functionalscript 0.44.0 → 0.45.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 (453) hide show
  1. package/fjs/asn.1/proof.f.d.mts +5 -0
  2. package/fjs/asn.1/proof.f.mjs +15 -3
  3. package/fjs/asserts/module.f.d.mts +14 -0
  4. package/fjs/asserts/module.f.mjs +20 -0
  5. package/fjs/asserts/proof.f.d.mts +3 -0
  6. package/fjs/asserts/proof.f.mjs +15 -1
  7. package/fjs/basen/base128/proof.f.d.mts +3 -1
  8. package/fjs/basen/base128/proof.f.mjs +3 -1
  9. package/fjs/basen/base64/module.f.mjs +7 -3
  10. package/fjs/basen/base64/proof.f.d.mts +3 -1
  11. package/fjs/basen/base64/proof.f.mjs +7 -4
  12. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  13. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  14. package/fjs/bnf/data/proof.f.mjs +0 -1
  15. package/fjs/bnf/descent/module.f.d.mts +17 -2
  16. package/fjs/bnf/descent/module.f.mjs +118 -41
  17. package/fjs/bnf/descent/proof.f.d.mts +1 -0
  18. package/fjs/bnf/descent/proof.f.mjs +77 -1
  19. package/fjs/bnf/descent/types.d.ts +12 -4
  20. package/fjs/bnf/ll1/module.f.d.mts +28 -2
  21. package/fjs/bnf/ll1/module.f.mjs +180 -38
  22. package/fjs/bnf/ll1/proof.f.d.mts +2 -0
  23. package/fjs/bnf/ll1/proof.f.mjs +62 -1
  24. package/fjs/bnf/ll1/types.d.ts +14 -8
  25. package/fjs/bnf/module.f.d.mts +15 -6
  26. package/fjs/bnf/module.f.mjs +52 -11
  27. package/fjs/bnf/proof.f.d.mts +2 -0
  28. package/fjs/bnf/proof.f.mjs +79 -3
  29. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  30. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  31. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  32. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  33. package/fjs/bnf/types.d.ts +10 -3
  34. package/fjs/cas/cli/proof.f.d.mts +3 -1
  35. package/fjs/cas/cli/proof.f.mjs +3 -1
  36. package/fjs/cas/evo/module.f.d.mts +7 -13
  37. package/fjs/cas/evo/module.f.mjs +103 -96
  38. package/fjs/cas/evo/proof.f.mjs +6 -3
  39. package/fjs/cas/module.f.mjs +96 -109
  40. package/fjs/ci/common/module.f.d.mts +1 -1
  41. package/fjs/ci/common/module.f.mjs +1 -0
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/nix/proof.f.d.mts +2 -0
  45. package/fjs/ci/nix/proof.f.mjs +2 -2
  46. package/fjs/ci/proof.f.d.mts +4 -2
  47. package/fjs/ci/proof.f.mjs +4 -3
  48. package/fjs/cli/proof.f.d.mts +4 -2
  49. package/fjs/cli/proof.f.mjs +4 -2
  50. package/fjs/common/monoid/module.f.d.mts +70 -12
  51. package/fjs/common/monoid/module.f.mjs +177 -14
  52. package/fjs/common/monoid/proof.f.d.mts +12 -1
  53. package/fjs/common/monoid/proof.f.mjs +88 -4
  54. package/fjs/common/monoid/types.d.ts +23 -0
  55. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  56. package/fjs/crypto/secp/proof.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +3 -1
  58. package/fjs/crypto/sha2/proof.f.mjs +3 -1
  59. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  60. package/fjs/crypto/vdf/module.f.mjs +6 -4
  61. package/fjs/dev/module.f.d.mts +5 -2
  62. package/fjs/dev/module.f.mjs +5 -4
  63. package/fjs/dev/package_json/module.f.d.mts +7 -0
  64. package/fjs/dev/package_json/module.f.mjs +10 -7
  65. package/fjs/dev/update/module.f.d.mts +3 -0
  66. package/fjs/dev/update/module.f.mjs +3 -2
  67. package/fjs/dev/update/proof.f.d.mts +3 -0
  68. package/fjs/dev/update/proof.f.mjs +1 -2
  69. package/fjs/djs/parser/module.f.d.mts +3 -0
  70. package/fjs/djs/parser/module.f.mjs +18 -0
  71. package/fjs/djs/parser/proof.f.d.mts +3 -0
  72. package/fjs/djs/parser/proof.f.mjs +13 -1
  73. package/fjs/djs/proof.f.d.mts +3 -0
  74. package/fjs/djs/proof.f.mjs +4 -1
  75. package/fjs/djs/serializer/module.f.mjs +5 -4
  76. package/fjs/djs/tokenizer/module.f.mjs +21 -13
  77. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  78. package/fjs/djs/tokenizer/proof.f.mjs +14 -2
  79. package/fjs/djs/transpiler/module.f.d.mts +1 -12
  80. package/fjs/djs/transpiler/module.f.mjs +1 -20
  81. package/fjs/djs/transpiler/types.d.ts +25 -0
  82. package/fjs/effects/eff/module.f.d.mts +10 -0
  83. package/fjs/effects/eff/module.f.mjs +4 -2
  84. package/fjs/effects/eff/proof.f.d.mts +3 -0
  85. package/fjs/effects/eff/proof.f.mjs +4 -1
  86. package/fjs/effects/list/module.f.d.mts +10 -2
  87. package/fjs/effects/list/module.f.mjs +4 -2
  88. package/fjs/effects/memory/module.f.d.mts +4 -2
  89. package/fjs/effects/memory/module.f.mjs +4 -3
  90. package/fjs/effects/memory/proof.f.d.mts +4 -0
  91. package/fjs/effects/memory/proof.f.mjs +5 -2
  92. package/fjs/effects/mock/module.f.d.mts +10 -2
  93. package/fjs/effects/mock/module.f.mjs +4 -2
  94. package/fjs/effects/module.d.mts +8 -0
  95. package/fjs/effects/module.f.d.mts +6 -4
  96. package/fjs/effects/module.f.mjs +6 -5
  97. package/fjs/effects/module.mjs +9 -1
  98. package/fjs/effects/node/memory/module.d.mts +3 -0
  99. package/fjs/effects/node/memory/module.mjs +3 -2
  100. package/fjs/effects/node/memory/proof.d.mts +2 -0
  101. package/fjs/effects/node/memory/proof.mjs +2 -1
  102. package/fjs/effects/node/module.d.mts +5 -0
  103. package/fjs/effects/node/module.f.d.mts +17 -12
  104. package/fjs/effects/node/module.f.mjs +6 -12
  105. package/fjs/effects/node/module.mjs +5 -17
  106. package/fjs/effects/node/virtual/module.f.d.mts +6 -3
  107. package/fjs/effects/node/virtual/module.f.mjs +6 -5
  108. package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
  109. package/fjs/effects/node/virtual/proof.f.mjs +13 -1
  110. package/fjs/effects/proof.f.d.mts +3 -0
  111. package/fjs/effects/proof.f.mjs +4 -1
  112. package/fjs/emergent_testing/all.test.d.mts +8 -0
  113. package/fjs/emergent_testing/all.test.mjs +14 -0
  114. package/fjs/emergent_testing/module.f.d.mts +6 -1
  115. package/fjs/emergent_testing/module.f.mjs +40 -66
  116. package/fjs/emergent_testing/proof.f.mjs +5 -5
  117. package/fjs/fsc/bnf.f.d.mts +3 -0
  118. package/fjs/fsc/bnf.f.mjs +4 -1
  119. package/fjs/fsc/json.f.d.mts +3 -0
  120. package/fjs/fsc/json.f.mjs +4 -1
  121. package/fjs/fsc/module.f.d.mts +9 -0
  122. package/fjs/fsc/module.f.mjs +5 -3
  123. package/fjs/fsm/proof.f.d.mts +3 -0
  124. package/fjs/fsm/proof.f.mjs +4 -1
  125. package/fjs/js/tokenizer/module.f.d.mts +7 -0
  126. package/fjs/js/tokenizer/module.f.mjs +19 -55
  127. package/fjs/mcp/module.f.d.mts +36 -1
  128. package/fjs/mcp/module.f.mjs +9 -7
  129. package/fjs/mcp/proof.f.d.mts +11 -1
  130. package/fjs/mcp/proof.f.mjs +11 -18
  131. package/fjs/media/html/module.f.d.mts +12 -0
  132. package/fjs/media/html/module.f.mjs +6 -4
  133. package/fjs/media/html/proof.f.d.mts +3 -0
  134. package/fjs/media/html/proof.f.mjs +4 -1
  135. package/fjs/media/json/parser/module.f.d.mts +1 -1
  136. package/fjs/media/json/parser/module.f.mjs +25 -8
  137. package/fjs/media/json/parser/types.d.ts +5 -0
  138. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  139. package/fjs/media/json/rtti/proof.f.mjs +3 -3
  140. package/fjs/media/json/schema/module.f.d.mts +61 -27
  141. package/fjs/media/json/schema/module.f.mjs +228 -63
  142. package/fjs/media/json/schema/proof.f.d.mts +41 -0
  143. package/fjs/media/json/schema/proof.f.mjs +219 -7
  144. package/fjs/media/json/serializer/module.f.d.mts +13 -0
  145. package/fjs/media/json/serializer/module.f.mjs +7 -7
  146. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  147. package/fjs/media/json/tokenizer/module.f.mjs +24 -5
  148. package/fjs/media/nix/module.f.d.mts +13 -0
  149. package/fjs/media/nix/module.f.mjs +4 -2
  150. package/fjs/media/nix/proof.f.d.mts +3 -0
  151. package/fjs/media/nix/proof.f.mjs +4 -1
  152. package/fjs/media/revision/module.f.d.mts +5 -0
  153. package/fjs/media/revision/module.f.mjs +8 -11
  154. package/fjs/media/revision/proof.f.d.mts +4 -0
  155. package/fjs/media/revision/proof.f.mjs +5 -2
  156. package/fjs/media/type/module.f.d.mts +28 -11
  157. package/fjs/media/type/module.f.mjs +69 -85
  158. package/fjs/media/type/proof.f.d.mts +16 -0
  159. package/fjs/media/type/proof.f.mjs +44 -4
  160. package/fjs/module.d.mts +5 -0
  161. package/fjs/module.f.d.mts +8 -0
  162. package/fjs/module.f.mjs +4 -2
  163. package/fjs/module.mjs +6 -0
  164. package/fjs/path/module.f.d.mts +8 -0
  165. package/fjs/path/module.f.mjs +4 -2
  166. package/fjs/proof.f.d.mts +4 -0
  167. package/fjs/proof.f.mjs +5 -2
  168. package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
  169. package/fjs/protocol/json_rpc/module.f.mjs +7 -4
  170. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  171. package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
  172. package/fjs/protocol/mcp/proof.f.d.mts +4 -0
  173. package/fjs/protocol/mcp/proof.f.mjs +47 -24
  174. package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
  175. package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
  176. package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
  177. package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
  178. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  179. package/fjs/sul/id/module.f.d.mts +5 -0
  180. package/fjs/sul/id/module.f.mjs +5 -4
  181. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  182. package/fjs/sul/level/hash/module.f.mjs +4 -3
  183. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  184. package/fjs/sul/level/hash/proof.f.mjs +5 -2
  185. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  186. package/fjs/sul/level/literal/module.f.mjs +4 -3
  187. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  188. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  189. package/fjs/sul/module.f.d.mts +5 -3
  190. package/fjs/sul/module.f.mjs +5 -4
  191. package/fjs/sul/proof.f.d.mts +4 -0
  192. package/fjs/sul/proof.f.mjs +5 -2
  193. package/fjs/text/ascii/module.f.d.mts +26 -0
  194. package/fjs/text/ascii/module.f.mjs +49 -1
  195. package/fjs/text/ascii/proof.f.d.mts +10 -0
  196. package/fjs/text/ascii/proof.f.mjs +33 -1
  197. package/fjs/text/code_point/module.f.d.mts +21 -3
  198. package/fjs/text/code_point/module.f.mjs +24 -8
  199. package/fjs/text/code_point/proof.f.d.mts +1 -0
  200. package/fjs/text/code_point/proof.f.mjs +28 -0
  201. package/fjs/text/module.f.d.mts +4 -2
  202. package/fjs/text/module.f.mjs +4 -3
  203. package/fjs/text/proof.f.d.mts +3 -0
  204. package/fjs/text/proof.f.mjs +4 -1
  205. package/fjs/text/sgr/module.f.d.mts +4 -1
  206. package/fjs/text/sgr/module.f.mjs +4 -3
  207. package/fjs/text/sgr/proof.f.d.mts +3 -0
  208. package/fjs/text/sgr/proof.f.mjs +4 -1
  209. package/fjs/text/utf16/module.f.d.mts +5 -1
  210. package/fjs/text/utf16/module.f.mjs +31 -33
  211. package/fjs/text/utf16/proof.f.d.mts +3 -1
  212. package/fjs/text/utf16/proof.f.mjs +18 -1
  213. package/fjs/text/utf8/module.f.d.mts +9 -5
  214. package/fjs/text/utf8/module.f.mjs +16 -18
  215. package/fjs/types/array/module.f.d.mts +2 -1
  216. package/fjs/types/array/module.f.mjs +2 -2
  217. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  218. package/fjs/types/bigfloat/module.f.mjs +33 -7
  219. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  220. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  221. package/fjs/types/bigint/module.f.d.mts +4 -0
  222. package/fjs/types/bigint/module.f.mjs +4 -3
  223. package/fjs/types/bit_vec/module.f.d.mts +10 -14
  224. package/fjs/types/bit_vec/module.f.mjs +61 -71
  225. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  226. package/fjs/types/bit_vec/proof.f.mjs +29 -3
  227. package/fjs/types/btree/find/module.f.d.mts +5 -1
  228. package/fjs/types/btree/find/module.f.mjs +5 -5
  229. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  230. package/fjs/types/btree/find/proof.f.mjs +5 -3
  231. package/fjs/types/btree/module.f.d.mts +3 -0
  232. package/fjs/types/btree/module.f.mjs +3 -2
  233. package/fjs/types/btree/proof.f.d.mts +5 -1
  234. package/fjs/types/btree/proof.f.mjs +5 -3
  235. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  236. package/fjs/types/btree/remove/module.f.mjs +9 -9
  237. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  238. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  239. package/fjs/types/btree/set/module.f.d.mts +9 -0
  240. package/fjs/types/btree/set/module.f.mjs +5 -6
  241. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  242. package/fjs/types/btree/set/proof.f.mjs +4 -1
  243. package/fjs/types/btree/types/module.f.d.mts +2 -1
  244. package/fjs/types/btree/types/module.f.mjs +2 -1
  245. package/fjs/types/byte_set/module.f.d.mts +10 -1
  246. package/fjs/types/byte_set/module.f.mjs +5 -3
  247. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  248. package/fjs/types/byte_set/proof.f.mjs +3 -1
  249. package/fjs/types/function/compare/module.f.d.mts +3 -2
  250. package/fjs/types/function/compare/module.f.mjs +3 -2
  251. package/fjs/types/function/module.f.d.mts +8 -1
  252. package/fjs/types/function/module.f.mjs +8 -1
  253. package/fjs/types/function/operator/module.f.d.mts +2 -1
  254. package/fjs/types/function/operator/module.f.mjs +2 -2
  255. package/fjs/types/list/module.f.d.mts +9 -2
  256. package/fjs/types/list/module.f.mjs +5 -3
  257. package/fjs/types/list/proof.f.d.mts +4 -1
  258. package/fjs/types/list/proof.f.mjs +4 -2
  259. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  260. package/fjs/types/nibble_set/module.f.mjs +2 -2
  261. package/fjs/types/nominal/module.f.d.mts +2 -1
  262. package/fjs/types/nominal/module.f.mjs +2 -1
  263. package/fjs/types/nullable/module.f.d.mts +8 -2
  264. package/fjs/types/nullable/module.f.mjs +4 -2
  265. package/fjs/types/number/module.f.d.mts +4 -0
  266. package/fjs/types/number/module.f.mjs +4 -3
  267. package/fjs/types/object/module.f.d.mts +14 -2
  268. package/fjs/types/object/module.f.mjs +15 -6
  269. package/fjs/types/object/proof.f.d.mts +5 -2
  270. package/fjs/types/object/proof.f.mjs +6 -3
  271. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  272. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  273. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  274. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  275. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  276. package/fjs/types/ordered_map/module.f.mjs +5 -4
  277. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  278. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  279. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  280. package/fjs/types/patricia_trie/module.f.mjs +2 -2
  281. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  282. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  283. package/fjs/types/prime_field/module.f.d.mts +3 -1
  284. package/fjs/types/prime_field/module.f.mjs +3 -2
  285. package/fjs/types/range/module.f.d.mts +2 -1
  286. package/fjs/types/range/module.f.mjs +2 -2
  287. package/fjs/types/range_map/module.f.d.mts +6 -0
  288. package/fjs/types/range_map/module.f.mjs +6 -9
  289. package/fjs/types/range_map/proof.f.d.mts +5 -1
  290. package/fjs/types/range_map/proof.f.mjs +5 -3
  291. package/fjs/types/range_set/module.f.d.mts +5 -0
  292. package/fjs/types/range_set/module.f.mjs +1 -0
  293. package/fjs/types/range_set/proof.f.d.mts +3 -0
  294. package/fjs/types/range_set/proof.f.mjs +4 -1
  295. package/fjs/types/result/module.d.mts +8 -0
  296. package/fjs/types/result/module.f.d.mts +37 -7
  297. package/fjs/types/result/module.f.mjs +38 -8
  298. package/fjs/types/result/module.mjs +9 -1
  299. package/fjs/types/result/proof.f.d.mts +5 -0
  300. package/fjs/types/result/proof.f.mjs +22 -2
  301. package/fjs/types/rtti/common/module.f.d.mts +35 -2
  302. package/fjs/types/rtti/common/module.f.mjs +9 -7
  303. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  304. package/fjs/types/rtti/common/proof.f.mjs +5 -2
  305. package/fjs/types/rtti/data/module.f.d.mts +120 -0
  306. package/fjs/types/rtti/data/module.f.mjs +1030 -0
  307. package/fjs/types/rtti/data/proof.f.d.mts +75 -0
  308. package/fjs/types/rtti/data/proof.f.mjs +566 -0
  309. package/fjs/types/rtti/data/types.d.ts +83 -0
  310. package/fjs/types/rtti/module.f.d.mts +12 -5
  311. package/fjs/types/rtti/module.f.mjs +7 -5
  312. package/fjs/types/rtti/parse/module.f.d.mts +38 -0
  313. package/fjs/types/rtti/parse/module.f.mjs +9 -7
  314. package/fjs/types/rtti/parse/proof.f.mjs +18 -38
  315. package/fjs/types/rtti/proof.f.d.mts +3 -1
  316. package/fjs/types/rtti/proof.f.mjs +3 -1
  317. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  318. package/fjs/types/rtti/ts/module.f.mjs +262 -30
  319. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  320. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  321. package/fjs/types/rtti/ts/types.d.ts +11 -0
  322. package/fjs/types/rtti/types.d.ts +40 -0
  323. package/fjs/types/rtti/validate/module.f.d.mts +36 -1
  324. package/fjs/types/rtti/validate/module.f.mjs +6 -4
  325. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  326. package/fjs/types/sorted_list/module.f.mjs +21 -12
  327. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  328. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  329. package/fjs/types/sorted_set/module.f.d.mts +31 -1
  330. package/fjs/types/sorted_set/module.f.mjs +4 -2
  331. package/fjs/types/sorted_set/proof.f.d.mts +3 -1
  332. package/fjs/types/sorted_set/proof.f.mjs +3 -1
  333. package/fjs/types/string/module.f.d.mts +4 -0
  334. package/fjs/types/string/module.f.mjs +4 -3
  335. package/fjs/types/string_set/module.f.d.mts +3 -1
  336. package/fjs/types/string_set/module.f.mjs +3 -2
  337. package/fjs/types/ts/module.f.d.mts +2 -0
  338. package/fjs/types/ts/module.f.mjs +3 -3
  339. package/fjs/types/ts/proof.f.d.mts +1 -0
  340. package/fjs/types/ts/proof.f.mjs +5 -0
  341. package/fjs/types/ts/types.d.ts +6 -1
  342. package/fjs/types/uint8array/module.f.d.mts +13 -2
  343. package/fjs/types/uint8array/module.f.mjs +20 -15
  344. package/fjs/website/module.f.d.mts +3 -0
  345. package/fjs/website/module.f.mjs +3 -2
  346. package/package.json +3 -3
  347. package/fjs/asn.1/types.js +0 -6
  348. package/fjs/asserts/types.js +0 -6
  349. package/fjs/basen/types.js +0 -6
  350. package/fjs/bnf/data/types.js +0 -6
  351. package/fjs/bnf/descent/types.js +0 -6
  352. package/fjs/bnf/ll1/types.js +0 -6
  353. package/fjs/bnf/token_symbol/types.js +0 -6
  354. package/fjs/bnf/types.js +0 -6
  355. package/fjs/cas/evo/types.js +0 -7
  356. package/fjs/cas/types.js +0 -6
  357. package/fjs/ci/common/types.js +0 -1
  358. package/fjs/ci/nix/types.js +0 -6
  359. package/fjs/ci/types.js +0 -6
  360. package/fjs/cli/types.js +0 -6
  361. package/fjs/common/monoid/types.js +0 -6
  362. package/fjs/crypto/pow/types.js +0 -6
  363. package/fjs/crypto/secp/types.js +0 -6
  364. package/fjs/crypto/sha2/types.js +0 -6
  365. package/fjs/crypto/sign/types.js +0 -6
  366. package/fjs/crypto/vdf/types.js +0 -6
  367. package/fjs/dev/types.js +0 -6
  368. package/fjs/djs/ast/types.js +0 -8
  369. package/fjs/djs/parser/types.js +0 -7
  370. package/fjs/djs/tokenizer/types.js +0 -7
  371. package/fjs/djs/types.js +0 -7
  372. package/fjs/effects/eff/types.js +0 -6
  373. package/fjs/effects/list/types.js +0 -6
  374. package/fjs/effects/memory/types.js +0 -6
  375. package/fjs/effects/mock/types.js +0 -6
  376. package/fjs/effects/node/types.js +0 -6
  377. package/fjs/effects/node/virtual/types.js +0 -7
  378. package/fjs/effects/types.js +0 -6
  379. package/fjs/emergent_testing/all.test.d.ts +0 -1
  380. package/fjs/emergent_testing/all.test.js +0 -5
  381. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  382. package/fjs/emergent_testing/scenarios/all.js +0 -1
  383. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  384. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  385. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  386. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  387. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  388. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  389. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  390. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  391. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  392. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  393. package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
  394. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  395. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  396. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  397. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  398. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  399. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  400. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  401. package/fjs/emergent_testing/types.js +0 -6
  402. package/fjs/js/tokenizer/types.js +0 -6
  403. package/fjs/media/html/types.js +0 -6
  404. package/fjs/media/json/parser/types.js +0 -6
  405. package/fjs/media/json/tokenizer/types.js +0 -6
  406. package/fjs/media/json/types.js +0 -13
  407. package/fjs/media/nix/types.js +0 -6
  408. package/fjs/media/revision/types.js +0 -8
  409. package/fjs/media/type/types.js +0 -6
  410. package/fjs/media/types.js +0 -7
  411. package/fjs/nanvm/types.js +0 -11
  412. package/fjs/protocol/json_rpc/types.js +0 -8
  413. package/fjs/protocol/mcp/types.js +0 -8
  414. package/fjs/sul/id/types.js +0 -6
  415. package/fjs/sul/level/hash/types.js +0 -6
  416. package/fjs/sul/level/literal/types.js +0 -6
  417. package/fjs/sul/types.js +0 -6
  418. package/fjs/text/sgr/types.js +0 -6
  419. package/fjs/text/types.js +0 -6
  420. package/fjs/text/utf16/types.js +0 -6
  421. package/fjs/text/utf8/types.js +0 -6
  422. package/fjs/types/array/types.js +0 -6
  423. package/fjs/types/bigfloat/types.js +0 -6
  424. package/fjs/types/bigint/types.js +0 -6
  425. package/fjs/types/bit_vec/types.js +0 -6
  426. package/fjs/types/btree/find/types.js +0 -6
  427. package/fjs/types/btree/types/types.js +0 -6
  428. package/fjs/types/byte_set/types.js +0 -6
  429. package/fjs/types/function/compare/types.js +0 -6
  430. package/fjs/types/function/operator/types.js +0 -6
  431. package/fjs/types/function/types.js +0 -6
  432. package/fjs/types/list/types.js +0 -6
  433. package/fjs/types/nibble_set/types.js +0 -6
  434. package/fjs/types/nominal/types.js +0 -6
  435. package/fjs/types/nullable/types.js +0 -6
  436. package/fjs/types/object/types.js +0 -8
  437. package/fjs/types/option/types.js +0 -6
  438. package/fjs/types/ordered_map/types.js +0 -6
  439. package/fjs/types/patricia_trie/types.js +0 -6
  440. package/fjs/types/phantom/types.js +0 -11
  441. package/fjs/types/prime_field/types.js +0 -6
  442. package/fjs/types/range/types.js +0 -6
  443. package/fjs/types/range_map/types.js +0 -6
  444. package/fjs/types/result/types.js +0 -6
  445. package/fjs/types/rtti/common/types.js +0 -1
  446. package/fjs/types/rtti/parse/types.js +0 -1
  447. package/fjs/types/rtti/ts/types.js +0 -1
  448. package/fjs/types/rtti/types.js +0 -1
  449. package/fjs/types/rtti/validate/types.js +0 -1
  450. package/fjs/types/sorted_list/types.js +0 -6
  451. package/fjs/types/sorted_set/types.js +0 -6
  452. package/fjs/types/string_set/types.js +0 -6
  453. package/fjs/types/ts/types.js +0 -8
@@ -1,15 +1,16 @@
1
1
  /**
2
2
  * Magic-byte MIME type detection.
3
3
  *
4
- * `detect` is a pure table lookup over the leading bytes of a `Vec`: it returns a
5
- * MIME type string for the container formats whose signatures it knows, or `null`
6
- * for anything else text, unknown binary, or a `Vec` too short to match.
4
+ * One list `signatures` declares every recognized magic-byte pattern, and
5
+ * both detectors read it through the same eliminator (`magicStep`): `detect`
6
+ * folds a whole `Vec` and returns a MIME type string or `null`, while
7
+ * `detectStream` folds a read stream one chunk at a time.
7
8
  *
8
- * Beside it, `detectStream` is the **streaming counterpart**: a byte-accepting
9
- * state machine (length × magic-byte eliminator × UTF-8 validity DFA) that derives
10
- * `{ length, mime_type, type }` by folding a CAS read stream in O(1) space, without
11
- * ever buffering the blob into a single `maxLength`-bounded `Vec`. See the README
12
- * for the factored design.
9
+ * Beside `detect`, `detectStream` is the **streaming counterpart**: a
10
+ * byte-accepting state machine (length × magic-byte eliminator × UTF-8 validity
11
+ * DFA) that derives `{ length, mime_type, type }` by folding a CAS read stream in
12
+ * O(1) space, without ever buffering the blob into a single `maxLength`-bounded
13
+ * `Vec`. See the README for the factored design.
13
14
  *
14
15
  * The CAS store is type-agnostic and keeps raw bytes only, so type is never
15
16
  * stored; it is recovered on read by sniffing the content. Callers decide what
@@ -27,107 +28,51 @@
27
28
  * | `application/zip` | `50 4B 03 04` / `05 06` / `07 08` (`"PK"` entry, empty, or spanned) |
28
29
  *
29
30
  * WebP is the one signature with a gap: the four-byte little-endian file size
30
- * sits between the `RIFF` and `WEBP` markers, so it is matched as a prefix plus
31
- * a second marker at byte offset 8 rather than a single contiguous run.
31
+ * sits between the `RIFF` and `WEBP` markers, so its pattern carries four
32
+ * wildcard bytes rather than being one contiguous run.
32
33
  *
33
34
  * See `./types.ts` for the type-level API.
34
35
  *
35
36
  * @module
37
+ *
38
+ * @import { Vec } from '../../types/bit_vec/types.ts'
39
+ * @import { Nullable } from '../../types/nullable/types.ts'
40
+ * @import { Effect, Operation } from '../../effects/types.ts'
41
+ * @import { List } from '../../effects/list/types.ts'
42
+ * @import { IoResult } from '../../effects/node/types.ts'
43
+ * @import { DetectMeta, DetectState, _MagicState, _Signature, _Utf8Detect } from './types.ts'
36
44
  */
37
45
 
38
- import { msb, fromSentinel, length, u8List } from '../../types/bit_vec/module.f.mjs'
39
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
46
+ import { msb, length, u8List } from '../../types/bit_vec/module.f.mjs'
40
47
  import { iterable } from '../../types/list/module.f.mjs'
41
- /** @import { Nullable } from '../../types/nullable/types.ts' */
42
48
  import { pure, step } from '../../effects/module.f.mjs'
43
- /** @import { Effect, Operation } from '../../effects/types.ts' */
44
- /** @import { List } from '../../effects/list/types.ts' */
45
- /** @import { IoResult } from '../../effects/node/types.ts' */
46
49
  import { ok, error } from '../../types/result/module.f.mjs'
47
50
  import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.mjs'
48
51
  import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.mjs'
49
- /** @import { DetectMeta, DetectState, _MagicState, _Signature, _Utf8Detect } from './types.ts' */
50
-
51
- const { startsWith, removeFront } = msb
52
-
53
- // Each signature is written as a hex literal whose leading `1` nibble is a
54
- // sentinel marking the start of the byte run (so leading zero bytes survive)
55
- // and fixing the length — see `bit_vec` `fromSentinel`.
56
- const sig = fromSentinel
57
-
58
- /**
59
- * Contiguous magic-byte signatures, checked in order; the first prefix match
60
- * wins. Ordering is irrelevant here — no signature is a prefix of another.
61
- *
62
- * @type {readonly (readonly [Vec, string])[]}
63
- */
64
- const table = [
65
- [sig(0x1_89_50_4e_47_0d_0a_1a_0an), 'image/png'],
66
- [sig(0x1_ff_d8_ffn), 'image/jpeg'],
67
- // Match the full GIF version headers ("GIF87a" / "GIF89a"), not just "GIF8",
68
- // so opaque bytes that merely start with "GIF8" are not mistyped.
69
- [sig(0x1_47_49_46_38_37_61n), 'image/gif'],
70
- [sig(0x1_47_49_46_38_39_61n), 'image/gif'],
71
- [sig(0x1_25_50_44_46_2dn), 'application/pdf'],
72
- // ZIP has three "PK" local-header variants: a normal entry, an empty
73
- // archive (end-of-central-directory only), and a spanned archive.
74
- [sig(0x1_50_4b_03_04n), 'application/zip'],
75
- [sig(0x1_50_4b_05_06n), 'application/zip'],
76
- [sig(0x1_50_4b_07_08n), 'application/zip'],
77
- ]
78
-
79
- // WebP: "RIFF" at offset 0, "WEBP" at offset 8 (the 4 bytes between are the
80
- // file size). 12 bytes = 96 bits is the minimum to carry both markers.
81
- const riff = sig(0x1_52_49_46_46n)
82
- const webp = sig(0x1_57_45_42_50n)
83
-
84
- /** @type {(bytes: Vec) => boolean} */
85
- const isWebp = bytes =>
86
- length(bytes) >= 96n
87
- && startsWith(riff)(bytes)
88
- && startsWith(webp)(removeFront(64n)(bytes))
89
-
90
- /**
91
- * Detects the MIME type of `bytes` from its leading magic-byte signature.
92
- *
93
- * @returns the MIME type string for a recognized format, or `null` when the
94
- * leading bytes match no known signature (including any `Vec` shorter than
95
- * the signature it might otherwise match).
96
- *
97
- * @type {(bytes: Vec) => Nullable<string>}
98
- */
99
- export const detect = bytes => {
100
- if (isWebp(bytes)) { return 'image/webp' }
101
- for (const [s, m] of table) {
102
- if (startsWith(s)(bytes)) { return m }
103
- }
104
- return null
105
- }
106
52
 
107
- // ── Streaming detector ────────────────────────────────────────────────────────────
53
+ // ── Magic-byte signatures ─────────────────────────────────────────────────────────
108
54
  //
109
- // A byte-accepting state machine that derives the same `{ length, mime_type, type }`
110
- // metadata as the pure `detect` + UTF-8 path, but **without buffering the blob**.
111
- // It is the product of three independent folds over the byte stream — length,
112
- // magic-byte signature elimination, and a UTF-8 validity DFA — read off at
113
- // end-of-stream by `finish`. This lets `cas_get` inspect arbitrarily large blobs
114
- // (where a single `Vec` would overflow `maxLength`) in O(1) space, since the bulk
115
- // of a large blob costs only length counting once the verdict is fixed (see
116
- // `isSettled`: a magic match settles it immediately, a dead magic once utf8 fails).
55
+ // The single declaration of what a signature is: a byte pattern the eliminator can
56
+ // consume one byte at a time, with `null` for a wildcard byte. Both `detect` and
57
+ // the streaming detector below eliminate against this one list, so a signature is
58
+ // added or corrected in exactly one place.
117
59
 
118
- // The streaming counterpart of `table`/`isWebp`: the same signatures expressed as
119
- // byte patterns the eliminator can consume one byte at a time. WebP's gap is the
120
- // only wildcard run.
121
60
  /** @type {readonly _Signature[]} */
122
61
  const signatures = [
123
62
  { pattern: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], mime: 'image/png' },
124
63
  { pattern: [0xff, 0xd8, 0xff], mime: 'image/jpeg' },
64
+ // Match the full GIF version headers ("GIF87a" / "GIF89a"), not just "GIF8",
65
+ // so opaque bytes that merely start with "GIF8" are not mistyped.
125
66
  { pattern: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], mime: 'image/gif' },
126
67
  { pattern: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], mime: 'image/gif' },
127
68
  { pattern: [0x25, 0x50, 0x44, 0x46, 0x2d], mime: 'application/pdf' },
69
+ // ZIP has three "PK" local-header variants: a normal entry, an empty
70
+ // archive (end-of-central-directory only), and a spanned archive.
128
71
  { pattern: [0x50, 0x4b, 0x03, 0x04], mime: 'application/zip' },
129
72
  { pattern: [0x50, 0x4b, 0x05, 0x06], mime: 'application/zip' },
130
73
  { pattern: [0x50, 0x4b, 0x07, 0x08], mime: 'application/zip' },
74
+ // WebP: "RIFF" at offset 0, "WEBP" at offset 8; the four bytes between are
75
+ // the little-endian file size, matched as wildcards.
131
76
  {
132
77
  pattern: [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50],
133
78
  mime: 'image/webp',
@@ -154,6 +99,45 @@ const magicStep = (m, byte) => {
154
99
  /** @type {(m: _MagicState) => Nullable<string>} */
155
100
  const magicMime = m => m.tag === 'matched' ? m.mime : null
156
101
 
102
+ /**
103
+ * Detects the MIME type of `bytes` from its leading magic-byte signature by
104
+ * folding them through the same eliminator the streaming detector uses. Both
105
+ * absorbing states end the fold: a `matched` signature is the answer, and a
106
+ * `dead` eliminator can no longer produce one. Bytes still in `scan` at the end
107
+ * of the `Vec` — a prefix too short to complete any signature — leave the
108
+ * eliminator unsettled, which reads as `null`.
109
+ *
110
+ * The bytes come from `u8List`, so a `Vec` whose length is not a whole number of
111
+ * bytes has its trailing partial byte zero-padded — the same reading of a ragged
112
+ * `Vec` the streaming detector already uses.
113
+ *
114
+ * @returns the MIME type string for a recognized format, or `null` when the
115
+ * leading bytes match no known signature (including any `Vec` shorter than
116
+ * the signature it might otherwise match).
117
+ *
118
+ * @type {(bytes: Vec) => Nullable<string>}
119
+ */
120
+ export const detect = bytes => {
121
+ /** @type {_MagicState} */
122
+ let magic = magicInit
123
+ for (const byte of iterable(u8List(msb)(bytes))) {
124
+ magic = magicStep(magic, byte)
125
+ if (magic.tag !== 'scan') { break }
126
+ }
127
+ return magicMime(magic)
128
+ }
129
+
130
+ // ── Streaming detector ────────────────────────────────────────────────────────────
131
+ //
132
+ // A byte-accepting state machine that derives the same `{ length, mime_type, type }`
133
+ // metadata as the pure `detect` + UTF-8 path, but **without buffering the blob**.
134
+ // It is the product of three independent folds over the byte stream — length,
135
+ // magic-byte signature elimination, and a UTF-8 validity DFA — read off at
136
+ // end-of-stream by `finish`. This lets `cas_get` inspect arbitrarily large blobs
137
+ // (where a single `Vec` would overflow `maxLength`) in O(1) space, since the bulk
138
+ // of a large blob costs only length counting once the verdict is fixed (see
139
+ // `isSettled`: a magic match settles it immediately, a dead magic once utf8 fails).
140
+
157
141
  /** @type {_Utf8Detect} */
158
142
  const utf8Init = { st: null, valid: true, text: true }
159
143
 
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ * @import { List } from '../../effects/list/types.ts'
4
+ * @import { Result } from '../../types/result/types.ts'
5
+ * @import { DetectMeta } from './types.ts'
6
+ */
1
7
  export declare const proof: {
2
8
  png: () => void;
3
9
  jpeg: () => void;
@@ -7,11 +13,21 @@ export declare const proof: {
7
13
  pdf: () => void;
8
14
  zip: () => void;
9
15
  emptyZip: () => void;
16
+ spannedZip: () => void;
10
17
  webp: () => void;
11
18
  riffNotWebp: () => void;
12
19
  textIsNull: () => void;
13
20
  shortIsNull: () => void;
14
21
  emptyIsNull: () => void;
22
+ truncated: {
23
+ png: () => void;
24
+ jpeg: () => void;
25
+ gif87a: () => void;
26
+ gif89a: () => void;
27
+ pdf: () => void;
28
+ zip: () => void;
29
+ webp: () => void;
30
+ };
15
31
  stream: {
16
32
  text: () => void;
17
33
  png: () => void;
@@ -1,13 +1,16 @@
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ * @import { List } from '../../effects/list/types.ts'
4
+ * @import { Result } from '../../types/result/types.ts'
5
+ * @import { DetectMeta } from './types.ts'
6
+ */
7
+
1
8
  import { assert, assertEq } from '../../asserts/module.f.mjs'
2
9
  import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.mjs'
3
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
4
10
  import { runPure } from '../../effects/module.f.mjs'
5
11
  import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.mjs'
6
- /** @import { List } from '../../effects/list/types.ts' */
7
- /** @import { Result } from '../../types/result/types.ts' */
8
12
  import { ok } from '../../types/result/module.f.mjs'
9
13
  import { detect, detectStream, detectVec } from './module.f.mjs'
10
- /** @import { DetectMeta } from './types.ts' */
11
14
 
12
15
  // Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
13
16
  // store would hold the leading bytes of a stored blob.
@@ -61,6 +64,11 @@ export const proof = {
61
64
  emptyZip: () =>
62
65
  assertEq(detect(bytes(0x50, 0x4b, 0x05, 0x06, 0x00, 0x00)), 'application/zip'),
63
66
 
67
+ // A spanned ZIP archive — the third "PK" variant, so every entry of the
68
+ // signature list has a case that fails if it is dropped.
69
+ spannedZip: () =>
70
+ assertEq(detect(bytes(0x50, 0x4b, 0x07, 0x08, 0x00, 0x00)), 'application/zip'),
71
+
64
72
  webp: () =>
65
73
  // "RIFF" + 4-byte size + "WEBP"
66
74
  assertEq(
@@ -86,6 +94,38 @@ export const proof = {
86
94
  emptyIsNull: () =>
87
95
  assertEq(detect(empty), null),
88
96
 
97
+ // Every signature, one byte short of complete. A signature is only ever
98
+ // recognized on its *last* byte, so each of these must still be null — an
99
+ // off-by-one in the eliminator's terminal-position test would report the
100
+ // format here, and would fire the "GIF8"-prefix trap `gif8NotGif` guards.
101
+ truncated: {
102
+ png: () =>
103
+ assertEq(detect(bytes(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a)), null),
104
+
105
+ jpeg: () =>
106
+ assertEq(detect(bytes(0xff, 0xd8)), null),
107
+
108
+ gif87a: () =>
109
+ assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x37)), null),
110
+
111
+ gif89a: () =>
112
+ assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x39)), null),
113
+
114
+ pdf: () =>
115
+ assertEq(detect(bytes(0x25, 0x50, 0x44, 0x46)), null),
116
+
117
+ zip: () =>
118
+ assertEq(detect(bytes(0x50, 0x4b, 0x03)), null),
119
+
120
+ // 11 bytes: "RIFF", the size wildcards, and all but the last byte of
121
+ // "WEBP" — the wildcard run must not shorten the pattern either.
122
+ webp: () =>
123
+ assertEq(
124
+ detect(bytes(
125
+ 0x52, 0x49, 0x46, 0x46, 0x1a, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42)),
126
+ null),
127
+ },
128
+
89
129
  // ── Streaming detector (detectStream) ───────────────────────────────────────
90
130
 
91
131
  stream: {
package/fjs/module.d.mts CHANGED
@@ -1,2 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ /**
3
+ * The `fjs` CLI executable entry point.
4
+ *
5
+ * @module
6
+ */
2
7
  export {};
@@ -1,3 +1,11 @@
1
+ /**
2
+ * FunctionalScript compiler entry points and command handlers.
3
+ *
4
+ * @module
5
+ *
6
+ * @import { NodeOp, NodeProgram } from './effects/node/types.ts'
7
+ * @import { Commands } from './cli/types.ts'
8
+ */
1
9
  import type { NodeProgram } from './effects/node/types.ts';
2
10
  /** @type {NodeProgram} */
3
11
  export declare const main: NodeProgram;
package/fjs/module.f.mjs CHANGED
@@ -2,15 +2,17 @@
2
2
  * FunctionalScript compiler entry points and command handlers.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { NodeOp, NodeProgram } from './effects/node/types.ts'
7
+ * @import { Commands } from './cli/types.ts'
5
8
  */
9
+
6
10
  import { compile } from './djs/module.f.mjs'
7
11
  import { main as testMain } from './emergent_testing/module.f.mjs'
8
12
  import { commands as casCommands } from './cas/cli/module.f.mjs'
9
13
  import { main as ciMain } from './ci/module.f.mjs'
10
14
  import { import_ } from './effects/node/module.f.mjs'
11
- /** @import { NodeOp, NodeProgram } from './effects/node/types.ts' */
12
15
  import { dispatch } from './cli/module.f.mjs'
13
- /** @import { Commands } from './cli/types.ts' */
14
16
  import { casMcpServer } from './mcp/module.f.mjs'
15
17
  import { pure, step } from './effects/module.f.mjs'
16
18
  import { unwrap } from './types/result/module.f.mjs'
package/fjs/module.mjs CHANGED
@@ -1,5 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ /**
4
+ * The `fjs` CLI executable entry point.
5
+ *
6
+ * @module
7
+ */
8
+
3
9
  import { main } from './module.f.mjs'
4
10
  import { run } from './effects/node/module.mjs'
5
11
 
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Path parsing and normalization helpers for portable module paths.
3
+ *
4
+ * @module
5
+ *
6
+ * @import { Fold, Reduce, Unary } from '../types/function/operator/types.ts'
7
+ * @import { List } from '../types/list/types.ts'
8
+ */
1
9
  import type { Reduce, Unary } from '../types/function/operator/types.ts';
2
10
  /**
3
11
  * Converts Windows separators (`\`) to POSIX separators (`/`).
@@ -2,9 +2,11 @@
2
2
  * Path parsing and normalization helpers for portable module paths.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { Fold, Reduce, Unary } from '../types/function/operator/types.ts'
7
+ * @import { List } from '../types/list/types.ts'
5
8
  */
6
- /** @import { Fold, Reduce, Unary } from '../types/function/operator/types.ts' */
7
- /** @import { List } from '../types/list/types.ts' */
9
+
8
10
  import { fold, last, take, length, concat as listConcat, toArray } from '../types/list/module.f.mjs'
9
11
  import { join as listJoin, concat as stringConcat } from '../types/string/module.f.mjs'
10
12
 
package/fjs/proof.f.d.mts CHANGED
@@ -1,3 +1,7 @@
1
+ /**
2
+ * @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
3
+ * @import { Dir } from './effects/node/virtual/types.ts'
4
+ */
1
5
  export declare const proof: {
2
6
  help: () => void;
3
7
  compileRequiresArgs: () => void;
package/fjs/proof.f.mjs CHANGED
@@ -1,8 +1,11 @@
1
+ /**
2
+ * @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
3
+ * @import { Dir } from './effects/node/virtual/types.ts'
4
+ */
5
+
1
6
  import { assert, assertEq } from './asserts/module.f.mjs'
2
7
  import { pure } from './effects/module.f.mjs'
3
- /** @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts' */
4
8
  import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.mjs'
5
- /** @import { Dir } from './effects/node/virtual/types.ts' */
6
9
  import { main } from './module.f.mjs'
7
10
 
8
11
  /** @type {(args: readonly string[]) => NodeProgramOptions} */
@@ -15,7 +15,7 @@
15
15
  * @module
16
16
  *
17
17
  * @import { Unknown } from '../../media/json/types.ts'
18
- * @import { Id, RpcError, Handler, Handlers, Response } from './types.ts'
18
+ * @import { Id, RpcError, Handlers, Response } from './types.ts'
19
19
  */
20
20
  import type { Unknown } from '../../media/json/types.ts';
21
21
  import type { RpcError, Handlers, Response } from './types.ts';
@@ -15,9 +15,10 @@
15
15
  * @module
16
16
  *
17
17
  * @import { Unknown } from '../../media/json/types.ts'
18
- * @import { Id, RpcError, Handler, Handlers, Response } from './types.ts'
18
+ * @import { Id, RpcError, Handlers, Response } from './types.ts'
19
19
  */
20
20
 
21
+ import { at } from '../../types/object/module.f.mjs'
21
22
  import { number, string, or, option } from '../../types/rtti/module.f.mjs'
22
23
  import { validate } from '../../types/rtti/validate/module.f.mjs'
23
24
  import { unknown } from '../../media/json/rtti/module.f.mjs'
@@ -100,9 +101,11 @@ export const dispatch = handlers => value => {
100
101
  if (id === undefined) {
101
102
  return null
102
103
  }
103
- /** @type {Handler | undefined} */
104
- const handler = handlers[method]
105
- if (handler === undefined) {
104
+ // `at`, not `handlers[method]`: `method` is untrusted wire data, and a
105
+ // bracket lookup on a plain object resolves inherited `Object.prototype`
106
+ // names (`constructor`, `toString`, ) to callables.
107
+ const handler = at(method)(handlers)
108
+ if (handler === null) {
106
109
  return errorResponseOf(id)(methodNotFound)
107
110
  }
108
111
  const [t2, result] = handler(params)
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @import { Handlers } from './types.ts'
3
+ */
1
4
  export declare const proof: {
2
5
  schema: {
3
6
  request: {
@@ -29,6 +32,9 @@ export declare const proof: {
29
32
  paramsPassed: () => void;
30
33
  handlerError: () => void;
31
34
  methodNotFound: () => void;
35
+ inheritedToString: () => void;
36
+ inheritedConstructor: () => void;
37
+ ownPrototypeName: () => void;
32
38
  invalidRequest: () => void;
33
39
  notification: () => void;
34
40
  };
@@ -1,4 +1,7 @@
1
- /** @import { Handlers } from './types.ts' */
1
+ /**
2
+ * @import { Handlers } from './types.ts'
3
+ */
4
+
2
5
  import { assert, assertEq } from '../../asserts/module.f.mjs'
3
6
  import { ok, error } from '../../types/result/module.f.mjs'
4
7
  import { validate } from '../../types/rtti/validate/module.f.mjs'
@@ -25,6 +28,9 @@ const handlers = {
25
28
  }
26
29
  const d = dispatch(handlers)
27
30
 
31
+ /** A handler table that does own the `Object.prototype` name `toString`. */
32
+ const dOwnPrototypeName = dispatch({ toString: () => ok('own') })
33
+
28
34
  export const proof = {
29
35
  schema: {
30
36
  request: {
@@ -72,6 +78,21 @@ export const proof = {
72
78
  const r = d({ jsonrpc: '2.0', method: 'nope', id: 4 })
73
79
  assert(r !== null && 'error' in r && r.error.code === -32601)
74
80
  },
81
+ // `method` is untrusted wire data: an inherited `Object.prototype`
82
+ // name must not resolve to a callable.
83
+ inheritedToString: () => {
84
+ const r = d({ jsonrpc: '2.0', method: 'toString', id: 4 })
85
+ assert(r !== null && 'error' in r && r.error.code === -32601)
86
+ },
87
+ inheritedConstructor: () => {
88
+ const r = d({ jsonrpc: '2.0', method: 'constructor', id: 4 })
89
+ assert(r !== null && 'error' in r && r.error.code === -32601)
90
+ },
91
+ // ... while an *own* property of that name is an ordinary method.
92
+ ownPrototypeName: () => {
93
+ const r = dOwnPrototypeName({ jsonrpc: '2.0', method: 'toString', id: 4 })
94
+ assert(r !== null && 'result' in r && r.result === 'own')
95
+ },
75
96
  invalidRequest: () => {
76
97
  const r = d({ jsonrpc: '1.0', method: 'ping', id: 5 })
77
98
  assert(r !== null && 'error' in r && r.error.code === -32600 && r.id === null)
@@ -3,6 +3,7 @@
3
3
  * @import { Effect, Operation } from '../../effects/types.ts'
4
4
  * @import { MemOperationMap } from '../../effects/mock/types.ts'
5
5
  * @import { Key, MemOp } from '../../effects/memory/types.ts'
6
+ * @import { Ts } from '../../types/rtti/ts/types.ts'
6
7
  * @import {
7
8
  * ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
8
9
  * McpHandlers, McpConfig, McpSessionState,
@@ -50,4 +51,7 @@ export declare const proof: {
50
51
  toolsCallWithoutCapabilityReturnsMethodNotFound: () => void;
51
52
  unknownMethodReturnsMethodNotFound: () => void;
52
53
  };
54
+ registry: {
55
+ toolsCallAbsentArgumentsDefaultsToEmptyObject: () => void;
56
+ };
53
57
  };
@@ -3,6 +3,7 @@
3
3
  * @import { Effect, Operation } from '../../effects/types.ts'
4
4
  * @import { MemOperationMap } from '../../effects/mock/types.ts'
5
5
  * @import { Key, MemOp } from '../../effects/memory/types.ts'
6
+ * @import { Ts } from '../../types/rtti/ts/types.ts'
6
7
  * @import {
7
8
  * ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
8
9
  * McpHandlers, McpConfig, McpSessionState,
@@ -10,12 +11,11 @@
10
11
  */
11
12
 
12
13
  import { assert, assertEq } from '../../asserts/module.f.mjs'
13
- import { pure, step } from '../../effects/module.f.mjs'
14
- import { eff } from '../../effects/eff/module.f.mjs'
14
+ import { history, historyStep, mapStep, pure, step, runPure } from '../../effects/module.f.mjs'
15
15
  import { run } from '../../effects/mock/module.f.mjs'
16
16
  import { asBase, asNominal, create, read } from '../../effects/memory/module.f.mjs'
17
17
  import {
18
- uninitializedState, mcpStep, notInitialized,
18
+ uninitializedState, mcpStep, notInitialized, fromRegistry, toolEntry, okResult,
19
19
  } from './module.f.mjs'
20
20
 
21
21
  // ── Memory mock ────────────────────────────────────────────────────────────────
@@ -80,40 +80,44 @@ const runMem = effect =>
80
80
  /** @type {<T>(e: Effect<Operation, T>) => Effect<MemOp, T>} */
81
81
  const asMemEffect = e => /** @type {Effect<MemOp, any>} */ (/** @type {unknown} */ (e))
82
82
 
83
+ // Pairs the last step's response with the session state read back afterwards.
84
+ // The response is still needed after the read, so it is carried forward in a
85
+ // history rather than closed over by a nested continuation.
86
+ /** @type {(key: Key<McpSessionState>) => (e: Effect<Operation, unknown>) => Effect<Operation, _StepResult>} */
87
+ const withState = key => e => {
88
+ const read0 = historyStep(history(e), () => read(key))
89
+ return mapStep(read0, ([state, resp]) => /** @type {const} */ ([resp, state]))
90
+ }
91
+
83
92
  // Run one step from uninitializedState, return [response, newState].
84
93
  /** @type {(cfg: McpConfig) => (msg: unknown) => _StepResult} */
85
94
  const step1 = cfg => msg =>
86
95
  runMem(asMemEffect(step(
87
96
  create(/** @type {McpSessionState} */ (uninitializedState)),
88
- key => step(
89
- mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg)),
90
- resp => step(
91
- read(key),
92
- state => pure(/** @type {const} */ ([resp, state])),
93
- ),
94
- ),
95
- )))
97
+ key => withState(key)(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg))))))
96
98
 
97
99
  // Run initialize then a second step, return [response, newState] of the second.
98
100
  /** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => _StepResult} */
99
101
  const step2 = cfg => msg1 => msg2 =>
100
- runMem(asMemEffect(eff(create(/** @type {McpSessionState} */ (uninitializedState))).step(key =>
101
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))).step(() =>
102
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2))).step(resp =>
103
- step(
104
- read(key),
105
- state => pure(/** @type {const} */ ([resp, state])),
106
- )
107
- ).value).value).value))
102
+ runMem(asMemEffect(step(
103
+ create(/** @type {McpSessionState} */ (uninitializedState)),
104
+ key => {
105
+ const r1 = mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))
106
+ const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2)))
107
+ return withState(key)(r2)
108
+ })))
108
109
 
109
110
  // Run initialize, notifications/initialized, then a third step; return [response, newState] of the third.
110
111
  /** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => (msg3: unknown) => _StepResult} */
111
112
  const step3 = cfg => msg1 => msg2 => msg3 =>
112
- runMem(asMemEffect(eff(create(/** @type {McpSessionState} */ (uninitializedState))).step(key =>
113
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))).step(() =>
114
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2))).step(() =>
115
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg3))).step(resp =>
116
- eff(read(key)).step(state => pure(/** @type {const} */ ([/** @type {unknown} */ (resp), state]))).value).value).value).value).value))
113
+ runMem(asMemEffect(step(
114
+ create(/** @type {McpSessionState} */ (uninitializedState)),
115
+ key => {
116
+ const r1 = mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))
117
+ const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2)))
118
+ const r3 = step(r2, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg3)))
119
+ return withState(key)(r3)
120
+ })))
117
121
 
118
122
  // ── Test messages ─────────────────────────────────────────────────────────────
119
123
 
@@ -309,4 +313,23 @@ export const proof = {
309
313
  assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32601)
310
314
  },
311
315
  },
316
+
317
+ registry: {
318
+ // `fromRegistry`'s `toolsCall` defaults a missing `arguments` field to
319
+ // `{}` before dispatching to the matched entry's `handle`. Exercised
320
+ // here directly (bypassing `mcpStep`) so the default reaches
321
+ // `toolEntry`'s own validation: if it were left `undefined` instead,
322
+ // validating it against the empty-object schema below would fail and
323
+ // this would observe an error result instead of `ok`.
324
+ toolsCallAbsentArgumentsDefaultsToEmptyObject: () => {
325
+ const echoArgs = /** @type {const} */ ({})
326
+ const entry = toolEntry('echo', 'echoes', echoArgs,
327
+ /** @type {(a: Ts<typeof echoArgs>) => Effect<never, ToolsCallResult>} */
328
+ (() => pure(okResult('ok'))))
329
+ const handlers = fromRegistry([entry])
330
+ const [result] = runPure(handlers.toolsCall({ name: 'echo' }))
331
+ assert(result !== undefined)
332
+ assertEq(/** @type {{ readonly text: string }} */ (result.content[0]).text, 'ok')
333
+ },
334
+ },
312
335
  }