functionalscript 0.37.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 (500) 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/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  28. package/{fs → fjs}/cas/cli/proof.f.js +29 -66
  29. package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
  30. package/fjs/cas/evo/mcp/module.f.js +56 -0
  31. package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
  32. package/fjs/cas/evo/mcp/proof.f.js +95 -0
  33. package/fjs/cas/evo/module.f.d.ts +138 -0
  34. package/fjs/cas/evo/module.f.js +309 -0
  35. package/fjs/cas/evo/proof.f.d.ts +32 -0
  36. package/fjs/cas/evo/proof.f.js +453 -0
  37. package/fjs/cas/mcp/module.f.d.ts +49 -0
  38. package/{fs → fjs}/cas/mcp/module.f.js +54 -76
  39. package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
  40. package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
  41. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  42. package/{fs → fjs}/cas/module.f.js +27 -1
  43. package/{fs → fjs}/cas/proof.f.d.ts +4 -0
  44. package/{fs → fjs}/cas/proof.f.js +77 -86
  45. package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
  46. package/{fs → fjs}/ci/config/module.f.js +5 -5
  47. package/{fs → fjs}/ci/proof.f.js +14 -9
  48. package/{fs → fjs}/ci/rust/module.f.js +9 -1
  49. package/{fs → fjs}/cli/proof.f.js +22 -63
  50. package/{fs → fjs}/common/monoid/proof.f.js +4 -9
  51. package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
  52. package/fjs/crypto/pow/proof.f.js +111 -0
  53. package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
  54. package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
  55. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  56. package/{fs → fjs}/crypto/sign/module.f.js +7 -4
  57. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  58. package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
  59. package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
  60. package/{fs → fjs}/dev/proof.f.js +2 -4
  61. package/{fs → fjs}/djs/ast/proof.f.js +4 -12
  62. package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
  63. package/{fs → fjs}/djs/parser/module.f.js +20 -0
  64. package/{fs → fjs}/djs/parser/proof.f.js +138 -400
  65. package/{fs → fjs}/djs/proof.f.js +13 -36
  66. package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
  67. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  68. package/fjs/djs/tokenizer/module.f.js +472 -0
  69. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  70. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
  71. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  72. package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
  73. package/{fs → fjs}/effects/memory/proof.f.js +8 -21
  74. package/{fs → fjs}/effects/node/memory/proof.js +5 -12
  75. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  76. package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
  77. package/{fs → fjs}/effects/node/module.js +3 -3
  78. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  79. package/{fs → fjs}/effects/node/proof.f.js +106 -292
  80. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
  81. package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
  82. package/{fs → fjs}/effects/proof.f.js +16 -45
  83. package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
  84. package/{fs → fjs}/fsc/proof.f.js +12 -34
  85. package/{fs → fjs}/fsm/proof.f.js +5 -12
  86. package/{fs → fjs}/mcp/module.f.d.ts +7 -0
  87. package/{fs → fjs}/mcp/module.f.js +9 -2
  88. package/{fs → fjs}/mcp/proof.f.js +12 -12
  89. package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
  90. package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
  91. package/{fs → fjs}/media/html/proof.f.js +12 -33
  92. package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
  93. package/{fs → fjs}/media/json/parser/module.f.js +14 -0
  94. package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
  95. package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
  96. package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
  97. package/{fs → fjs}/media/json/schema/module.f.js +23 -39
  98. package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
  99. package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
  100. package/{fs → fjs}/media/module.f.d.ts +6 -6
  101. package/{fs → fjs}/media/module.f.js +3 -4
  102. package/{fs → fjs}/media/proof.f.js +5 -4
  103. package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
  104. package/{fs → fjs}/media/revision/module.f.js +35 -23
  105. package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
  106. package/fjs/media/revision/proof.f.js +140 -0
  107. package/{fs → fjs}/media/type/proof.f.js +2 -6
  108. package/{fs → fjs}/module.f.js +1 -1
  109. package/{fs → fjs}/path/proof.f.js +27 -78
  110. package/{fs → fjs}/proof.f.js +2 -0
  111. package/{fs → fjs}/sul/id/proof.f.js +7 -21
  112. package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
  113. package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
  114. package/fjs/text/ascii/proof.f.d.ts +6 -0
  115. package/{fs → fjs}/text/ascii/proof.f.js +4 -14
  116. package/{fs → fjs}/text/code_point/module.f.js +10 -10
  117. package/{fs → fjs}/text/proof.f.js +4 -9
  118. package/{fs → fjs}/text/sgr/proof.f.js +6 -15
  119. package/{fs → fjs}/text/utf16/module.f.js +1 -1
  120. package/{fs → fjs}/text/utf16/proof.f.js +23 -66
  121. package/{fs → fjs}/text/utf8/proof.f.js +56 -125
  122. package/{fs → fjs}/types/array/proof.f.js +18 -52
  123. package/fjs/types/bigfloat/proof.f.js +217 -0
  124. package/{fs → fjs}/types/bigint/proof.f.js +49 -145
  125. package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
  126. package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
  127. package/{fs → fjs}/types/btree/proof.f.js +5 -12
  128. package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
  129. package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
  130. package/{fs → fjs}/types/btree/set/module.f.js +5 -2
  131. package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
  132. package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
  133. package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
  134. package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
  135. package/{fs → fjs}/types/function/proof.f.js +2 -3
  136. package/{fs → fjs}/types/list/proof.f.js +55 -163
  137. package/{fs → fjs}/types/map/proof.f.js +4 -12
  138. package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
  139. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  140. package/fjs/types/nullable/proof.f.js +29 -0
  141. package/{fs → fjs}/types/number/proof.f.js +9 -24
  142. package/{fs → fjs}/types/object/proof.f.js +3 -6
  143. package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
  144. package/{fs → fjs}/types/prime_field/module.f.js +2 -7
  145. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  146. package/fjs/types/range/module.f.js +2 -0
  147. package/fjs/types/range/proof.f.js +9 -0
  148. package/{fs → fjs}/types/range_map/proof.f.js +28 -81
  149. package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
  150. package/fjs/types/result/proof.f.js +31 -0
  151. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  152. package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
  153. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  154. package/fjs/types/rtti/common/proof.f.js +51 -0
  155. package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
  156. package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
  157. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  158. package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
  159. package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
  160. package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
  161. package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
  162. package/fjs/types/string/proof.f.js +77 -0
  163. package/fjs/types/string_set/proof.f.js +43 -0
  164. package/{fs → fjs}/types/ts/proof.f.js +15 -42
  165. package/{fs → fjs}/types/uint8array/module.f.js +7 -7
  166. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  167. package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
  168. package/{fs → fjs}/website/proof.f.js +3 -6
  169. package/package.json +6 -6
  170. package/fs/asserts/module.f.d.ts +0 -4
  171. package/fs/asserts/module.f.js +0 -9
  172. package/fs/asserts/proof.f.d.ts +0 -8
  173. package/fs/asserts/proof.f.js +0 -51
  174. package/fs/bnf/data/module.f.d.ts +0 -30
  175. package/fs/bnf/descent/module.f.js +0 -119
  176. package/fs/bnf/proof.f.js +0 -104
  177. package/fs/cas/mcp/module.f.d.ts +0 -36
  178. package/fs/crypto/pow/proof.f.js +0 -161
  179. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  180. package/fs/djs/tokenizer/module.f.js +0 -62
  181. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  182. package/fs/djs/tokenizer/proof.f.js +0 -543
  183. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  184. package/fs/djs/tokenizer-new/module.f.js +0 -155
  185. package/fs/media/revision/proof.f.js +0 -119
  186. package/fs/text/ascii/proof.f.d.ts +0 -4
  187. package/fs/types/bigfloat/proof.f.js +0 -348
  188. package/fs/types/nullable/proof.f.js +0 -50
  189. package/fs/types/range/module.f.js +0 -2
  190. package/fs/types/range/proof.f.js +0 -18
  191. package/fs/types/result/proof.f.js +0 -52
  192. package/fs/types/string/proof.f.js +0 -118
  193. package/fs/types/string_set/proof.f.js +0 -82
  194. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  195. /package/{fs → fjs}/asn.1/module.f.js +0 -0
  196. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  197. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  198. /package/{fs → fjs}/base_n/module.f.js +0 -0
  199. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  200. /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
  201. /package/{fs → fjs}/basen/base128/module.f.js +0 -0
  202. /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
  203. /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
  204. /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
  205. /package/{fs → fjs}/basen/base64/module.f.js +0 -0
  206. /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
  207. /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
  208. /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
  209. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  210. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  211. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  212. /package/{fs → fjs}/cas/cli/module.f.js +0 -0
  213. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  214. /package/{fs → fjs}/ci/bun/module.f.js +0 -0
  215. /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
  216. /package/{fs → fjs}/ci/common/module.f.js +0 -0
  217. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  218. /package/{fs → fjs}/ci/deno/module.f.js +0 -0
  219. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  220. /package/{fs → fjs}/ci/module.f.js +0 -0
  221. /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
  222. /package/{fs → fjs}/ci/node/module.f.js +0 -0
  223. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  224. /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
  225. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  226. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  227. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  228. /package/{fs → fjs}/cli/module.f.js +0 -0
  229. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  230. /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
  231. /package/{fs → fjs}/common/monoid/module.f.js +0 -0
  232. /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
  233. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  234. /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
  235. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  236. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  237. /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
  238. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  239. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  240. /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
  241. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  242. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  243. /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
  244. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  245. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  246. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  247. /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
  248. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  249. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  250. /package/{fs → fjs}/dev/module.f.js +0 -0
  251. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  252. /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
  253. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  254. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  255. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  256. /package/{fs → fjs}/djs/ast/module.f.js +0 -0
  257. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  258. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  259. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  260. /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
  261. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  262. /package/{fs → fjs}/djs/module.f.d.ts +0 -0
  263. /package/{fs → fjs}/djs/module.f.js +0 -0
  264. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  265. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  266. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  267. /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
  268. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  269. /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
  270. /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
  271. /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
  272. /package/{fs → fjs}/effects/list/module.f.js +0 -0
  273. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  274. /package/{fs → fjs}/effects/memory/module.f.js +0 -0
  275. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  276. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  277. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  278. /package/{fs → fjs}/effects/module.d.ts +0 -0
  279. /package/{fs → fjs}/effects/module.f.d.ts +0 -0
  280. /package/{fs → fjs}/effects/module.f.js +0 -0
  281. /package/{fs → fjs}/effects/module.js +0 -0
  282. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  283. /package/{fs → fjs}/effects/node/memory/module.js +0 -0
  284. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  285. /package/{fs → fjs}/effects/node/module.f.js +0 -0
  286. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  287. /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
  288. /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
  289. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  290. /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
  291. /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
  292. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  293. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  294. /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
  295. /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
  296. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  297. /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
  298. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  299. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  300. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  301. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  302. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  303. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  304. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  305. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  306. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  307. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  308. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  309. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  310. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  311. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  312. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  313. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  314. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  315. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  316. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  317. /package/{fs → fjs}/fsc/bnf.f.js +0 -0
  318. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  319. /package/{fs → fjs}/fsc/json.f.js +0 -0
  320. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  321. /package/{fs → fjs}/fsc/module.f.js +0 -0
  322. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  323. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  324. /package/{fs → fjs}/fsm/module.f.js +0 -0
  325. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  326. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  327. /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
  328. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  329. /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
  330. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  331. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  332. /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
  333. /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
  334. /package/{fs → fjs}/media/html/module.f.js +0 -0
  335. /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
  336. /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
  337. /package/{fs → fjs}/media/json/module.f.js +0 -0
  338. /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
  339. /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
  340. /package/{fs → fjs}/media/json/proof.f.js +0 -0
  341. /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
  342. /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
  343. /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
  344. /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
  345. /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
  346. /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
  347. /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
  348. /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
  350. /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
  351. /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
  352. /package/{fs → fjs}/media/proof.f.d.ts +0 -0
  353. /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
  354. /package/{fs → fjs}/media/type/module.f.js +0 -0
  355. /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
  356. /package/{fs → fjs}/module.d.ts +0 -0
  357. /package/{fs → fjs}/module.f.d.ts +0 -0
  358. /package/{fs → fjs}/module.js +0 -0
  359. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  360. /package/{fs → fjs}/path/module.f.js +0 -0
  361. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  362. /package/{fs → fjs}/proof.f.d.ts +0 -0
  363. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  364. /package/{fs → fjs}/sul/id/module.f.js +0 -0
  365. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  366. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  367. /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
  368. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  369. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  370. /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
  371. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  372. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  373. /package/{fs → fjs}/sul/module.f.js +0 -0
  374. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  375. /package/{fs → fjs}/sul/proof.f.js +0 -0
  376. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  377. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  378. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  379. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  380. /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
  381. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/text/module.f.js +0 -0
  383. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  384. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  385. /package/{fs → fjs}/text/sgr/module.f.js +0 -0
  386. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  387. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  388. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  389. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  390. /package/{fs → fjs}/text/utf8/module.f.js +0 -0
  391. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  392. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  393. /package/{fs → fjs}/types/array/module.f.js +0 -0
  394. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  395. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  396. /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
  397. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  398. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  399. /package/{fs → fjs}/types/bigint/module.f.js +0 -0
  400. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  401. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  402. /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
  403. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  404. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  405. /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
  406. /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
  407. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  408. /package/{fs → fjs}/types/btree/module.f.js +0 -0
  409. /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
  410. /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
  411. /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
  412. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  413. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  415. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  416. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  417. /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
  418. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  419. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  420. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  421. /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
  422. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  423. /package/{fs → fjs}/types/function/module.f.js +0 -0
  424. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  425. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  426. /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
  428. /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
  429. /package/{fs → fjs}/types/list/module.f.js +0 -0
  430. /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
  431. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  432. /package/{fs → fjs}/types/map/module.f.js +0 -0
  433. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  434. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  435. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  436. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  437. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  439. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  440. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  441. /package/{fs → fjs}/types/nullable/module.f.js +0 -0
  442. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  443. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  444. /package/{fs → fjs}/types/number/module.f.js +0 -0
  445. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  446. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  447. /package/{fs → fjs}/types/object/module.f.js +0 -0
  448. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  449. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/option/module.f.js +0 -0
  451. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
  453. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
  455. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  456. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  457. /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  459. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  460. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  462. /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
  463. /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/range_map/module.f.js +0 -0
  466. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  467. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  468. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  469. /package/{fs → fjs}/types/result/module.f.js +0 -0
  470. /package/{fs → fjs}/types/result/module.js +0 -0
  471. /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
  472. /package/{fs → fjs}/types/rtti/module.f.js +0 -0
  473. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  474. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  475. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  476. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  477. /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
  478. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  479. /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
  480. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  481. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  482. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
  484. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  485. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
  487. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  489. /package/{fs → fjs}/types/string/module.f.js +0 -0
  490. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  492. /package/{fs → fjs}/types/string_set/module.f.js +0 -0
  493. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  494. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  496. /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
  497. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  498. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  499. /package/{fs → fjs}/website/module.f.js +0 -0
  500. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Evo API: subjects and revision heads, cached in memory over an immutable
3
+ * content-addressable store.
4
+ *
5
+ * A `Cas<O>` stores `vnd.fjs.revision` blobs ([`fjs/media/revision`](../../media/revision/module.f.ts))
6
+ * like any other content: as immutable bytes under a hash. Resolving "what
7
+ * are the current heads of subject X" from that store means walking every
8
+ * stored revision and reversing the parent links — too expensive to redo on
9
+ * every query. This module scans the store once into an in-memory `Cache`
10
+ * ([`fjs/effects/memory`](../../effects/memory/module.f.ts)) mapping subject →
11
+ * head hashes, then keeps the cache current as new revisions are `add`ed
12
+ * through it — or, for a revision stored some other way (e.g. the generic
13
+ * `cas_add` MCP tool), via {@link syncRevision}.
14
+ *
15
+ * A **head** of a subject is any stored revision of that subject whose hash
16
+ * is not referenced as a `parents` entry by another revision of the same
17
+ * subject (see [`fjs/media/revision/README.md`](../../media/revision/README.md)).
18
+ * `Cache` therefore tracks, per subject, every revision hash seen and every
19
+ * hash referenced as somebody's parent; heads are the set difference between
20
+ * the two, computed at read time ({@link headsOf}). Storing both sets rather
21
+ * than a running head list is what makes folding revisions truly order
22
+ * independent: `cas.list()` (used by {@link buildCache} to scan an existing
23
+ * store) returns hashes in hash order, not revision ancestry, so a child can
24
+ * be seen before its parent — an incremental "drop this hash from the head
25
+ * set, then re-add whichever hash we just saw" would wrongly resurrect the
26
+ * parent as a head once it is scanned after its child. Tracking the two sets
27
+ * separately and only subtracting at read time has no such ordering
28
+ * dependency: whichever order revisions are folded in, `hashes − parents`
29
+ * converges to the same result. {@link buildCache} and {@link addRevision}
30
+ * both fold through the same {@link addRevisionToCache}, the former over the
31
+ * whole store at once, the latter incrementally for one new revision.
32
+ *
33
+ * @module
34
+ */
35
+ import { pure, foldStep } from '../../effects/module.f.js';
36
+ import { create, read, write } from '../../effects/memory/module.f.js';
37
+ import { collectRead } from '../module.f.js';
38
+ import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.js';
39
+ import { fromVec } from '../../text/utf8/module.f.js';
40
+ import { tryUtf8 } from '../../text/module.f.js';
41
+ import { decodeText, dialect, checkReferences, isHash } from '../../media/revision/module.f.js';
42
+ import { stringify } from '../../media/json/module.f.js';
43
+ import { identity } from '../../types/function/module.f.js';
44
+ import { ok, error } from '../../types/result/module.f.js';
45
+ import { nonEmpty, empty as elEmpty } from '../../effects/list/module.f.js';
46
+ import { at, definedEntries } from '../../types/object/module.f.js';
47
+ import { unwrap } from '../../types/nullable/module.f.js';
48
+ /** A cache with no known subjects yet — the starting point for {@link buildCache}. */
49
+ export const emptyCache = { bySubject: {} };
50
+ /** Canonical JSON encoder for a `Revision` — key order carries no meaning for detection. */
51
+ const toJson = stringify(identity);
52
+ const emptySubjectState = { hashes: [], parents: [] };
53
+ /** Adds every item of `items` to `set` that isn't already there, preserving `set`'s existing order. */
54
+ const union = (set) => (items) => items.reduce((acc, h) => acc.includes(h) ? acc : [...acc, h], set);
55
+ /**
56
+ * Re-encodes `h` in its canonical cBase32 spelling. `cBase32ToVec` accepts
57
+ * more than one spelling of the same hash (e.g. case, or alphabet aliases),
58
+ * but {@link headsOf} compares hash strings directly, so a parent reference
59
+ * recorded in a non-canonical spelling would never match the canonical
60
+ * spelling a revision's own hash is always recorded under ({@link
61
+ * addRevisionToCache}'s `hash` parameter is always produced by
62
+ * `vecToCBase32`) — silently keeping a demoted revision listed as a head.
63
+ * Every caller of this module reaches {@link addRevisionToCache} only with a
64
+ * `revision` whose `parents` already passed `isHash`
65
+ * (`fjs/media/revision` `checkReferences`), so decoding here cannot fail.
66
+ */
67
+ const canonicalHash = (h) => vecToCBase32(unwrap(cBase32ToVec(h)));
68
+ /** A subject's current heads: revision hashes seen that no other revision of the same subject names as a parent. */
69
+ const headsOf = (state) => state.hashes.filter(h => !state.parents.includes(h));
70
+ /**
71
+ * Folds one more stored revision into `cache`: `hash` joins its subject's
72
+ * `hashes` set, and `revision.parents` (canonicalized, see
73
+ * {@link canonicalHash}) join its `parents` set. Order independent (see the
74
+ * module doc) — used both for a full-store scan and for a single
75
+ * incremental `add`.
76
+ *
77
+ * Looks `revision.subject` up via {@link at} (own-property only), not plain
78
+ * bracket indexing: a subject is an arbitrary caller-supplied string
79
+ * (`AddRevision.subject`, or the MCP `evo_add`/`evo_head` argument), so it
80
+ * can collide with an inherited `Object.prototype` name (`toString`,
81
+ * `constructor`, …) — bracket indexing would then return that inherited
82
+ * value instead of "no entry yet" and crash on the (non-array) `.hashes`
83
+ * access below.
84
+ */
85
+ const addRevisionToCache = (hash, revision) => (cache) => {
86
+ const existing = at(revision.subject)(cache.bySubject) ?? emptySubjectState;
87
+ const state = {
88
+ hashes: union(existing.hashes)([hash]),
89
+ parents: union(existing.parents)(revision.parents.map(canonicalHash)),
90
+ };
91
+ return { bySubject: { ...cache.bySubject, [revision.subject]: state } };
92
+ };
93
+ /**
94
+ * Decodes already-read bytes as a `vnd.fjs.revision`. Returns `null` for
95
+ * anything that is not a valid revision — bytes that are not valid UTF-8, or
96
+ * text that does not parse/validate as the dialect.
97
+ */
98
+ export const decodeRevisionVec = (value) => {
99
+ const text = fromVec(value);
100
+ if (text === null) {
101
+ return null;
102
+ }
103
+ const [decodeTag, revision] = decodeText(text);
104
+ return decodeTag === 'error' ? null : revision;
105
+ };
106
+ /**
107
+ * Reads and decodes the blob at `hash` as a `vnd.fjs.revision`. Returns
108
+ * `null` for anything that is not a valid revision — a missing hash, or (via
109
+ * {@link decodeRevisionVec}) bytes that are not valid UTF-8 or do not
110
+ * parse/validate as the dialect — so a store containing arbitrary other
111
+ * content can be scanned without failing the whole cache build.
112
+ */
113
+ export const decodeRevisionBlob = (cas) => (hash) => collectRead(cas.read(hash)).step(([tag, value]) => pure(tag === 'error' ? null : decodeRevisionVec(value)));
114
+ /**
115
+ * Scans every hash in `cas` and builds a fresh {@link Cache} from the
116
+ * `vnd.fjs.revision` blobs found among them. Non-revision blobs are ignored.
117
+ */
118
+ export const buildCache = (cas) => cas.list().step(hashes => foldStep((hash) => (cache) => decodeRevisionBlob(cas)(hash).step(revision => pure(revision === null ? cache : addRevisionToCache(vecToCBase32(hash), revision)(cache))))(emptyCache)(hashes));
119
+ /** Scans `cas` once and allocates a memory slot holding the resulting {@link Cache}. */
120
+ export const initEvo = (cas) => buildCache(cas).step(cache => create(cache));
121
+ /** Reads, then rewrites, the cache at `cacheKey` with `revision` folded in at `hash`. */
122
+ const foldIntoCache = (cacheKey) => (hash) => (revision) => read(cacheKey).step(cache => write(cacheKey, addRevisionToCache(hash, revision)(cache)).step(() => pure(undefined)));
123
+ /**
124
+ * Folds `value` — bytes already written to a `Cas` at `hash` by some other
125
+ * caller — into the cache at `cacheKey` if it decodes as a `vnd.fjs.revision`
126
+ * ({@link decodeRevisionVec}); a no-op otherwise. `cas_add`/`evo_add`
127
+ * (`fjs/cas/mcp`) are two ways to reach the same store — a plain `cas_add`
128
+ * call can store a revision blob without going through {@link addRevision},
129
+ * and this is what keeps the cache honest about it without rescanning the
130
+ * whole store.
131
+ */
132
+ export const syncRevision = (cacheKey) => (hash) => (value) => {
133
+ const revision = decodeRevisionVec(value);
134
+ return revision === null ? pure(undefined) : foldIntoCache(cacheKey)(vecToCBase32(hash))(revision);
135
+ };
136
+ /**
137
+ * Resolves and validates one `parents` entry: the hash must decode as
138
+ * cBase32 and the blob it names must itself be a `vnd.fjs.revision`. Used
139
+ * unconditionally for every parent — even when `subject` is given explicitly
140
+ * — so `add` never stores a revision whose declared parent is missing or not
141
+ * a revision.
142
+ */
143
+ const resolveParent = (cas) => (parentRef) => {
144
+ const parentHash = cBase32ToVec(parentRef);
145
+ if (parentHash === null) {
146
+ return pure(error(`invalid parent hash: ${parentRef}`));
147
+ }
148
+ return decodeRevisionBlob(cas)(parentHash).step(parent => pure(parent === null ? error(`parent is not a revision blob: ${parentRef}`) : ok(parent)));
149
+ };
150
+ /** Resolves and validates every entry of `parents`, in order, short-circuiting on the first failure. */
151
+ const resolveParents = (cas) => (parents) => {
152
+ const init = ok([]);
153
+ return foldStep((parentRef) => (acc) => {
154
+ if (acc[0] === 'error') {
155
+ return pure(acc);
156
+ }
157
+ return resolveParent(cas)(parentRef).step((parentResult) => pure(parentResult[0] === 'error' ? parentResult : ok([...acc[1], parentResult[1]])));
158
+ })(init)(parents);
159
+ };
160
+ /**
161
+ * Resolves the `subject` of a new revision from its already-resolved
162
+ * `parents`: the caller's explicit `subject` when given, otherwise the
163
+ * single parent's own `subject` (a revision does not carry its own
164
+ * subject-inheritance rule the way `snapshot` does, so this is derived
165
+ * explicitly). More or fewer than one parent without an explicit `subject`
166
+ * cannot be resolved.
167
+ */
168
+ const resolveSubject = (input) => (parents) => {
169
+ if (input.subject !== undefined) {
170
+ return ok(input.subject);
171
+ }
172
+ if (parents.length !== 1) {
173
+ return error('subject is required unless there is exactly one parent to inherit it from');
174
+ }
175
+ return ok(parents[0].subject);
176
+ };
177
+ /**
178
+ * Checks that every already-resolved parent belongs to `subject`. A revision
179
+ * models one step in the evolution of a single mutable object, so a parent
180
+ * from a different subject would silently graft the new revision (and any
181
+ * inherited `snapshot`) onto an unrelated object's history; head demotion is
182
+ * also scoped to `revision.subject` ({@link addRevisionToCache}), so a
183
+ * cross-subject parent would never even leave its own subject's head set —
184
+ * this must be rejected rather than merely producing a head mismatch later.
185
+ */
186
+ const validateParentSubjects = (subject) => (parents) => {
187
+ const mismatch = parents.find(p => p.subject !== subject);
188
+ return mismatch === undefined
189
+ ? ok(undefined)
190
+ : error(`parent belongs to a different subject (${mismatch.subject}), expected ${subject}`);
191
+ };
192
+ /**
193
+ * Resolves the `snapshot` of a new revision — the inference the
194
+ * `vnd.fjs.revision` format used to carry, now run once at the write boundary
195
+ * with the parents already resolved and written explicitly into the stored
196
+ * blob (which requires `snapshot`; see `fjs/media/revision`). The caller's
197
+ * explicit `snapshot` is used as-is when given; otherwise zero parents fall
198
+ * back to `subject` as the snapshot reference (which must then be a hash),
199
+ * exactly one parent inherits that parent's stored `snapshot`, and more than
200
+ * one parent without an explicit `snapshot` cannot be resolved — there is no
201
+ * single parent snapshot to inherit, and falling back to `subject` would
202
+ * silently lose the merge result.
203
+ */
204
+ const resolveSnapshot = (input) => (subject) => (parents) => {
205
+ if (input.snapshot !== undefined) {
206
+ return ok(input.snapshot);
207
+ }
208
+ if (parents.length === 0) {
209
+ return isHash(subject)
210
+ ? ok(subject)
211
+ : error(`subject must be a valid hash when snapshot is omitted and there are no parents: ${subject}`);
212
+ }
213
+ if (parents.length === 1) {
214
+ return ok(parents[0].snapshot);
215
+ }
216
+ return error('snapshot is required when a revision has more than one parent');
217
+ };
218
+ /**
219
+ * The authoritative `generation` of a new revision: `0` for a root
220
+ * (`parents: []`), else `1 + max(parents' generations)`. Computed here from
221
+ * the already-decoded parents, never taken from input — everything evo writes
222
+ * follows the formula by construction (see the `generation` semantics in
223
+ * [`fjs/cas/evo/todo/evo-revision.md`](todo/evo-revision.md)).
224
+ *
225
+ * The max is a `reduce`, not `Math.max(...parents.map(...))`: `parents` is
226
+ * caller-sized (the direct API or the `evo_add` MCP tool), and argument-spread
227
+ * of a large array overflows the JS call stack with a `RangeError` before the
228
+ * documented `Result` error path can run — a `reduce` has no such limit.
229
+ */
230
+ const computeGeneration = (parents) => parents.length === 0 ? 0 : 1 + parents.reduce((max, p) => Math.max(max, p.generation), 0);
231
+ /**
232
+ * Adds a new revision to `cas` and folds it into the cache at `cacheKey`.
233
+ *
234
+ * Steps: resolve and validate every parent ({@link resolveParents}), resolve
235
+ * `subject` from them ({@link resolveSubject}) and check every parent
236
+ * actually belongs to it ({@link validateParentSubjects}), resolve `snapshot`
237
+ * ({@link resolveSnapshot}) and compute `generation`
238
+ * ({@link computeGeneration}), assemble a `Revision` and check its hash /
239
+ * generation semantics (`fjs/media/revision` `checkReferences` — the same rule
240
+ * a reader applies; the shape itself is already guaranteed by this function's
241
+ * own field types), encode and write it to `cas`, then fold the new revision
242
+ * into the cache. Every failure — an invalid or missing parent, a
243
+ * cross-subject parent, an unresolvable subject or snapshot, an invalid
244
+ * revision, a blob too large to encode, or a store write failure — is
245
+ * reported as `error(message)` rather than thrown, so a caller (e.g. an MCP
246
+ * tool handler) can surface it without a `throw`/`catch`.
247
+ */
248
+ export const addRevision = (cas) => (cacheKey) => (input) => resolveParents(cas)(input.parents).step((parentsResult) => {
249
+ if (parentsResult[0] === 'error') {
250
+ return pure(parentsResult);
251
+ }
252
+ const subjectResult = resolveSubject(input)(parentsResult[1]);
253
+ if (subjectResult[0] === 'error') {
254
+ return pure(subjectResult);
255
+ }
256
+ const parentSubjectsResult = validateParentSubjects(subjectResult[1])(parentsResult[1]);
257
+ if (parentSubjectsResult[0] === 'error') {
258
+ return pure(parentSubjectsResult);
259
+ }
260
+ const snapshotResult = resolveSnapshot(input)(subjectResult[1])(parentsResult[1]);
261
+ if (snapshotResult[0] === 'error') {
262
+ return pure(snapshotResult);
263
+ }
264
+ const revision = {
265
+ dialect,
266
+ subject: subjectResult[1],
267
+ parents: input.parents,
268
+ snapshot: snapshotResult[1],
269
+ generation: computeGeneration(parentsResult[1]),
270
+ archived: input.archived,
271
+ };
272
+ const referencesResult = checkReferences(revision);
273
+ if (referencesResult[0] === 'error') {
274
+ return pure(referencesResult);
275
+ }
276
+ // Canonicalize parent/snapshot spellings now that checkReferences has
277
+ // confirmed they decode (`unwrap` inside `canonicalHash` is safe):
278
+ // two `add` calls describing the same logical revision but spelled
279
+ // differently (case, `i`/`l`/`o` aliases) must serialize identically,
280
+ // or they'd produce two distinct CAS blobs that both remain heads —
281
+ // the point of `canonicalHash` (see the module doc) is defeated if
282
+ // this module itself writes non-canonical spellings.
283
+ const canonicalRevision = {
284
+ ...revision,
285
+ parents: revision.parents.map(canonicalHash),
286
+ snapshot: canonicalHash(revision.snapshot),
287
+ };
288
+ const bytes = tryUtf8(toJson(canonicalRevision));
289
+ if (bytes === null) {
290
+ return pure(error('revision too large to encode'));
291
+ }
292
+ return cas.write(nonEmpty(ok(bytes), elEmpty()))
293
+ .step((writeResult) => {
294
+ if (writeResult[0] === 'error') {
295
+ return pure(error('failed to write revision to CAS'));
296
+ }
297
+ const hash = vecToCBase32(writeResult[1]);
298
+ return foldIntoCache(cacheKey)(hash)(canonicalRevision).step(() => pure(ok(hash)));
299
+ });
300
+ });
301
+ /** Builds the {@link Evo} API over `cas`, backed by the cache at `cacheKey` (see {@link initEvo}). */
302
+ export const evo = (cas) => (cacheKey) => ({
303
+ list: () => read(cacheKey).step(cache => pure(definedEntries(cache.bySubject).map(([subject]) => subject))),
304
+ head: subject => read(cacheKey).step(cache => {
305
+ const state = at(subject)(cache.bySubject);
306
+ return pure(state === null ? [] : headsOf(state));
307
+ }),
308
+ add: input => addRevision(cas)(cacheKey)(input),
309
+ });
@@ -0,0 +1,32 @@
1
+ export declare const proof: {
2
+ buildCacheEmptyStoreYieldsEmptyCache: () => void;
3
+ buildCacheSkipsNonRevisionBlob: () => void;
4
+ decodeRevisionBlobMissingHashIsNull: () => void;
5
+ decodeRevisionBlobNonUtf8IsNull: () => void;
6
+ decodeRevisionBlobInvalidJsonIsNull: () => void;
7
+ decodeRevisionBlobValidRevisionRoundTrips: () => void;
8
+ buildCacheIncludesScannedRevision: () => void;
9
+ buildCacheOrderIndependentWhenChildScannedBeforeParent: () => void;
10
+ buildCacheCanonicalizesNonCanonicalParentHashes: () => void;
11
+ addRevisionBuildsHeadsAcrossChainAndFork: () => void;
12
+ addRevisionIdempotentOnDuplicateContent: () => void;
13
+ addRevisionCanonicalizesParentSpellingBeforeSerializing: () => void;
14
+ addRevisionResolvesSubjectFromSingleParent: () => void;
15
+ addComputesGenerationAndResolvesSnapshot: () => void;
16
+ addComputesMergeGenerationFromMaxOfParents: () => void;
17
+ addRevisionSubjectRequiredForZeroParents: () => void;
18
+ addRevisionNonHashSubjectWithoutSnapshotIsError: () => void;
19
+ addRevisionInvalidParentHashIsError: () => void;
20
+ addRevisionParentNotARevisionIsError: () => void;
21
+ addRevisionValidatesParentsEvenWithExplicitSubject: () => void;
22
+ addRevisionRejectsCrossSubjectParent: () => void;
23
+ addRevisionShortCircuitsOnFirstInvalidParentAmongMultiple: () => void;
24
+ addRevisionInvalidReferencesIsError: () => void;
25
+ addRevisionTooLargeToEncodeIsError: () => void;
26
+ addRevisionWriteFailureIsError: () => void;
27
+ syncRevisionFoldsValidRevisionIntoCache: () => void;
28
+ syncRevisionIgnoresNonRevisionContent: () => void;
29
+ evoHeadUnknownSubjectIsEmpty: () => void;
30
+ evoHeadUnknownPrototypeNamedSubjectIsEmpty: () => void;
31
+ evoAddAndHeadHandlePrototypeNamedSubject: () => void;
32
+ };