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,42 +1,37 @@
1
- /** @import { Unknown } from '../media/json/types.ts' */
1
+ /**
2
+ * @import { Unknown } from '../media/json/types.ts'
3
+ * @import { Operation } from '../effects/types.ts'
4
+ * @import { Response } from '../protocol/json_rpc/types.ts'
5
+ * @import { Handle } from '../protocol/mcp/types.ts'
6
+ * @import { Vec } from '../types/bit_vec/types.ts'
7
+ * @import { FileCasOperation } from '../cas/types.ts'
8
+ * @import { List } from '../effects/list/types.ts'
9
+ * @import { Effect } from '../effects/types.ts'
10
+ * @import { ContentItem, ToolsCallResult } from '../protocol/mcp/types.ts'
11
+ * @import { IoChannel, Mkdir, Now, RandomInt, ReadBytes, Rename } from '../effects/node/types.ts'
12
+ * @import { Dir } from '../effects/node/virtual/types.ts'
13
+ */
2
14
 
3
15
  import { assert, assertEq } from '../asserts/module.f.mjs'
4
- import { pure, step } from '../effects/module.f.mjs'
5
- /** @import { Effect, Operation } from '../effects/types.ts' */
16
+ import { pureOk, step } from '../effects/module.f.mjs'
6
17
  import { create } from '../effects/memory/module.f.mjs'
7
18
  import { parse as parseJson } from '../media/json/module.f.mjs'
8
19
  import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs'
9
20
  import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs'
10
- /** @import { Response } from '../protocol/json_rpc/types.ts' */
11
- /** @import { Vec } from '../types/bit_vec/types.ts' */
12
21
  import { msb, u8ListToVec, vec8, repeat, length, maxLengthBytes } from '../types/bit_vec/module.f.mjs'
13
22
  import { vecToCBase32 } from '../basen/cbase32/module.f.mjs'
14
23
  import { encode as base64Encode } from '../basen/base64/module.f.mjs'
15
24
  import { utf8 } from '../text/module.f.mjs'
16
25
  import { fileCas } from '../cas/module.f.mjs'
17
- /** @import { FileCasOperation } from '../cas/types.ts' */
18
26
  import { dialect as revisionDialect, mediaType as revisionMediaType } from '../media/revision/module.f.mjs'
19
27
  import { sha256 } from '../crypto/sha2/module.f.mjs'
20
28
  import { nonEmpty, empty as elEmpty } from '../effects/list/module.f.mjs'
21
- /** @import { List } from '../effects/list/types.ts' */
22
29
  import {
23
30
  mcpStep, uninitializedState,
24
31
  } from '../protocol/mcp/module.f.mjs'
25
- /** @import { McpSessionState, ToolsCallResult } from '../protocol/mcp/types.ts' */
26
- /**
27
- * @import {
28
- * IoResult,
29
- * Mkdir,
30
- * Now,
31
- * RandomInt,
32
- * ReadBytes,
33
- * Rename,
34
- * } from '../effects/node/types.ts'
35
- */
36
32
  import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs'
37
- /** @import { Dir } from '../effects/node/virtual/types.ts' */
38
33
  import { casConfig, casMcpHandlers } from './module.f.mjs'
39
- import { ok as resultOk, unwrap } from '../types/result/module.f.mjs'
34
+ import { ok as resultOk, unwrap, unwrap as unwrapResult } from '../types/result/module.f.mjs'
40
35
  import { stdioTransport } from '../protocol/mcp/stdio/module.f.mjs'
41
36
  import { fromVec } from '../types/uint8array/module.f.mjs'
42
37
  import { initEvo } from '../cas/evo/module.f.mjs'
@@ -62,14 +57,16 @@ const parseCasGetResult = rttiParse(casGetResult)
62
57
  // Feeds each message to `handler` in order, collecting every response.
63
58
  /**
64
59
  * @template {Operation} O
65
- * @param {(v: Unknown) => Effect<O, Response | null>} handler
66
- * @returns {(msgs: readonly unknown[]) => Effect<O, readonly unknown[]>}
60
+ * @param {Handle<O>} handler
61
+ * @returns {(msgs: readonly unknown[]) => Effect<O, readonly unknown[], never>}
67
62
  */
68
63
  const feed = handler => msgs => {
69
- /** @type {(i: number, acc: readonly unknown[]) => Effect<O, readonly unknown[]>} */
64
+ /** @type {(i: number, acc: readonly unknown[]) => Effect<O, readonly unknown[], never>} */
70
65
  const go = (i, acc) => (
71
66
  i === msgs.length
72
- ? pure(acc)
67
+ ? pureOk(acc)
68
+ // The channel stays `never`: a `Handle` has absorbed its own
69
+ // failures into the response, so every message contributes one.
73
70
  : step(
74
71
  handler(/** @type {Unknown} */ (msgs[i])),
75
72
  r => go(i + 1, [...acc, r]))
@@ -88,11 +85,10 @@ const runSessionVirtual =
88
85
  initEvo(fileCas(sha256)(home)),
89
86
  cacheKey => step(
90
87
  create(uninitializedState),
91
- sessionKey => {
92
- const step = mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey)
93
- return feed(step)(msgs)
94
- }))
95
- return virtual({ ...emptyState, root })(effect)[1]
88
+ sessionKey => feed(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))(msgs)))
89
+ // A proof has nobody to report a channel failure to, so it panics: the
90
+ // session either ran or the test is meaningless.
91
+ return unwrapResult(virtual({ ...emptyState, root })(effect)[1])
96
92
  }
97
93
 
98
94
  // Seeds a blob directly into the virtual store via `c.write`, bypassing the
@@ -105,8 +101,8 @@ const runSessionVirtual =
105
101
  const seedBlob = (root, home = '/home/user') => chunks => {
106
102
  const c = fileCas(sha256)(home)
107
103
  const stream = chunks.reduceRight(
108
- (/** @type {List<never, IoResult<Vec>>} */ tail, chunk) => nonEmpty(resultOk(chunk), tail),
109
- /** @type {List<never, IoResult<Vec>>} */ (elEmpty()))
104
+ (/** @type {List<never, Vec, IoChannel>} */ tail, chunk) => nonEmpty(chunk, tail),
105
+ /** @satisfies {List<never, Vec, IoChannel>} */ (elEmpty()))
110
106
  const [state, result] = virtual({ ...emptyState, root })(c.write(stream))
111
107
  assert(result[0] === 'ok', result)
112
108
  return [state.root, vecToCBase32(result[1])]
@@ -150,7 +146,7 @@ const runStdio =
150
146
  const effect = step(
151
147
  initEvo(fileCas(sha256)(home)),
152
148
  cacheKey => step(
153
- create(/** @type {McpSessionState} */ (uninitializedState)),
149
+ create(uninitializedState),
154
150
  sessionKey =>
155
151
  stdioTransport(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))
156
152
  )
@@ -161,15 +157,80 @@ const runStdio =
161
157
  return stdout.split('\n').filter(line => line.length > 0).slice(1).map(line => unwrap(parseJson(line)))
162
158
  }
163
159
 
160
+ /**
161
+ * The `result` of a `tools/call` response.
162
+ *
163
+ * This is the one place a response crosses from `unknown` to a typed
164
+ * {@link ToolsCallResult}. The structural essentials are checked here so the
165
+ * accessors below — and every call site — do not have to assume them; only the
166
+ * final step from a checked `content` array to `ToolsCallResult` is taken on
167
+ * trust, because rtti's `parse` reads `Unknown`, and getting there from
168
+ * `unknown` is the same problem one level down.
169
+ */
164
170
  /** @type {(resp: unknown) => ToolsCallResult} */
165
- const resultOf = resp =>
166
- /** @type {{ readonly result: ToolsCallResult }} */ (resp).result
171
+ const resultOf = resp => {
172
+ assert(typeof resp === 'object' && resp !== null && 'result' in resp, resp)
173
+ const { result } = resp
174
+ assert(typeof result === 'object' && result !== null && 'content' in result, result)
175
+ const { content } = result
176
+ assert(content instanceof Array, content)
177
+ return /** @type {ToolsCallResult} */ (result)
178
+ }
167
179
 
168
- /** @type {(resp: unknown) => unknown} */
169
- const item0 = resp => resultOf(resp).content[0]
180
+ /** @type {(resp: unknown) => ContentItem} */
181
+ const item0 = resp => {
182
+ const [item] = resultOf(resp).content
183
+ assert(item !== undefined, resp)
184
+ return item
185
+ }
170
186
 
171
187
  /** @type {(resp: unknown) => string} */
172
- const textOf = resp => (/** @type {{ readonly text: string }} */ (item0(resp))).text
188
+ const textOf = resp => {
189
+ const item = item0(resp)
190
+ assert(item.type === 'text', item)
191
+ return item.text
192
+ }
193
+
194
+ // The accessors below read a response that is `unknown` at this boundary. They
195
+ // check their way in rather than casting, so a malformed response fails at the
196
+ // read with the offending value attached.
197
+
198
+ /** Whether `resp` is an object carrying `key`. */
199
+ /** @type {(resp: unknown, key: 'error' | 'result') => boolean} */
200
+ const has = (resp, key) => typeof resp === 'object' && resp !== null && key in resp
201
+
202
+ /** @type {(resp: unknown) => number} */
203
+ const errorCode = resp => {
204
+ assert(typeof resp === 'object' && resp !== null && 'error' in resp, resp)
205
+ const { error } = resp
206
+ assert(typeof error === 'object' && error !== null && 'code' in error, error)
207
+ const { code } = error
208
+ assert(typeof code === 'number', code)
209
+ return code
210
+ }
211
+
212
+ /** @type {(resp: unknown) => unknown} */
213
+ const idOf = resp => {
214
+ assert(typeof resp === 'object' && resp !== null && 'id' in resp, resp)
215
+ return resp.id
216
+ }
217
+
218
+ /** The `name` and `inputSchema.type` of each tool in a `tools/list` result. */
219
+ /** @type {(resp: unknown) => readonly { readonly name: string, readonly schemaType: unknown }[]} */
220
+ const toolsOf = resp => {
221
+ assert(typeof resp === 'object' && resp !== null && 'result' in resp, resp)
222
+ const { result } = resp
223
+ assert(typeof result === 'object' && result !== null && 'tools' in result, result)
224
+ const { tools } = result
225
+ assert(tools instanceof Array, tools)
226
+ return tools.map(t => {
227
+ assert(typeof t === 'object' && t !== null && 'name' in t && 'inputSchema' in t, t)
228
+ const { name, inputSchema } = t
229
+ assert(typeof name === 'string', name)
230
+ assert(typeof inputSchema === 'object' && inputSchema !== null && 'type' in inputSchema, inputSchema)
231
+ return { name, schemaType: inputSchema.type }
232
+ })
233
+ }
173
234
 
174
235
  /** The `text` payload of a `cas_get` response, parsed and checked against {@link casGetResult}. */
175
236
  const casGetResultOf = (/** @type {unknown} */ resp) =>
@@ -183,12 +244,12 @@ const textSample = 'hello, world!'
183
244
  const revisionSample = `{"dialect":"${revisionDialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`
184
245
 
185
246
  // A base64-encoded binary payload for binary add→get round-trips.
186
- const binarySample = /** @type {string} */ (base64Encode(vec8(0x2An)))
247
+ const binarySample = base64Encode(vec8(0x2An))
187
248
 
188
249
  // A base64 blob whose leading bytes are the PNG magic-byte signature, so
189
250
  // `cas_get` detects its type and returns base64 with mimeType image/png.
190
- const pngSample = /** @type {string} */ (base64Encode(
191
- u8ListToVec(msb)([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x01])))
251
+ const pngSample = base64Encode(
252
+ u8ListToVec(msb)([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x01]))
192
253
 
193
254
  // Returns the RFC 4648 base64 encoding of `n` zero bytes, computed directly
194
255
  // without bigint arithmetic — independent of `base64.encode` so these tests
@@ -216,10 +277,10 @@ const largeMultiChunkBlobMeta =
216
277
  (/** @type {Vec} */ chunk0, /** @type {Vec} */ chunk1, /** @type {string} */ expectedType,
217
278
  /** @type {string} */ expectedMime) => () => {
218
279
  const [root, hash] = seedBlob({})([chunk0, chunk1])
219
- const [metaResp] = /** @type {readonly unknown[]} */ (runSessionVirtual(root)([
280
+ const [metaResp] = runSessionVirtual(root)([
220
281
  init, initialized,
221
282
  call(2, 'cas_get', { hash }),
222
- ]).slice(2))
283
+ ]).slice(2)
223
284
  assert(!resultOf(metaResp).isError)
224
285
  const meta = casGetResultOf(metaResp)
225
286
  assertEq(meta.type, expectedType)
@@ -272,10 +333,10 @@ export const proof = {
272
333
  // buffered inline. The metadata-only path (above) still returns its size/type.
273
334
  getContentLargeBlobTooLargeError: () => {
274
335
  const [root, hash] = seedBlob({})([asciiChunk, asciiChunk])
275
- const [getResp] = /** @type {readonly unknown[]} */ (runSessionVirtual(root)([
336
+ const [getResp] = runSessionVirtual(root)([
276
337
  init, initialized,
277
338
  call(2, 'cas_get', { hash, content: true }),
278
- ]).slice(2))
339
+ ]).slice(2)
279
340
  assertEq(resultOf(getResp).isError, true)
280
341
  const text = textOf(getResp)
281
342
  assert(text.includes('too large'))
@@ -309,9 +370,8 @@ export const proof = {
309
370
  const [getResp] = runStdio(root)([
310
371
  call(2, 'cas_get', { hash, content: true }),
311
372
  ])
312
- const err = /** @type {{ readonly error?: { readonly code: number }, readonly id: unknown }} */ (getResp)
313
- assertEq(err.error?.code, -32603)
314
- assertEq(err.id, 2)
373
+ assertEq(errorCode(getResp), -32603)
374
+ assertEq(idOf(getResp), 2)
315
375
  },
316
376
 
317
377
  // The paired boundary case: a blob whose base64 inflation leaves enough
@@ -344,19 +404,18 @@ export const proof = {
344
404
  const [getResp] = runStdio(root)([
345
405
  call(2, 'cas_get', { hash, content: true }),
346
406
  ])
347
- const err = /** @type {{ readonly error?: { readonly code: number }, readonly id: unknown }} */ (getResp)
348
- assertEq(err.error?.code, -32603)
349
- assertEq(err.id, 2)
407
+ assertEq(errorCode(getResp), -32603)
408
+ assertEq(idOf(getResp), 2)
350
409
  },
351
410
 
352
411
  toolsListAdvertisesSevenTools: () => {
353
412
  const [resp] = runSessionVirtual({})([init, initialized, list(2)]).slice(2)
354
- const tools = (/** @type {{ result: { tools: readonly { name: string }[] } }} */ (resp)).result.tools
413
+ const tools = toolsOf(resp)
355
414
  assertEq(tools.length, 7)
356
415
  assertEq(tools.map(t => t.name).join(','), 'cas_add,cas_get,cas_list,evo_list,evo_head,evo_revision,evo_add')
357
- const add = (/** @type {{ result: { tools: readonly { inputSchema: { type?: string } }[] } }} */ (resp))
358
- .result.tools[0]
359
- assertEq(add.inputSchema.type, 'object')
416
+ const [add] = tools
417
+ assert(add !== undefined, tools)
418
+ assertEq(add.schemaType, 'object')
360
419
  },
361
420
 
362
421
  // The same server also exposes Evo (fjs/cas/evo): add a revision, then
@@ -483,7 +542,7 @@ export const proof = {
483
542
  call(2, 'cas_add', { content: textSample }),
484
543
  call(3, 'cas_get', { hash, content: true }),
485
544
  )
486
- assertEq(item0(getResp) === null ? null : (/** @type {{ type: string }} */ (item0(getResp))).type, 'text')
545
+ assertEq(item0(getResp).type, 'text')
487
546
  const result = casGetResultOf(getResp)
488
547
  assertEq(result.type, 'text')
489
548
  assertEq(result.mimeType, 'text/plain')
@@ -498,7 +557,7 @@ export const proof = {
498
557
  call(3, 'cas_get', { hash, content: true }),
499
558
  )
500
559
  assert(!resultOf(getResp).isError)
501
- assertEq((/** @type {{ type: string }} */ (item0(getResp))).type, 'text')
560
+ assertEq(item0(getResp).type, 'text')
502
561
  const result = casGetResultOf(getResp)
503
562
  assertEq(result.type, 'base64')
504
563
  assertEq(result.mimeType, 'image/png')
@@ -627,8 +686,8 @@ export const proof = {
627
686
 
628
687
  toolErrorIsNotJsonRpcError: () => {
629
688
  const [resp] = session(call(2, 'cas_add', { content: 'not valid!', type: 'base64' }))
630
- assert(!('error' in /** @type {object} */ (resp)))
631
- assert('result' in /** @type {object} */ (resp))
689
+ assert(!has(resp, 'error'), resp)
690
+ assert(has(resp, 'result'), resp)
632
691
  },
633
692
 
634
693
  // cas_get without content:true returns only metadata.
@@ -664,7 +723,7 @@ export const proof = {
664
723
 
665
724
  getMetaOctetStreamForUnknownBinary: () => {
666
725
  const binaryContent = u8ListToVec(msb)([0xFF, 0xFE, 0x00, 0x01])
667
- const binaryB64 = /** @type {string} */ (base64Encode(binaryContent))
726
+ const binaryB64 = base64Encode(binaryContent)
668
727
  const [addResp] = session(call(2, 'cas_add', { content: binaryB64, type: 'base64' }))
669
728
  const hash = textOf(addResp)
670
729
  const [, metaResp] = session(
@@ -682,7 +741,7 @@ export const proof = {
682
741
  // base64/octet-stream, not text/plain.
683
742
  getMetaOctetStreamForNulBlob: () => {
684
743
  const nulContent = u8ListToVec(msb)([0x00, 0x00, 0x00])
685
- const nulB64 = /** @type {string} */ (base64Encode(nulContent))
744
+ const nulB64 = base64Encode(nulContent)
686
745
  const [addResp] = session(call(2, 'cas_add', { content: nulB64, type: 'base64' }))
687
746
  const hash = textOf(addResp)
688
747
  const [, metaResp] = session(
@@ -709,7 +768,7 @@ export const proof = {
709
768
  // cas_get with content:true on octet-stream (no magic bytes, not UTF-8) returns inline base64.
710
769
  getOctetStreamWithContentIncludesBase64: () => {
711
770
  const binaryContent = u8ListToVec(msb)([0xFF, 0xFE, 0x00, 0x01])
712
- const binaryB64 = /** @type {string} */ (base64Encode(binaryContent))
771
+ const binaryB64 = base64Encode(binaryContent)
713
772
  const [addResp] = session(call(2, 'cas_add', { content: binaryB64, type: 'base64' }))
714
773
  const hash = textOf(addResp)
715
774
  const [, getResp] = session(
@@ -1,3 +1,15 @@
1
+ /**
2
+ * HTML serialization helpers: `Element`/`Attributes` builders, void-tag
3
+ * handling, attribute/text escaping, and a UTF-8 emitter for full documents.
4
+ * See `./types.ts` for the `Element`/`Node` type-level API.
5
+ *
6
+ * @module
7
+ *
8
+ * @import { List } from '../../types/list/types.ts'
9
+ * @import { Entry, StringMap } from '../../types/object/types.ts'
10
+ * @import { Vec } from '../../types/bit_vec/types.ts'
11
+ * @import { Element, Node } from './types.ts'
12
+ */
1
13
  import type { List } from '../../types/list/types.ts';
2
14
  import type { StringMap } from '../../types/object/types.ts';
3
15
  import type { Vec } from '../../types/bit_vec/types.ts';
@@ -4,19 +4,21 @@
4
4
  * See `./types.ts` for the `Element`/`Node` type-level API.
5
5
  *
6
6
  * @module
7
+ *
8
+ * @import { List } from '../../types/list/types.ts'
9
+ * @import { Entry, StringMap } from '../../types/object/types.ts'
10
+ * @import { Vec } from '../../types/bit_vec/types.ts'
11
+ * @import { Element, Node } from './types.ts'
7
12
  */
8
- /** @import { List } from '../../types/list/types.ts' */
13
+
9
14
  import { map, flatMap, flat, concat as listConcat } from '../../types/list/module.f.mjs'
10
15
  import { concat, concat as stringConcat } from '../../types/string/module.f.mjs'
11
16
  import { definedEntries } from '../../types/object/module.f.mjs'
12
- /** @import { Entry, StringMap } from '../../types/object/types.ts' */
13
17
  import { compose } from '../../types/function/module.f.mjs'
14
18
  import { stringToList } from '../../text/utf16/module.f.mjs'
15
19
  import { includes } from '../../types/array/module.f.mjs'
16
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
17
20
  import { utf8 } from '../../text/module.f.mjs'
18
21
  import { quotationMark, ampersand, lessThanSign, greaterThanSign } from '../../text/ascii/module.f.mjs'
19
- /** @import { Element, Node } from './types.ts' */
20
22
 
21
23
  const { fromCharCode } = String
22
24
 
@@ -65,7 +67,7 @@ const escapeTable = /** @type {const} */ ({
65
67
 
66
68
  /** @type {(code: number) => string} */
67
69
  const escapeCharCode = code =>
68
- escapeTable[/** @type {keyof typeof escapeTable} */ (code)] ?? fromCharCode(code)
70
+ escapeTable[code] ?? fromCharCode(code)
69
71
 
70
72
  const escape = compose(stringToList)(map(escapeCharCode))
71
73
 
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @import { Element } from './types.ts'
3
+ */
1
4
  export declare const proof: {
2
5
  empty: () => void;
3
6
  empty2: () => void;
@@ -1,5 +1,8 @@
1
+ /**
2
+ * @import { Element } from './types.ts'
3
+ */
4
+
1
5
  import { htmlToString } from "./module.f.mjs"
2
- /** @import { Element } from './types.ts' */
3
6
  import { assertEq } from '../../asserts/module.f.mjs'
4
7
 
5
8
  export const proof = {
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Extended JSON: the ordinary JSON data model with `bigint` added to the
3
+ * primitive leaves, so bare integer syntax survives a parse exactly.
4
+ *
5
+ * It is a runtime representation, not a syntax. `stringify` emits ordinary,
6
+ * valid JSON text — there is no `123n` literal, tagged object, or
7
+ * quoted-integer convention — and ordinary JavaScript consumers of that text
8
+ * are free to read it back into whatever numeric representation they use,
9
+ * `JSON.parse`'s `number` included. What the extended codec adds is that
10
+ * *this* codec reads it back into the same runtime value it wrote.
11
+ *
12
+ * ### Parse
13
+ *
14
+ * The split is lexical, not mathematical: **a token containing `.` or `e` /
15
+ * `E` is a `number`, even when its value is an integer.**
16
+ *
17
+ * ```text
18
+ * 123 -> 123n -123 -> -123n 0 -> 0n
19
+ * -0 -> -0 1.5 -> 1.5 1.0 -> 1
20
+ * 1e3 -> 1000 1E3 -> 1000
21
+ * ```
22
+ *
23
+ * `-0` is the exception to bare integer syntax: `bigint` has no negative zero,
24
+ * so keeping it as a `number` is what preserves the sign the JSON text spells.
25
+ *
26
+ * The extended domain is exact where it claims to be, so it rejects rather
27
+ * than rounds: a token whose value is outside the finite `number` range
28
+ * (`1e400`) is a parse `error`, not `Infinity`. Ordinary rounding within that
29
+ * range is inherent to `number` and is not an error — `1e-400` is `0`, and
30
+ * `0.1` is the nearest double, as everywhere else.
31
+ *
32
+ * ### Serialize
33
+ *
34
+ * Spelling follows the runtime type of the leaf, so parsing the output returns
35
+ * the value that was written:
36
+ *
37
+ * ```text
38
+ * 0n -> 0 -> 0n 3n -> 3 -> 3n
39
+ * 0 -> 0.0 -> 0 3 -> 3.0 -> 3
40
+ * -0 -> -0 -> -0
41
+ * ```
42
+ *
43
+ * A `bigint` is always its full base-10 digits, **never** exponent notation,
44
+ * however large: exponent syntax belongs to the `number` side and would parse
45
+ * back as one. A whole-valued `number` other than `-0` gets a non-integer
46
+ * spelling (`3.0`) for the same reason. This `.0` rule is the extended codec's
47
+ * own; the standard codec in [`../module.f.mjs`](../module.f.mjs) has its own
48
+ * numeric spelling and does not route through here.
49
+ *
50
+ * `NaN`, `Infinity` and `-Infinity` cannot arrive from JSON text but can be
51
+ * supplied programmatically, and JSON has no syntax for them. They serialize
52
+ * as `null`, matching what `JSON.stringify` does with them.
53
+ *
54
+ * @module
55
+ *
56
+ * @import { Result } from '../../../types/result/types.ts'
57
+ * @import { List } from '../../../types/list/types.ts'
58
+ * @import { NumberPolicy } from '../parser/types.ts'
59
+ * @import { Primitive, Unknown, _MapEntries } from './types.ts'
60
+ */
61
+ import type { Result } from '../../../types/result/types.ts';
62
+ import type { List } from '../../../types/list/types.ts';
63
+ import type { Unknown, _MapEntries } from './types.ts';
64
+ /**
65
+ * Parses `text` as extended JSON, reporting failure as a `Result` rather than
66
+ * throwing.
67
+ *
68
+ * @type {(text: string) => Result<Unknown, string>}
69
+ */
70
+ export declare const parse: (text: string) => Result<Unknown, string>;
71
+ /**
72
+ * Serializes an extended JSON value as a list of string chunks.
73
+ *
74
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
75
+ */
76
+ export declare const serialize: (mapEntries: _MapEntries) => (value: Unknown) => List<string>;
77
+ /**
78
+ * Serializes an extended JSON value as ordinary JSON text.
79
+ *
80
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
81
+ */
82
+ export declare const stringify: (mapEntries: _MapEntries) => (value: Unknown) => string;
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Extended JSON: the ordinary JSON data model with `bigint` added to the
3
+ * primitive leaves, so bare integer syntax survives a parse exactly.
4
+ *
5
+ * It is a runtime representation, not a syntax. `stringify` emits ordinary,
6
+ * valid JSON text — there is no `123n` literal, tagged object, or
7
+ * quoted-integer convention — and ordinary JavaScript consumers of that text
8
+ * are free to read it back into whatever numeric representation they use,
9
+ * `JSON.parse`'s `number` included. What the extended codec adds is that
10
+ * *this* codec reads it back into the same runtime value it wrote.
11
+ *
12
+ * ### Parse
13
+ *
14
+ * The split is lexical, not mathematical: **a token containing `.` or `e` /
15
+ * `E` is a `number`, even when its value is an integer.**
16
+ *
17
+ * ```text
18
+ * 123 -> 123n -123 -> -123n 0 -> 0n
19
+ * -0 -> -0 1.5 -> 1.5 1.0 -> 1
20
+ * 1e3 -> 1000 1E3 -> 1000
21
+ * ```
22
+ *
23
+ * `-0` is the exception to bare integer syntax: `bigint` has no negative zero,
24
+ * so keeping it as a `number` is what preserves the sign the JSON text spells.
25
+ *
26
+ * The extended domain is exact where it claims to be, so it rejects rather
27
+ * than rounds: a token whose value is outside the finite `number` range
28
+ * (`1e400`) is a parse `error`, not `Infinity`. Ordinary rounding within that
29
+ * range is inherent to `number` and is not an error — `1e-400` is `0`, and
30
+ * `0.1` is the nearest double, as everywhere else.
31
+ *
32
+ * ### Serialize
33
+ *
34
+ * Spelling follows the runtime type of the leaf, so parsing the output returns
35
+ * the value that was written:
36
+ *
37
+ * ```text
38
+ * 0n -> 0 -> 0n 3n -> 3 -> 3n
39
+ * 0 -> 0.0 -> 0 3 -> 3.0 -> 3
40
+ * -0 -> -0 -> -0
41
+ * ```
42
+ *
43
+ * A `bigint` is always its full base-10 digits, **never** exponent notation,
44
+ * however large: exponent syntax belongs to the `number` side and would parse
45
+ * back as one. A whole-valued `number` other than `-0` gets a non-integer
46
+ * spelling (`3.0`) for the same reason. This `.0` rule is the extended codec's
47
+ * own; the standard codec in [`../module.f.mjs`](../module.f.mjs) has its own
48
+ * numeric spelling and does not route through here.
49
+ *
50
+ * `NaN`, `Infinity` and `-Infinity` cannot arrive from JSON text but can be
51
+ * supplied programmatically, and JSON has no syntax for them. They serialize
52
+ * as `null`, matching what `JSON.stringify` does with them.
53
+ *
54
+ * @module
55
+ *
56
+ * @import { Result } from '../../../types/result/types.ts'
57
+ * @import { List } from '../../../types/list/types.ts'
58
+ * @import { NumberPolicy } from '../parser/types.ts'
59
+ * @import { Primitive, Unknown, _MapEntries } from './types.ts'
60
+ */
61
+
62
+ import { concat } from '../../../types/string/module.f.mjs'
63
+ import { compose } from '../../../types/function/module.f.mjs'
64
+ import { error, ok } from '../../../types/result/module.f.mjs'
65
+ import { stringToList } from '../../../text/utf16/module.f.mjs'
66
+ import { parse as parseTokens } from '../parser/module.f.mjs'
67
+ import { tokenize } from '../tokenizer/module.f.mjs'
68
+ import { isBareInteger, numberLexeme } from '../number/module.f.mjs'
69
+ import { treeSerialize, stringSerialize, nullSerialize, boolSerialize } from '../serializer/module.f.mjs'
70
+
71
+ const { isFinite } = Number
72
+
73
+ const { is } = Object
74
+
75
+ /**
76
+ * The extended numeric policy, applied to the token's exact lexeme.
77
+ *
78
+ * Bare integer syntax is materialized as `bigint` straight from that lexeme —
79
+ * never through `number`, which would round anything above
80
+ * `Number.MAX_SAFE_INTEGER`. Everything else is `number`, and is rejected if
81
+ * the finite `number` range cannot hold it.
82
+ *
83
+ * @type {NumberPolicy<number | bigint>}
84
+ */
85
+ const numberPolicy = ({ value }) => {
86
+ if (isBareInteger(numberLexeme(value))) {
87
+ return ok(value === '-0' ? -0 : BigInt(value))
88
+ }
89
+ const n = Number(value)
90
+ return isFinite(n) ? ok(n) : error(`number is out of the finite range: ${value}`)
91
+ }
92
+
93
+ /**
94
+ * Parses `text` as extended JSON, reporting failure as a `Result` rather than
95
+ * throwing.
96
+ *
97
+ * @type {(text: string) => Result<Unknown, string>}
98
+ */
99
+ export const parse = text => parseTokens(numberPolicy)(tokenize(stringToList(text)))
100
+
101
+ const negativeZeroSerialize = ['-0']
102
+
103
+ /**
104
+ * Spells a `number` so that reparsing it returns a `number` — never a
105
+ * `bigint`.
106
+ *
107
+ * A whole-valued `number` already spells itself with `.` or `e` often enough
108
+ * (`1e+21`, `1.5`); when it does not, `.0` is appended, which is the same
109
+ * value in JSON and the other lexical branch on the way back. `-0` is written
110
+ * out as the exact token `-0`, the one bare integer the parser keeps as a
111
+ * `number`.
112
+ *
113
+ * @type {(value: number) => List<string>}
114
+ */
115
+ const numberSerialize = value => {
116
+ if (is(value, -0)) { return negativeZeroSerialize }
117
+ if (!isFinite(value)) { return nullSerialize }
118
+ const text = `${value}`
119
+ return [isBareInteger(numberLexeme(text)) ? `${text}.0` : text]
120
+ }
121
+
122
+ /**
123
+ * Spells a `bigint` as its full base-10 digits. `BigInt`'s own decimal form is
124
+ * exactly that: no `n` suffix, and no exponent notation at any magnitude.
125
+ *
126
+ * @type {(value: bigint) => List<string>}
127
+ */
128
+ const bigintSerialize = value => [`${value}`]
129
+
130
+ /** @type {(value: Primitive) => List<string>} */
131
+ const primitiveSerialize = value => {
132
+ switch (typeof value) {
133
+ case 'boolean': { return boolSerialize(value) }
134
+ case 'bigint': { return bigintSerialize(value) }
135
+ case 'number': { return numberSerialize(value) }
136
+ case 'string': { return stringSerialize(value) }
137
+ default: { return nullSerialize }
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Serializes an extended JSON value as a list of string chunks.
143
+ *
144
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
145
+ */
146
+ export const serialize = treeSerialize(primitiveSerialize)
147
+
148
+ /**
149
+ * Serializes an extended JSON value as ordinary JSON text.
150
+ *
151
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
152
+ */
153
+ export const stringify = sort => compose(serialize(sort))(concat)