functionalscript 0.37.0 → 0.39.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 (517) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  3. package/fjs/asserts/module.f.d.ts +36 -0
  4. package/fjs/asserts/module.f.js +39 -0
  5. package/fjs/asserts/proof.f.d.ts +11 -0
  6. package/fjs/asserts/proof.f.js +18 -0
  7. package/{fs → fjs}/base_n/proof.f.js +12 -36
  8. package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
  9. package/{fs → fjs}/basen/base64/proof.f.js +15 -1
  10. package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
  11. package/fjs/bnf/data/module.f.d.ts +52 -0
  12. package/{fs → fjs}/bnf/data/module.f.js +53 -3
  13. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  14. package/{fs → fjs}/bnf/data/proof.f.js +54 -19
  15. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  16. package/fjs/bnf/descent/module.f.js +124 -0
  17. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  18. package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
  19. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  20. package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
  21. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  22. package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
  23. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  24. package/{fs → fjs}/bnf/module.f.js +10 -11
  25. package/fjs/bnf/proof.f.js +69 -0
  26. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  27. package/fjs/bnf/token_symbol/module.f.d.ts +38 -0
  28. package/fjs/bnf/token_symbol/module.f.js +48 -0
  29. package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
  30. package/fjs/bnf/token_symbol/proof.f.js +37 -0
  31. package/{fs → fjs}/cas/cli/module.f.js +6 -9
  32. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  33. package/{fs → fjs}/cas/cli/proof.f.js +29 -66
  34. package/fjs/cas/evo/mcp/module.f.d.ts +27 -0
  35. package/fjs/cas/evo/mcp/module.f.js +94 -0
  36. package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
  37. package/fjs/cas/evo/mcp/proof.f.js +126 -0
  38. package/fjs/cas/evo/module.f.d.ts +202 -0
  39. package/fjs/cas/evo/module.f.js +421 -0
  40. package/fjs/cas/evo/proof.f.d.ts +39 -0
  41. package/fjs/cas/evo/proof.f.js +572 -0
  42. package/fjs/cas/mcp/module.f.d.ts +49 -0
  43. package/{fs → fjs}/cas/mcp/module.f.js +61 -81
  44. package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
  45. package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
  46. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  47. package/{fs → fjs}/cas/module.f.js +89 -36
  48. package/fjs/cas/proof.f.d.ts +18 -0
  49. package/fjs/cas/proof.f.js +305 -0
  50. package/{fs → fjs}/ci/bun/module.f.js +3 -3
  51. package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
  52. package/{fs → fjs}/ci/common/module.f.js +1 -5
  53. package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
  54. package/{fs → fjs}/ci/config/module.f.js +8 -8
  55. package/{fs → fjs}/ci/deno/module.f.js +3 -3
  56. package/{fs → fjs}/ci/module.f.js +3 -4
  57. package/{fs → fjs}/ci/node/module.f.js +11 -9
  58. package/{fs → fjs}/ci/proof.f.js +16 -9
  59. package/{fs → fjs}/ci/rust/module.f.js +9 -1
  60. package/{fs → fjs}/cli/module.f.js +2 -2
  61. package/{fs → fjs}/cli/proof.f.js +22 -63
  62. package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
  63. package/fjs/common/monoid/module.f.js +88 -0
  64. package/fjs/common/monoid/proof.f.d.ts +9 -0
  65. package/fjs/common/monoid/proof.f.js +48 -0
  66. package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
  67. package/fjs/crypto/pow/proof.f.js +111 -0
  68. package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
  69. package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
  70. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  71. package/{fs → fjs}/crypto/sign/module.f.js +7 -4
  72. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  73. package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
  74. package/{fs → fjs}/dev/module.f.js +25 -25
  75. package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
  76. package/{fs → fjs}/dev/proof.f.js +2 -4
  77. package/{fs → fjs}/djs/ast/proof.f.js +4 -12
  78. package/{fs → fjs}/djs/module.f.js +5 -8
  79. package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
  80. package/{fs → fjs}/djs/parser/module.f.js +37 -0
  81. package/{fs → fjs}/djs/parser/proof.f.js +138 -400
  82. package/{fs → fjs}/djs/proof.f.js +13 -36
  83. package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
  84. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  85. package/fjs/djs/tokenizer/module.f.js +472 -0
  86. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  87. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
  88. package/{fs → fjs}/djs/transpiler/module.f.js +6 -6
  89. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  90. package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
  91. package/fjs/effects/eff/module.f.d.ts +72 -0
  92. package/fjs/effects/eff/module.f.js +46 -0
  93. package/fjs/effects/eff/proof.f.d.ts +11 -0
  94. package/fjs/effects/eff/proof.f.js +58 -0
  95. package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
  96. package/{fs → fjs}/effects/list/module.f.js +2 -1
  97. package/{fs → fjs}/effects/memory/proof.f.js +15 -29
  98. package/fjs/effects/module.f.d.ts +388 -0
  99. package/fjs/effects/module.f.js +288 -0
  100. package/{fs → fjs}/effects/node/memory/proof.js +7 -13
  101. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  102. package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
  103. package/{fs → fjs}/effects/node/module.f.js +9 -11
  104. package/{fs → fjs}/effects/node/module.js +3 -3
  105. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  106. package/{fs → fjs}/effects/node/proof.f.js +121 -299
  107. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
  108. package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
  109. package/fjs/effects/proof.f.d.ts +51 -0
  110. package/fjs/effects/proof.f.js +178 -0
  111. package/{fs → fjs}/emergent_testing/module.f.js +55 -39
  112. package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
  113. package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
  114. package/{fs → fjs}/fsc/proof.f.js +12 -34
  115. package/{fs → fjs}/fsm/proof.f.js +5 -12
  116. package/{fs → fjs}/mcp/module.f.d.ts +7 -0
  117. package/{fs → fjs}/mcp/module.f.js +17 -10
  118. package/{fs → fjs}/mcp/proof.f.js +17 -16
  119. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  120. package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
  121. package/{fs → fjs}/media/html/proof.f.js +12 -33
  122. package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
  123. package/{fs → fjs}/media/json/parser/module.f.js +14 -0
  124. package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
  125. package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
  126. package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
  127. package/{fs → fjs}/media/json/schema/module.f.js +23 -39
  128. package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
  129. package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
  130. package/{fs → fjs}/media/module.f.d.ts +6 -6
  131. package/{fs → fjs}/media/module.f.js +3 -4
  132. package/{fs → fjs}/media/proof.f.js +5 -4
  133. package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
  134. package/{fs → fjs}/media/revision/module.f.js +35 -23
  135. package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
  136. package/fjs/media/revision/proof.f.js +140 -0
  137. package/{fs → fjs}/media/type/module.f.js +2 -2
  138. package/{fs → fjs}/media/type/proof.f.js +8 -15
  139. package/{fs → fjs}/module.f.js +5 -9
  140. package/{fs → fjs}/path/proof.f.js +27 -78
  141. package/{fs → fjs}/proof.f.js +2 -0
  142. package/{fs → fjs}/sul/id/proof.f.js +7 -21
  143. package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
  144. package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
  145. package/fjs/text/ascii/proof.f.d.ts +6 -0
  146. package/{fs → fjs}/text/ascii/proof.f.js +4 -14
  147. package/{fs → fjs}/text/code_point/module.f.js +10 -10
  148. package/{fs → fjs}/text/proof.f.js +4 -9
  149. package/{fs → fjs}/text/sgr/proof.f.js +6 -15
  150. package/{fs → fjs}/text/utf16/module.f.js +1 -1
  151. package/{fs → fjs}/text/utf16/proof.f.js +23 -66
  152. package/{fs → fjs}/text/utf8/proof.f.js +56 -125
  153. package/{fs → fjs}/types/array/proof.f.js +18 -52
  154. package/fjs/types/bigfloat/proof.f.js +217 -0
  155. package/{fs → fjs}/types/bigint/module.f.js +4 -3
  156. package/{fs → fjs}/types/bigint/proof.f.js +49 -145
  157. package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
  158. package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
  159. package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
  160. package/{fs → fjs}/types/btree/proof.f.js +5 -12
  161. package/{fs → fjs}/types/btree/remove/module.f.d.ts +5 -0
  162. package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
  163. package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
  164. package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
  165. package/{fs → fjs}/types/btree/set/module.f.js +5 -2
  166. package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
  167. package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
  168. package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
  169. package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
  170. package/{fs → fjs}/types/function/proof.f.js +2 -3
  171. package/{fs → fjs}/types/list/module.f.d.ts +21 -0
  172. package/{fs → fjs}/types/list/module.f.js +17 -0
  173. package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
  174. package/{fs → fjs}/types/list/proof.f.js +79 -164
  175. package/{fs → fjs}/types/map/proof.f.js +4 -12
  176. package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
  177. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  178. package/fjs/types/nullable/proof.f.js +29 -0
  179. package/{fs → fjs}/types/number/module.f.js +2 -1
  180. package/{fs → fjs}/types/number/proof.f.js +9 -24
  181. package/{fs → fjs}/types/object/proof.f.js +3 -6
  182. package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
  183. package/{fs → fjs}/types/prime_field/module.f.js +2 -7
  184. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  185. package/fjs/types/range/module.f.js +2 -0
  186. package/fjs/types/range/proof.f.js +9 -0
  187. package/{fs → fjs}/types/range_map/proof.f.js +28 -81
  188. package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
  189. package/fjs/types/result/proof.f.js +31 -0
  190. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  191. package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
  192. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  193. package/fjs/types/rtti/common/proof.f.js +51 -0
  194. package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
  195. package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
  196. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  197. package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
  198. package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
  199. package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
  200. package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
  201. package/{fs → fjs}/types/string/module.f.js +10 -2
  202. package/fjs/types/string/proof.f.js +77 -0
  203. package/fjs/types/string_set/proof.f.js +43 -0
  204. package/{fs → fjs}/types/ts/proof.f.js +15 -42
  205. package/{fs → fjs}/types/uint8array/module.f.js +7 -7
  206. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  207. package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
  208. package/{fs → fjs}/website/module.f.js +2 -3
  209. package/{fs → fjs}/website/proof.f.js +3 -6
  210. package/package.json +8 -8
  211. package/fs/asserts/module.f.d.ts +0 -4
  212. package/fs/asserts/module.f.js +0 -9
  213. package/fs/asserts/proof.f.d.ts +0 -8
  214. package/fs/asserts/proof.f.js +0 -51
  215. package/fs/bnf/data/module.f.d.ts +0 -30
  216. package/fs/bnf/descent/module.f.js +0 -119
  217. package/fs/bnf/proof.f.js +0 -104
  218. package/fs/cas/mcp/module.f.d.ts +0 -36
  219. package/fs/cas/proof.f.d.ts +0 -20
  220. package/fs/cas/proof.f.js +0 -294
  221. package/fs/common/monoid/module.f.js +0 -44
  222. package/fs/common/monoid/proof.f.d.ts +0 -4
  223. package/fs/common/monoid/proof.f.js +0 -27
  224. package/fs/crypto/pow/proof.f.js +0 -161
  225. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  226. package/fs/djs/tokenizer/module.f.js +0 -62
  227. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  228. package/fs/djs/tokenizer/proof.f.js +0 -543
  229. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  230. package/fs/djs/tokenizer-new/module.f.js +0 -155
  231. package/fs/effects/module.f.d.ts +0 -106
  232. package/fs/effects/module.f.js +0 -80
  233. package/fs/effects/proof.f.d.ts +0 -25
  234. package/fs/effects/proof.f.js +0 -115
  235. package/fs/media/revision/proof.f.js +0 -119
  236. package/fs/text/ascii/proof.f.d.ts +0 -4
  237. package/fs/types/bigfloat/proof.f.js +0 -348
  238. package/fs/types/nullable/proof.f.js +0 -50
  239. package/fs/types/range/module.f.js +0 -2
  240. package/fs/types/range/proof.f.js +0 -18
  241. package/fs/types/result/proof.f.js +0 -52
  242. package/fs/types/string/proof.f.js +0 -118
  243. package/fs/types/string_set/proof.f.js +0 -82
  244. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  245. /package/{fs → fjs}/asn.1/module.f.js +0 -0
  246. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  247. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  248. /package/{fs → fjs}/base_n/module.f.js +0 -0
  249. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  250. /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
  251. /package/{fs → fjs}/basen/base128/module.f.js +0 -0
  252. /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
  253. /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
  254. /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
  255. /package/{fs → fjs}/basen/base64/module.f.js +0 -0
  256. /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
  257. /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
  258. /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
  259. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  260. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  261. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  262. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  263. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  264. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  265. /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
  266. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  267. /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
  268. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  269. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  270. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  271. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  272. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  273. /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
  274. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  275. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  276. /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
  277. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  278. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  279. /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
  280. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  281. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  282. /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
  283. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  284. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  285. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  286. /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
  287. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  288. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  289. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  290. /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
  291. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  292. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  293. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  294. /package/{fs → fjs}/djs/ast/module.f.js +0 -0
  295. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  296. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  297. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  298. /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
  299. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  300. /package/{fs → fjs}/djs/module.f.d.ts +0 -0
  301. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  302. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  303. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  304. /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
  305. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  306. /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
  307. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  308. /package/{fs → fjs}/effects/memory/module.f.js +0 -0
  309. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  310. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  311. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  312. /package/{fs → fjs}/effects/module.d.ts +0 -0
  313. /package/{fs → fjs}/effects/module.js +0 -0
  314. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  315. /package/{fs → fjs}/effects/node/memory/module.js +0 -0
  316. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  317. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  318. /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
  319. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  320. /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
  321. /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
  322. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  323. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  324. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  325. /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
  326. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  327. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  328. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  329. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  330. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  331. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  332. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  333. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  334. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  335. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  336. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  337. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  338. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  339. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  340. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  341. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  342. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  343. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  344. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  345. /package/{fs → fjs}/fsc/bnf.f.js +0 -0
  346. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  347. /package/{fs → fjs}/fsc/json.f.js +0 -0
  348. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/fsc/module.f.js +0 -0
  350. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  351. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  352. /package/{fs → fjs}/fsm/module.f.js +0 -0
  353. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  355. /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
  356. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
  358. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  359. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
  361. /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/media/html/module.f.js +0 -0
  363. /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
  364. /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
  365. /package/{fs → fjs}/media/json/module.f.js +0 -0
  366. /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/media/json/proof.f.js +0 -0
  369. /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
  370. /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
  371. /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
  372. /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
  373. /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
  374. /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
  375. /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
  376. /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
  377. /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
  378. /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
  379. /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
  380. /package/{fs → fjs}/media/proof.f.d.ts +0 -0
  381. /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/module.d.ts +0 -0
  384. /package/{fs → fjs}/module.f.d.ts +0 -0
  385. /package/{fs → fjs}/module.js +0 -0
  386. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  387. /package/{fs → fjs}/path/module.f.js +0 -0
  388. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  389. /package/{fs → fjs}/proof.f.d.ts +0 -0
  390. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  391. /package/{fs → fjs}/sul/id/module.f.js +0 -0
  392. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  393. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  394. /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
  395. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  396. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  397. /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
  398. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  399. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  400. /package/{fs → fjs}/sul/module.f.js +0 -0
  401. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  402. /package/{fs → fjs}/sul/proof.f.js +0 -0
  403. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  404. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  405. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  406. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  407. /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
  408. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  409. /package/{fs → fjs}/text/module.f.js +0 -0
  410. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/text/sgr/module.f.js +0 -0
  413. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  415. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  416. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  417. /package/{fs → fjs}/text/utf8/module.f.js +0 -0
  418. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  419. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  420. /package/{fs → fjs}/types/array/module.f.js +0 -0
  421. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  422. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  423. /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
  424. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  425. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  426. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
  431. /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
  432. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  433. /package/{fs → fjs}/types/btree/module.f.js +0 -0
  434. /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  437. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  439. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
  441. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  442. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  443. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  444. /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/types/function/module.f.js +0 -0
  447. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  449. /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/map/module.f.js +0 -0
  453. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  456. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  459. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/nullable/module.f.js +0 -0
  462. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  466. /package/{fs → fjs}/types/object/module.f.js +0 -0
  467. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  469. /package/{fs → fjs}/types/option/module.f.js +0 -0
  470. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  471. /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
  472. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
  474. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  475. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  476. /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  478. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  479. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  481. /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
  482. /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/range_map/module.f.js +0 -0
  485. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  487. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/result/module.f.js +0 -0
  489. /package/{fs → fjs}/types/result/module.js +0 -0
  490. /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/rtti/module.f.js +0 -0
  492. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  494. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  496. /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
  497. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  498. /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
  499. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  502. /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
  503. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  504. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
  506. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  508. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/string_set/module.f.js +0 -0
  511. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  514. /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  517. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -1,25 +1,20 @@
1
1
  import { arrayWrap, boolSerialize, numberSerialize, objectWrap, stringSerialize } from './module.f.js';
2
2
  import * as list from '../../../types/list/module.f.js';
3
+ import { assertEq } from '../../../asserts/module.f.js';
3
4
  const { toArray } = list;
4
5
  export const proof = {
5
6
  arrayWrap: [
6
7
  () => {
7
8
  const result = JSON.stringify(toArray(arrayWrap(null)));
8
- if (result !== '["[","]"]') {
9
- throw result;
10
- }
9
+ assertEq(result, '["[","]"]');
11
10
  },
12
11
  () => {
13
12
  const result = JSON.stringify(toArray(arrayWrap([['a', 'b']])));
14
- if (result !== '["[","a","b","]"]') {
15
- throw result;
16
- }
13
+ assertEq(result, '["[","a","b","]"]');
17
14
  },
18
15
  () => {
19
16
  const result = JSON.stringify(toArray(arrayWrap([['a'], ['b']])));
20
- if (result !== '["[","a",",","b","]"]') {
21
- throw result;
22
- }
17
+ assertEq(result, '["[","a",",","b","]"]');
23
18
  }
24
19
  ],
25
20
  objectWrap: [
@@ -45,43 +40,31 @@ export const proof = {
45
40
  stringSerialize: [
46
41
  () => {
47
42
  const result = JSON.stringify(toArray(stringSerialize('abc')));
48
- if (result !== '["\\"abc\\""]') {
49
- throw result;
50
- }
43
+ assertEq(result, '["\\"abc\\""]');
51
44
  },
52
45
  () => {
53
46
  const result = JSON.stringify(toArray(stringSerialize('123')));
54
- if (result !== '["\\"123\\""]') {
55
- throw result;
56
- }
47
+ assertEq(result, '["\\"123\\""]');
57
48
  }
58
49
  ],
59
50
  numberSerialize: [
60
51
  () => {
61
52
  const result = JSON.stringify(toArray(numberSerialize(123)));
62
- if (result !== '["123"]') {
63
- throw result;
64
- }
53
+ assertEq(result, '["123"]');
65
54
  },
66
55
  () => {
67
56
  const result = JSON.stringify(toArray(numberSerialize(10e20)));
68
- if (result !== '["1e+21"]') {
69
- throw result;
70
- }
57
+ assertEq(result, '["1e+21"]');
71
58
  }
72
59
  ],
73
60
  boolSerialize: [
74
61
  () => {
75
62
  const result = JSON.stringify(toArray(boolSerialize(false)));
76
- if (result !== '["false"]') {
77
- throw result;
78
- }
63
+ assertEq(result, '["false"]');
79
64
  },
80
65
  () => {
81
66
  const result = JSON.stringify(toArray(boolSerialize(true)));
82
- if (result !== '["true"]') {
83
- throw result;
84
- }
67
+ assertEq(result, '["true"]');
85
68
  }
86
69
  ]
87
70
  };
@@ -2,15 +2,15 @@
2
2
  * Media-type detection entry point: dialect-tagged JSON recognition layered
3
3
  * on top of the byte-signature / UTF-8 detector.
4
4
  *
5
- * `fs/media/type` classifies raw bytes (magic-byte signatures, UTF-8
5
+ * `fjs/media/type` classifies raw bytes (magic-byte signatures, UTF-8
6
6
  * text-vs-binary) with no notion of a JSON dialect. `detect` here adds one
7
7
  * more classification step in front of it: when the whole blob is
8
- * whole-blob-valid UTF-8 text (as `fs/media/type` already determined), try
8
+ * whole-blob-valid UTF-8 text (as `fjs/media/type` already determined), try
9
9
  * parsing it as JSON and validating it against a known dialect's rtti schema
10
- * (currently just `vnd.fjs.revision` — see `fs/media/revision`). A match
10
+ * (currently just `vnd.fjs.revision` — see `fjs/media/revision`). A match
11
11
  * reports the dialect's derived media type; anything that isn't valid JSON,
12
12
  * or doesn't validate against a known dialect, falls through to the
13
- * `fs/media/type` verdict unchanged.
13
+ * `fjs/media/type` verdict unchanged.
14
14
  *
15
15
  * Detection is semantic, not syntactic: any JSON that satisfies a dialect's
16
16
  * schema is recognized regardless of key order, whitespace, or any other
@@ -21,7 +21,7 @@
21
21
  * form), because dialect validation needs the whole parsed value. A single
22
22
  * `Vec` already caps at `maxLength` bits (128 KiB — the same bound as the
23
23
  * existing inline-content cap), so dialect detection is naturally
24
- * size-bounded. The unbounded streaming detector (`fs/media/type`
24
+ * size-bounded. The unbounded streaming detector (`fjs/media/type`
25
25
  * `detectStream`) is untouched and stays a pure byte-signature/UTF-8
26
26
  * classifier with no dialect awareness.
27
27
  *
@@ -31,7 +31,7 @@ import type { Vec } from '../types/bit_vec/module.f.ts';
31
31
  import { type DetectMeta } from './type/module.f.ts';
32
32
  /**
33
33
  * Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
34
- * type }` shape as `fs/media/type` `detectVec`, but with dialect-tagged JSON
34
+ * type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
35
35
  * recognized ahead of the plain `text/plain` fallback.
36
36
  */
37
37
  export declare const detect: (bytes: Vec) => DetectMeta;
@@ -1,10 +1,10 @@
1
1
  import { fromVec } from '../text/utf8/module.f.js';
2
2
  import { detectVec } from './type/module.f.js';
3
3
  import { decodeText as decodeRevisionText, mediaType as revisionMediaType } from './revision/module.f.js';
4
- import { assert } from '../asserts/module.f.js';
4
+ import { assertNotNullish } from '../asserts/module.f.js';
5
5
  /**
6
6
  * Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
7
- * type }` shape as `fs/media/type` `detectVec`, but with dialect-tagged JSON
7
+ * type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
8
8
  * recognized ahead of the plain `text/plain` fallback.
9
9
  */
10
10
  export const detect = (bytes) => {
@@ -14,11 +14,10 @@ export const detect = (bytes) => {
14
14
  if (base.type !== 'text') {
15
15
  return base;
16
16
  }
17
- const text = fromVec(bytes);
18
17
  // `detectVec`'s `type: 'text'` verdict already means `bytes` is byte-aligned,
19
18
  // whole-blob-valid UTF-8 — the same two conditions `fromVec` checks, via the
20
19
  // same decoder — so `fromVec` cannot return `null` here.
21
- assert(text !== null, 'detect: type text implies fromVec succeeds');
20
+ const text = assertNotNullish(fromVec(bytes), 'detect: type text implies fromVec succeeds');
22
21
  const [tag] = decodeRevisionText(text);
23
22
  return tag === 'ok' ? { ...base, mime_type: revisionMediaType } : base;
24
23
  };
@@ -4,7 +4,7 @@ import { detect } from './module.f.js';
4
4
  import { dialect } from './revision/module.f.js';
5
5
  // All test strings here are ASCII, so char code === UTF-8 byte value.
6
6
  const utf8Bytes = (s) => u8ListToVec(msb)([...s].map(c => c.charCodeAt(0)));
7
- const revisionJson = `{"dialect":"${dialect}","subject":"8","parents":[]}`;
7
+ const revisionJson = `{"dialect":"${dialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`;
8
8
  export const proof = {
9
9
  // A valid revision blob is recognized and reported under its derived media type.
10
10
  validRevision: () => {
@@ -15,12 +15,13 @@ export const proof = {
15
15
  // Key order carries no meaning: a valid revision whose `dialect` key is
16
16
  // not first must still be detected.
17
17
  keyOrderIndependent: () => {
18
- const text = `{"parents":[],"subject":"8","dialect":"${dialect}"}`;
18
+ const text = `{"parents":[],"subject":"8","dialect":"${dialect}","snapshot":"8","generation":0}`;
19
19
  const m = detect(utf8Bytes(text));
20
20
  assertEq(m.mime_type, 'application/vnd.fjs.revision+json');
21
21
  },
22
- // Structurally invalid revision (bad multi-parent snapshot rule) falls
23
- // through to the ordinary text/plain classification.
22
+ // A revision missing a required field (here `snapshot` and `generation`)
23
+ // fails validation and falls through to the ordinary text/plain
24
+ // classification.
24
25
  invalidRevisionFallsThrough: () => {
25
26
  const text = `{"dialect":"${dialect}","subject":"8","parents":["8","r"]}`;
26
27
  const m = detect(utf8Bytes(text));
@@ -28,19 +28,46 @@ export declare const revisionSchema: {
28
28
  readonly dialect: "vnd.fjs.revision";
29
29
  readonly subject: import("../../types/rtti/module.f.ts").String;
30
30
  readonly parents: import("../../types/rtti/module.f.ts").Type1<"array", import("../../types/rtti/module.f.ts").String>;
31
- readonly snapshot: import("../../types/rtti/module.f.ts").Or<readonly [import("../../types/rtti/module.f.ts").String, undefined]>;
32
- readonly generation: import("../../types/rtti/module.f.ts").Or<readonly [import("../../types/rtti/module.f.ts").Number, undefined]>;
31
+ readonly snapshot: import("../../types/rtti/module.f.ts").String;
32
+ readonly generation: import("../../types/rtti/module.f.ts").Number;
33
33
  readonly archived: import("../../types/rtti/module.f.ts").Or<readonly [true, undefined]>;
34
34
  };
35
35
  /** The TypeScript type derived from {@link revisionSchema} — the single source of truth. */
36
36
  export type Revision = Ts<typeof revisionSchema>;
37
37
  /** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
38
38
  export declare const isHash: (s: string) => boolean;
39
- /** Either a structural validation error or a semantic (snapshot-reference) error message. */
39
+ /** Either a structural validation error or a semantic (hash / generation) error message. */
40
40
  export type RevisionError = ValidationError | string;
41
+ /**
42
+ * Checks the semantic refinements the structural schema can't express on an
43
+ * already shape-valid revision: every `parents` entry and the `snapshot` must
44
+ * decode as a cbase32 hash ({@link isHash}), and `generation` must be a
45
+ * non-negative *safe* integer. `subject` is not checked — it is an identity
46
+ * string, never a snapshot reference, so any string is valid.
47
+ *
48
+ * `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
49
+ * or above `2 ** 53` passes `isInteger` but is no longer uniquely
50
+ * representable, so `1 + max(parents' generations)` — how a writer derives the
51
+ * next generation — can round back to the parent's value and fail to advance.
52
+ * Rejecting unsafe integers keeps stored generations exact.
53
+ *
54
+ * Both `snapshot` and `generation` are required by the schema, so no absence
55
+ * ever has to be resolved here: a revision states its content and its
56
+ * generation explicitly, and is fully interpretable in isolation (see the
57
+ * README). The former snapshot-resolution algorithm (subject-as-fallback,
58
+ * single-parent inheritance, multi-parent rejection) is gone.
59
+ *
60
+ * Exported separately from {@link validate} for callers that assemble a
61
+ * `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
62
+ * `addRevision`): the shape is then guaranteed by TypeScript already, so only
63
+ * these semantic (string-only error) checks are worth re-running — routing
64
+ * through the combined structural-plus-semantic `validate` would add an
65
+ * unreachable structural-error branch on the caller's side.
66
+ */
67
+ export declare const checkReferences: (r: Revision) => Result<Revision, string>;
41
68
  /**
42
69
  * Validates an already-parsed JSON value as a `revision` BLOB: structural
43
- * (rtti) validation followed by the snapshot-reference semantic checks.
70
+ * (rtti) validation followed by the hash / generation semantic checks.
44
71
  */
45
72
  export declare const validate: (value: Unknown) => Result<Revision, RevisionError>;
46
73
  /**
@@ -47,45 +47,57 @@ export const revisionSchema = {
47
47
  dialect,
48
48
  subject: string,
49
49
  parents: array(hash),
50
- snapshot: option(hash),
51
- generation: option(number),
50
+ snapshot: hash,
51
+ generation: number,
52
52
  archived: option(true),
53
53
  };
54
- /** Structural-only validator: checks the shape, not the snapshot-reference semantics. */
54
+ /** Structural-only validator: checks the shape, not the hash / generation semantics. */
55
55
  const validateShape = rttiValidate(revisionSchema);
56
56
  /** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
57
57
  export const isHash = (s) => cBase32ToVec(s) !== null;
58
58
  /**
59
- * Checks the snapshot-reference semantics of an already shape-valid revision:
60
- * every parent must be a hash; `snapshot`, when present, must be a hash;
61
- * when `snapshot` is absent, zero parents fall back to `subject` (which must
62
- * then be a hash), exactly one parent inherits that parent's snapshot, and
63
- * more than one parent without an explicit `snapshot` is invalid — there is
64
- * no single parent snapshot to inherit, and falling back to `subject` would
65
- * silently lose the merge result.
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.
66
83
  */
67
- const checkReferences = (r) => {
84
+ export const checkReferences = (r) => {
68
85
  for (const p of r.parents) {
69
86
  if (!isHash(p)) {
70
87
  return error(`parent is not a valid hash: ${p}`);
71
88
  }
72
89
  }
73
- if (r.snapshot !== undefined) {
74
- return isHash(r.snapshot) ? ok(r) : error(`snapshot is not a valid hash: ${r.snapshot}`);
75
- }
76
- if (r.parents.length === 0) {
77
- return isHash(r.subject)
78
- ? ok(r)
79
- : error(`subject must be a valid hash when snapshot is absent and there are no parents: ${r.subject}`);
90
+ if (!isHash(r.snapshot)) {
91
+ return error(`snapshot is not a valid hash: ${r.snapshot}`);
80
92
  }
81
- if (r.parents.length === 1) {
82
- return ok(r);
93
+ if (!Number.isSafeInteger(r.generation) || r.generation < 0) {
94
+ return error(`generation must be a non-negative safe integer: ${r.generation}`);
83
95
  }
84
- return error('snapshot is required when a revision has more than one parent');
96
+ return ok(r);
85
97
  };
86
98
  /**
87
99
  * Validates an already-parsed JSON value as a `revision` BLOB: structural
88
- * (rtti) validation followed by the snapshot-reference semantic checks.
100
+ * (rtti) validation followed by the hash / generation semantic checks.
89
101
  */
90
102
  export const validate = (value) => {
91
103
  const [t, v] = validateShape(value);
@@ -94,7 +106,7 @@ export const validate = (value) => {
94
106
  }
95
107
  return checkReferences(v);
96
108
  };
97
- /** Parses `text` as JSON without relying on `JSON.parse` (the shared `fs/media/json` parser/tokenizer). */
109
+ /** Parses `text` as JSON without relying on `JSON.parse` (the shared `fjs/media/json` parser/tokenizer). */
98
110
  const parseJson = (text) => jsonParse(jsonTokenize(stringToList(text)));
99
111
  /**
100
112
  * Decodes `text` as a `revision` BLOB: JSON-parses it, then validates it per
@@ -6,15 +6,17 @@ export declare const proof: {
6
6
  arbitraryStringRejected: () => void;
7
7
  };
8
8
  validate: {
9
- firstRevisionFallsBackToSubjectHash: () => void;
10
- firstRevisionRejectsNonHashSubject: () => void;
11
- explicitSnapshotAllowsArbitrarySubject: () => void;
12
- singleParentInheritsSnapshot: () => void;
13
- multiParentWithoutSnapshotRejected: () => void;
14
- multiParentWithSnapshotAccepted: () => void;
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;
15
19
  httpsRejectedInParents: () => void;
16
- httpsRejectedInSnapshot: () => void;
17
- httpsRejectedAsFallbackSubject: () => void;
18
20
  archivedAccepted: () => void;
19
21
  wrongDialectRejected: () => void;
20
22
  missingSubjectRejected: () => void;
@@ -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
+ };
@@ -34,7 +34,7 @@
34
34
  */
35
35
  import { msb, fromSentinel, length, u8List } from '../../types/bit_vec/module.f.js';
36
36
  import { iterable } from '../../types/list/module.f.js';
37
- import { pure } from '../../effects/module.f.js';
37
+ import { pure, step } from '../../effects/module.f.js';
38
38
  import { ok, error } from '../../types/result/module.f.js';
39
39
  import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.js';
40
40
  import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.js';
@@ -216,7 +216,7 @@ export const detectVec = (bytes) => finish(push(detectInit)(bytes));
216
216
  * item short-circuits into the `IoResult` error.
217
217
  */
218
218
  export const detectStream = (stream) => {
219
- const loop = (s) => (l) => l.step((node) => {
219
+ const loop = (s) => (l) => step(l, (node) => {
220
220
  if (node === undefined) {
221
221
  return pure(ok(finish(s)));
222
222
  }
@@ -1,6 +1,6 @@
1
1
  import { assert, assertEq } from '../../asserts/module.f.js';
2
2
  import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.js';
3
- import { decode } from '../../effects/module.f.js';
3
+ import { runPure } from '../../effects/module.f.js';
4
4
  import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.js';
5
5
  import { ok } from '../../types/result/module.f.js';
6
6
  import { detect, detectStream, detectVec } from './module.f.js';
@@ -8,22 +8,14 @@ import { detect, detectStream, detectVec } from './module.f.js';
8
8
  // store would hold the leading bytes of a stored blob.
9
9
  const bytes = (...b) => u8ListToVec(msb)(b);
10
10
  // ── Streaming detector helpers ──────────────────────────────────────────────────
11
- // Evaluates a fully pure effect (no operations) to its result.
12
- const runPure = (e) => {
13
- const d = decode(e);
14
- if (!d.done) {
15
- throw 'effect is not pure';
16
- }
17
- return d.result;
18
- };
19
11
  // Builds a CAS-style read stream from a sequence of ok(chunk) items.
20
12
  const stream = (...chunks) => chunks.reduceRight((tail, c) => nonEmpty(ok(c), tail), emptyList());
21
13
  // Runs the streaming detector over the given chunks and unwraps the metadata.
22
14
  const detectChunks = (...chunks) => {
23
- const r = runPure(detectStream(stream(...chunks)));
24
- if (r[0] === 'error') {
25
- throw r[1];
26
- }
15
+ const o = runPure(detectStream(stream(...chunks)));
16
+ assert(o.length === 1, 'effect is not pure');
17
+ const [r] = o;
18
+ assert(r[0] !== 'error', r[1]);
27
19
  return r[1];
28
20
  };
29
21
  export const proof = {
@@ -177,8 +169,9 @@ export const proof = {
177
169
  // A read `error` item short-circuits into the IoResult error.
178
170
  readErrorSurfaces: () => {
179
171
  const errStream = nonEmpty(['error', 'boom'], emptyList());
180
- const r = runPure(detectStream(errStream));
181
- assert(r[0] === 'error');
172
+ const o = runPure(detectStream(errStream));
173
+ assert(o.length === 1, 'effect is not pure');
174
+ assert(o[0][0] === 'error');
182
175
  },
183
176
  // Empty stream: zero-length text/plain.
184
177
  empty: () => {
@@ -10,7 +10,8 @@ import { main as ciMain } from './ci/module.f.js';
10
10
  import { import_ } from './effects/node/module.f.js';
11
11
  import { dispatch } from './cli/module.f.js';
12
12
  import { casMcpServer } from './cas/mcp/module.f.js';
13
- import { pure } from './effects/module.f.js';
13
+ import { pure, step } from './effects/module.f.js';
14
+ import { unwrap } from './types/result/module.f.js';
14
15
  const commands = [
15
16
  {
16
17
  names: ['test', 't'],
@@ -29,8 +30,8 @@ const commands = [
29
30
  },
30
31
  {
31
32
  names: ['mcp', 'm'],
32
- description: 'Run an MCP server over stdio exposing the CAS as tools',
33
- handler: ({ home }) => casMcpServer(home).step(() => pure(0)),
33
+ description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
34
+ handler: ({ home }) => step(casMcpServer(home), () => pure(0)),
34
35
  },
35
36
  {
36
37
  names: ['ci', 'i'],
@@ -42,12 +43,7 @@ const commands = [
42
43
  description: 'Run a FunctionalScript module as a NodeProgram',
43
44
  handler: options => {
44
45
  const [file, ...args] = options.args;
45
- return import_(file).step(([s, v]) => {
46
- if (s === 'error') {
47
- throw v;
48
- }
49
- return v.main({ ...options, args });
50
- });
46
+ return step(import_(file), x => unwrap(x).main({ ...options, args }));
51
47
  },
52
48
  },
53
49
  ];