functionalscript 0.36.0 → 0.38.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 (523) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/module.f.js +1 -1
  3. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  4. package/fjs/asserts/module.f.d.ts +36 -0
  5. package/fjs/asserts/module.f.js +39 -0
  6. package/fjs/asserts/proof.f.d.ts +11 -0
  7. package/fjs/asserts/proof.f.js +18 -0
  8. package/{fs → fjs}/base_n/module.f.js +3 -3
  9. package/{fs → fjs}/base_n/proof.f.js +15 -39
  10. package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
  11. package/{fs → fjs/basen}/base128/module.f.js +1 -1
  12. package/{fs → fjs/basen}/base128/proof.f.js +3 -3
  13. package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
  14. package/{fs → fjs/basen}/base64/module.f.js +25 -15
  15. package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
  16. package/{fs → fjs/basen}/base64/proof.f.js +26 -6
  17. package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
  18. package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
  19. package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
  20. package/fjs/bnf/data/module.f.d.ts +52 -0
  21. package/{fs → fjs}/bnf/data/module.f.js +56 -6
  22. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  23. package/{fs → fjs}/bnf/data/proof.f.js +59 -24
  24. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  25. package/fjs/bnf/descent/module.f.js +124 -0
  26. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  27. package/{fs → fjs}/bnf/descent/proof.f.js +59 -28
  28. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  29. package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
  30. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  31. package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
  32. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  33. package/{fs → fjs}/bnf/module.f.js +14 -15
  34. package/fjs/bnf/proof.f.js +69 -0
  35. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  36. package/{fs → fjs}/cas/cli/module.f.js +7 -7
  37. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  38. package/{fs → fjs}/cas/cli/proof.f.js +37 -74
  39. package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
  40. package/fjs/cas/evo/mcp/module.f.js +56 -0
  41. package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
  42. package/fjs/cas/evo/mcp/proof.f.js +95 -0
  43. package/fjs/cas/evo/module.f.d.ts +138 -0
  44. package/fjs/cas/evo/module.f.js +309 -0
  45. package/fjs/cas/evo/proof.f.d.ts +32 -0
  46. package/fjs/cas/evo/proof.f.js +453 -0
  47. package/fjs/cas/mcp/module.f.d.ts +49 -0
  48. package/fjs/cas/mcp/module.f.js +267 -0
  49. package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
  50. package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
  51. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  52. package/{fs → fjs}/cas/module.f.js +36 -10
  53. package/{fs → fjs}/cas/proof.f.d.ts +8 -2
  54. package/{fs → fjs}/cas/proof.f.js +85 -94
  55. package/{fs → fjs}/ci/bun/module.f.js +2 -2
  56. package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
  57. package/{fs → fjs}/ci/common/module.f.js +4 -4
  58. package/fjs/ci/config/module.f.d.ts +42 -0
  59. package/{fs → fjs}/ci/config/module.f.js +6 -8
  60. package/fjs/ci/deno/module.f.js +20 -0
  61. package/{fs → fjs}/ci/module.f.js +9 -9
  62. package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
  63. package/{fs → fjs}/ci/node/module.f.js +3 -5
  64. package/{fs → fjs}/ci/playwright/module.f.js +3 -3
  65. package/{fs → fjs}/ci/proof.f.js +27 -22
  66. package/{fs → fjs}/ci/rust/module.f.js +11 -3
  67. package/{fs → fjs}/cli/module.f.js +3 -3
  68. package/{fs → fjs}/cli/proof.f.js +25 -66
  69. package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
  70. package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
  71. package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
  72. package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
  73. package/{fs → fjs}/crypto/pow/module.f.js +3 -3
  74. package/fjs/crypto/pow/proof.f.js +111 -0
  75. package/{fs → fjs}/crypto/secp/module.f.js +2 -2
  76. package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
  77. package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
  78. package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
  79. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  80. package/{fs → fjs}/crypto/sign/module.f.js +11 -8
  81. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  82. package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
  83. package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
  84. package/{fs → fjs}/dev/module.f.js +6 -6
  85. package/{fs → fjs}/dev/package_json/module.f.js +6 -6
  86. package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
  87. package/{fs → fjs}/dev/proof.f.js +3 -5
  88. package/{fs → fjs}/djs/ast/module.f.js +2 -2
  89. package/{fs → fjs}/djs/ast/proof.f.js +8 -16
  90. package/fjs/djs/examples/m.f.d.ts +2 -0
  91. package/{fs → fjs}/djs/module.f.d.ts +1 -1
  92. package/{fs → fjs}/djs/module.f.js +5 -5
  93. package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
  94. package/{fs → fjs}/djs/parser/module.f.js +24 -4
  95. package/{fs → fjs}/djs/parser/proof.f.js +145 -407
  96. package/{fs → fjs}/djs/proof.f.js +16 -39
  97. package/{fs → fjs}/djs/serializer/module.f.js +6 -6
  98. package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
  99. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  100. package/fjs/djs/tokenizer/module.f.js +472 -0
  101. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  102. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +447 -446
  103. package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
  104. package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
  105. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  106. package/fjs/djs/transpiler/proof.f.js +67 -0
  107. package/{fs → fjs}/effects/memory/module.f.js +4 -4
  108. package/{fs → fjs}/effects/memory/proof.f.js +11 -24
  109. package/{fs → fjs}/effects/module.f.js +1 -1
  110. package/{fs → fjs}/effects/node/memory/module.js +2 -2
  111. package/{fs → fjs}/effects/node/memory/proof.js +8 -15
  112. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  113. package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
  114. package/{fs → fjs}/effects/node/module.f.js +7 -7
  115. package/{fs → fjs}/effects/node/module.js +13 -13
  116. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  117. package/{fs → fjs}/effects/node/proof.f.js +106 -292
  118. package/{fs → fjs}/effects/node/virtual/module.f.js +7 -7
  119. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
  120. package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
  121. package/{fs → fjs}/effects/proof.f.js +18 -47
  122. package/fjs/emergent_testing/all.test.js +4 -0
  123. package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
  124. package/{fs → fjs}/emergent_testing/module.f.js +6 -6
  125. package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
  126. package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
  127. package/fjs/emergent_testing/scenarios/all.js +1 -0
  128. package/{fs → fjs}/fsc/bnf.f.js +2 -2
  129. package/{fs → fjs}/fsc/json.f.js +1 -1
  130. package/{fs → fjs}/fsc/module.f.js +7 -7
  131. package/{fs → fjs}/fsc/proof.f.js +16 -38
  132. package/{fs → fjs}/fsm/module.f.js +9 -9
  133. package/{fs → fjs}/fsm/proof.f.js +12 -19
  134. package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
  135. package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
  136. package/{fs → fjs}/mcp/module.f.d.ts +20 -13
  137. package/{fs → fjs}/mcp/module.f.js +16 -9
  138. package/{fs → fjs}/mcp/proof.f.js +17 -17
  139. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  140. package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
  141. package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
  142. package/{fs → fjs/media}/html/module.f.d.ts +3 -3
  143. package/{fs → fjs/media}/html/module.f.js +9 -9
  144. package/{fs → fjs/media}/html/proof.f.js +12 -33
  145. package/fjs/media/json/module.f.d.ts +50 -0
  146. package/{fs → fjs/media}/json/module.f.js +7 -7
  147. package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
  148. package/{fs → fjs/media}/json/parser/module.f.js +21 -7
  149. package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
  150. package/{fs → fjs/media}/json/proof.f.js +4 -4
  151. package/fjs/media/json/rpc/module.f.d.ts +114 -0
  152. package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
  153. package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
  154. package/fjs/media/json/schema/module.f.d.ts +78 -0
  155. package/{fs → fjs/media}/json/schema/module.f.js +25 -41
  156. package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
  157. package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
  158. package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
  159. package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
  160. package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
  161. package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
  162. package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
  163. package/fjs/media/module.f.d.ts +37 -0
  164. package/fjs/media/module.f.js +23 -0
  165. package/fjs/media/proof.f.d.ts +9 -0
  166. package/fjs/media/proof.f.js +58 -0
  167. package/fjs/media/revision/module.f.d.ts +78 -0
  168. package/fjs/media/revision/module.f.js +122 -0
  169. package/fjs/media/revision/proof.f.d.ts +31 -0
  170. package/fjs/media/revision/proof.f.js +140 -0
  171. package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
  172. package/{fs/mime → fjs/media/type}/module.f.js +6 -6
  173. package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
  174. package/fjs/module.f.d.ts +2 -0
  175. package/{fs/fjs → fjs}/module.f.js +9 -9
  176. package/fjs/module.js +4 -0
  177. package/{fs → fjs}/path/module.f.js +2 -2
  178. package/{fs → fjs}/path/proof.f.js +27 -78
  179. package/{fs/fjs → fjs}/proof.f.js +6 -4
  180. package/{fs → fjs}/sul/id/module.f.js +9 -9
  181. package/{fs → fjs}/sul/id/proof.f.js +12 -26
  182. package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
  183. package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
  184. package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
  185. package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
  186. package/{fs → fjs}/sul/module.f.js +3 -3
  187. package/{fs → fjs}/sul/proof.f.js +3 -3
  188. package/fjs/text/ascii/proof.f.d.ts +6 -0
  189. package/fjs/text/ascii/proof.f.js +14 -0
  190. package/{fs → fjs}/text/code_point/module.f.js +12 -12
  191. package/{fs → fjs}/text/code_point/proof.f.js +1 -1
  192. package/{fs → fjs}/text/module.f.js +5 -5
  193. package/{fs → fjs}/text/proof.f.js +7 -12
  194. package/{fs → fjs}/text/sgr/module.f.js +2 -2
  195. package/{fs → fjs}/text/sgr/proof.f.js +8 -17
  196. package/{fs → fjs}/text/utf16/module.f.js +6 -6
  197. package/{fs → fjs}/text/utf16/proof.f.js +27 -70
  198. package/{fs → fjs}/text/utf8/module.f.js +22 -17
  199. package/{fs → fjs}/text/utf8/proof.f.js +59 -128
  200. package/{fs → fjs}/types/array/module.f.js +1 -1
  201. package/{fs → fjs}/types/array/proof.f.js +21 -55
  202. package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
  203. package/fjs/types/bigfloat/proof.f.js +217 -0
  204. package/{fs → fjs}/types/bigint/module.f.js +2 -2
  205. package/{fs → fjs}/types/bigint/proof.f.js +51 -147
  206. package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
  207. package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
  208. package/{fs → fjs}/types/btree/find/module.f.js +1 -1
  209. package/fjs/types/btree/find/proof.f.d.ts +3 -0
  210. package/fjs/types/btree/find/proof.f.js +108 -0
  211. package/{fs → fjs}/types/btree/module.f.js +2 -2
  212. package/fjs/types/btree/proof.f.d.ts +13 -0
  213. package/{fs → fjs}/types/btree/proof.f.js +12 -19
  214. package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
  215. package/fjs/types/btree/remove/proof.f.d.ts +9 -0
  216. package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
  217. package/{fs → fjs}/types/btree/set/module.f.js +8 -5
  218. package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
  219. package/{fs → fjs}/types/byte_set/module.f.js +2 -2
  220. package/fjs/types/byte_set/proof.f.js +79 -0
  221. package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
  222. package/fjs/types/function/operator/proof.f.d.ts +23 -0
  223. package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
  224. package/{fs → fjs}/types/function/proof.f.js +3 -4
  225. package/{fs → fjs}/types/list/module.f.js +2 -2
  226. package/fjs/types/list/proof.f.d.ts +30 -0
  227. package/{fs → fjs}/types/list/proof.f.js +59 -167
  228. package/{fs → fjs}/types/map/proof.f.js +6 -14
  229. package/fjs/types/nibble_set/proof.f.js +60 -0
  230. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  231. package/{fs → fjs}/types/nullable/module.f.js +2 -2
  232. package/fjs/types/nullable/proof.f.js +29 -0
  233. package/{fs → fjs}/types/number/module.f.js +5 -5
  234. package/{fs → fjs}/types/number/proof.f.js +10 -25
  235. package/{fs → fjs}/types/object/module.f.js +4 -4
  236. package/{fs → fjs}/types/object/proof.f.js +4 -7
  237. package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
  238. package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
  239. package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
  240. package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
  241. package/{fs → fjs}/types/prime_field/module.f.js +3 -8
  242. package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
  243. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  244. package/fjs/types/range/module.f.js +2 -0
  245. package/fjs/types/range/proof.f.js +9 -0
  246. package/{fs → fjs}/types/range_map/module.f.js +4 -4
  247. package/{fs → fjs}/types/range_map/proof.f.js +35 -88
  248. package/{fs → fjs}/types/result/module.js +1 -1
  249. package/fjs/types/result/proof.f.d.ts +12 -0
  250. package/fjs/types/result/proof.f.js +31 -0
  251. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  252. package/{fs → fjs}/types/rtti/common/module.f.js +48 -4
  253. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  254. package/fjs/types/rtti/common/proof.f.js +51 -0
  255. package/{fs → fjs}/types/rtti/module.f.d.ts +2 -2
  256. package/{fs → fjs}/types/rtti/module.f.js +1 -1
  257. package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
  258. package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
  259. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  260. package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
  261. package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
  262. package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
  263. package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
  264. package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
  265. package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
  266. package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
  267. package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
  268. package/{fs → fjs}/types/string/module.f.js +4 -4
  269. package/fjs/types/string/proof.f.js +77 -0
  270. package/{fs → fjs}/types/string_set/module.f.js +6 -6
  271. package/fjs/types/string_set/proof.f.js +43 -0
  272. package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
  273. package/{fs → fjs}/types/ts/proof.f.js +16 -43
  274. package/{fs → fjs}/types/uint8array/module.f.js +10 -10
  275. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  276. package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
  277. package/{fs → fjs}/website/module.f.js +3 -3
  278. package/fjs/website/proof.f.js +13 -0
  279. package/package.json +8 -8
  280. package/fs/asserts/module.f.d.ts +0 -4
  281. package/fs/asserts/module.f.js +0 -9
  282. package/fs/asserts/proof.f.d.ts +0 -8
  283. package/fs/asserts/proof.f.js +0 -51
  284. package/fs/bnf/data/module.f.d.ts +0 -30
  285. package/fs/bnf/descent/module.f.js +0 -119
  286. package/fs/bnf/proof.f.js +0 -104
  287. package/fs/cas/mcp/module.f.d.ts +0 -36
  288. package/fs/cas/mcp/module.f.js +0 -249
  289. package/fs/ci/config/module.f.d.ts +0 -43
  290. package/fs/ci/deno/module.f.js +0 -16
  291. package/fs/crypto/pow/proof.f.js +0 -161
  292. package/fs/djs/examples/m.f.d.ts +0 -2
  293. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  294. package/fs/djs/tokenizer/module.f.js +0 -62
  295. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  296. package/fs/djs/tokenizer/proof.f.js +0 -543
  297. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  298. package/fs/djs/tokenizer-new/module.f.js +0 -155
  299. package/fs/djs/transpiler/proof.f.js +0 -68
  300. package/fs/emergent_testing/all.test.js +0 -4
  301. package/fs/emergent_testing/scenarios/all.js +0 -1
  302. package/fs/fjs/module.f.d.ts +0 -2
  303. package/fs/fjs/module.js +0 -4
  304. package/fs/json/module.f.d.ts +0 -50
  305. package/fs/json/rpc/module.f.d.ts +0 -114
  306. package/fs/json/schema/module.f.d.ts +0 -77
  307. package/fs/text/ascii/proof.f.d.ts +0 -4
  308. package/fs/text/ascii/proof.f.js +0 -24
  309. package/fs/types/bigfloat/proof.f.js +0 -348
  310. package/fs/types/btree/find/proof.f.js +0 -151
  311. package/fs/types/btree/proof.f.d.ts +0 -7
  312. package/fs/types/btree/remove/proof.f.d.ts +0 -4
  313. package/fs/types/byte_set/proof.f.js +0 -120
  314. package/fs/types/function/operator/proof.f.d.ts +0 -12
  315. package/fs/types/list/proof.f.d.ts +0 -22
  316. package/fs/types/nibble_set/proof.f.js +0 -89
  317. package/fs/types/nullable/proof.f.js +0 -50
  318. package/fs/types/patricia_trie/proof.f.d.ts +0 -7
  319. package/fs/types/range/module.f.js +0 -2
  320. package/fs/types/range/proof.f.d.ts +0 -1
  321. package/fs/types/range/proof.f.js +0 -18
  322. package/fs/types/result/proof.f.d.ts +0 -6
  323. package/fs/types/result/proof.f.js +0 -52
  324. package/fs/types/string/proof.f.js +0 -118
  325. package/fs/types/string_set/proof.f.js +0 -82
  326. package/fs/website/proof.f.js +0 -16
  327. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  328. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  329. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  330. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  331. /package/{fs → fjs/basen}/base128/proof.f.d.ts +0 -0
  332. /package/{fs → fjs/basen}/cbase32/proof.f.d.ts +0 -0
  333. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  334. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  335. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  336. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  337. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  338. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  339. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  340. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  341. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  342. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  343. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  344. /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
  345. /package/{fs/types → fjs/common}/monoid/proof.f.d.ts +0 -0
  346. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  347. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  348. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  350. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  351. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  352. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  353. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  355. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  356. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  358. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  359. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  361. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  363. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  364. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  365. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  366. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  369. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  370. /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
  371. /package/{fs → fjs}/effects/list/module.f.js +0 -0
  372. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  373. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  374. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  375. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  376. /package/{fs → fjs}/effects/module.d.ts +0 -0
  377. /package/{fs → fjs}/effects/module.f.d.ts +0 -0
  378. /package/{fs → fjs}/effects/module.js +0 -0
  379. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  380. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  381. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  384. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  385. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  386. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  387. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  388. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  389. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  390. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  391. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  392. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  393. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  394. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  395. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  396. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  397. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  398. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  399. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  400. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  401. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  402. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  403. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  404. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  405. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  406. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  407. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  408. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  409. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  410. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  413. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  415. /package/{fs → fjs/media}/html/proof.f.d.ts +0 -0
  416. /package/{fs → fjs/media}/json/parser/proof.f.d.ts +0 -0
  417. /package/{fs → fjs/media}/json/proof.f.d.ts +0 -0
  418. /package/{fs → fjs/media}/json/rpc/proof.f.d.ts +0 -0
  419. /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
  420. /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
  421. /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
  422. /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
  423. /package/{fs/fjs → fjs}/module.d.ts +0 -0
  424. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  425. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  426. /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  431. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  432. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  433. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  434. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  437. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  439. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  441. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  442. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  443. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  444. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  447. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  449. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  453. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  456. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  459. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  462. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  466. /package/{fs/types/btree/find → fjs/types/function/compare}/proof.f.d.ts +0 -0
  467. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/function/module.f.js +0 -0
  469. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  470. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  471. /package/{fs/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
  472. /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  474. /package/{fs → fjs}/types/map/module.f.js +0 -0
  475. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  476. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  478. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  479. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  481. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  482. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  485. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  487. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  489. /package/{fs → fjs}/types/option/module.f.js +0 -0
  490. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  492. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  494. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  496. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  497. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  498. /package/{fs/types/function → fjs/types/range}/proof.f.d.ts +0 -0
  499. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  502. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  503. /package/{fs → fjs}/types/result/module.f.js +0 -0
  504. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  506. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  508. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  511. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  514. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  517. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  518. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  519. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  520. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  521. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  522. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  523. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * `vnd.fjs.revision` — one step in the evolution of a mutable object on top
3
+ * of an immutable content-addressable store.
4
+ *
5
+ * A revision BLOB links back to its parent revision(s) (a DAG, not just a
6
+ * chain, so concurrent edits can merge) and carries the full materialized
7
+ * content of that step — never an incremental diff (see the versioning rule
8
+ * in the README). This module is the pure format only: the rtti schema, the
9
+ * `dialect` tag, and decode/validate. No store access, no effects — head
10
+ * resolution, materialization, and reverse indexes are a separate, deferred
11
+ * concern.
12
+ *
13
+ * See `README.md` for the full spec.
14
+ *
15
+ * @module
16
+ */
17
+ import { array, number, option, string } from '../../types/rtti/module.f.js';
18
+ import { validate as rttiValidate } from '../../types/rtti/validate/module.f.js';
19
+ import { parse as jsonParse } from '../json/parser/module.f.js';
20
+ import { tokenize as jsonTokenize } from '../json/tokenizer/module.f.js';
21
+ import { stringToList } from '../../text/utf16/module.f.js';
22
+ import { cBase32ToVec } from '../../basen/cbase32/module.f.js';
23
+ import { error, ok } from '../../types/result/module.f.js';
24
+ /**
25
+ * Format tag: names the dialect of this BLOB. The media type it is served
26
+ * with is derived mechanically: `application/` + `dialect` + `+json`.
27
+ */
28
+ export const dialect = 'vnd.fjs.revision';
29
+ /** The media type derived from {@link dialect}: `application/vnd.fjs.revision+json`. */
30
+ export const mediaType = `application/${dialect}+json`;
31
+ /**
32
+ * rtti schema for the snapshot-reference type: a cbase32 CAS hash string.
33
+ *
34
+ * This is `string` at the rtti (structural) level — rtti schemas can't
35
+ * express string-content refinements — so cbase32 decodability, and the
36
+ * rejection of `https://` bridge URLs and any other location-addressed
37
+ * reference form, is enforced by {@link isHash} / {@link validate} below,
38
+ * not by this schema on its own.
39
+ */
40
+ export const hash = string;
41
+ /**
42
+ * rtti schema for a `revision` BLOB. See the README for the full semantics of
43
+ * each field; `dialect` is the type discriminant, matched here as an exact
44
+ * literal so structural validation alone rejects any other dialect's blob.
45
+ */
46
+ export const revisionSchema = {
47
+ dialect,
48
+ subject: string,
49
+ parents: array(hash),
50
+ snapshot: hash,
51
+ generation: number,
52
+ archived: option(true),
53
+ };
54
+ /** Structural-only validator: checks the shape, not the hash / generation semantics. */
55
+ const validateShape = rttiValidate(revisionSchema);
56
+ /** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
57
+ export const isHash = (s) => cBase32ToVec(s) !== null;
58
+ /**
59
+ * Checks the semantic refinements the structural schema can't express on an
60
+ * already shape-valid revision: every `parents` entry and the `snapshot` must
61
+ * decode as a cbase32 hash ({@link isHash}), and `generation` must be a
62
+ * non-negative *safe* integer. `subject` is not checked — it is an identity
63
+ * string, never a snapshot reference, so any string is valid.
64
+ *
65
+ * `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
66
+ * or above `2 ** 53` passes `isInteger` but is no longer uniquely
67
+ * representable, so `1 + max(parents' generations)` — how a writer derives the
68
+ * next generation — can round back to the parent's value and fail to advance.
69
+ * Rejecting unsafe integers keeps stored generations exact.
70
+ *
71
+ * Both `snapshot` and `generation` are required by the schema, so no absence
72
+ * ever has to be resolved here: a revision states its content and its
73
+ * generation explicitly, and is fully interpretable in isolation (see the
74
+ * README). The former snapshot-resolution algorithm (subject-as-fallback,
75
+ * single-parent inheritance, multi-parent rejection) is gone.
76
+ *
77
+ * Exported separately from {@link validate} for callers that assemble a
78
+ * `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
79
+ * `addRevision`): the shape is then guaranteed by TypeScript already, so only
80
+ * these semantic (string-only error) checks are worth re-running — routing
81
+ * through the combined structural-plus-semantic `validate` would add an
82
+ * unreachable structural-error branch on the caller's side.
83
+ */
84
+ export const checkReferences = (r) => {
85
+ for (const p of r.parents) {
86
+ if (!isHash(p)) {
87
+ return error(`parent is not a valid hash: ${p}`);
88
+ }
89
+ }
90
+ if (!isHash(r.snapshot)) {
91
+ return error(`snapshot is not a valid hash: ${r.snapshot}`);
92
+ }
93
+ if (!Number.isSafeInteger(r.generation) || r.generation < 0) {
94
+ return error(`generation must be a non-negative safe integer: ${r.generation}`);
95
+ }
96
+ return ok(r);
97
+ };
98
+ /**
99
+ * Validates an already-parsed JSON value as a `revision` BLOB: structural
100
+ * (rtti) validation followed by the hash / generation semantic checks.
101
+ */
102
+ export const validate = (value) => {
103
+ const [t, v] = validateShape(value);
104
+ if (t === 'error') {
105
+ return error(v);
106
+ }
107
+ return checkReferences(v);
108
+ };
109
+ /** Parses `text` as JSON without relying on `JSON.parse` (the shared `fjs/media/json` parser/tokenizer). */
110
+ const parseJson = (text) => jsonParse(jsonTokenize(stringToList(text)));
111
+ /**
112
+ * Decodes `text` as a `revision` BLOB: JSON-parses it, then validates it per
113
+ * {@link validate}. Detection is semantic, not syntactic — any JSON that
114
+ * satisfies the schema is a revision, regardless of key order or whitespace.
115
+ */
116
+ export const decodeText = (text) => {
117
+ const [t, v] = parseJson(text);
118
+ if (t === 'error') {
119
+ return error(v);
120
+ }
121
+ return validate(v);
122
+ };
@@ -0,0 +1,31 @@
1
+ export declare const proof: {
2
+ dialectAndMediaType: () => void;
3
+ isHash: {
4
+ validHash: () => void;
5
+ httpsRejected: () => void;
6
+ arbitraryStringRejected: () => void;
7
+ };
8
+ validate: {
9
+ allFieldsPresent: () => void;
10
+ nonHashSubjectAccepted: () => void;
11
+ multiParentAccepted: () => void;
12
+ missingSnapshotRejected: () => void;
13
+ nonHashSnapshotRejected: () => void;
14
+ missingGenerationRejected: () => void;
15
+ nonIntegerGenerationRejected: () => void;
16
+ negativeGenerationRejected: () => void;
17
+ unsafeIntegerGenerationRejected: () => void;
18
+ positiveGenerationAccepted: () => void;
19
+ httpsRejectedInParents: () => void;
20
+ archivedAccepted: () => void;
21
+ wrongDialectRejected: () => void;
22
+ missingSubjectRejected: () => void;
23
+ extraFieldsAccepted: () => void;
24
+ };
25
+ decodeText: {
26
+ validJson: () => void;
27
+ keyOrderIndependent: () => void;
28
+ malformedJsonRejected: () => void;
29
+ ordinaryJsonRejected: () => void;
30
+ };
31
+ };
@@ -0,0 +1,140 @@
1
+ import { assert, assertEq } from '../../asserts/module.f.js';
2
+ import { dialect, mediaType, isHash, validate, decodeText } from './module.f.js';
3
+ // Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.ts): single
4
+ // cbase32 symbols, cheap to write inline here.
5
+ const h1 = '8';
6
+ const h2 = 'r';
7
+ // A shape-valid revision: every required field present (`snapshot` and
8
+ // `generation` included), with `extra` overriding or adding fields per test.
9
+ const revisionOf = (extra) => ({
10
+ dialect,
11
+ subject: h1,
12
+ parents: [],
13
+ snapshot: h2,
14
+ generation: 0,
15
+ ...extra,
16
+ });
17
+ export const proof = {
18
+ dialectAndMediaType: () => {
19
+ assertEq(dialect, 'vnd.fjs.revision');
20
+ assertEq(mediaType, 'application/vnd.fjs.revision+json');
21
+ },
22
+ isHash: {
23
+ validHash: () => assert(isHash(h1)),
24
+ httpsRejected: () => assert(!isHash('https://example.com/blob/abc')),
25
+ arbitraryStringRejected: () => assert(!isHash('not-a-hash!')),
26
+ },
27
+ validate: {
28
+ // A fully explicit revision validates.
29
+ allFieldsPresent: () => {
30
+ const [t] = validate(revisionOf({}));
31
+ assertEq(t, 'ok');
32
+ },
33
+ // `subject` is a pure identity string, never a snapshot reference: a
34
+ // zero-parent revision whose `subject` is not a hash is now valid,
35
+ // because `snapshot` is always stated explicitly.
36
+ nonHashSubjectAccepted: () => {
37
+ const r = validate(revisionOf({ subject: 'my-config' }));
38
+ assert(r[0] === 'ok', ['expected ok', r]);
39
+ assertEq(r[1].subject, 'my-config');
40
+ },
41
+ // A merge revision (more than one parent) is valid like any other —
42
+ // there is no "multiple parents without snapshot" case left, because
43
+ // `snapshot` is required.
44
+ multiParentAccepted: () => {
45
+ const r = validate(revisionOf({ subject: 'my-config', parents: [h1, h2], snapshot: h2 }));
46
+ assert(r[0] === 'ok', ['expected ok', r]);
47
+ assertEq(r[1].snapshot, h2);
48
+ },
49
+ // `snapshot` is required: absent is a shape error.
50
+ missingSnapshotRejected: () => {
51
+ const [t] = validate({ dialect, subject: h1, parents: [], generation: 0 });
52
+ assertEq(t, 'error');
53
+ },
54
+ // `snapshot` must decode as a hash — `https://` bridge URLs rejected.
55
+ nonHashSnapshotRejected: () => {
56
+ const [t] = validate(revisionOf({ snapshot: 'https://example.com/x' }));
57
+ assertEq(t, 'error');
58
+ },
59
+ // `generation` is required: absent is a shape error.
60
+ missingGenerationRejected: () => {
61
+ const [t] = validate({ dialect, subject: h1, parents: [], snapshot: h2 });
62
+ assertEq(t, 'error');
63
+ },
64
+ // `generation` must be an integer: a fractional value is rejected.
65
+ nonIntegerGenerationRejected: () => {
66
+ const [t] = validate(revisionOf({ generation: 1.5 }));
67
+ assertEq(t, 'error');
68
+ },
69
+ // `generation` must be non-negative.
70
+ negativeGenerationRejected: () => {
71
+ const [t] = validate(revisionOf({ generation: -1 }));
72
+ assertEq(t, 'error');
73
+ },
74
+ // `generation` must be a *safe* integer: at `2 ** 53` and above the
75
+ // value is no longer uniquely representable, so `1 + max(...)` could
76
+ // fail to advance — such a blob is rejected (`Number.isInteger` would
77
+ // accept it; `Number.isSafeInteger` does not).
78
+ unsafeIntegerGenerationRejected: () => {
79
+ const [t] = validate(revisionOf({ generation: 2 ** 53 }));
80
+ assertEq(t, 'error');
81
+ },
82
+ // A positive integer generation is accepted.
83
+ positiveGenerationAccepted: () => {
84
+ const r = validate(revisionOf({ parents: [h1], generation: 3 }));
85
+ assert(r[0] === 'ok', ['expected ok', r]);
86
+ assertEq(r[1].generation, 3);
87
+ },
88
+ // `https://` bridge URLs are rejected wherever a hash is required.
89
+ httpsRejectedInParents: () => {
90
+ const [t] = validate(revisionOf({ parents: ['https://example.com/x'] }));
91
+ assertEq(t, 'error');
92
+ },
93
+ // `archived` follows the presence-only `option(true)` idiom.
94
+ archivedAccepted: () => {
95
+ const [t] = validate(revisionOf({ archived: true }));
96
+ assertEq(t, 'ok');
97
+ },
98
+ // Wrong dialect tag: structural validation rejects it outright.
99
+ wrongDialectRejected: () => {
100
+ const [t] = validate({ dialect: 'vnd.fjs.other', subject: h1, parents: [], snapshot: h2, generation: 0 });
101
+ assertEq(t, 'error');
102
+ },
103
+ // Missing required fields: rejected.
104
+ missingSubjectRejected: () => {
105
+ const [t] = validate({ dialect, parents: [], snapshot: h2, generation: 0 });
106
+ assertEq(t, 'error');
107
+ },
108
+ // rtti structs are open: extra fields don't break validation — the
109
+ // additive forward-compatibility path the versioning rule relies on.
110
+ extraFieldsAccepted: () => {
111
+ const [t] = validate(revisionOf({ future: 'field' }));
112
+ assertEq(t, 'ok');
113
+ },
114
+ },
115
+ decodeText: {
116
+ validJson: () => {
117
+ const r = decodeText(JSON.stringify(revisionOf({})));
118
+ assert(r[0] === 'ok', ['expected ok', r]);
119
+ assertEq(r[1].subject, h1);
120
+ },
121
+ // Key order carries no meaning: detection parses the JSON and
122
+ // validates the parsed value, so `dialect` need not be first.
123
+ keyOrderIndependent: () => {
124
+ const text = `{"generation":0,"snapshot":"${h2}","parents":[],"subject":"${h1}","dialect":"${dialect}"}`;
125
+ const [t] = decodeText(text);
126
+ assertEq(t, 'ok');
127
+ },
128
+ malformedJsonRejected: () => {
129
+ const [t] = decodeText('{not json');
130
+ assertEq(t, 'error');
131
+ },
132
+ // Ordinary JSON that isn't a revision at all falls through as an error
133
+ // here — `fjs/media`'s composed detector is what falls back to the
134
+ // ordinary detector; this module only reports validity.
135
+ ordinaryJsonRejected: () => {
136
+ const [t] = decodeText('{"hello":"world"}');
137
+ assertEq(t, 'error');
138
+ },
139
+ },
140
+ };
@@ -32,12 +32,12 @@
32
32
  *
33
33
  * @module
34
34
  */
35
- import { type Vec } from '../types/bit_vec/module.f.ts';
36
- import type { Nullable } from '../types/nullable/module.f.ts';
37
- import { type Effect, type Operation } from '../effects/module.f.ts';
38
- import type { List } from '../effects/list/module.f.ts';
39
- import type { IoResult } from '../effects/node/module.f.ts';
40
- import { type Utf8State } from '../text/utf8/module.f.ts';
35
+ import { type Vec } from '../../types/bit_vec/module.f.ts';
36
+ import type { Nullable } from '../../types/nullable/module.f.ts';
37
+ import { type Effect, type Operation } from '../../effects/module.f.ts';
38
+ import type { List } from '../../effects/list/module.f.ts';
39
+ import type { IoResult } from '../../effects/node/module.f.ts';
40
+ import { type Utf8State } from '../../text/utf8/module.f.ts';
41
41
  /**
42
42
  * Detects the MIME type of `bytes` from its leading magic-byte signature.
43
43
  *
@@ -32,12 +32,12 @@
32
32
  *
33
33
  * @module
34
34
  */
35
- import { msb, fromSentinel, length, u8List } from "../types/bit_vec/module.f.js";
36
- import { iterable } from "../types/list/module.f.js";
37
- import { pure } from "../effects/module.f.js";
38
- import { ok, error } from "../types/result/module.f.js";
39
- import { isValidCodePoint, isTextCodePoint } from "../text/code_point/module.f.js";
40
- import { utf8ByteToCodePointOp } from "../text/utf8/module.f.js";
35
+ import { msb, fromSentinel, length, u8List } from '../../types/bit_vec/module.f.js';
36
+ import { iterable } from '../../types/list/module.f.js';
37
+ import { pure } from '../../effects/module.f.js';
38
+ import { ok, error } from '../../types/result/module.f.js';
39
+ import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.js';
40
+ import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.js';
41
41
  const { startsWith, removeFront } = msb;
42
42
  // Each signature is written as a hex literal whose leading `1` nibble is a
43
43
  // sentinel marking the start of the byte run (so leading zero bytes survive)
@@ -1,9 +1,9 @@
1
- import { assert, assertEq } from "../asserts/module.f.js";
2
- import { msb, u8ListToVec, vec8, repeat, empty } from "../types/bit_vec/module.f.js";
3
- import { decode } from "../effects/module.f.js";
4
- import { nonEmpty, empty as emptyList } from "../effects/list/module.f.js";
5
- import { ok } from "../types/result/module.f.js";
6
- import { detect, detectStream, detectVec } from "./module.f.js";
1
+ import { assert, assertEq } from '../../asserts/module.f.js';
2
+ import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.js';
3
+ import { decode } from '../../effects/module.f.js';
4
+ import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.js';
5
+ import { ok } from '../../types/result/module.f.js';
6
+ import { detect, detectStream, detectVec } from './module.f.js';
7
7
  // Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
8
8
  // store would hold the leading bytes of a stored blob.
9
9
  const bytes = (...b) => u8ListToVec(msb)(b);
@@ -11,9 +11,7 @@ const bytes = (...b) => u8ListToVec(msb)(b);
11
11
  // Evaluates a fully pure effect (no operations) to its result.
12
12
  const runPure = (e) => {
13
13
  const d = decode(e);
14
- if (!d.done) {
15
- throw 'effect is not pure';
16
- }
14
+ assert(d.done, 'effect is not pure');
17
15
  return d.result;
18
16
  };
19
17
  // Builds a CAS-style read stream from a sequence of ok(chunk) items.
@@ -21,9 +19,7 @@ const stream = (...chunks) => chunks.reduceRight((tail, c) => nonEmpty(ok(c), ta
21
19
  // Runs the streaming detector over the given chunks and unwraps the metadata.
22
20
  const detectChunks = (...chunks) => {
23
21
  const r = runPure(detectStream(stream(...chunks)));
24
- if (r[0] === 'error') {
25
- throw r[1];
26
- }
22
+ assert(r[0] !== 'error', r[1]);
27
23
  return r[1];
28
24
  };
29
25
  export const proof = {
@@ -0,0 +1,2 @@
1
+ import { type NodeProgram } from './effects/node/module.f.ts';
2
+ export declare const main: NodeProgram;
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { compile } from "../djs/module.f.js";
7
- import { main as testMain } from "../emergent_testing/module.f.js";
8
- import { commands as casCommands } from "../cas/cli/module.f.js";
9
- import { main as ciMain } from "../ci/module.f.js";
10
- import { import_ } from "../effects/node/module.f.js";
11
- import { dispatch } from "../cli/module.f.js";
12
- import { casMcpServer } from "../cas/mcp/module.f.js";
13
- import { pure } from "../effects/module.f.js";
6
+ import { compile } from './djs/module.f.js';
7
+ import { main as testMain } from './emergent_testing/module.f.js';
8
+ import { commands as casCommands } from './cas/cli/module.f.js';
9
+ import { main as ciMain } from './ci/module.f.js';
10
+ import { import_ } from './effects/node/module.f.js';
11
+ import { dispatch } from './cli/module.f.js';
12
+ import { casMcpServer } from './cas/mcp/module.f.js';
13
+ import { pure } from './effects/module.f.js';
14
14
  const commands = [
15
15
  {
16
16
  names: ['test', 't'],
@@ -29,7 +29,7 @@ const commands = [
29
29
  },
30
30
  {
31
31
  names: ['mcp', 'm'],
32
- description: 'Run an MCP server over stdio exposing the CAS as tools',
32
+ description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
33
33
  handler: ({ home }) => casMcpServer(home).step(() => pure(0)),
34
34
  },
35
35
  {
package/fjs/module.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { main } from './module.f.js';
3
+ import { run } from './effects/node/module.js';
4
+ await run(main);
@@ -1,5 +1,5 @@
1
- import { fold, last, take, length, concat as listConcat, toArray } from "../types/list/module.f.js";
2
- import { join as listJoin, concat as stringConcat } from "../types/string/module.f.js";
1
+ import { fold, last, take, length, concat as listConcat, toArray } from '../types/list/module.f.js';
2
+ import { join as listJoin, concat as stringConcat } from '../types/string/module.f.js';
3
3
  const foldNormalizeOp = input => state => {
4
4
  switch (input) {
5
5
  case '':
@@ -1,170 +1,119 @@
1
1
  import { concat, isProperPrefix, join, normalize, relativize, toPosix } from "./module.f.js";
2
+ import { assertEq } from '../asserts/module.f.js';
2
3
  const normalizeTest = [
3
4
  () => {
4
5
  const norm = normalize("dir/file.json");
5
- if (norm !== "dir/file.json") {
6
- throw norm;
7
- }
6
+ assertEq(norm, "dir/file.json");
8
7
  },
9
8
  () => {
10
9
  const norm = normalize("dir//file.json");
11
- if (norm !== "dir/file.json") {
12
- throw norm;
13
- }
10
+ assertEq(norm, "dir/file.json");
14
11
  },
15
12
  () => {
16
13
  const norm = normalize("../../dir/file.json");
17
- if (norm !== "../../dir/file.json") {
18
- throw norm;
19
- }
14
+ assertEq(norm, "../../dir/file.json");
20
15
  },
21
16
  () => {
22
17
  const norm = normalize("../../dir/../file.json");
23
- if (norm !== "../../file.json") {
24
- throw norm;
25
- }
18
+ assertEq(norm, "../../file.json");
26
19
  },
27
20
  ];
28
21
  const concatTest = [
29
22
  () => {
30
23
  const c = concat("a")("b");
31
- if (c !== "a/b") {
32
- throw c;
33
- }
24
+ assertEq(c, "a/b");
34
25
  },
35
26
  () => {
36
27
  const c = concat("a///b/")("c");
37
- if (c !== "a/b/c") {
38
- throw c;
39
- }
28
+ assertEq(c, "a/b/c");
40
29
  },
41
30
  () => {
42
31
  const c = concat("a/../b/..")("c");
43
- if (c !== "c") {
44
- throw c;
45
- }
32
+ assertEq(c, "c");
46
33
  },
47
34
  ];
48
35
  const joinTest = [
49
36
  () => {
50
37
  const r = join('a', 'b');
51
- if (r !== 'a/b') {
52
- throw r;
53
- }
38
+ assertEq(r, 'a/b');
54
39
  },
55
40
  () => {
56
41
  const r = join('/abs/root', 'x');
57
- if (r !== '/abs/root/x') {
58
- throw r;
59
- }
42
+ assertEq(r, '/abs/root/x');
60
43
  },
61
44
  () => {
62
45
  const r = join('a', 'b', 'c', 'd');
63
- if (r !== 'a/b/c/d') {
64
- throw r;
65
- }
46
+ assertEq(r, 'a/b/c/d');
66
47
  },
67
48
  () => {
68
49
  const r = join('', 'x');
69
- if (r !== '/x') {
70
- throw r;
71
- }
50
+ assertEq(r, '/x');
72
51
  },
73
52
  () => {
74
53
  const r = join();
75
- if (r !== '') {
76
- throw r;
77
- }
54
+ assertEq(r, '');
78
55
  },
79
56
  () => {
80
57
  const r = join('only');
81
- if (r !== 'only') {
82
- throw r;
83
- }
58
+ assertEq(r, 'only');
84
59
  },
85
60
  ];
86
61
  const relativizeTest = [
87
62
  () => {
88
63
  const r = relativize('/repo', '/repo/fs/a.ts');
89
- if (r !== './fs/a.ts') {
90
- throw r;
91
- }
64
+ assertEq(r, './fs/a.ts');
92
65
  },
93
66
  () => {
94
67
  const r = relativize('/repo', '/other/a.ts');
95
- if (r !== '/other/a.ts') {
96
- throw r;
97
- }
68
+ assertEq(r, '/other/a.ts');
98
69
  },
99
70
  () => {
100
71
  const r = relativize('', './fs/a.ts');
101
- if (r !== './fs/a.ts') {
102
- throw r;
103
- }
72
+ assertEq(r, './fs/a.ts');
104
73
  },
105
74
  ];
106
75
  const toPosixTest = [
107
76
  () => {
108
77
  const p = toPosix('a\\b\\c');
109
- if (p !== 'a/b/c') {
110
- throw p;
111
- }
78
+ assertEq(p, 'a/b/c');
112
79
  },
113
80
  () => {
114
81
  const p = toPosix('a/b/c');
115
- if (p !== 'a/b/c') {
116
- throw p;
117
- }
82
+ assertEq(p, 'a/b/c');
118
83
  },
119
84
  () => {
120
85
  const p = toPosix('C:\\Users\\x');
121
- if (p !== 'C:/Users/x') {
122
- throw p;
123
- }
86
+ assertEq(p, 'C:/Users/x');
124
87
  },
125
88
  () => {
126
89
  const p = toPosix('');
127
- if (p !== '') {
128
- throw p;
129
- }
90
+ assertEq(p, '');
130
91
  },
131
92
  ];
132
93
  const isProperPrefixTest = [
133
94
  () => {
134
95
  const r = isProperPrefix(['a', 'b'], ['a', 'b', 'c']);
135
- if (r !== true) {
136
- throw r;
137
- }
96
+ assertEq(r, true);
138
97
  },
139
98
  () => {
140
99
  const r = isProperPrefix(['a', 'b'], ['a', 'b']);
141
- if (r !== false) {
142
- throw r;
143
- }
100
+ assertEq(r, false);
144
101
  },
145
102
  () => {
146
103
  const r = isProperPrefix(['a', 'x'], ['a', 'b', 'c']);
147
- if (r !== false) {
148
- throw r;
149
- }
104
+ assertEq(r, false);
150
105
  },
151
106
  () => {
152
107
  const r = isProperPrefix(['a', 'b', 'c'], ['a', 'b']);
153
- if (r !== false) {
154
- throw r;
155
- }
108
+ assertEq(r, false);
156
109
  },
157
110
  () => {
158
111
  const r = isProperPrefix([], ['a']);
159
- if (r !== true) {
160
- throw r;
161
- }
112
+ assertEq(r, true);
162
113
  },
163
114
  () => {
164
115
  const r = isProperPrefix([], []);
165
- if (r !== false) {
166
- throw r;
167
- }
116
+ assertEq(r, false);
168
117
  },
169
118
  ];
170
119
  export const proof = { normalizeTest, concatTest, joinTest, relativizeTest, toPosixTest, isProperPrefixTest };
@@ -1,7 +1,7 @@
1
- import { assert, assertEq } from "../asserts/module.f.js";
2
- import { pure } from "../effects/module.f.js";
3
- import { defaultNodeProgramOptions, emptyState, virtual } from "../effects/node/virtual/module.f.js";
4
- import { main } from "./module.f.js";
1
+ import { assert, assertEq } from './asserts/module.f.js';
2
+ import { pure } from './effects/module.f.js';
3
+ import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.js';
4
+ import { main } from './module.f.js';
5
5
  const makeOptions = (args) => ({ ...defaultNodeProgramOptions, args });
6
6
  const run = (root) => (args) => virtual({ ...emptyState, root })(main(makeOptions(args)));
7
7
  const appMain = ({ args }) => pure(args.length);
@@ -25,6 +25,8 @@ export const proof = {
25
25
  mcp: () => {
26
26
  // stdin is empty in the virtual environment, so the server sees EOF
27
27
  // immediately and shuts down cleanly, exercising the `mcp` handler.
28
+ // The store is empty too, so `casMcpServer`'s Evo cache scan
29
+ // (`initEvo`) also runs and finds nothing.
28
30
  const [, code] = run({})(['mcp']);
29
31
  assertEq(code, 0);
30
32
  },