functionalscript 0.44.0 → 0.46.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 (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -42,33 +42,65 @@
42
42
  *
43
43
  * @module
44
44
  *
45
- * @import { Effect, Operation } from '../../effects/types.ts'
45
+ * @import { Operation } from '../../effects/types.ts'
46
+ * @import { Effect, NotImplemented } from '../../effects/types.ts'
47
+ * @import { EvoChannel, EvoError } from './types.ts'
46
48
  * @import { Key, MemOp } from '../../effects/memory/types.ts'
47
49
  * @import { Cas } from '../types.ts'
48
- * @import { Ok, Result } from '../../types/result/types.ts'
50
+ * @import { Result } from '../../types/result/types.ts'
49
51
  * @import { Vec } from '../../types/bit_vec/types.ts'
50
- * @import { IoResult } from '../../effects/node/types.ts'
52
+ * @import { Ok } from '../../types/result/types.ts'
51
53
  * @import { List } from '../../effects/list/types.ts'
52
- * @import { LockMap, Revision } from '../../media/revision/types.ts'
54
+ * @import { IoChannel, IoResult } from '../../effects/node/types.ts'
55
+ * @import { LockField, LockMap, Revision } from '../../media/revision/types.ts'
53
56
  * @import { Hash, Subject, RevisionData, SubjectState, Cache, Evo } from './types.ts'
54
57
  */
55
58
 
56
- import { pure, foldStep } from '../../effects/module.f.mjs'
57
- import { eff } from '../../effects/eff/module.f.mjs'
59
+ import {
60
+ catchStep,
61
+ foldStep as ioFoldStep,
62
+ mapStep as ioMapStep,
63
+ pureError,
64
+ pureOk,
65
+ resultMapStep,
66
+ step as ioStep,
67
+ } from '../../effects/module.f.mjs'
58
68
  import { create, read, write } from '../../effects/memory/module.f.mjs'
59
69
  import { collectRead } from '../module.f.mjs'
60
70
  import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.mjs'
61
71
  import { fromVec } from '../../text/utf8/module.f.mjs'
62
72
  import { tryUtf8 } from '../../text/module.f.mjs'
63
- import { ok, error } from '../../types/result/module.f.mjs'
73
+ import { ok, error, okThen } from '../../types/result/module.f.mjs'
64
74
  import { nonEmpty, empty as elEmpty } from '../../effects/list/module.f.mjs'
65
75
  import { at, definedEntries } from '../../types/object/module.f.mjs'
66
76
  import { unwrap } from '../../types/nullable/module.f.mjs'
67
- import { isNotFound } from '../../effects/node/module.f.mjs'
77
+ import { errorSummary, isNotFound } from '../../effects/node/module.f.mjs'
68
78
  import { decodeText, encodeText, dialect, checkReferences, isHash } from '../../media/revision/module.f.mjs'
69
79
 
80
+ /**
81
+ * A rejected revision, tagged so it renders alongside `notImplemented` and
82
+ * `ioError` rather than needing a `typeof` test to be told from them.
83
+ *
84
+ * @type {(message: string) => EvoError}
85
+ */
86
+ export const evoError = message => ['evoError', message]
87
+
88
+ /**
89
+ * Renders an {@link EvoChannel} failure as a message.
90
+ *
91
+ * The two cases are told apart by tag and nothing else — which is the whole
92
+ * reason {@link EvoError} is a tuple. A rejected revision already carries a
93
+ * message written for a caller; a runner that could not dispatch is described
94
+ * by `errorSummary`, the same renderer the node channel uses, so there is one
95
+ * phrasing of "operation not implemented" rather than two.
96
+ *
97
+ * @type {(e: EvoChannel) => string}
98
+ */
99
+ export const evoSummary = e => e[0] === 'evoError' ? e[1] : errorSummary(e)
100
+
70
101
  /** A cache with no known subjects yet — the starting point for {@link buildCache}. */
71
- export const emptyCache = /** @type {Cache} */ ({ bySubject: {} })
102
+ /** @type {Cache} */
103
+ export const emptyCache = { bySubject: {} }
72
104
 
73
105
  /** @type {SubjectState} */
74
106
  const emptySubjectState = { hashes: [], parents: [], archived: [] }
@@ -94,11 +126,26 @@ const union = set => items =>
94
126
  */
95
127
  const canonicalHash = h => vecToCBase32(unwrap(cBase32ToVec(h)))
96
128
 
97
- /** Canonicalizes every direct hash in a structurally validated flat lock map.
129
+ /**
130
+ * Canonicalizes every direct hash of a structurally validated lock map, at
131
+ * every depth, preserving its nested scope structure. Nested maps are scopes
132
+ * rather than references, so only the strings are re-spelled — the same split
133
+ * `fjs/media/revision`'s `checkReferences` validates along.
98
134
  * @type {(lock: LockMap) => LockMap}
99
135
  */
100
136
  const canonicalLock = lock =>
101
- Object.fromEntries(definedEntries(lock).map(([subject, hash]) => [subject, canonicalHash(hash)]))
137
+ Object.fromEntries(definedEntries(lock).map(
138
+ ([subject, value]) => [subject, typeof value === 'string' ? canonicalHash(value) : canonicalLock(value)]))
139
+
140
+ /**
141
+ * Canonicalizes a revision's `lock` field: a shared-lock reference is one hash
142
+ * to re-spell, an inline map is walked to the bottom ({@link canonicalLock}).
143
+ * The split is the same one `fjs/media/revision`'s `lockFieldError` validates
144
+ * along, so what this re-spells is exactly what was checked.
145
+ * @type {(value: LockField) => LockField}
146
+ */
147
+ const canonicalLockField = value =>
148
+ typeof value === 'string' ? canonicalHash(value) : canonicalLock(value)
102
149
 
103
150
  /** A subject's current heads: revision hashes seen that no other revision of the same subject names as a parent.
104
151
  * @type {(state: SubjectState) => readonly Hash[]}
@@ -182,51 +229,62 @@ export const decodeRevisionVec = value => {
182
229
  *
183
230
  * @template {Operation} O
184
231
  * @param {Cas<O>} cas
185
- * @returns {(hash: Vec) => Effect<O, Revision | null>}
232
+ * The `never` is a decision, not an observation: reading the store *can* fail,
233
+ * and this maps that failure to `null` alongside "the bytes are not a
234
+ * revision". A scan wants exactly that — one unreadable blob must not fail the
235
+ * whole cache build — but the two are genuinely different answers, and this
236
+ * one loses the difference on purpose. Saying `never` puts that where a reader
237
+ * can disagree with it.
238
+ *
239
+ * @returns {(hash: Vec) => Effect<O, Revision | null, never>}
186
240
  */
187
241
  export const decodeRevisionBlob = cas => hash =>
188
- eff(collectRead(cas.read(hash)))
189
- .map(([tag, value]) => tag === 'error' ? null : decodeRevisionVec(value))
190
- .value
242
+ resultMapStep(
243
+ collectRead(cas.read(hash)),
244
+ ([tag, value]) => ok(tag === 'error' ? null : decodeRevisionVec(value)))
191
245
 
192
246
  /**
193
247
  * Scans every hash in `cas` and builds a fresh {@link Cache} from the
194
248
  * `vnd.fjs.revision` blobs found among them. Non-revision blobs are ignored.
195
249
  *
250
+ * A store that cannot be listed is a failure of the scan, not an empty cache:
251
+ * the fold never starts, and the caller is told. Blobs that fail to *read*
252
+ * remain "not a revision" and are skipped — see {@link decodeRevisionBlob}.
253
+ *
196
254
  * @template {Operation} O
197
255
  * @param {Cas<O>} cas
198
- * @returns {Effect<O, Cache>}
256
+ * @returns {Effect<O, Cache, IoChannel>}
199
257
  */
200
- export const buildCache = cas =>
201
- foldStep(
202
- cas.list(),
203
- emptyCache,
204
- hash => cache =>
205
- eff(decodeRevisionBlob(cas)(hash))
206
- .step(revision =>
207
- pure(revision === null ? cache : addRevisionToCache(vecToCBase32(hash), revision)(cache))
208
- )
209
- .value)
258
+ export const buildCache = cas => {
259
+ // Annotated rather than inferred: the body's `ok(…)` is an `Ok<Cache>`,
260
+ // which unifies with `Result<S, E>` for any `E`, so the fold's error type
261
+ // has nothing to pin it and drifts into the accumulator's.
262
+ /** @type {(hash: Vec) => (cache: Cache) => Effect<O, Cache, IoChannel>} */
263
+ const foldOne = hash => cache =>
264
+ ioMapStep(
265
+ decodeRevisionBlob(cas)(hash),
266
+ revision =>
267
+ revision === null ? cache : addRevisionToCache(vecToCBase32(hash), revision)(cache))
268
+ return ioStep(cas.list(), hashes => ioFoldStep(pureOk(hashes), emptyCache, foldOne))
269
+ }
210
270
 
211
271
  /**
212
272
  * Scans `cas` once and allocates a memory slot holding the resulting {@link Cache}.
213
273
  *
214
274
  * @template {Operation} O
215
275
  * @param {Cas<O>} cas
216
- * @returns {Effect<O | MemOp, Key<Cache>>}
276
+ * @returns {Effect<O | MemOp, Key<Cache>, IoChannel>}
217
277
  */
218
278
  export const initEvo = cas =>
219
- eff(buildCache(cas))
220
- .step(cache => create(cache))
221
- .value
279
+ ioStep(buildCache(cas), cache => create(cache))
222
280
 
223
281
  /** Reads, then rewrites, the cache at `cacheKey` with `revision` folded in at `hash`.
224
- * @type {(cacheKey: Key<Cache>) => (hash: Hash) => (revision: Revision) => Effect<MemOp, void>}
282
+ * @type {(cacheKey: Key<Cache>) => (hash: Hash) => (revision: Revision) => Effect<MemOp, void, NotImplemented>}
225
283
  */
226
284
  const foldIntoCache = cacheKey => hash => revision =>
227
- eff(read(cacheKey))
228
- .step(cache => write(cacheKey, addRevisionToCache(hash, revision)(cache)))
229
- .value
285
+ ioStep(
286
+ read(cacheKey),
287
+ cache => write(cacheKey, addRevisionToCache(hash, revision)(cache)))
230
288
 
231
289
  /**
232
290
  * Folds `value` — bytes already written to a `Cas` at `hash` by some other
@@ -236,11 +294,11 @@ const foldIntoCache = cacheKey => hash => revision =>
236
294
  * call can store a revision blob without going through {@link addRevision},
237
295
  * and this is what keeps the cache honest about it without rescanning the
238
296
  * whole store.
239
- * @type {(cacheKey: Key<Cache>) => (hash: Vec) => (value: Vec) => Effect<MemOp, void>}
297
+ * @type {(cacheKey: Key<Cache>) => (hash: Vec) => (value: Vec) => Effect<MemOp, void, NotImplemented>}
240
298
  */
241
299
  export const syncRevision = cacheKey => hash => value => {
242
300
  const revision = decodeRevisionVec(value)
243
- return revision === null ? pure(undefined) : foldIntoCache(cacheKey)(vecToCBase32(hash))(revision)
301
+ return revision === null ? pureOk(undefined) : foldIntoCache(cacheKey)(vecToCBase32(hash))(revision)
244
302
  }
245
303
 
246
304
  /**
@@ -252,42 +310,39 @@ export const syncRevision = cacheKey => hash => value => {
252
310
  *
253
311
  * @template {Operation} O
254
312
  * @param {Cas<O>} cas
255
- * @returns {(parentRef: Hash) => Effect<O, Result<Revision, string>>}
313
+ * @returns {(parentRef: Hash) => Effect<O, Revision, EvoError>}
256
314
  */
257
315
  const resolveParent = cas => parentRef => {
258
316
  const parentHash = cBase32ToVec(parentRef)
259
317
  if (parentHash === null) {
260
- return pure(error(`invalid parent hash: ${parentRef}`))
318
+ return pureError(evoError(`invalid parent hash: ${parentRef}`))
261
319
  }
262
- return eff(decodeRevisionBlob(cas)(parentHash))
263
- .step(parent =>
264
- pure(parent === null ? error(`parent is not a revision blob: ${parentRef}`) : ok(parent))
265
- )
266
- .value
320
+ return ioStep(
321
+ decodeRevisionBlob(cas)(parentHash),
322
+ parent => parent === null
323
+ ? pureError(evoError(`parent is not a revision blob: ${parentRef}`))
324
+ : pureOk(parent))
267
325
  }
268
326
 
269
327
  /**
270
328
  * Resolves and validates every entry of `parents`, in order, short-circuiting on the first failure.
271
329
  *
330
+ * Short-circuiting is `foldStep`'s, not this function's. It used to be
331
+ * two hand-written `[0] === 'error'` tests, which is what a verdict costs when
332
+ * it rides in the value instead of the channel.
333
+ *
272
334
  * @template {Operation} O
273
335
  * @param {Cas<O>} cas
274
- * @returns {(parents: readonly Hash[]) => Effect<O, Result<readonly Revision[], string>>}
336
+ * @returns {(parents: readonly Hash[]) => Effect<O, readonly Revision[], EvoError>}
275
337
  */
276
338
  const resolveParents = cas => parents => {
277
- /** @type {Result<readonly Revision[], string>} */
278
- const init = ok([])
279
- return foldStep(
280
- pure(parents),
339
+ /** @type {readonly Revision[]} */
340
+ const init = []
341
+ return ioFoldStep(
342
+ pureOk(parents),
281
343
  init,
282
- parentRef => (/** @type {Result<readonly Revision[], string>} */ acc) => {
283
- if (acc[0] === 'error') { return pure(acc) }
284
- return eff(resolveParent(cas)(parentRef))
285
- .step((/** @type {Result<Revision, string>} */ parentResult) =>
286
- /** @type {Effect<never, Result<readonly Revision[], string>>} */
287
- (pure(parentResult[0] === 'error' ? parentResult : ok([...acc[1], parentResult[1]])))
288
- )
289
- .value
290
- })
344
+ parentRef => (/** @type {readonly Revision[]} */ acc) =>
345
+ ioMapStep(resolveParent(cas)(parentRef), parent => [...acc, parent]))
291
346
  }
292
347
 
293
348
  /**
@@ -366,21 +421,73 @@ const computeGeneration = parents =>
366
421
  parents.length === 0 ? 0 : 1 + parents.reduce((max, p) => Math.max(max, p.generation), 0)
367
422
 
368
423
  /**
369
- * Adds a new revision to `cas` and folds it into the cache at `cacheKey`.
424
+ * The pure half of {@link addRevision}: turns already-resolved `parents` into
425
+ * the exact `Revision` that will be stored, or the first reason it cannot be.
370
426
  *
371
- * Steps: resolve and validate every parent ({@link resolveParents}), resolve
372
- * `subject` from them ({@link resolveSubject}) and check every parent
373
- * actually belongs to it ({@link validateParentSubjects}), resolve `snapshot`
374
- * ({@link resolveSnapshot}) and compute `generation`
375
- * ({@link computeGeneration}), assemble a `Revision` and check its hash /
427
+ * Resolves `subject` ({@link resolveSubject}) and checks every parent belongs
428
+ * to it ({@link validateParentSubjects}), resolves `snapshot`
429
+ * ({@link resolveSnapshot}) and computes `generation`
430
+ * ({@link computeGeneration}), assembles the `Revision` and checks its hash /
376
431
  * generation semantics (`fjs/media/revision` `checkReferences` — the same rule
377
- * a reader applies; the shape itself is already guaranteed by this function's
378
- * own field types), encode and write it to `cas`, then fold the new revision
379
- * into the cache. Every failure — an invalid or missing parent, a
380
- * cross-subject parent, an unresolvable subject or snapshot, an invalid
381
- * revision, a blob too large to encode, or a store write failure — is
382
- * reported as `error(message)` rather than thrown, so a caller (e.g. an MCP
383
- * tool handler) can surface it without a `throw`/`catch`.
432
+ * a reader applies; the shape itself is already guaranteed by the field types
433
+ * here), then canonicalizes it.
434
+ *
435
+ * Canonicalizing parent/snapshot spellings is only safe once `checkReferences`
436
+ * has confirmed they decode, which makes the `unwrap` inside
437
+ * {@link canonicalHash} safe. It is not optional: two `add` calls describing
438
+ * the same logical revision but spelled differently (case, `i`/`l`/`o`
439
+ * aliases) must serialize identically, or they would produce two distinct CAS
440
+ * blobs that both remain heads — the point of `canonicalHash` (see the module
441
+ * doc) is defeated if this module itself writes non-canonical spellings.
442
+ *
443
+ * Separate from {@link addRevision} because none of it touches the store:
444
+ * everything up to the bytes is a plain `Result` pipeline, so `addRevision` is
445
+ * left holding only the encode, the write, and the cache fold. Each step also
446
+ * reads values resolved by earlier ones, which is why the guards are a flat
447
+ * sequence rather than an `okThen` chain — see `okThen`'s own note in
448
+ * [`fjs/types/result`](../../types/result/module.f.mjs).
449
+ *
450
+ * @param {RevisionData} input
451
+ * @returns {(parents: readonly Revision[]) => Result<Revision, string>}
452
+ */
453
+ const buildRevision = input => parents => {
454
+ const subjectResult = resolveSubject(input)(parents)
455
+ if (subjectResult[0] === 'error') { return subjectResult }
456
+ const subject = subjectResult[1]
457
+ const parentSubjectsResult = validateParentSubjects(subject)(parents)
458
+ if (parentSubjectsResult[0] === 'error') { return parentSubjectsResult }
459
+ const snapshotResult = resolveSnapshot(input)(subject)(parents)
460
+ if (snapshotResult[0] === 'error') { return snapshotResult }
461
+ /** @type {Revision} */
462
+ const revision = {
463
+ dialect,
464
+ subject,
465
+ parents: input.parents,
466
+ snapshot: snapshotResult[1],
467
+ generation: computeGeneration(parents),
468
+ archived: input.archived,
469
+ lock: input.lock,
470
+ }
471
+ const referencesResult = checkReferences(revision)
472
+ if (referencesResult[0] === 'error') { return referencesResult }
473
+ return ok({
474
+ ...revision,
475
+ parents: revision.parents.map(canonicalHash),
476
+ snapshot: canonicalHash(revision.snapshot),
477
+ lock: revision.lock === undefined ? undefined : canonicalLockField(revision.lock),
478
+ })
479
+ }
480
+
481
+ /**
482
+ * Adds a new revision to `cas` and folds it into the cache at `cacheKey`.
483
+ *
484
+ * Steps: resolve and validate every parent ({@link resolveParents}), derive
485
+ * the revision to store from them ({@link buildRevision}), then encode it,
486
+ * write it to `cas`, and fold it into the cache. Every failure — an invalid
487
+ * or missing parent, a cross-subject parent, an unresolvable subject or
488
+ * snapshot, an invalid revision, a blob too large to encode, or a store write
489
+ * failure — is reported as `error(message)` rather than thrown, so a caller
490
+ * (e.g. an MCP tool handler) can surface it without a `throw`/`catch`.
384
491
  *
385
492
  * `input.generation` is ignored: it exists on {@link RevisionData} only so a
386
493
  * value read back by {@link readRevision} round-trips into `add` unchanged,
@@ -389,61 +496,43 @@ const computeGeneration = parents =>
389
496
  *
390
497
  * @template {Operation} O
391
498
  * @param {Cas<O>} cas
392
- * @returns {(cacheKey: Key<Cache>) => (input: RevisionData) => Effect<O | MemOp, Result<Hash, string>>}
499
+ * A rejected revision and an unreachable cache slot share one channel — see
500
+ * {@link Evo.add} — so every branch below answers `pureError`, and the
501
+ * successful path never re-tests what an earlier step already decided.
502
+ *
503
+ * The `Cas` write is the one place a host failure is *translated* rather than
504
+ * propagated: {@link catchStep} turns any `IoChannel` error into one
505
+ * {@link EvoError}, because a caller of this API has the same recourse to a
506
+ * full disk as to a malformed parent, and the store's own error vocabulary is
507
+ * not part of this contract.
508
+ *
509
+ * @returns {(cacheKey: Key<Cache>) => (input: RevisionData) => Effect<O | MemOp, Hash, EvoChannel>}
393
510
  */
394
511
  export const addRevision = cas => cacheKey => input =>
395
- eff(resolveParents(cas)(input.parents))
396
- .step((/** @type {Result<readonly Revision[], string>} */ parentsResult) => {
397
- if (parentsResult[0] === 'error') { return pure(parentsResult) }
398
- const subjectResult = resolveSubject(input)(parentsResult[1])
399
- if (subjectResult[0] === 'error') { return pure(subjectResult) }
400
- const parentSubjectsResult = validateParentSubjects(subjectResult[1])(parentsResult[1])
401
- if (parentSubjectsResult[0] === 'error') { return pure(parentSubjectsResult) }
402
- const snapshotResult = resolveSnapshot(input)(subjectResult[1])(parentsResult[1])
403
- if (snapshotResult[0] === 'error') { return pure(snapshotResult) }
404
- /** @type {Revision} */
405
- const revision = {
406
- dialect,
407
- subject: subjectResult[1],
408
- parents: input.parents,
409
- snapshot: snapshotResult[1],
410
- generation: computeGeneration(parentsResult[1]),
411
- archived: input.archived,
412
- lock: input.lock,
413
- }
414
- const referencesResult = checkReferences(revision)
415
- if (referencesResult[0] === 'error') { return pure(referencesResult) }
416
- // Canonicalize parent/snapshot spellings now that checkReferences has
417
- // confirmed they decode (`unwrap` inside `canonicalHash` is safe):
418
- // two `add` calls describing the same logical revision but spelled
419
- // differently (case, `i`/`l`/`o` aliases) must serialize identically,
420
- // or they'd produce two distinct CAS blobs that both remain heads —
421
- // the point of `canonicalHash` (see the module doc) is defeated if
422
- // this module itself writes non-canonical spellings.
423
- /** @type {Revision} */
424
- const canonicalRevision = {
425
- ...revision,
426
- parents: revision.parents.map(canonicalHash),
427
- snapshot: canonicalHash(revision.snapshot),
428
- lock: revision.lock === undefined ? undefined : canonicalLock(revision.lock),
429
- }
512
+ ioStep(
513
+ resolveParents(cas)(input.parents),
514
+ (/** @type {readonly Revision[]} */ parents) => {
515
+ const revisionResult = buildRevision(input)(parents)
516
+ if (revisionResult[0] === 'error') { return pureError(evoError(revisionResult[1])) }
517
+ const canonicalRevision = revisionResult[1]
430
518
  const bytes = tryUtf8(encodeText(canonicalRevision))
431
519
  if (bytes === null) {
432
- return pure(error('revision too large to encode'))
520
+ return pureError(evoError('revision too large to encode'))
433
521
  }
434
- return eff(cas.write(nonEmpty(ok(bytes), /** @type {List<never, Ok<Vec>>} */ (elEmpty()))))
435
- .step((/** @type {IoResult<Vec>} */ writeResult) => {
436
- if (writeResult[0] === 'error') {
437
- return /** @type {Effect<MemOp, Result<Hash, string>>} */ (pure(error('failed to write revision to CAS')))
438
- }
439
- const hash = vecToCBase32(writeResult[1])
440
- return eff(foldIntoCache(cacheKey)(hash)(canonicalRevision))
441
- .step(() => pure(ok(hash)))
442
- .value
522
+ // Annotated so the payload's operation set infers as `never`: the
523
+ // list is built from `pure` cells and requests no commands of its
524
+ // own, which `cas.write`'s `O1` has nothing else to pin it to.
525
+ /** @type {Effect<O, Vec, EvoError>} */
526
+ const written = catchStep(
527
+ cas.write((nonEmpty(bytes, elEmpty()))),
528
+ () => pureError(evoError('failed to write revision to CAS')))
529
+ return ioStep(
530
+ written,
531
+ (/** @type {Vec} */ writtenHash) => {
532
+ const hash = vecToCBase32(writtenHash)
533
+ return ioMapStep(foldIntoCache(cacheKey)(hash)(canonicalRevision), () => hash)
443
534
  })
444
- .value
445
535
  })
446
- .value
447
536
 
448
537
  /**
449
538
  * Projects a decoded `Revision` into the shared {@link RevisionData}
@@ -463,7 +552,7 @@ const toRevisionData = ({ subject, parents, snapshot, generation, archived, lock
463
552
  snapshot: canonicalHash(snapshot),
464
553
  generation,
465
554
  archived,
466
- lock: lock === undefined ? undefined : canonicalLock(lock),
555
+ lock: lock === undefined ? undefined : canonicalLockField(lock),
467
556
  })
468
557
 
469
558
  /**
@@ -490,17 +579,17 @@ const toRevisionData = ({ subject, parents, snapshot, generation, archived, lock
490
579
  * how far it got; recovering that difference would mean folding the chunk
491
580
  * stream here instead of reusing `collectRead`, for a distinction no client
492
581
  * can act on differently.
493
- * @type {(hash: Hash) => (result: IoResult<Vec>) => Result<RevisionData, string>}
582
+ * @type {(hash: Hash) => (result: IoResult<Vec>) => Result<RevisionData, EvoError>}
494
583
  */
495
584
  const decodeReadRevision = hash => ([tag, value]) => {
496
585
  if (tag === 'error') {
497
- return error(isNotFound(value)
586
+ return error(evoError(isNotFound(value)
498
587
  ? `revision not found: ${hash}`
499
- : `failed to read revision: ${hash}`)
588
+ : `failed to read revision: ${hash}`))
500
589
  }
501
590
  const revision = decodeRevisionVec(value)
502
591
  return revision === null
503
- ? error(`not a revision blob: ${hash}`)
592
+ ? error(evoError(`not a revision blob: ${hash}`))
504
593
  : ok(toRevisionData(revision))
505
594
  }
506
595
 
@@ -519,15 +608,13 @@ const decodeReadRevision = hash => ([tag, value]) => {
519
608
  *
520
609
  * @template {Operation} O
521
610
  * @param {Cas<O>} cas
522
- * @returns {(hash: Hash) => Effect<O, Result<RevisionData, string>>}
611
+ * @returns {(hash: Hash) => Effect<O, RevisionData, EvoError>}
523
612
  */
524
613
  export const readRevision = cas => hash => {
525
614
  const hashVec = cBase32ToVec(hash)
526
615
  return hashVec === null
527
- ? pure(error(`invalid hash: ${hash}`))
528
- : eff(collectRead(cas.read(hashVec)))
529
- .map(decodeReadRevision(hash))
530
- .value
616
+ ? pureError(evoError(`invalid hash: ${hash}`))
617
+ : resultMapStep(collectRead(cas.read(hashVec)), decodeReadRevision(hash))
531
618
  }
532
619
 
533
620
  /**
@@ -540,17 +627,15 @@ export const readRevision = cas => hash => {
540
627
  export const evo = cas => cacheKey => ({
541
628
  list: archived => {
542
629
  const listed = subjectListed(archived)
543
- return eff(read(cacheKey))
544
- .step(cache => pure(definedEntries(cache.bySubject)
545
- .flatMap(([subject, state]) => listed(state) ? [subject] : [])))
546
- .value
630
+ return ioMapStep(
631
+ read(cacheKey),
632
+ cache => definedEntries(cache.bySubject)
633
+ .flatMap(([subject, state]) => listed(state) ? [subject] : []))
547
634
  },
548
- head: subject => eff(read(cacheKey))
549
- .step(cache => {
550
- const state = at(subject)(cache.bySubject)
551
- return pure(state === null ? [] : headsOf(state))
552
- })
553
- .value,
635
+ head: subject => ioMapStep(read(cacheKey), cache => {
636
+ const state = at(subject)(cache.bySubject)
637
+ return state === null ? [] : headsOf(state)
638
+ }),
554
639
  add: input => addRevision(cas)(cacheKey)(input),
555
640
  revision: readRevision(cas),
556
641
  })
@@ -1,8 +1,12 @@
1
1
  /**
2
2
  * @import { Cas } from '../types.ts'
3
+ * @import { EvoChannel } from './types.ts'
4
+ * @import { Result } from '../../types/result/types.ts'
5
+ * @import { Effect } from '../../effects/types.ts'
6
+ * @import { IoChannel, NodeOp } from '../../effects/node/types.ts'
7
+ * @import { State } from '../../effects/node/virtual/types.ts'
3
8
  * @import { Vec } from '../../types/bit_vec/types.ts'
4
9
  * @import { Ok } from '../../types/result/types.ts'
5
- * @import { IoResult } from '../../effects/node/types.ts'
6
10
  * @import { List } from '../../effects/list/types.ts'
7
11
  * @import { RevisionData } from './types.ts'
8
12
  */
@@ -44,9 +48,14 @@ export declare const proof: {
44
48
  revisionCanonicalizesReferenceSpellings: () => void;
45
49
  revisionRoundTripsThroughAdd: () => void;
46
50
  revisionLockRoundTripsAndCanonicalizes: () => void;
51
+ revisionSharedLockReferenceRoundTripsAndCanonicalizes: () => void;
52
+ revisionInvalidSharedLockReferenceIsRejected: () => void;
53
+ revisionNestedLockRoundTripsAndCanonicalizes: () => void;
54
+ revisionInvalidNestedLockValueIsRejected: () => void;
47
55
  revisionAbsentAndEmptyLocksRemainDistinct: () => void;
48
56
  revisionInvalidLockValueIsRejected: () => void;
49
57
  equivalentLockOrdersReuseOneCasAddress: () => void;
58
+ equivalentNestedLockOrdersReuseOneCasAddress: () => void;
50
59
  syncRevisionFoldsValidRevisionIntoCache: () => void;
51
60
  syncRevisionIgnoresNonRevisionContent: () => void;
52
61
  evoHeadUnknownSubjectIsEmpty: () => void;