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
@@ -1,19 +1,26 @@
1
1
  /**
2
- * MCP adapter for the content-addressable store.
2
+ * MCP adapter for the content-addressable store and the Evo API layered on
3
+ * top of it.
3
4
  *
4
5
  * Maps `Cas<O>` operations onto MCP tools, so an agent that speaks MCP can
5
6
  * store a blob and get back its hash, fetch a blob by hash, and enumerate
6
7
  * what is stored — without shelling out to the `cas` CLI. The store itself
7
- * (`fs/cas/module.f.ts`) stays transport-agnostic; this is an additional
8
- * front end alongside the CLI `main`.
8
+ * (`fjs/cas/module.f.ts`) stays transport-agnostic; this is an additional
9
+ * front end alongside the CLI `main`. The same server also exposes
10
+ * `fjs/cas/evo`'s subject/head API (`evo_list`/`evo_head`/`evo_add`,
11
+ * `fjs/cas/evo/mcp`) — one process, one `~/.cas/` store, one in-memory Evo
12
+ * cache scanned once at startup (`initEvo`).
9
13
  *
10
14
  * ## Tools
11
15
  *
12
- * | Tool | args | action | result |
13
- * |------------|-------------------------------|------------------|-------------------------------------|
14
- * | `cas_add` | `{ content, type? }` | `c.write(...)` | hash (cBase32) |
15
- * | `cas_get` | `{ hash, content?: boolean }` | `c.read(key)` | JSON `{length,mimeType,type[,uri][,text\|blob]}` |
16
- * | `cas_list` | `{}` | `c.list()` | hashes, one per line |
16
+ * | Tool | args | action | result |
17
+ * |-------------|-------------------------------------------------|---------------|--------------------------------------|
18
+ * | `cas_add` | `{ content, type? }` | `c.write(...)`| hash (cBase32) |
19
+ * | `cas_get` | `{ hash, content?: boolean }` | `c.read(key)` | JSON `{length,mimeType,type[,uri][,text\|blob]}` |
20
+ * | `cas_list` | `{}` | `c.list()` | hashes, one per line |
21
+ * | `evo_list` | `{}` | `e.list()` | subjects, one per line |
22
+ * | `evo_head` | `{ subject }` | `e.head(...)` | head hashes, one per line |
23
+ * | `evo_add` | `{ parents, snapshot?, subject?, archived? }` | `e.add(...)` | hash (cBase32) |
17
24
  *
18
25
  * ## `cas_add` input encoding
19
26
  *
@@ -26,7 +33,7 @@
26
33
  *
27
34
  * Inline content (either encoding) is capped at 128 KiB (`maxLength`). There is
28
35
  * no MCP route for larger content — the server never opens a local path named by
29
- * the client (see the invariant in `fs/cas/mcp/README.md`); large files go
36
+ * the client (see the invariant in `fjs/cas/mcp/README.md`); large files go
30
37
  * through the `cas` CLI (`cas add <path>`) instead, run directly by the user.
31
38
  *
32
39
  * ## `cas_get` output
@@ -40,7 +47,7 @@
40
47
  * present (`'text'` or `'base64'`) as the discriminator for which of `text` /
41
48
  * `blob` a later `content: true` fetch would populate — MCP allows extra fields,
42
49
  * so `type` and `length` simply stay alongside the required resource-contents
43
- * fields. A single classifier — the `fs/media/type` detector state machine (length ×
50
+ * fields. A single classifier — the `fjs/media/type` detector state machine (length ×
44
51
  * magic-byte eliminator × UTF-8 DFA) — produces the same three-way verdict on
45
52
  * both paths, so there is no second, divergent copy of the rules:
46
53
  *
@@ -51,12 +58,12 @@
51
58
  *
52
59
  * **Metadata-only (`content: false`, the default) is size-independent for
53
60
  * non-text and oversized blobs.** It folds the read stream through
54
- * `fs/media/type` `detectStream` and never buffers the blob. Because a single
61
+ * `fjs/media/type` `detectStream` and never buffers the blob. Because a single
55
62
  * `Vec` caps at `maxLength` bits (128 KiB), the old drain-into-one-`Vec`
56
63
  * approach failed on any blob larger than one chunk even when only metadata
57
64
  * was asked for; streaming detection returns correct
58
65
  * `{ length, mimeType, type[, uri] }` regardless of size. A dialect (e.g.
59
- * `vnd.fjs.revision`, see `fs/media/module.f.ts`) can only be recognized by
66
+ * `vnd.fjs.revision`, see `fjs/media/module.f.ts`) can only be recognized by
60
67
  * parsing the whole blob as JSON, so when the streaming verdict is
61
68
  * whole-blob-valid text within the same bounded inline cap as `content: true`
62
69
  * (`maxLengthBytes`), one extra bounded read materializes the blob purely to
@@ -65,12 +72,12 @@
65
72
  * alone, unbuffered.
66
73
  *
67
74
  * **`content: true`** first derives `{ length, mimeType, type }` with the same
68
- * size-independent `fs/media/type` `detectStream` machine (to decide whether the
75
+ * size-independent `fjs/media/type` `detectStream` machine (to decide whether the
69
76
  * blob even fits inline), then materializes the bytes (via `collectRead`, bounded
70
77
  * by `maxLength`) and re-derives the verdict from the dialect-aware detector
71
- * (`fs/media/module.f.ts` `detect`) — now that the whole blob is in hand, a
78
+ * (`fjs/media/module.f.ts` `detect`) — now that the whole blob is in hand, a
72
79
  * dialect match is reflected in the result — before encoding the inline payload
73
- * by `type` — a `fs/text/utf8` `fromVec` string on `text` (for `type: 'text'`),
80
+ * by `type` — a `fjs/text/utf8` `fromVec` string on `text` (for `type: 'text'`),
74
81
  * base64 on `blob` (for `type: 'base64'`). A blob larger than `maxLength` (128
75
82
  * KiB) cannot be buffered into one `Vec`, so it is rejected here with a
76
83
  * descriptive *"too large"* error (carrying the byte size and `uri`) rather than
@@ -80,7 +87,7 @@
80
87
  * ## Encoding split: hashes vs. content
81
88
  *
82
89
  * `Cas<O>` deals in `Vec` (bit vectors); MCP models only `textContent` today.
83
- * **Hashes** travel as cBase32 (`fs/basen/cbase32`) — the canonical CAS hash format,
90
+ * **Hashes** travel as cBase32 (`fjs/basen/cbase32`) — the canonical CAS hash format,
84
91
  * shared with the CLI and the on-disk store layout. **Content** encoding is
85
92
  * determined at read time as described above.
86
93
  *
@@ -101,23 +108,25 @@
101
108
  */
102
109
  import { string, option, or, boolean } from '../../types/rtti/module.f.js';
103
110
  import { stringify } from '../../media/json/module.f.js';
104
- import { pure, decode } from '../../effects/module.f.js';
111
+ import { pure } from '../../effects/module.f.js';
105
112
  import { create } from '../../effects/memory/module.f.js';
106
113
  import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.js';
107
114
  import { decode as base64Decode, encode as base64Encode } from '../../basen/base64/module.f.js';
108
115
  import { tryUtf8 } from '../../text/module.f.js';
109
116
  import { detectStream } from '../../media/type/module.f.js';
110
117
  import { detect as detectDialect } from '../../media/module.f.js';
111
- import { empty, length as bitVecLength, maxLength, maxLengthBytes, msb, vec } from '../../types/bit_vec/module.f.js';
118
+ import { maxLengthBytes } from '../../types/bit_vec/module.f.js';
112
119
  import { ok, error } from '../../types/result/module.f.js';
113
120
  import {} from '../../effects/node/module.f.js';
114
121
  import { stdioTransport } from '../../mcp/stdio/module.f.js';
115
- import { mcpStep, uninitializedState, toolEntry, fromRegistry, errorResult, } from '../../mcp/module.f.js';
116
- import { fileCas } from '../module.f.js';
122
+ import { mcpStep, uninitializedState, toolEntry, fromRegistry, errorResult, okResult, } from '../../mcp/module.f.js';
123
+ import { collectRead, fileCas } from '../module.f.js';
117
124
  import { fromVec } from '../../text/utf8/module.f.js';
118
125
  import { identity } from '../../types/function/module.f.js';
119
126
  import { sha256 } from '../../crypto/sha2/module.f.js';
120
127
  import { nonEmpty, empty as elEmpty } from '../../effects/list/module.f.js';
128
+ import { initEvo, evo, syncRevision } from '../evo/module.f.js';
129
+ import { evoToolRegistry } from '../evo/mcp/module.f.js';
121
130
  // ── Argument schemas (declared once, used for both inputSchema and validate) ─────
122
131
  /** Arguments for `cas_add`: content to store, with optional encoding type. */
123
132
  export const casAddArgs = {
@@ -131,38 +140,18 @@ export const casGetArgs = {
131
140
  };
132
141
  /** Arguments for `cas_list`: none. */
133
142
  export const casListArgs = {};
134
- // ── Stream helper ────────────────────────────────────────────────────────────────
135
- /**
136
- * Drains a CAS read stream into a single `Vec`. Used only on the `content: true`
137
- * path, where the whole blob is needed for inline base64 / UTF-8 transfer; the
138
- * chunk stream is concatenated and an error item is surfaced as the result.
139
- * Metadata-only `cas_get` avoids this entirely via `fs/media/type` `detectStream`,
140
- * which is why it is not bound by the `maxLength` ceiling below.
141
- */
142
- const collectRead = (stream) => {
143
- const loop = (acc) => (s) => s.step((node) => {
144
- if (node === undefined) {
145
- return pure(ok(acc));
146
- }
147
- const { first, tail } = node;
148
- const [t, v] = first;
149
- if (t === 'error') {
150
- return pure(first);
151
- }
152
- // A single `Vec` cannot exceed `maxLength` bits; concatenating past it would
153
- // overflow the runtime's `bigint` constraint. Surface that as an error item
154
- // so the tool reports a failure rather than crashing the process.
155
- if (bitVecLength(acc) + bitVecLength(v) > maxLength) {
156
- return pure(error(`cas blob exceeds maximum vector length of ${maxLength} bits`));
157
- }
158
- return loop(msb.concat(acc)(v))(tail);
159
- });
160
- return loop(empty)(stream);
161
- };
162
143
  // ── Tool registry ──────────────────────────────────────────────────────────────
163
144
  const toJson = stringify(identity);
164
- /** Registry of all CAS tools. */
165
- const casToolRegistry = (home) => {
145
+ /**
146
+ * Registry of all CAS tools, bound to `home` and the Evo cache at
147
+ * `cacheKey`. `cas_add` is the only tool that writes, so it is the only one
148
+ * that needs `cacheKey`: a successfully stored blob is folded into the Evo
149
+ * cache via `syncRevision` when it happens to be a `vnd.fjs.revision` — a
150
+ * plain `cas_add` and `evo_add` are two ways to reach the same store, and
151
+ * this keeps `evo_list`/`evo_head` honest about either one without a
152
+ * rescan.
153
+ */
154
+ export const casToolRegistry = (home) => (cacheKey) => {
166
155
  const c = fileCas(sha256)(home);
167
156
  return [
168
157
  toolEntry('cas_add', 'Store content and return its hash (cBase32). Pass type:"base64" for binary; omit or pass type:"text" for UTF-8 text (default). Inline content is capped at 128 KiB (131072 bytes) — larger content is rejected. For larger content, store the file with the `cas` CLI instead: run `npx functionalscript cas add <path>` yourself if you have shell access, or give the user that exact command to run — it prints the resulting hash on stdout.', casAddArgs, ({ type, content }) => {
@@ -173,9 +162,13 @@ const casToolRegistry = (home) => {
173
162
  return x === null
174
163
  ? pure(errorResult('too large or malformed — for large content, run `npx functionalscript cas add <path>` (or have the user run it) instead'))
175
164
  // The resolved content fits in one chunk; feed it as a single-item stream.
176
- : c.write(nonEmpty(ok(x), elEmpty())).step(([tag, hash]) => pure(tag === 'error'
177
- ? errorResult('write')
178
- : okResult(vecToCBase32(hash))));
165
+ : c.write(nonEmpty(ok(x), elEmpty())).step((writeResult) => {
166
+ if (writeResult[0] === 'error') {
167
+ return pure(errorResult('write'));
168
+ }
169
+ const hash = writeResult[1];
170
+ return syncRevision(cacheKey)(hash)(x).step(() => pure(okResult(vecToCBase32(hash))));
171
+ });
179
172
  }),
180
173
  toolEntry('cas_get', 'Inspect a blob by hash. Always returns JSON {length,mimeType,type[,uri]} where type is "text" or "base64". Pass content:true to also include the inline payload as text (type:"text") or blob (type:"base64"), but content is capped at 128 KiB (131072 bytes) — a larger blob is rejected with an error. To download a blob, prefer the uri field returned in the result instead of requesting inline content.', casGetArgs, r => {
181
174
  const key = cBase32ToVec(r.hash);
@@ -242,14 +235,12 @@ const casToolRegistry = (home) => {
242
235
  toolEntry('cas_list', 'List all stored content hashes (cBase32), one per line.', casListArgs, () => c.list().step(hashes => pure(okResult(hashes.map(vecToCBase32).join('\n'))))),
243
236
  ];
244
237
  };
245
- // ── Result helpers ──────────────────────────────────────────────────────────────
246
- /** A successful single-text-block tool result. */
247
- const okResult = (text) => ({ content: [{ type: 'text', text }] });
248
238
  // ── Handlers ────────────────────────────────────────────────────────────────────
249
239
  /**
250
- * MCP handlers for `FileCas`.
240
+ * MCP handlers for `FileCas` plus the Evo API (`fjs/cas/evo`) layered on it,
241
+ * bound to `home` and an already-built Evo cache slot (see `initEvo`).
251
242
  */
252
- export const casMcpHandlers = (home) => fromRegistry(casToolRegistry(home));
243
+ export const casMcpHandlers = (home) => (cacheKey) => fromRegistry([...casToolRegistry(home)(cacheKey), ...evoToolRegistry(evo(fileCas(sha256)(home))(cacheKey))]);
253
244
  // ── Session configuration ───────────────────────────────────────────────────────
254
245
  /**
255
246
  * Static MCP configuration for the CAS server: advertises the `tools`
@@ -262,28 +253,15 @@ export const casConfig = {
262
253
  };
263
254
  // ── Server ──────────────────────────────────────────────────────────────────────
264
255
  /**
265
- * Runs the file CAS MCP server over stdio: allocates the session-state slot, builds
266
- * the `mcpStep` for `c`, and drives the read → parse → dispatch → write loop
267
- * until stdin EOF.
256
+ * Runs the combined CAS + Evo MCP server over stdio: scans `~/.cas/` once to
257
+ * build the Evo subject/head cache (`initEvo`), allocates the session-state
258
+ * slot, builds the `mcpStep` for the merged tool registry, and drives the
259
+ * read → parse → dispatch → write loop until stdin EOF.
268
260
  */
269
- export const casMcpServer = (home) => create(uninitializedState).step(key => stdioTransport(mcpStep(casConfig)(casMcpHandlers(home))(key)));
261
+ export const casMcpServer = (home) => initEvo(fileCas(sha256)(home)).step(cacheKey => create(uninitializedState).step(sessionKey => stdioTransport(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))));
270
262
  // ── Tests ────────────────────────────────────────────────────────────────────
271
263
  export const proof = {
272
264
  // casMcpServer is never called in integration tests because it drives a
273
265
  // real stdio server; call it here to cover its Effect-building body.
274
266
  casMcpServer: () => { casMcpServer('/'); },
275
- // The overflow guard in collectRead (lines 125-126) is only reached when
276
- // the running total of two stream chunks would exceed maxLength. Feed a
277
- // pure stream whose second chunk pushes it just over the limit so the
278
- // error branch executes without any real I/O.
279
- collectReadOverflow: () => {
280
- const half = maxLength / 2n;
281
- const v1 = vec(half)(0n);
282
- const v2 = vec(half + 1n)(0n);
283
- const stream = nonEmpty(ok(v1), nonEmpty(ok(v2), elEmpty()));
284
- const d = decode(collectRead(stream));
285
- if (!d.done || d.result[0] !== 'error') {
286
- throw 'expected overflow error';
287
- }
288
- },
289
267
  };
@@ -7,7 +7,10 @@ export declare const proof: {
7
7
  getContentBase64InflationOverflowWritesInternalError: () => void;
8
8
  getContentBase64NearBoundarySucceeds: () => void;
9
9
  getContentDoubleEscapedOverflowWritesInternalError: () => void;
10
- toolsListAdvertisesThreeTools: () => void;
10
+ toolsListAdvertisesSixTools: () => void;
11
+ evoAddListHeadRoundTripsThroughCasServer: () => void;
12
+ evoAddDomainErrorIsErrorThroughCasServer: () => void;
13
+ casAddSyncsEvoCacheForRevisionContent: () => void;
11
14
  addReturnsHash: () => void;
12
15
  textAddGetMetaRoundTrips: () => void;
13
16
  textAddGetContentRoundTrips: () => void;
@@ -16,6 +16,7 @@ import { casConfig, casMcpHandlers } from './module.f.js';
16
16
  import { ok as resultOk } from '../../types/result/module.f.js';
17
17
  import { stdioTransport } from '../../mcp/stdio/module.f.js';
18
18
  import { fromVec } from '../../types/uint8array/module.f.js';
19
+ import { initEvo } from '../evo/module.f.js';
19
20
  const initialTestState = { memory: { next: 0, values: {} } };
20
21
  const mock = {
21
22
  memCreate: value => state => {
@@ -56,10 +57,10 @@ const feed = (step) => (msgs) => {
56
57
  // Rename/ReadBytes/RandomInt/Mkdir). Uses fileKvStore so upload and get share
57
58
  // the same filesystem-backed CAS.
58
59
  const runSessionVirtual = (root, home = '/home/user') => (msgs) => {
59
- const effect = create(uninitializedState).step(sessionKey => {
60
- const step = mcpStep(casConfig)(casMcpHandlers(home))(sessionKey);
60
+ const effect = initEvo(fileCas(sha256)(home)).step(cacheKey => create(uninitializedState).step(sessionKey => {
61
+ const step = mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey);
61
62
  return feed(step)(msgs);
62
- });
63
+ }));
63
64
  return virtual({ ...emptyState, root })(effect)[1];
64
65
  };
65
66
  // Seeds a blob directly into the virtual store via `c.write`, bypassing the
@@ -91,10 +92,10 @@ const toBytes = (s) => [...fromVec(utf8(s))];
91
92
  // `session`/`runSessionVirtual`, which collect `mcpStep`'s `Response` values
92
93
  // as plain JS objects and never serialize/encode them, this is the only
93
94
  // helper that can observe the transport's oversized-response fallback (see
94
- // `fs/mcp/stdio/module.f.ts` `writeResponse`).
95
+ // `fjs/mcp/stdio/module.f.ts` `writeResponse`).
95
96
  const runStdio = (root, home = '/home/user') => (msgs) => {
96
97
  const input = [init, initialized, ...msgs].map(m => JSON.stringify(m)).join('\n') + '\n';
97
- const effect = create(uninitializedState).step(sessionKey => stdioTransport(mcpStep(casConfig)(casMcpHandlers(home))(sessionKey)));
98
+ const effect = initEvo(fileCas(sha256)(home)).step(cacheKey => create(uninitializedState).step(sessionKey => stdioTransport(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))));
98
99
  const stdout = virtual({ ...emptyState, root, stdin: toBytes(input) })(effect)[0].stdout;
99
100
  // Only requests get a written line (notifications, like `initialized`,
100
101
  // write nothing) — drop the `init` response, keep one line per `msgs` entry.
@@ -105,9 +106,9 @@ const item0 = (resp) => resultOf(resp).content[0];
105
106
  const textOf = (resp) => item0(resp).text;
106
107
  // A plain text sample for text add→get round-trips.
107
108
  const textSample = 'hello, world!';
108
- // A valid `vnd.fjs.revision` blob: zero parents, so `subject` must be (and is,
109
- // per `fs/media/revision/proof.f.ts`) a valid cbase32 hash on its own.
110
- const revisionSample = `{"dialect":"${revisionDialect}","subject":"8","parents":[]}`;
109
+ // A valid `vnd.fjs.revision` blob: every required field present, including the
110
+ // explicit `snapshot` and `generation` the format now mandates.
111
+ const revisionSample = `{"dialect":"${revisionDialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`;
111
112
  // A base64-encoded binary payload for binary add→get round-trips.
112
113
  const binarySample = base64Encode(vec8(0x2an));
113
114
  // A base64 blob whose leading bytes are the PNG magic-byte signature, so
@@ -207,12 +208,12 @@ export const proof = {
207
208
  // the JSON-RPC envelope is even added. The transport's `writeResponse`
208
209
  // (`tryUtf8`) must catch this and write a JSON-RPC internal-error response —
209
210
  // carrying the *original request's* `id` — instead of crashing the process.
210
- // See `fs/mcp/stdio/module.f.ts` `writeResponse`.
211
+ // See `fjs/mcp/stdio/module.f.ts` `writeResponse`.
211
212
  //
212
213
  // This test originally timed out under `bun test`'s native 5s per-test
213
214
  // limit (12-14s observed in CI on PR #1201) — the cost was in
214
215
  // `base64Encode`, quadratic before the `baseN.vecToString` fix (see
215
- // `fs/basen/base64/proof.f.ts` `encodeLargeVecIsSlow`). Now well under budget on
216
+ // `fjs/basen/base64/proof.f.ts` `encodeLargeVecIsSlow`). Now well under budget on
216
217
  // both engines.
217
218
  getContentBase64InflationOverflowWritesInternalError: () => {
218
219
  const [root, hash] = seedBlob({})([oversizedBase64Chunk]);
@@ -256,14 +257,41 @@ export const proof = {
256
257
  assertEq(err.error?.code, -32603);
257
258
  assertEq(err.id, 2);
258
259
  },
259
- toolsListAdvertisesThreeTools: () => {
260
+ toolsListAdvertisesSixTools: () => {
260
261
  const [resp] = runSessionVirtual({})([init, initialized, list(2)]).slice(2);
261
262
  const tools = resp.result.tools;
262
- assertEq(tools.length, 3);
263
- assertEq(tools.map(t => t.name).join(','), 'cas_add,cas_get,cas_list');
263
+ assertEq(tools.length, 6);
264
+ assertEq(tools.map(t => t.name).join(','), 'cas_add,cas_get,cas_list,evo_list,evo_head,evo_add');
264
265
  const add = resp.result.tools[0];
265
266
  assertEq(add.inputSchema.type, 'object');
266
267
  },
268
+ // The same server also exposes Evo (fjs/cas/evo): add a revision, then
269
+ // find it via evo_list/evo_head — one process, one store, one cache.
270
+ evoAddListHeadRoundTripsThroughCasServer: () => {
271
+ const [addResp, listResp, headResp] = session(call(2, 'evo_add', { parents: [], subject: 'doc', snapshot: vecToCBase32(vec8(0x1n)) }), call(3, 'evo_list', {}), call(4, 'evo_head', { subject: 'doc' }));
272
+ assert(!resultOf(addResp).isError);
273
+ const hash = textOf(addResp);
274
+ assert(hash.length > 0);
275
+ assertEq(textOf(listResp), '["doc"]');
276
+ assertEq(textOf(headResp), hash);
277
+ },
278
+ evoAddDomainErrorIsErrorThroughCasServer: () => {
279
+ // Valid arguments, but the domain rule fails: `subject` is required
280
+ // unless there is exactly one parent.
281
+ const [resp] = session(call(2, 'evo_add', { parents: [] }));
282
+ assertEq(resultOf(resp).isError, true);
283
+ assert(textOf(resp).includes('subject is required'));
284
+ },
285
+ // A plain `cas_add` of `vnd.fjs.revision` content is folded into the Evo
286
+ // cache too (`syncRevision`), not just `evo_add` — `cas_add`/`evo_add`
287
+ // are two ways to reach the same store and cache.
288
+ casAddSyncsEvoCacheForRevisionContent: () => {
289
+ const [addResp, listResp, headResp] = session(call(2, 'cas_add', { content: revisionSample }), call(3, 'evo_list', {}), call(4, 'evo_head', { subject: '8' }));
290
+ assert(!resultOf(addResp).isError);
291
+ const hash = textOf(addResp);
292
+ assertEq(textOf(listResp), '["8"]');
293
+ assertEq(textOf(headResp), hash);
294
+ },
267
295
  addReturnsHash: () => {
268
296
  const [resp] = session(call(2, 'cas_add', { content: textSample }));
269
297
  assert(!resultOf(resp).isError);
@@ -33,6 +33,16 @@ export type Cas<O extends Operation> = {
33
33
  /** Lists all stored content hashes. */
34
34
  readonly list: () => Effect<O, readonly Vec[]>;
35
35
  };
36
+ /**
37
+ * Drains a `Cas<O>.read` chunk stream into a single `Vec`. Used by any caller
38
+ * that needs the whole blob at once (an MCP `content: true` fetch, an Evo
39
+ * revision decode): the chunk stream is concatenated and an error item is
40
+ * surfaced as the result. A single `Vec` cannot exceed `maxLength` bits;
41
+ * concatenating past it would overflow the runtime's `bigint` constraint, so
42
+ * that case is surfaced as an error item too, rather than crashing the
43
+ * process.
44
+ */
45
+ export declare const collectRead: <O extends Operation>(stream: List<O, IoResult<Vec>>) => Effect<O, IoResult<Vec>>;
36
46
  export type FileCas = Cas<FileCasOperation> & {
37
47
  url: (v: Vec) => string;
38
48
  };
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { sha256 } from '../crypto/sha2/module.f.js';
7
7
  import { join, normalize, parse } from '../path/module.f.js';
8
- import { empty, length, maxLengthBytes, msb, vec } from '../types/bit_vec/module.f.js';
8
+ import { empty, length, maxLength, maxLengthBytes, msb, vec } from '../types/bit_vec/module.f.js';
9
9
  import { cBase32ToVec, vecToCBase32 } from '../basen/cbase32/module.f.js';
10
10
  import { foldStep, forEachStep, okStep, pure } from '../effects/module.f.js';
11
11
  import { access, createExclusive, isNotFound, mkdir, now, randomInt, readBytes, readdir, rename, rm, stat, writeBytes, } from '../effects/node/module.f.js';
@@ -22,6 +22,32 @@ export const toPath = (key) => {
22
22
  const [b, c] = split2(bc);
23
23
  return join(prefix, a, b, c);
24
24
  };
25
+ /**
26
+ * Drains a `Cas<O>.read` chunk stream into a single `Vec`. Used by any caller
27
+ * that needs the whole blob at once (an MCP `content: true` fetch, an Evo
28
+ * revision decode): the chunk stream is concatenated and an error item is
29
+ * surfaced as the result. A single `Vec` cannot exceed `maxLength` bits;
30
+ * concatenating past it would overflow the runtime's `bigint` constraint, so
31
+ * that case is surfaced as an error item too, rather than crashing the
32
+ * process.
33
+ */
34
+ export const collectRead = (stream) => {
35
+ const loop = (acc) => (s) => s.step((node) => {
36
+ if (node === undefined) {
37
+ return pure(ok(acc));
38
+ }
39
+ const { first, tail } = node;
40
+ const [t, v] = first;
41
+ if (t === 'error') {
42
+ return pure(first);
43
+ }
44
+ if (length(acc) + length(v) > maxLength) {
45
+ return pure(error(`cas blob exceeds maximum vector length of ${maxLength} bits`));
46
+ }
47
+ return loop(msb.concat(acc)(v))(tail);
48
+ });
49
+ return loop(empty)(stream);
50
+ };
25
51
  /** Maximum chunk size for streaming reads: the largest `Vec` the runtime allows. */
26
52
  const chunkBytes = Number(maxLengthBytes);
27
53
  /** Staging directory under the store root; GC and every uploader share it. */
@@ -16,5 +16,9 @@ export declare const proof: {
16
16
  casWriteGcReclaimsExpired: () => void;
17
17
  casUploadSuccess: () => void;
18
18
  casUploadFailureKeepsSource: () => void;
19
+ collectReadDrainsChunks: () => void;
20
+ collectReadPropagatesErrorItem: () => void;
21
+ collectReadOverflow: () => void;
22
+ casListPropagatesNonNotFoundAccessError: () => void;
19
23
  };
20
24
  export {};