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
@@ -9,55 +9,166 @@
9
9
  * See `./types.ts` for the type-level API.
10
10
  *
11
11
  * @module
12
+ *
13
+ * @import { Vec } from '../../types/bit_vec/types.ts'
14
+ * @import { Result } from '../../types/result/types.ts'
15
+ * @import { Commands, CommandSet, Effect, Func, NotImplemented, Operation } from '../types.ts'
16
+ * @import { List } from '../list/types.ts'
17
+ * @import { All, Access, Await, Console, CreateExclusive, CreateServer, Dirent, Engine, Env, Exec, ExecResult, Fetch, FileStat, Forever, Fs, Headers, Http, IncomingMessage, Import, IoChannel, IoError, IoErrorInfo, Listen, MakeDirectoryOptions, Mkdir, Module, Now, NodeOp, NodeProgramOptions, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, ReaddirOptions, RequestListener, Rename, Rm, Sandbox, SandboxResult, Server, ServerResponse, Stat, Test, TestContext, TestFn, Write, WriteBytes, WriteConsoles, WriteFile, _UtfList, _WriteLoop } from './types.ts'
12
18
  */
19
+
13
20
  import { utf8, utf8ToString } from '../../text/module.f.mjs'
14
21
  import { toCodePointList } from '../../text/utf8/module.f.mjs'
15
22
  import { codePointListToString } from '../../text/utf16/module.f.mjs'
16
23
  import { reverse } from '../../types/list/module.f.mjs'
17
24
  import { length } from '../../types/bit_vec/module.f.mjs'
18
- import { ok, error as resultError, mapOk } from '../../types/result/module.f.mjs'
19
- import { do_, mapStep, okStep, pure, step } from '../module.f.mjs'
20
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
21
- /** @import { Effect, Func, Operation } from '../types.ts' */
22
- /** @import { List } from '../list/types.ts' */
23
- /** @import {
24
- All, Access, Await, Console, CreateExclusive, CreateServer, Dirent, Engine,
25
- Env, Exec, ExecResult, Fetch, FileStat, Forever, Fs, Headers, Http,
26
- IncomingMessage, Import, IoResult, Listen, MakeDirectoryOptions, Mkdir,
27
- Module, Now, NodeOp, NodeProgramOptions, RandomInt, Read, ReadBytes,
28
- ReadConsoles, ReadFile, Readdir, ReaddirOptions, RequestListener, Rename,
29
- Rm, Sandbox, SandboxResult, Server, ServerResponse, Stat, Test, TestContext,
30
- TestFn, Write, WriteBytes, WriteConsoles, WriteFile, _UtfList, _WriteLoop,
31
- } from './types.ts' */
25
+ import { error as resultError, ok as resultOk, unwrap } from '../../types/result/module.f.mjs'
26
+ import { do_, pure } from '../module.f.mjs'
27
+ import {
28
+ mapStep as ioMapStep, pureError, pureOk, resultMapStep, resultStep, step as ioStep,
29
+ } from '../module.f.mjs'
30
+
31
+ /**
32
+ * Builds a normalized host error. The constructor exists so the shape is
33
+ * written once: every runner reports its failures through it, and a consumer
34
+ * matching on `'ioError'` knows what the payload holds.
35
+ *
36
+ * @type {(info: IoErrorInfo) => IoError}
37
+ */
38
+ export const ioError = info => ['ioError', info]
39
+
40
+ /**
41
+ * Normalizes a **thrown** value into an {@link IoError}: the OS error code when
42
+ * the host attached a string one, and a message that is the `Error`'s own or
43
+ * the value's string form.
44
+ *
45
+ * This is the boundary where an impure runner's `catch` becomes ordinary effect
46
+ * data. Nothing past it sees the thrown object, which is the point — a stack, a
47
+ * `cause`, and arbitrary own properties do not survive a wire hop, and a
48
+ * program that branched on them would be reading the host's implementation
49
+ * rather than the operation's contract.
50
+ *
51
+ * @type {(e: unknown) => IoError}
52
+ */
53
+ export const toIoError = e => {
54
+ const message = e instanceof Error ? e.message : String(e)
55
+ if (typeof e !== 'object' || e === null || !('code' in e) || typeof e.code !== 'string') {
56
+ return ioError({ message })
57
+ }
58
+ return ioError({ code: e.code, message })
59
+ }
32
60
 
33
61
  /**
34
62
  * True if `e` is a "file or directory does not exist" (`ENOENT`) error.
35
63
  *
36
- * Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'`; the
37
- * virtual interpreter mirrors that shape for absent paths. Lets callers swallow
38
- * only the missing-path case (e.g. a fresh store) while propagating genuine
39
- * failures (permissions, corruption) rather than masking them.
64
+ * Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'`, which
65
+ * {@link toIoError} keeps; the virtual interpreter reports the same code for
66
+ * absent paths. Lets callers swallow only the missing-path case (e.g. a fresh
67
+ * store) while propagating genuine failures (permissions, corruption) rather
68
+ * than masking them.
69
+ *
70
+ * A {@link NotImplemented} is never "not found": a runner that cannot perform
71
+ * the operation has not looked for the path at all, so the two must not
72
+ * collapse into one benign branch — which is exactly what a bare `unknown`
73
+ * error channel used to allow.
74
+ *
75
+ * @type {(e: IoChannel) => boolean}
76
+ */
77
+ export const isNotFound = ([tag, payload]) =>
78
+ tag === 'ioError' && payload.code === 'ENOENT'
79
+
80
+ /**
81
+ * `NodeOp`'s commands as data, so a runner that implements only part of them
82
+ * can still tell an operation it lacks from a `Do` node whose `command` was
83
+ * never a `NodeOp` at all — see `CommandSet` in `../types.ts` for why the
84
+ * distinction needs the set at runtime.
85
+ *
86
+ * Declared as a record because `CommandSet<NodeOp>` is checked for
87
+ * *completeness*: adding a command to `NodeOp` and forgetting it here is a
88
+ * compile error, where an array literal would only have its members checked and
89
+ * would drift silently.
90
+ *
91
+ * @type {CommandSet<NodeOp>}
92
+ */
93
+ const nodeCommandSet = {
94
+ access: null, all: null, await: null, createExclusive: null,
95
+ createServer: null, exec: null, fetch: null, forever: null,
96
+ import: null, listen: null, memCreate: null, memRead: null,
97
+ memWrite: null, mkdir: null, now: null, randomInt: null,
98
+ read: null, readBytes: null, readFile: null, readdir: null,
99
+ rename: null, rm: null, sandbox: null, stat: null,
100
+ test: null, write: null, writeBytes: null, writeFile: null,
101
+ }
102
+
103
+ /**
104
+ * The commands of {@link nodeCommandSet}, in the form a partial runner tests
105
+ * membership against. The cast is the one `Object.keys` always needs: it
106
+ * answers `string[]` for a record whose keys the type system knows exactly.
40
107
  *
41
- * @type {(e: unknown) => boolean}
108
+ * @type {Commands<NodeOp>}
42
109
  */
43
- export const isNotFound = e =>
44
- typeof e === 'object' && e !== null && (/** @type {{ readonly code?: unknown }} */ (e)).code === 'ENOENT'
110
+ export const nodeCommands = /** @type {Commands<NodeOp>} */ (Object.keys(nodeCommandSet))
45
111
 
46
112
  // all
47
113
 
48
114
  /**
49
115
  * To run the operation `O` should be known by the runner/engine.
50
- * This is the reason why we merge `O` with `All` in the resulted `Effect`.
116
+ * This is the reason why we merge `O` with `All` in the resulting effect.
51
117
  */
52
118
  export const all =
53
- /** @type {<O extends Operation, T>(...a: readonly Effect<O, T>[]) => Effect<O | All, readonly T[]>} */
54
- (do_('all'))
119
+ // `Func` cannot express a variadic generic operation, so the declared type
120
+ // is written out here and `do_`'s is set aside.
121
+ /** @type {<O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly Result<T, E>[], NotImplemented>} */
122
+ (/** @type {unknown} */ (do_('all')))
123
+
124
+ /**
125
+ * Collapses a list of results into a result of the list, keeping the **first**
126
+ * error in list order and discarding the later ones.
127
+ *
128
+ * Keeping one is what makes this a `Result` rather than a report: the callers
129
+ * that need it are chains, and a chain has one error channel. A site that wants
130
+ * every failure wants a different return type and should not reach for this.
131
+ *
132
+ * @type {<T, E>(list: readonly Result<T, E>[]) => Result<readonly T[], E>}
133
+ */
134
+ const okList = list => {
135
+ for (const r of list) {
136
+ if (r[0] === 'error') { return r }
137
+ }
138
+ return resultOk(list.map(unwrap))
139
+ }
140
+
141
+ /**
142
+ * {@link all} in the `ok` channel: collects the values when every effect
143
+ * succeeded, and answers with the first failure otherwise.
144
+ *
145
+ * `all` alone cannot serve a fallible chain. Its envelope is the runner's
146
+ * (`OpResult`, saying whether the *operation* could be dispatched), so handing
147
+ * it `Effect`s nests one `Result` inside another and the caller receives
148
+ * `readonly Result<T, E>[]`. That has to be collapsed before the chain can
149
+ * `step` again, and a continuation that forgets to is the value-discarding
150
+ * hazard this migration exists to remove — one level in, where it is harder to
151
+ * see.
152
+ *
153
+ * **Every effect still runs.** The short-circuit is in the *result*, not in the
154
+ * execution: `all` performs them concurrently and this reads the answers once
155
+ * they are all in, so a failure does not cancel its siblings the way it stops
156
+ * the sequential `forEachStep` in `./module.f.mjs`. The error channel
157
+ * unions the runner's
158
+ * `NotImplemented` with the effects' own `E` for the same reason every other
159
+ * step does — either can be what went wrong.
160
+ *
161
+ * @type {<O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly T[], NotImplemented | E>}
162
+ */
163
+ export const allOk = (...a) =>
164
+ ioStep(all(...a), rs => pure(okList(rs)))
55
165
 
56
166
  /**
57
167
  * @template {Operation} O0
58
168
  * @template T0
59
- * @param {Effect<O0, T0>} a
60
- * @returns {<O1 extends Operation, T1>(b: Effect<O1, T1>) => Effect<O0 | O1 | All, readonly[T0, T1]>}
169
+ * @template E0
170
+ * @param {Effect<O0, T0, E0>} a
171
+ * @returns {<O1 extends Operation, T1, E1>(b: Effect<O1, T1, E1>) => Effect<O0 | O1 | All, readonly[Result<T0, E0>, Result<T1, E1>], NotImplemented>}
61
172
  */
62
173
  export const both = a => b =>
63
174
  /** @type {any} */ (all)(a, b)
@@ -80,14 +191,14 @@ export const readFile = do_('readFile')
80
191
  /**
81
192
  * Reads a file as UTF-8 text.
82
193
  *
83
- * Preserves the `IoResult` instead of unwrapping so callers can pattern-match
84
- * on errors (e.g. convert them into domain-specific errors) or `unwrap` at the
85
- * call site.
194
+ * Preserves the error channel instead of unwrapping so callers can
195
+ * pattern-match on it (e.g. convert a failure into a domain-specific error) or
196
+ * `unwrap` at the call site.
86
197
  *
87
- * @type {(path: string) => Effect<ReadFile, IoResult<string>>}
198
+ * @type {(path: string) => Effect<ReadFile, string, IoChannel>}
88
199
  */
89
200
  export const readUtf8File = path =>
90
- mapStep(readFile(path), mapOk(utf8ToString))
201
+ ioMapStep(readFile(path), utf8ToString)
91
202
 
92
203
  // readdir
93
204
 
@@ -102,7 +213,7 @@ export const writeFile = do_('writeFile')
102
213
  /**
103
214
  * Writes a string to `path` as UTF-8 bytes.
104
215
  *
105
- * @type {(path: string, content: string) => Effect<WriteFile, IoResult<void>>}
216
+ * @type {(path: string, content: string) => Effect<WriteFile, void, IoChannel>}
106
217
  */
107
218
  export const writeUtf8File = (path, content) =>
108
219
  writeFile(path, utf8(content))
@@ -151,21 +262,18 @@ export const writeBytes = do_('writeBytes')
151
262
  const writeLoop = path => {
152
263
  /** @type {_WriteLoop} */
153
264
  const f = (offset, e) =>
154
- step(e, r => {
155
- if (r === undefined) {
156
- return pure(ok(undefined))
157
- }
158
- const { first: [t, v], tail } = r
159
- if (t === 'error') {
160
- return pure(resultError(v))
265
+ ioStep(e, node => {
266
+ if (node === undefined) {
267
+ return pureOk(undefined)
161
268
  }
269
+ const { first: v, tail } = node
162
270
  const lenV = length(v)
163
271
  if ((lenV & 0b111n) !== 0n) {
164
- return pure(resultError('invalid buffer size'))
272
+ return pureError(ioError({ message: 'invalid buffer size' }))
165
273
  }
166
- return step(
274
+ return ioStep(
167
275
  writeBytes(path, offset, v),
168
- okStep(() => f(offset + Number(lenV >> 3n), tail)))
276
+ () => f(offset + Number(lenV >> 3n), tail))
169
277
  })
170
278
  return f
171
279
  }
@@ -173,13 +281,13 @@ const writeLoop = path => {
173
281
  /**
174
282
  * @template {Operation} O
175
283
  * @param {string} path
176
- * @param {List<O, IoResult<Vec>>} e
177
- * @returns {Effect<O | WriteBytes | CreateExclusive, IoResult<void>>}
284
+ * @param {List<O, Vec, IoChannel>} e
285
+ * @returns {Effect<O | WriteBytes | CreateExclusive, void, IoChannel>}
178
286
  */
179
287
  export const writeFromStream = (path, e) =>
180
- step(
288
+ ioStep(
181
289
  createExclusive(path),
182
- okStep(() => /** @type {Effect<O | WriteBytes, IoResult<void>>} */ (writeLoop(path)(0, e))))
290
+ () => writeLoop(path)(0, e))
183
291
 
184
292
  // stat
185
293
 
@@ -210,27 +318,31 @@ export const import_ = do_('import')
210
318
  // write
211
319
 
212
320
  /** Emits a `Write` effect to the given named stream. */
213
- export const write = /** @type {Func<Write>} */ (do_('write'))
321
+ /** @type {Func<Write>} */
322
+ export const write = do_('write')
214
323
 
215
324
  /**
216
325
  * Encodes `s + '\n'` as UTF-8 and emits a `Write` effect to `stream`.
217
326
  * Shared implementation for `log` and `error`.
218
327
  *
219
- * @type {(stream: WriteConsoles) => (s: string) => Effect<Write, void>}
328
+ * @type {(stream: WriteConsoles) => Console}
220
329
  */
221
330
  const writeString = stream => s =>
222
331
  write(stream, utf8(s + '\n'))
223
332
 
224
333
  /** Writes a line to `stdout`. Replaces the retired `Log` effect. */
225
- export const log = /** @type {Console} */ (writeString('stdout'))
334
+ /** @type {Console} */
335
+ export const log = writeString('stdout')
226
336
 
227
337
  /** Writes a line to `stderr`. Replaces the retired `Error` effect. */
228
- export const error = /** @type {Console} */ (writeString('stderr'))
338
+ /** @type {Console} */
339
+ export const error = writeString('stderr')
229
340
 
230
341
  // read
231
342
 
232
343
  /** Emits a `Read` effect, yielding the next input byte or `null` at EOF. */
233
- export const read = /** @type {Func<Read>} */ (do_('read'))
344
+ /** @type {Func<Read>} */
345
+ export const read = do_('read')
234
346
 
235
347
  /** @type {(bytes: _UtfList) => string} */
236
348
  const utf8ListToString = bytes =>
@@ -253,17 +365,20 @@ const lf = 0x0a
253
365
  * reversed and decoded once at the terminator, so a large line costs O(n)
254
366
  * rather than the O(n²) of copying a growing array on every byte.
255
367
  *
256
- * @type {(stream: ReadConsoles) => Effect<Read, string | null>}
368
+ * A failed `read` a runner without the operation — propagates: the line is
369
+ * not silently truncated into a `null` that a caller would read as EOF.
370
+ *
371
+ * @type {(stream: ReadConsoles) => Effect<Read, string | null, NotImplemented>}
257
372
  */
258
373
  export const readLine = stream => {
259
- /** @type {(acc: _UtfList) => Effect<Read, string | null>} */
374
+ /** @type {(acc: _UtfList) => Effect<Read, string | null, NotImplemented>} */
260
375
  const loop = acc =>
261
- step(
376
+ ioStep(
262
377
  read(stream),
263
378
  b => b === null
264
- ? pure(acc === null ? null : utf8ListToString(reverse(acc)))
379
+ ? pureOk(acc === null ? null : utf8ListToString(reverse(acc)))
265
380
  : b === lf
266
- ? pure(utf8ListToString(reverse(acc)))
381
+ ? pureOk(utf8ListToString(reverse(acc)))
267
382
  : loop({ first: b, tail: acc })
268
383
  )
269
384
  return loop(null)
@@ -301,9 +416,9 @@ export const sandbox = do_('sandbox')
301
416
  /** @type {Func<Await>} */
302
417
  const awaitPromise = do_('await')
303
418
 
304
- /** @type {(p: unknown) => Effect<Await, unknown>} */
419
+ /** @type {(p: unknown) => Effect<Await, unknown, NotImplemented>} */
305
420
  export const awaitIfPromise = p =>
306
- mapStep(awaitPromise(p), ([x]) => x)
421
+ ioMapStep(awaitPromise(p), ([x]) => x)
307
422
 
308
423
  // Test registration
309
424
 
@@ -313,14 +428,97 @@ export const test = do_('test')
313
428
  // Node
314
429
 
315
430
  /**
316
- * Writes an error line to `stderr` and yields exit code `1`. The canonical
431
+ * Writes an error line to `stderr` and fails with exit code `1`. The canonical
317
432
  * "fail with a message" program for a `NodeProgram`. For non-`1` exit codes,
318
- * compose `mapStep(error(s), () => n)` directly.
433
+ * compose `resultMapStep(error(s), () => resultError(n))` directly.
434
+ *
435
+ * **It never succeeds, and the type says so.** `E` is `number` and `T` is
436
+ * `never`, so `step`'s continuation takes a `never` and can never run. That is
437
+ * a continuation nobody reaches, not a compile error: writing one still type-
438
+ * checks, because a function accepting `never` accepts anything. What the type
439
+ * buys is that no *value* can be invented for the success branch, so nothing
440
+ * downstream can proceed as if this had succeeded.
319
441
  *
320
- * @type {(s: string) => Effect<Write, number>}
442
+ * **The write's own outcome is deliberately discarded**, which is why this is
443
+ * `resultMapStep` rather than `mapStep`. The program is already failing and
444
+ * the exit code is `1` whether or not `stderr` accepted the bytes; propagating
445
+ * here would hand every caller a "failed to report a failure" branch with no
446
+ * better answer available to it than the one taken here.
447
+ *
448
+ * @type {(s: string) => Effect<Write, never, number>}
321
449
  */
322
450
  export const errorExit = s =>
323
- mapStep(error(s), () => 1)
451
+ resultMapStep(error(s), () => resultError(1))
452
+
453
+ /**
454
+ * The exit code a {@link Program} answered, from whichever branch it came.
455
+ *
456
+ * `Result<0, number>` puts a number at `[1]` on both sides — `ok(0)` for
457
+ * success, `error(n)` for failure — so reading the code never asks which
458
+ * branch produced it, while a caller that cares *whether* it failed still asks
459
+ * `[0]`. That is why the success type is the literal `0` rather than `void`.
460
+ *
461
+ * A non-zero code belongs in the `error` branch and `0` in the `ok` branch; the
462
+ * type cannot say so, since there is no "non-zero number", and nothing depends
463
+ * on it — this reads `[1]` either way.
464
+ *
465
+ * @type {(r: Result<0, number>) => number}
466
+ */
467
+ export const exitCode = ([, code]) => code
468
+
469
+ /**
470
+ * Renders a channel error as a human line: an {@link IoError}'s own message, or
471
+ * the command name a runner could not dispatch.
472
+ *
473
+ * @type {(e: IoChannel) => string}
474
+ */
475
+ export const errorMessage = ([tag, payload]) =>
476
+ tag === 'notImplemented' ? `operation not implemented: ${payload}` : payload.message
477
+
478
+ /**
479
+ * Renders a channel error for a **remote** caller: the command name for a
480
+ * {@link NotImplemented}, the OS error code for an `IoError`, and nothing else.
481
+ *
482
+ * {@link errorMessage} is for the operator of the program, who is entitled to
483
+ * the host's own words — including the path that failed. A protocol client is
484
+ * not, and the difference is not stylistic: `payload.message` is where the
485
+ * host puts the absolute path it could not read, so answering an MCP tool call
486
+ * with it publishes the server's filesystem layout to whoever is on the other
487
+ * end. The code (`ENOENT`, `EACCES`) says *what* went wrong without saying
488
+ * *where*, which is the part a client can act on anyway.
489
+ *
490
+ * A host that attached no code leaves nothing safe to forward, so the answer is
491
+ * the bare kind. That is deliberate: guessing which part of a free-text message
492
+ * is path-free is exactly the mistake this exists to prevent.
493
+ *
494
+ * @type {(e: IoChannel) => string}
495
+ */
496
+ export const errorSummary = ([tag, payload]) =>
497
+ tag === 'notImplemented'
498
+ ? `operation not implemented: ${payload}`
499
+ : payload.code === undefined ? 'io error' : `io error: ${payload.code}`
500
+
501
+ /**
502
+ * Ends a program with an exit code that reflects `e`: `ok` yields `0`, and a
503
+ * failure is reported on `stderr` and yields `1` ({@link errorExit}).
504
+ *
505
+ * This is the exit-code policy a `NodeProgram` needs at the end of its chain,
506
+ * and the reason a program does not have to invent one per command. It is the
507
+ * counterpart of {@link isNotFound} at the other end of the channel: where that
508
+ * one asks which failure this is, this one stops asking and reports.
509
+ *
510
+ * @type {<O extends Operation, T>(e: Effect<O, T, IoChannel>) => Effect<O | Write, 0, number>}
511
+ */
512
+ export const exitStep = e =>
513
+ resultStep(e, r => {
514
+ // Bound rather than returned inline: the two branches are
515
+ // `Effect<Write, never, number>` and `Effect<never, 0, never>`, both
516
+ // assignable to this, but `step` infers its continuation's type from
517
+ // the union and picks neither.
518
+ /** @type {Effect<Write, 0, number>} */
519
+ const code = r[0] === 'error' ? errorExit(errorMessage(r[1])) : pureOk(0)
520
+ return code
521
+ })
324
522
 
325
523
  /** @type {(version: string) => readonly number[]} */
326
524
  const versionParts = version =>