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,21 +1,27 @@
1
1
  /**
2
2
  * @import { Unknown } from '../../media/json/types.ts'
3
- * @import { Effect, Operation } from '../../effects/types.ts'
3
+ * @import { Operation } from '../../effects/types.ts'
4
+ * @import { Effect, NotImplemented } from '../../effects/types.ts'
4
5
  * @import { MemOperationMap } from '../../effects/mock/types.ts'
5
6
  * @import { Key, MemOp } from '../../effects/memory/types.ts'
6
7
  * @import {
7
- * ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
8
- * McpHandlers, McpConfig, McpSessionState,
8
+ * ToolsListParams,
9
+ * ToolsCallParams,
10
+ * McpHandlers,
11
+ * McpConfig,
12
+ * McpSessionState,
9
13
  * } from './types.ts'
10
14
  */
11
15
 
12
16
  import { assert, assertEq } from '../../asserts/module.f.mjs'
13
- import { pure, step } from '../../effects/module.f.mjs'
14
- import { eff } from '../../effects/eff/module.f.mjs'
17
+ import { runPure } from '../../effects/module.f.mjs'
18
+ import { history, historyStep, mapStep, pureOk, step } from '../../effects/module.f.mjs'
19
+ import { error, ok, unwrap as unwrapResult } from '../../types/result/module.f.mjs'
15
20
  import { run } from '../../effects/mock/module.f.mjs'
21
+ import { internalError } from '../json_rpc/module.f.mjs'
16
22
  import { asBase, asNominal, create, read } from '../../effects/memory/module.f.mjs'
17
23
  import {
18
- uninitializedState, mcpStep, notInitialized,
24
+ uninitializedState, mcpStep, notInitialized, fromRegistry, toolEntry, okResult,
19
25
  } from './module.f.mjs'
20
26
 
21
27
  // ── Memory mock ────────────────────────────────────────────────────────────────
@@ -34,12 +40,12 @@ const mock = {
34
40
  const id = `k${state.next}`
35
41
  /** @type {Key<unknown>} */
36
42
  const key = asNominal(id)
37
- return [{ next: state.next + 1, values: { ...state.values, [id]: value } }, key]
43
+ return [{ next: state.next + 1, values: { ...state.values, [id]: value } }, ok(key)]
38
44
  },
39
- memRead: key => state => [state, state.values[asBase(key)]],
45
+ memRead: key => state => [state, ok(state.values[asBase(key)])],
40
46
  memWrite: (key, value) => state => {
41
47
  const id = asBase(key)
42
- return [{ ...state, values: { ...state.values, [id]: value } }, undefined]
48
+ return [{ ...state, values: { ...state.values, [id]: value } }, ok(undefined)]
43
49
  },
44
50
  }
45
51
 
@@ -59,61 +65,148 @@ const configNoTools = { ...config, capabilities: {} }
59
65
  const handlers = {
60
66
  // Echoes a received cursor as `nextCursor` so tests can observe pagination params.
61
67
  toolsList: (/** @type {ToolsListParams} */ p) =>
62
- /** @type {Effect<_Op, ToolsListResult>} */
63
- (pure(p.cursor === undefined
68
+ pureOk(p.cursor === undefined
64
69
  ? { tools: [{ name: 'greet', inputSchema: {} }] }
65
- : { tools: [], nextCursor: p.cursor })),
70
+ : { tools: [], nextCursor: p.cursor }),
66
71
  toolsCall: (/** @type {ToolsCallParams} */ _p) =>
67
- /** @type {Effect<_Op, ToolsCallResult>} */
68
- (pure({ content: [{ type: 'text', text: 'hello' }] })),
72
+ pureOk({ content: [{ type: 'text', text: 'hello' }] }),
69
73
  }
70
74
 
71
75
  /** @typedef {readonly [unknown, McpSessionState]} _StepResult */
72
76
 
73
- // Run a memory effect against the mock, return the result.
74
- /** @type {<T>(effect: Effect<MemOp, T>) => T} */
77
+ // Run a memory effect against the mock and unwrap what it answered. The
78
+ // channel stays generic because nothing here interprets it: a proof has nobody
79
+ // to report a failure to, so an `error` is a panic and the tests read the `ok`.
80
+ /** @type {<T, E>(effect: Effect<MemOp, T, E>) => T} */
75
81
  const runMem = effect =>
76
- run(mock)(initial)(effect)[1]
82
+ unwrapResult(run(mock)(initial)(effect)[1])
77
83
 
78
84
  // TypeScript infers O = Operation (the upper bound) rather than O = never when
79
85
  // O flows through McpHandlers<never>, so we cast the widened type down to MemOp.
80
- /** @type {<T>(e: Effect<Operation, T>) => Effect<MemOp, T>} */
81
- const asMemEffect = e => /** @type {Effect<MemOp, any>} */ (/** @type {unknown} */ (e))
86
+ /** @type {<T, E>(e: Effect<Operation, T, E>) => Effect<MemOp, T, E>} */
87
+ const asMemEffect = e => /** @type {Effect<MemOp, any, any>} */ (e)
88
+
89
+ // Pairs the last step's response with the session state read back afterwards.
90
+ // The response is still needed after the read, so it is carried forward in a
91
+ // history rather than closed over by a nested continuation.
92
+ /** @type {(key: Key<McpSessionState>) => (e: Effect<Operation, unknown, never>) => Effect<Operation, _StepResult, NotImplemented>} */
93
+ const withState = key => e => {
94
+ const read0 = historyStep(history(e), () => read(key))
95
+ // A history holds `ok` values, so `resp` is the response itself rather
96
+ // than a `Result` around it: a failed link short-circuits, contributing
97
+ // nothing to the tuple and skipping this projection with it.
98
+ return mapStep(read0, ([state, resp]) => /** @type {const} */ ([resp, state]))
99
+ }
82
100
 
83
101
  // Run one step from uninitializedState, return [response, newState].
84
- /** @type {(cfg: McpConfig) => (msg: unknown) => _StepResult} */
102
+ /** @type {(cfg: McpConfig) => (msg: Unknown) => _StepResult} */
85
103
  const step1 = cfg => msg =>
86
104
  runMem(asMemEffect(step(
87
- create(/** @type {McpSessionState} */ (uninitializedState)),
88
- key => step(
89
- mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg)),
90
- resp => step(
91
- read(key),
92
- state => pure(/** @type {const} */ ([resp, state])),
93
- ),
94
- ),
95
- )))
105
+ create(uninitializedState),
106
+ key => withState(key)(mcpStep(cfg)(handlers)(key)(msg)))))
96
107
 
97
108
  // Run initialize then a second step, return [response, newState] of the second.
98
- /** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => _StepResult} */
109
+ /** @type {(cfg: McpConfig) => (msg1: Unknown) => (msg2: Unknown) => _StepResult} */
99
110
  const step2 = cfg => msg1 => msg2 =>
100
- runMem(asMemEffect(eff(create(/** @type {McpSessionState} */ (uninitializedState))).step(key =>
101
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))).step(() =>
102
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2))).step(resp =>
103
- step(
104
- read(key),
105
- state => pure(/** @type {const} */ ([resp, state])),
106
- )
107
- ).value).value).value))
111
+ runMem(asMemEffect(step(
112
+ create(uninitializedState),
113
+ key => {
114
+ const r1 = mcpStep(cfg)(handlers)(key)(msg1)
115
+ const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(msg2))
116
+ return withState(key)(r2)
117
+ })))
108
118
 
109
119
  // Run initialize, notifications/initialized, then a third step; return [response, newState] of the third.
110
- /** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => (msg3: unknown) => _StepResult} */
120
+ /** @type {(cfg: McpConfig) => (msg1: Unknown) => (msg2: Unknown) => (msg3: Unknown) => _StepResult} */
111
121
  const step3 = cfg => msg1 => msg2 => msg3 =>
112
- runMem(asMemEffect(eff(create(/** @type {McpSessionState} */ (uninitializedState))).step(key =>
113
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))).step(() =>
114
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2))).step(() =>
115
- eff(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg3))).step(resp =>
116
- eff(read(key)).step(state => pure(/** @type {const} */ ([/** @type {unknown} */ (resp), state]))).value).value).value).value).value))
122
+ runMem(asMemEffect(step(
123
+ create(uninitializedState),
124
+ key => {
125
+ const r1 = mcpStep(cfg)(handlers)(key)(msg1)
126
+ const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(msg2))
127
+ const r3 = step(r2, () => mcpStep(cfg)(handlers)(key)(msg3))
128
+ return withState(key)(r3)
129
+ })))
130
+
131
+ // ── Response accessors ────────────────────────────────────────────────────────
132
+ //
133
+ // A step's response is `unknown`, and its shape is exactly what these proofs
134
+ // exist to check — so reading it through a cast would assume the thing being
135
+ // proved. These accessors check their way in instead, and fail at the read
136
+ // rather than somewhere downstream.
137
+
138
+ /** Whether `resp` is an object carrying an `error` member. */
139
+ /** @type {(resp: unknown) => boolean} */
140
+ const hasError = resp =>
141
+ typeof resp === 'object' && resp !== null && 'error' in resp
142
+
143
+ /** @type {(resp: unknown) => number} */
144
+ const errorCode = resp => {
145
+ assert(hasError(resp) && typeof resp === 'object' && resp !== null && 'error' in resp, resp)
146
+ const { error } = resp
147
+ assert(typeof error === 'object' && error !== null && 'code' in error, error)
148
+ const { code } = error
149
+ assert(typeof code === 'number', code)
150
+ return code
151
+ }
152
+
153
+ /** @type {(resp: unknown) => unknown} */
154
+ const errorId = resp => {
155
+ assert(typeof resp === 'object' && resp !== null && 'id' in resp, resp)
156
+ return resp.id
157
+ }
158
+
159
+ /** @type {(resp: unknown) => object} */
160
+ const resultOf = resp => {
161
+ assert(typeof resp === 'object' && resp !== null && 'result' in resp, resp)
162
+ const { result } = resp
163
+ assert(typeof result === 'object' && result !== null, result)
164
+ return result
165
+ }
166
+
167
+ /** @type {(resp: unknown) => string} */
168
+ const protocolVersion = resp => {
169
+ const result = resultOf(resp)
170
+ assert('protocolVersion' in result, result)
171
+ const { protocolVersion: v } = result
172
+ assert(typeof v === 'string', v)
173
+ return v
174
+ }
175
+
176
+ /** @type {(resp: unknown) => readonly string[]} */
177
+ const toolNames = resp => {
178
+ const result = resultOf(resp)
179
+ assert('tools' in result, result)
180
+ const { tools } = result
181
+ assert(tools instanceof Array, tools)
182
+ return tools.map(t => {
183
+ assert(typeof t === 'object' && t !== null && 'name' in t, t)
184
+ const { name } = t
185
+ assert(typeof name === 'string', name)
186
+ return name
187
+ })
188
+ }
189
+
190
+ /** @type {(resp: unknown) => unknown} */
191
+ const nextCursor = resp => {
192
+ const result = resultOf(resp)
193
+ assert('nextCursor' in result, result)
194
+ return result.nextCursor
195
+ }
196
+
197
+ /** The `text` of the first content item of a `tools/call` result. */
198
+ /** @type {(resp: unknown) => string} */
199
+ const firstText = resp => {
200
+ const result = resultOf(resp)
201
+ assert('content' in result, result)
202
+ const { content } = result
203
+ assert(content instanceof Array && content.length !== 0, content)
204
+ const [item] = content
205
+ assert(typeof item === 'object' && item !== null && 'text' in item, item)
206
+ const { text } = item
207
+ assert(typeof text === 'string', text)
208
+ return text
209
+ }
117
210
 
118
211
  // ── Test messages ─────────────────────────────────────────────────────────────
119
212
 
@@ -122,9 +215,53 @@ const initMsg = { jsonrpc: '2.0', method: 'initialize', id: 1,
122
215
 
123
216
  const initNotif = { jsonrpc: '2.0', method: 'notifications/initialized' }
124
217
 
218
+ /** A memory handler that answers as a runner with no such operation. */
219
+ const memNotImplemented = () => (/** @type {_MemoryState} */ state) =>
220
+ /** @type {const} */ ([state, error(/** @type {const} */ (['notImplemented', 'memRead']))])
221
+
222
+ // Runs one step against a memory mock with `overrides` applied, from a session
223
+ // slot created before them so the slot itself always exists.
224
+ /** @type {(overrides: Partial<MemOperationMap<MemOp, _MemoryState>>) => (msg: Unknown) => unknown} */
225
+ const failingStep = overrides => msg => {
226
+ const [state, key] = run(mock)(initial)(create(uninitializedState))
227
+ const runner = run(/** @type {MemOperationMap<MemOp, _MemoryState>} */ ({ ...mock, ...overrides }))
228
+ // A `Handle` answers `Effect<…, Response | null, never>`, so the payload
229
+ // the runner hands back is the `ok` around the response and the unwrap is
230
+ // total — the failures these tests inject are the ones `mcpStep` itself
231
+ // absorbs into an error response.
232
+ return unwrapResult(runner(state)(asMemEffect(mcpStep(config)(handlers)(unwrapResult(key))(msg)))[1])
233
+ }
234
+
125
235
  // ── Tests ─────────────────────────────────────────────────────────────────────
126
236
 
127
237
  export const proof = {
238
+ // A session slot the runner cannot reach is `-32603`, not `-32002`.
239
+ // `notInitialized` tells the client to run the handshake it has already
240
+ // run, so it would run it forever; an internal error says the fault is the
241
+ // server's. Three sites answer it — the `initialize` read, the transition
242
+ // write, and the gate every other method passes through — and a
243
+ // notification, having no response frame at all, answers `null` instead.
244
+ sessionStateFailure: {
245
+ initializeRead: () => {
246
+ const resp = failingStep({ memRead: memNotImplemented })(initMsg)
247
+ assertEq(errorCode(resp), internalError.code)
248
+ },
249
+ initializeWrite: () => {
250
+ const resp = failingStep({ memWrite: memNotImplemented })(initMsg)
251
+ assertEq(errorCode(resp), internalError.code)
252
+ },
253
+ gatedMethod: () => {
254
+ const resp = failingStep({ memRead: memNotImplemented })(
255
+ { jsonrpc: '2.0', method: 'tools/list', id: 3 })
256
+ assertEq(errorCode(resp), internalError.code)
257
+ },
258
+ // The notification path has nowhere to report, so it stays silent and
259
+ // leaves the session gated rather than claiming the transition.
260
+ initializedNotification: () => {
261
+ const resp = failingStep({ memRead: memNotImplemented })(initNotif)
262
+ assertEq(resp, null)
263
+ },
264
+ },
128
265
  lifecycle: {
129
266
  initialStateIsUninitialized: () => {
130
267
  assert(uninitializedState[0] === 'uninitialized')
@@ -143,16 +280,14 @@ export const proof = {
143
280
 
144
281
  initializeReturnsResult: () => {
145
282
  const [resp] = step1(config)(initMsg)
146
- assert(resp !== null && typeof resp === 'object' && 'result' in /** @type {object} */ (resp))
147
- const r = /** @type {{ result: { protocolVersion: string } }} */ (resp).result
148
- assertEq(r.protocolVersion, '2024-11-05')
283
+ assertEq(protocolVersion(resp), '2024-11-05')
149
284
  },
150
285
 
151
286
  initializeWithBadParamsReturnsInvalidParams: () => {
152
287
  const bad = { jsonrpc: '2.0', method: 'initialize', id: 2, params: { wrong: true } }
153
288
  const [resp, newState] = step1(config)(bad)
154
289
  assert(newState[0] === 'uninitialized')
155
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32602)
290
+ assertEq(errorCode(resp), -32602)
156
291
  },
157
292
 
158
293
  notificationBeforeInitReturnNull: () => {
@@ -170,39 +305,39 @@ export const proof = {
170
305
  doubleInitializeReturnsInvalidRequest: () => {
171
306
  const [resp, newState] = step2(config)(initMsg)(initMsg)
172
307
  assert(newState[0] === 'initializing')
173
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32600)
308
+ assertEq(errorCode(resp), -32600)
174
309
  },
175
310
 
176
311
  pingBeforeInitSucceeds: () => {
177
312
  const msg = { jsonrpc: '2.0', method: 'ping', id: 11 }
178
313
  const [resp, newState] = step1(config)(msg)
179
314
  assert(newState[0] === 'uninitialized')
180
- assert(!('error' in /** @type {object} */ (resp)))
315
+ assert(!hasError(resp), resp)
181
316
  },
182
317
 
183
318
  pingDuringInitializingSucceeds: () => {
184
319
  const msg = { jsonrpc: '2.0', method: 'ping', id: 12 }
185
320
  const [resp, newState] = step2(config)(initMsg)(msg)
186
321
  assert(newState[0] === 'initializing')
187
- assert(!('error' in /** @type {object} */ (resp)))
322
+ assert(!hasError(resp), resp)
188
323
  },
189
324
 
190
325
  pingAfterInitSucceeds: () => {
191
326
  const msg = { jsonrpc: '2.0', method: 'ping', id: 15 }
192
327
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
193
- assert(!('error' in /** @type {object} */ (resp)))
328
+ assert(!hasError(resp), resp)
194
329
  },
195
330
 
196
331
  pingWithObjectParamsSucceeds: () => {
197
332
  const msg = { jsonrpc: '2.0', method: 'ping', id: 19, params: {} }
198
333
  const [resp] = step1(config)(msg)
199
- assert(!('error' in /** @type {object} */ (resp)))
334
+ assert(!hasError(resp), resp)
200
335
  },
201
336
 
202
337
  pingInvalidParamsReturnsInvalidParams: () => {
203
338
  const msg = { jsonrpc: '2.0', method: 'ping', id: 20, params: 1 }
204
339
  const [resp] = step1(config)(msg)
205
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32602)
340
+ assertEq(errorCode(resp), -32602)
206
341
  },
207
342
 
208
343
  initializedNotificationObjectParamsTransitions: () => {
@@ -223,21 +358,21 @@ export const proof = {
223
358
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 3 }
224
359
  const [resp, newState] = step1(config)(msg)
225
360
  assert(newState[0] === 'uninitialized')
226
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, notInitialized.code)
361
+ assertEq(errorCode(resp), notInitialized.code)
227
362
  },
228
363
 
229
364
  methodDuringInitializingReturnsNotInitialized: () => {
230
365
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 16 }
231
366
  const [resp, newState] = step2(config)(initMsg)(msg)
232
367
  assert(newState[0] === 'initializing')
233
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, notInitialized.code)
368
+ assertEq(errorCode(resp), notInitialized.code)
234
369
  },
235
370
 
236
371
  invalidEnvelopeReturnsInvalidRequest: () => {
237
372
  const bad = { jsonrpc: '1.0', method: 'ping', id: 4 }
238
373
  const [resp] = step1(config)(bad)
239
- assertEq(/** @type {{ error: { code: number }; id: unknown }} */ (resp).error.code, -32600)
240
- assertEq(/** @type {{ error: { code: number }; id: unknown }} */ (resp).id, null)
374
+ assertEq(errorCode(resp), -32600)
375
+ assertEq(errorId(resp), null)
241
376
  },
242
377
  },
243
378
 
@@ -245,68 +380,88 @@ export const proof = {
245
380
  toolsListSucceeds: () => {
246
381
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 5 }
247
382
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
248
- assertEq(/** @type {{ result: ToolsListResult }} */ (resp).result.tools.length, 1)
249
- assertEq(/** @type {{ result: ToolsListResult }} */ (resp).result.tools[0].name, 'greet')
383
+ assertEq(toolNames(resp).length, 1)
384
+ assertEq(toolNames(resp)[0], 'greet')
250
385
  },
251
386
 
252
387
  toolsListPassesCursorToHandler: () => {
253
388
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 17,
254
389
  params: { cursor: 'page-2' } }
255
390
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
256
- assertEq(/** @type {{ result: ToolsListResult }} */ (resp).result.nextCursor, 'page-2')
391
+ assertEq(nextCursor(resp), 'page-2')
257
392
  },
258
393
 
259
394
  toolsListInvalidCursorReturnsInvalidParams: () => {
260
395
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 18,
261
396
  params: { cursor: 42 } }
262
397
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
263
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32602)
398
+ assertEq(errorCode(resp), -32602)
264
399
  },
265
400
 
266
401
  toolsCallSucceeds: () => {
267
402
  const msg = { jsonrpc: '2.0', method: 'tools/call', id: 6,
268
403
  params: { name: 'greet', arguments: {} } }
269
404
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
270
- assertEq(/** @type {{ text: string }} */ (/** @type {{ result: ToolsCallResult }} */ (resp).result.content[0]).text, 'hello')
405
+ assertEq(firstText(resp), 'hello')
271
406
  },
272
407
 
273
408
  toolsCallBadParamsReturnsInvalidParams: () => {
274
409
  const msg = { jsonrpc: '2.0', method: 'tools/call', id: 7, params: { missing: true } }
275
410
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
276
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32602)
411
+ assertEq(errorCode(resp), -32602)
277
412
  },
278
413
 
279
414
  toolsCallAbsentArgumentsSucceeds: () => {
280
415
  const msg = { jsonrpc: '2.0', method: 'tools/call', id: 13,
281
416
  params: { name: 'greet' } }
282
417
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
283
- assertEq(/** @type {{ text: string }} */ (/** @type {{ result: ToolsCallResult }} */ (resp).result.content[0]).text, 'hello')
418
+ assertEq(firstText(resp), 'hello')
284
419
  },
285
420
 
286
421
  toolsCallNullArgumentsReturnsInvalidParams: () => {
287
422
  const msg = { jsonrpc: '2.0', method: 'tools/call', id: 14,
288
423
  params: { name: 'greet', arguments: null } }
289
424
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
290
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32602)
425
+ assertEq(errorCode(resp), -32602)
291
426
  },
292
427
 
293
428
  toolsListWithoutCapabilityReturnsMethodNotFound: () => {
294
429
  const msg = { jsonrpc: '2.0', method: 'tools/list', id: 8 }
295
430
  const [resp] = step3(configNoTools)(initMsg)(initNotif)(msg)
296
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32601)
431
+ assertEq(errorCode(resp), -32601)
297
432
  },
298
433
 
299
434
  toolsCallWithoutCapabilityReturnsMethodNotFound: () => {
300
435
  const msg = { jsonrpc: '2.0', method: 'tools/call', id: 9,
301
436
  params: { name: 'greet', arguments: {} } }
302
437
  const [resp] = step3(configNoTools)(initMsg)(initNotif)(msg)
303
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32601)
438
+ assertEq(errorCode(resp), -32601)
304
439
  },
305
440
 
306
441
  unknownMethodReturnsMethodNotFound: () => {
307
442
  const msg = { jsonrpc: '2.0', method: 'resources/list', id: 10 }
308
443
  const [resp] = step3(config)(initMsg)(initNotif)(msg)
309
- assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32601)
444
+ assertEq(errorCode(resp), -32601)
445
+ },
446
+ },
447
+
448
+ registry: {
449
+ // `fromRegistry`'s `toolsCall` defaults a missing `arguments` field to
450
+ // `{}` before dispatching to the matched entry's `handle`. Exercised
451
+ // here directly (bypassing `mcpStep`) so the default reaches
452
+ // `toolEntry`'s own validation: if it were left `undefined` instead,
453
+ // validating it against the empty-object schema below would fail and
454
+ // this would observe an error result instead of `ok`.
455
+ toolsCallAbsentArgumentsDefaultsToEmptyObject: () => {
456
+ const echoArgs = /** @type {const} */ ({})
457
+ const entry = toolEntry('echo', 'echoes', echoArgs,
458
+ () => pureOk(okResult('ok')))
459
+ const handlers = fromRegistry([entry])
460
+ const [r] = runPure(handlers.toolsCall({ name: 'echo' }))
461
+ assert(r !== undefined && r[0] === 'ok', r)
462
+ const [item] = r[1].content
463
+ assert(item.type === 'text', item)
464
+ assertEq(item.text, 'ok')
310
465
  },
311
466
  },
312
467
  }
@@ -2,7 +2,7 @@
2
2
  * stdio transport for JSON-RPC / MCP servers.
3
3
  *
4
4
  * `stdioTransport` wraps a step function — the `mcpStep`-shaped
5
- * `(value) => Effect<O, Response | null>` from `fjs/protocol/mcp/module.f.mjs` — in the
5
+ * `(value) => Effect<O, Response | null, never>` from `fjs/protocol/mcp/module.f.mjs` — in the
6
6
  * canonical read → parse → dispatch → write loop, expressed as a recursive
7
7
  * effect so it stays in the pure effect model and is fully testable against a
8
8
  * mock stdin / stdout (see `fjs/effects/node/virtual`) with no real process.
@@ -29,24 +29,30 @@
29
29
  *
30
30
  * @module
31
31
  *
32
- * @import { Unknown } from '../../../media/json/types.ts'
33
- * @import { Effect, Operation } from '../../../effects/types.ts'
34
- * @import { IoResult, Read, Write } from '../../../effects/node/types.ts'
32
+ * @import { Operation } from '../../../effects/types.ts'
33
+ * @import { IoChannel, Read, Write } from '../../../effects/node/types.ts'
34
+ * @import { Effect } from '../../../effects/types.ts'
35
35
  * @import { Response } from '../../json_rpc/types.ts'
36
+ * @import { Step } from './types.ts'
36
37
  */
37
- import type { Unknown } from '../../../media/json/types.ts';
38
- import type { Effect, Operation } from '../../../effects/types.ts';
39
- import type { Read, Write } from '../../../effects/node/types.ts';
40
- import type { Response } from '../../json_rpc/types.ts';
41
- export type Step<O extends Operation> = (value: Unknown) => Effect<O, Response | null>;
38
+ import type { Operation } from '../../../effects/types.ts';
39
+ import type { IoChannel, Read, Write } from '../../../effects/node/types.ts';
40
+ import type { Effect } from '../../../effects/types.ts';
41
+ import type { Step } from './types.ts';
42
42
  /**
43
43
  * Drives the read-parse-dispatch-write loop for `handler` over stdin/stdout.
44
44
  *
45
45
  * Recurses after each handled line; terminates (resolving to `void`) when
46
46
  * `readLine` reports EOF.
47
47
  *
48
+ * A transport that cannot read its own input has no fallback to choose, but it
49
+ * does not have to decide that here: the failure ends the loop and travels to
50
+ * whoever started the server, which for `fjs mcp` is a message on `stderr` and
51
+ * exit `1`. EOF is not that — `readLine` answers `ok(null)`, the loop ends, and
52
+ * the server has done its job.
53
+ *
48
54
  * @template {Operation} O
49
55
  * @param {Step<O>} handler
50
- * @returns {Effect<Read | Write | O, void>}
56
+ * @returns {Effect<Read | Write | O, void, IoChannel>}
51
57
  */
52
- export declare const stdioTransport: <O extends Operation>(handler: Step<O>) => Effect<Read | Write | O, void>;
58
+ export declare const stdioTransport: <O extends Operation>(handler: Step<O>) => Effect<Read | Write | O, void, IoChannel>;