functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -1,13 +1,18 @@
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ * @import { List } from '../../effects/list/types.ts'
4
+ * @import { IoChannel } from '../../effects/node/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
- import { ok } from '../../types/result/module.f.mjs'
12
+ import { pureError } from '../../effects/module.f.mjs'
13
+ import { error, ok } from '../../types/result/module.f.mjs'
14
+ import { ioError } from '../../effects/node/module.f.mjs'
9
15
  import { detect, detectStream, detectVec } from './module.f.mjs'
10
- /** @import { DetectMeta } from './types.ts' */
11
16
 
12
17
  // Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
13
18
  // store would hold the leading bytes of a stored blob.
@@ -16,12 +21,12 @@ const bytes = (...b) => u8ListToVec(msb)(b)
16
21
 
17
22
  // ── Streaming detector helpers ──────────────────────────────────────────────────
18
23
 
19
- // Builds a CAS-style read stream from a sequence of ok(chunk) items.
20
- /** @type {(...chunks: readonly Vec[]) => List<never, Result<Vec, unknown>>} */
24
+ // Builds a CAS-style read stream from a sequence of chunks.
25
+ /** @type {(...chunks: readonly Vec[]) => List<never, Vec, IoChannel>} */
21
26
  const stream = (...chunks) =>
22
27
  chunks.reduceRight(
23
- (tail, c) => nonEmpty(ok(c), tail),
24
- /** @type {List<never, Result<Vec, unknown>>} */ (emptyList()))
28
+ (tail, c) => nonEmpty(c, tail),
29
+ /** @satisfies {List<never, Vec, IoChannel>} */ (emptyList()))
25
30
 
26
31
  // Runs the streaming detector over the given chunks and unwraps the metadata.
27
32
  /** @type {(...chunks: readonly Vec[]) => DetectMeta} */
@@ -61,6 +66,11 @@ export const proof = {
61
66
  emptyZip: () =>
62
67
  assertEq(detect(bytes(0x50, 0x4b, 0x05, 0x06, 0x00, 0x00)), 'application/zip'),
63
68
 
69
+ // A spanned ZIP archive — the third "PK" variant, so every entry of the
70
+ // signature list has a case that fails if it is dropped.
71
+ spannedZip: () =>
72
+ assertEq(detect(bytes(0x50, 0x4b, 0x07, 0x08, 0x00, 0x00)), 'application/zip'),
73
+
64
74
  webp: () =>
65
75
  // "RIFF" + 4-byte size + "WEBP"
66
76
  assertEq(
@@ -76,6 +86,25 @@ export const proof = {
76
86
  null),
77
87
 
78
88
  // Plain ASCII text matches no signature.
89
+ // `detect` is the magic projection of `push`, and that only holds because
90
+ // `magicStep` leaves a non-`scan` state alone. These pin both absorbing
91
+ // states as fixed points from the outside, where `magicStep` is private.
92
+ settledMagicIsAFixedPoint: [
93
+ // `matched` survives whatever follows the signature — including bytes
94
+ // that would not extend it, and a long tail that would otherwise keep
95
+ // the fold running.
96
+ () => assertEq(detect(bytes(0xff, 0xd8, 0xff, 0x00, 0x01, 0x02)), 'image/jpeg'),
97
+ () => assertEq(detect(bytes(0xff, 0xd8, 0xff, ...Array(64).fill(0x41))), 'image/jpeg'),
98
+ // `dead` survives too. This is the case where `push` keeps folding
99
+ // after the magic state is settled — `isSettled` stays false while the
100
+ // UTF-8 factor is still valid text — so a `dead` magic is fed many more
101
+ // bytes here than `detect`'s old loop ever gave it.
102
+ () => assertEq(detect(bytes(0x41)), null),
103
+ () => assertEq(detect(bytes(0x41, ...Array(64).fill(0x42))), null),
104
+ // ...and the same input still reads as text through the full detector,
105
+ // confirming the fold really did continue past the dead magic.
106
+ () => assertEq(detectVec(bytes(0x41, ...Array(64).fill(0x42))).type, 'text'),
107
+ ],
79
108
  textIsNull: () =>
80
109
  assertEq(detect(bytes(0x68, 0x65, 0x6c, 0x6c, 0x6f)), null),
81
110
 
@@ -86,6 +115,38 @@ export const proof = {
86
115
  emptyIsNull: () =>
87
116
  assertEq(detect(empty), null),
88
117
 
118
+ // Every signature, one byte short of complete. A signature is only ever
119
+ // recognized on its *last* byte, so each of these must still be null — an
120
+ // off-by-one in the eliminator's terminal-position test would report the
121
+ // format here, and would fire the "GIF8"-prefix trap `gif8NotGif` guards.
122
+ truncated: {
123
+ png: () =>
124
+ assertEq(detect(bytes(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a)), null),
125
+
126
+ jpeg: () =>
127
+ assertEq(detect(bytes(0xff, 0xd8)), null),
128
+
129
+ gif87a: () =>
130
+ assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x37)), null),
131
+
132
+ gif89a: () =>
133
+ assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x39)), null),
134
+
135
+ pdf: () =>
136
+ assertEq(detect(bytes(0x25, 0x50, 0x44, 0x46)), null),
137
+
138
+ zip: () =>
139
+ assertEq(detect(bytes(0x50, 0x4b, 0x03)), null),
140
+
141
+ // 11 bytes: "RIFF", the size wildcards, and all but the last byte of
142
+ // "WEBP" — the wildcard run must not shorten the pattern either.
143
+ webp: () =>
144
+ assertEq(
145
+ detect(bytes(
146
+ 0x52, 0x49, 0x46, 0x46, 0x1a, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42)),
147
+ null),
148
+ },
149
+
89
150
  // ── Streaming detector (detectStream) ───────────────────────────────────────
90
151
 
91
152
  stream: {
@@ -230,11 +291,10 @@ export const proof = {
230
291
  assertEq(m.length, 8n)
231
292
  },
232
293
 
233
- // A read `error` item short-circuits into the IoResult error.
294
+ // A stream that fails carries its failure out as the detector's own.
234
295
  readErrorSurfaces: () => {
235
- /** @type {List<never, Result<Vec, unknown>>} */
236
- const errStream =
237
- nonEmpty(/** @type {const} */ (['error', 'boom']), emptyList())
296
+ /** @type {List<never, Vec, IoChannel>} */
297
+ const errStream = pureError(ioError({ message: 'boom' }))
238
298
  const o = runPure(detectStream(errStream))
239
299
  assert(o.length === 1, 'effect is not pure')
240
300
  assert(o[0][0] === 'error')
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,18 +2,19 @@
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
- import { import_ } from './effects/node/module.f.mjs'
11
- /** @import { NodeOp, NodeProgram } from './effects/node/types.ts' */
14
+ import { errorExit, errorMessage, exitStep, import_ } from './effects/node/module.f.mjs'
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
- import { pure, step } from './effects/module.f.mjs'
16
- import { unwrap } from './types/result/module.f.mjs'
17
+ import { resultStep } from './effects/module.f.mjs'
17
18
 
18
19
  /** @type {Commands<NodeOp>} */
19
20
  const commands = [
@@ -35,9 +36,17 @@ const commands = [
35
36
  {
36
37
  names: ['mcp', 'm'],
37
38
  description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
38
- handler: ({ home }) => step(
39
- casMcpServer(home),
40
- () => pure(0)),
39
+ // `exitStep`, not `resultStep(…, () => pureOk(0))`: the server's
40
+ // bootstrap can fail, and a continuation that ignores its result would
41
+ // report a server that never started as a clean exit.
42
+ //
43
+ // The types do *not* rule that out. `Program`'s exit code being a
44
+ // `Result` catches the old spelling — `() => pure(0)` hands back a bare
45
+ // number, which no longer fits — but `() => pureOk(0)` still compiles,
46
+ // because discarding a result you were handed is exactly what a
47
+ // continuation is allowed to do. This comment guards a mistake that is
48
+ // still available.
49
+ handler: ({ home }) => exitStep(casMcpServer(home)),
41
50
  },
42
51
  {
43
52
  names: ['ci', 'i'],
@@ -47,11 +56,25 @@ const commands = [
47
56
  {
48
57
  names: ['run', 'r'],
49
58
  description: 'Run a FunctionalScript module as a NodeProgram',
59
+ // Both ways this can fail are the command line, not a defect: the
60
+ // named file may not import, and a module that does import may export
61
+ // no `main`. Neither deserves a stack trace, so both are reported on
62
+ // `stderr` and exit `1` — the same answer an unknown command gets a
63
+ // few lines up, and the same one every other command now gives.
50
64
  handler: options => {
51
65
  const [file, ...args] = options.args
52
- return step(
66
+ return resultStep(
53
67
  import_(file),
54
- x => (/** @type {NodeProgram} */ (unwrap(x).main))({ ...options, args }))
68
+ r => {
69
+ if (r[0] === 'error') {
70
+ return errorExit(`${file}: ${errorMessage(r[1])}`)
71
+ }
72
+ const { main } = r[1]
73
+ if (typeof main !== 'function') {
74
+ return errorExit(`${file}: not a NodeProgram — no exported \`main\` function`)
75
+ }
76
+ return /** @type {NodeProgram} */ (main)({ ...options, args })
77
+ })
55
78
  },
56
79
  },
57
80
  ]
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
 
@@ -121,8 +121,8 @@ const eqProof = (() => {
121
121
  })
122
122
  /** @type {(c: EqCase) => readonly[string, () => void]} */
123
123
  const leaf = c => [c.name, () => {
124
- const a = /** @type {any} */(operand(c.a))
125
- const b = /** @type {any} */(operand(c.b))
124
+ const a = operand(c.a)
125
+ const b = operand(c.b)
126
126
  assertEq(a === b, c.eq, [a, c.eq ? '===' : '!==', b])
127
127
  assertEq(b === a, c.eq)
128
128
  }]
@@ -157,7 +157,7 @@ const jsOnly = {
157
157
  },
158
158
  throw: {
159
159
  toStringThrows: () => String({ toString: () => { throw 'Custom error' } }),
160
- toStringNotAFunction: () => String(/** @type {any} */({ toString: 'hello' })),
160
+ toStringNotAFunction: () => String({ toString: 'hello' }),
161
161
  toStringNotPrimitive: () => String({ toString: () => [] }),
162
162
  /** `throws` describes a case's outcome; it is not a value to build. */
163
163
  throwsIsNotAValue: () => value(() => ['throw']),
@@ -78,7 +78,7 @@ export const valueExpr = v => {
78
78
  case 'bigint': { return `bigint_any(${i64Literal(v)})` }
79
79
  }
80
80
  if (Array.isArray(v)) {
81
- const items = /** @type {readonly Value[]} */(v)
81
+ const items = v
82
82
  return items.length === 0
83
83
  ? 'Array::default().to_any()'
84
84
  : `[${items.map(valueExpr).join(', ')}].to_array().to_any()`
@@ -8,16 +8,16 @@
8
8
  *
9
9
  * @module
10
10
  *
11
+ * @import { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
11
12
  * @import { Effect } from '../../effects/types.ts'
12
- * @import { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
13
13
  */
14
+ import type { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts';
14
15
  import type { Effect } from '../../effects/types.ts';
15
- import type { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts';
16
16
  /**
17
17
  * Regenerates `nanvm-lib/tests/test/generated.rs` from the shared test data.
18
18
  *
19
- * @type {() => Effect<Mkdir | WriteFile, void>}
19
+ * @type {() => Effect<Mkdir | WriteFile, void, IoChannel>}
20
20
  */
21
- export declare const generateRustTests: () => Effect<Mkdir | WriteFile, void>;
21
+ export declare const generateRustTests: () => Effect<Mkdir | WriteFile, void, IoChannel>;
22
22
  /** @type {NodeProgram} */
23
23
  export declare const main: NodeProgram;
@@ -8,26 +8,25 @@
8
8
  *
9
9
  * @module
10
10
  *
11
+ * @import { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
11
12
  * @import { Effect } from '../../effects/types.ts'
12
- * @import { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
13
13
  */
14
14
 
15
- import { mapStep, step } from '../../effects/module.f.mjs'
16
- import { mkdir, writeUtf8File } from '../../effects/node/module.f.mjs'
17
- import { unwrap } from '../../types/result/module.f.mjs'
15
+
16
+ import { exitStep, mkdir, writeUtf8File } from '../../effects/node/module.f.mjs'
17
+ import { step } from '../../effects/module.f.mjs'
18
18
  import { data } from '../module.f.mjs'
19
19
  import { directory, generate, path } from '../rust/module.f.mjs'
20
20
 
21
21
  /**
22
22
  * Regenerates `nanvm-lib/tests/test/generated.rs` from the shared test data.
23
23
  *
24
- * @type {() => Effect<Mkdir | WriteFile, void>}
24
+ * @type {() => Effect<Mkdir | WriteFile, void, IoChannel>}
25
25
  */
26
26
  export const generateRustTests = () => {
27
- const directoryReady = mapStep(mkdir(directory, { recursive: true }), unwrap)
28
- const written = step(directoryReady, () => writeUtf8File(path, generate(data)))
29
- return mapStep(written, unwrap)
27
+ const directoryReady = mkdir(directory, { recursive: true })
28
+ return step(directoryReady, () => writeUtf8File(path, generate(data)))
30
29
  }
31
30
 
32
31
  /** @type {NodeProgram} */
33
- export const main = () => mapStep(generateRustTests(), () => 0)
32
+ export const main = () => exitStep(generateRustTests())
@@ -4,8 +4,9 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { exitCode } from '../../effects/node/module.f.mjs'
7
8
  import { assert, assertEq } from '../../asserts/module.f.mjs'
8
- import { step } from '../../effects/module.f.mjs'
9
+ import { step as ioStep } from '../../effects/module.f.mjs'
9
10
  import { readUtf8File } from '../../effects/node/module.f.mjs'
10
11
  import {
11
12
  defaultNodeProgramOptions,
@@ -20,13 +21,13 @@ export const proof = {
20
21
  generateRustTests: () => {
21
22
  // The target directory does not exist in `emptyState`, so this also
22
23
  // covers the `mkdir` the writer does before the file write.
23
- const written = step(generateRustTests(), () => readUtf8File(path))
24
+ const written = ioStep(generateRustTests(), () => readUtf8File(path))
24
25
  const [, [tag, result]] = virtual(emptyState)(written)
25
26
  assert(tag === 'ok', result)
26
27
  assertEq(result, generate(data))
27
28
  },
28
29
  main: () => {
29
30
  const [, result] = virtual(emptyState)(main(defaultNodeProgramOptions))
30
- assertEq(result, 0)
31
+ assertEq(exitCode(result), 0)
31
32
  },
32
33
  }
@@ -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,9 +1,13 @@
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;
4
8
  runModule: () => void;
5
9
  mcp: () => void;
6
- throw: {
7
- runImportError: () => void;
8
- };
10
+ mcpCorruptStore: () => void;
11
+ runImportError: () => void;
12
+ runNotANodeProgram: () => void;
9
13
  };
package/fjs/proof.f.mjs CHANGED
@@ -1,9 +1,14 @@
1
+ /**
2
+ * @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
3
+ * @import { Dir } from './effects/node/virtual/types.ts'
4
+ */
5
+
6
+ import { exitCode } from './effects/node/module.f.mjs'
1
7
  import { assert, assertEq } from './asserts/module.f.mjs'
2
- import { pure } from './effects/module.f.mjs'
3
- /** @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts' */
8
+ import { pureError, pureOk } from './effects/module.f.mjs'
4
9
  import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.mjs'
5
- /** @import { Dir } from './effects/node/virtual/types.ts' */
6
10
  import { main } from './module.f.mjs'
11
+ import { vec8 } from './types/bit_vec/module.f.mjs'
7
12
 
8
13
  /** @type {(args: readonly string[]) => NodeProgramOptions} */
9
14
  const makeOptions = args => ({ ...defaultNodeProgramOptions, args })
@@ -11,18 +16,20 @@ const makeOptions = args => ({ ...defaultNodeProgramOptions, args })
11
16
  const run = (/** @type {Dir} */ root) => (/** @type {readonly string[]} */ args) =>
12
17
  virtual({ ...emptyState, root })(main(makeOptions(args)))
13
18
 
19
+ // A program whose exit code is its argument count — non-zero, so it leaves
20
+ // through the error branch like any other failing program.
14
21
  /** @type {NodeProgram} */
15
- const appMain = ({ args }) => pure(args.length)
22
+ const appMain = ({ args }) => args.length === 0 ? pureOk(0) : pureError(args.length)
16
23
 
17
24
  export const proof = {
18
25
  help: () => {
19
26
  const [state, code] = run({})(['help'])
20
- assertEq(code, 0)
27
+ assertEq(exitCode(code), 0)
21
28
  assert(state.stdout.includes('compile'), 'expected command list in stdout')
22
29
  },
23
30
  compileRequiresArgs: () => {
24
31
  const [state, code] = run({})(['compile'])
25
- assertEq(code, 1)
32
+ assertEq(exitCode(code), 1)
26
33
  assert(state.stderr.length !== 0, 'expected error in stderr')
27
34
  },
28
35
  runModule: () => {
@@ -30,7 +37,7 @@ export const proof = {
30
37
  const root = { 'app.f.ts': () => ({ main: appMain }) }
31
38
  const [, code] = run(root)(['run', 'app.f.ts', 'x', 'y'])
32
39
  // `run` strips the command and file name, so `main` sees two arguments
33
- assertEq(code, 2)
40
+ assertEq(exitCode(code), 2)
34
41
  },
35
42
  mcp: () => {
36
43
  // stdin is empty in the virtual environment, so the server sees EOF
@@ -38,11 +45,33 @@ export const proof = {
38
45
  // The store is empty too, so `casMcpServer`'s Evo cache scan
39
46
  // (`initEvo`) also runs and finds nothing.
40
47
  const [, code] = run({})(['mcp'])
41
- assertEq(code, 0)
48
+ assertEq(exitCode(code), 0)
49
+ },
50
+ mcpCorruptStore: () => {
51
+ // The headline new error path, end to end: `.cas` exists but is a
52
+ // file, so `initEvo`'s scan cannot list it. The server never starts,
53
+ // and the failure travels out of the bootstrap to the command's
54
+ // `exitStep` — a message on stderr and exit 1, where it used to be a
55
+ // panic from inside `buildCache`.
56
+ const [state, code] = run({ '.cas': [vec8(0x2An)] })(['mcp'])
57
+ assertEq(exitCode(code), 1)
58
+ assert(state.stderr !== '', ['expected the storage error on stderr', state.stderr])
42
59
  },
43
- throw: {
44
- runImportError: () => {
45
- run({})(['run', 'missing.f.ts'])
46
- },
60
+ // A file that will not import is the user's command line, not a defect:
61
+ // it is reported with the name they typed and exits 1, where it used to
62
+ // panic out of the effect runner.
63
+ runImportError: () => {
64
+ const [state, code] = run({})(['run', 'missing.f.ts'])
65
+ assertEq(exitCode(code), 1)
66
+ assert(state.stderr.startsWith('missing.f.ts: '), state.stderr)
67
+ },
68
+ // The file imports but is not a program. Same answer, different reason —
69
+ // and the reason is the half of it worth saying.
70
+ runNotANodeProgram: () => {
71
+ /** @type {Dir} */
72
+ const root = { 'app.f.ts': () => ({ notMain: 1 }) }
73
+ const [state, code] = run(root)(['run', 'app.f.ts'])
74
+ assertEq(exitCode(code), 1)
75
+ assert(state.stderr.includes('not a NodeProgram'), state.stderr)
47
76
  },
48
77
  }
@@ -2,7 +2,7 @@
2
2
  * JSON-RPC 2.0 envelopes and a pure dispatcher.
3
3
  *
4
4
  * The envelopes are rtti schemas, so one declaration yields both a runtime
5
- * decoder (`validate(request)`) and the static type (`Ts<typeof request>`) — no
5
+ * decoder (`parse(request)`) and the static type (`Ts<typeof request>`) — no
6
6
  * drift between them. The dispatcher is pure: it maps an already-parsed request
7
7
  * value to a response value (or `null` for a notification) and performs no I/O.
8
8
  *
@@ -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';
@@ -77,7 +77,7 @@ export declare const response: import("../../types/rtti/types.ts").Or<[{
77
77
  readonly id: import("../../types/rtti/types.ts").Or<[import("../../types/rtti/types.ts")._Type0<"string">, import("../../types/rtti/types.ts")._Type0<"number">, null]>;
78
78
  }]>;
79
79
  /** Decodes an untrusted value as a JSON-RPC request / notification. */
80
- export declare const decodeRequest: import("../../types/rtti/common/types.ts").Validate<{
80
+ export declare const decodeRequest: import("../../types/rtti/parse/types.ts").Parse<{
81
81
  readonly jsonrpc: "2.0";
82
82
  readonly method: import("../../types/rtti/types.ts")._Type0<"string">;
83
83
  readonly params: import("../../types/rtti/types.ts").Or<readonly [() => readonly ['or', typeof import("../../media/json/rtti/module.f.mjs").primitive, typeof import("../../media/json/rtti/module.f.mjs").object, typeof import("../../media/json/rtti/module.f.mjs").array], undefined]>;
@@ -2,7 +2,7 @@
2
2
  * JSON-RPC 2.0 envelopes and a pure dispatcher.
3
3
  *
4
4
  * The envelopes are rtti schemas, so one declaration yields both a runtime
5
- * decoder (`validate(request)`) and the static type (`Ts<typeof request>`) — no
5
+ * decoder (`parse(request)`) and the static type (`Ts<typeof request>`) — no
6
6
  * drift between them. The dispatcher is pure: it maps an already-parsed request
7
7
  * value to a response value (or `null` for a notification) and performs no I/O.
8
8
  *
@@ -15,11 +15,12 @@
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
- import { validate } from '../../types/rtti/validate/module.f.mjs'
23
+ import { parse } from '../../types/rtti/parse/module.f.mjs'
23
24
  import { unknown } from '../../media/json/rtti/module.f.mjs'
24
25
 
25
26
  export const jsonrpc = /** @type {const} */ ('2.0')
@@ -62,7 +63,7 @@ export const errorResponse = /** @type {const} */ ({ jsonrpc, error, id: _id })
62
63
  export const response = or(successResponse, errorResponse)
63
64
 
64
65
  /** Decodes an untrusted value as a JSON-RPC request / notification. */
65
- export const decodeRequest = validate(request)
66
+ export const decodeRequest = parse(request)
66
67
 
67
68
  /**
68
69
  * Builds an `RpcError` with the given `code` and `message` (no `data`).
@@ -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,7 +1,10 @@
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
- import { validate } from '../../types/rtti/validate/module.f.mjs'
7
+ import { parse } from '../../types/rtti/parse/module.f.mjs'
5
8
  import {
6
9
  error as errorSchema,
7
10
  decodeRequest,
@@ -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: {
@@ -38,9 +44,9 @@ export const proof = {
38
44
  notObject: () => assert(!isOk(decodeRequest(42))),
39
45
  },
40
46
  error: {
41
- ok: () => assert(isOk(validate(errorSchema)({ code: -1, message: 'x' }))),
42
- withData: () => assert(isOk(validate(errorSchema)({ code: -1, message: 'x', data: [1, 2] }))),
43
- missingMessage: () => assert(!isOk(validate(errorSchema)({ code: -1 }))),
47
+ ok: () => assert(isOk(parse(errorSchema)({ code: -1, message: 'x' }))),
48
+ withData: () => assert(isOk(parse(errorSchema)({ code: -1, message: 'x', data: [1, 2] }))),
49
+ missingMessage: () => assert(!isOk(parse(errorSchema)({ code: -1 }))),
44
50
  },
45
51
  },
46
52
  errors: {
@@ -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)