functionalscript 0.45.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 (296) 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 +10 -0
  4. package/fjs/asn.1/proof.f.mjs +16 -0
  5. package/fjs/basen/base128/module.f.mjs +22 -5
  6. package/fjs/bnf/data/module.f.d.mts +32 -6
  7. package/fjs/bnf/data/module.f.mjs +112 -7
  8. package/fjs/bnf/data/proof.f.d.mts +2 -0
  9. package/fjs/bnf/data/proof.f.mjs +74 -3
  10. package/fjs/bnf/data/types.d.ts +20 -2
  11. package/fjs/bnf/descent/module.f.d.mts +28 -14
  12. package/fjs/bnf/descent/module.f.mjs +122 -77
  13. package/fjs/bnf/descent/proof.f.d.mts +2 -0
  14. package/fjs/bnf/descent/proof.f.mjs +117 -31
  15. package/fjs/bnf/descent/types.d.ts +12 -14
  16. package/fjs/bnf/ll1/module.f.d.mts +64 -22
  17. package/fjs/bnf/ll1/module.f.mjs +214 -154
  18. package/fjs/bnf/ll1/proof.f.d.mts +15 -2
  19. package/fjs/bnf/ll1/proof.f.mjs +323 -149
  20. package/fjs/bnf/ll1/types.d.ts +16 -24
  21. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  22. package/fjs/bnf/matcher/module.f.mjs +81 -0
  23. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  24. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  25. package/fjs/bnf/matcher/types.d.ts +54 -0
  26. package/fjs/bnf/testlib.f.d.mts +31 -0
  27. package/fjs/bnf/testlib.f.mjs +80 -0
  28. package/fjs/cas/cli/module.f.d.mts +1 -1
  29. package/fjs/cas/cli/module.f.mjs +14 -20
  30. package/fjs/cas/cli/proof.f.d.mts +1 -3
  31. package/fjs/cas/cli/proof.f.mjs +44 -33
  32. package/fjs/cas/evo/module.f.d.mts +64 -18
  33. package/fjs/cas/evo/module.f.mjs +148 -70
  34. package/fjs/cas/evo/proof.f.d.mts +10 -1
  35. package/fjs/cas/evo/proof.f.mjs +305 -223
  36. package/fjs/cas/evo/types.d.ts +45 -9
  37. package/fjs/cas/module.f.d.mts +18 -32
  38. package/fjs/cas/module.f.mjs +129 -128
  39. package/fjs/cas/proof.f.d.mts +11 -8
  40. package/fjs/cas/proof.f.mjs +259 -147
  41. package/fjs/cas/types.d.ts +24 -10
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/module.f.d.mts +5 -5
  45. package/fjs/ci/module.f.mjs +8 -7
  46. package/fjs/ci/nix/module.f.d.mts +7 -5
  47. package/fjs/ci/nix/module.f.mjs +13 -12
  48. package/fjs/ci/nix/proof.f.mjs +2 -2
  49. package/fjs/ci/proof.f.mjs +9 -5
  50. package/fjs/cli/module.f.d.mts +4 -6
  51. package/fjs/cli/module.f.mjs +4 -8
  52. package/fjs/cli/proof.f.mjs +17 -16
  53. package/fjs/cli/types.d.ts +2 -3
  54. package/fjs/common/monoid/types.d.ts +1 -1
  55. package/fjs/crypto/hmac/module.f.mjs +2 -2
  56. package/fjs/crypto/sha2/module.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +1 -0
  58. package/fjs/crypto/sha2/proof.f.mjs +24 -0
  59. package/fjs/crypto/sha2/types.d.ts +11 -0
  60. package/fjs/crypto/sign/module.f.mjs +2 -2
  61. package/fjs/dev/module.f.d.mts +13 -4
  62. package/fjs/dev/module.f.mjs +56 -27
  63. package/fjs/dev/update/module.f.d.mts +9 -4
  64. package/fjs/dev/update/module.f.mjs +14 -10
  65. package/fjs/dev/update/proof.f.d.mts +1 -3
  66. package/fjs/dev/update/proof.f.mjs +10 -5
  67. package/fjs/djs/module.f.d.mts +13 -5
  68. package/fjs/djs/module.f.mjs +31 -16
  69. package/fjs/djs/parser/module.f.d.mts +13 -3
  70. package/fjs/djs/parser/module.f.mjs +117 -16
  71. package/fjs/djs/parser/proof.f.d.mts +5 -1
  72. package/fjs/djs/parser/proof.f.mjs +274 -12
  73. package/fjs/djs/parser/types.d.ts +7 -1
  74. package/fjs/djs/proof.f.d.mts +18 -2
  75. package/fjs/djs/proof.f.mjs +187 -12
  76. package/fjs/djs/serializer/module.f.d.mts +25 -8
  77. package/fjs/djs/serializer/module.f.mjs +61 -15
  78. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  79. package/fjs/djs/serializer/proof.f.mjs +23 -1
  80. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  81. package/fjs/djs/tokenizer/module.f.mjs +99 -60
  82. package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
  83. package/fjs/djs/tokenizer/proof.f.mjs +74 -67
  84. package/fjs/djs/transpiler/module.f.d.mts +12 -7
  85. package/fjs/djs/transpiler/module.f.mjs +82 -56
  86. package/fjs/djs/transpiler/types.d.ts +7 -3
  87. package/fjs/djs/types.d.ts +7 -1
  88. package/fjs/effects/list/module.f.d.mts +14 -11
  89. package/fjs/effects/list/module.f.mjs +13 -11
  90. package/fjs/effects/list/types.d.ts +27 -7
  91. package/fjs/effects/memory/module.f.d.mts +2 -1
  92. package/fjs/effects/memory/module.f.mjs +3 -4
  93. package/fjs/effects/memory/proof.f.mjs +13 -7
  94. package/fjs/effects/memory/types.d.ts +4 -3
  95. package/fjs/effects/mock/module.f.d.mts +20 -4
  96. package/fjs/effects/mock/module.f.mjs +37 -5
  97. package/fjs/effects/mock/types.d.ts +10 -1
  98. package/fjs/effects/module.d.mts +4 -2
  99. package/fjs/effects/module.f.d.mts +466 -280
  100. package/fjs/effects/module.f.mjs +537 -299
  101. package/fjs/effects/module.mjs +2 -1
  102. package/fjs/effects/node/memory/module.d.mts +4 -2
  103. package/fjs/effects/node/memory/module.mjs +6 -3
  104. package/fjs/effects/node/memory/proof.mjs +10 -4
  105. package/fjs/effects/node/module.d.mts +4 -3
  106. package/fjs/effects/node/module.f.d.mts +168 -33
  107. package/fjs/effects/node/module.f.mjs +256 -52
  108. package/fjs/effects/node/module.mjs +57 -34
  109. package/fjs/effects/node/proof.f.d.mts +28 -2
  110. package/fjs/effects/node/proof.f.mjs +161 -42
  111. package/fjs/effects/node/types.d.ts +106 -18
  112. package/fjs/effects/node/virtual/module.f.d.mts +18 -4
  113. package/fjs/effects/node/virtual/module.f.mjs +110 -68
  114. package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
  115. package/fjs/effects/node/virtual/proof.f.mjs +190 -9
  116. package/fjs/effects/proof.f.d.mts +69 -37
  117. package/fjs/effects/proof.f.mjs +410 -130
  118. package/fjs/effects/types.d.ts +161 -33
  119. package/fjs/emergent_testing/module.f.d.mts +19 -12
  120. package/fjs/emergent_testing/module.f.mjs +93 -33
  121. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  122. package/fjs/emergent_testing/proof.f.mjs +166 -32
  123. package/fjs/emergent_testing/types.d.ts +22 -4
  124. package/fjs/fsm/module.f.d.mts +14 -4
  125. package/fjs/fsm/module.f.mjs +54 -37
  126. package/fjs/fsm/proof.f.d.mts +2 -0
  127. package/fjs/fsm/proof.f.mjs +83 -114
  128. package/fjs/js/keywords/module.f.d.mts +52 -0
  129. package/fjs/js/keywords/module.f.mjs +72 -0
  130. package/fjs/js/keywords/proof.f.d.mts +3 -0
  131. package/fjs/js/keywords/proof.f.mjs +13 -0
  132. package/fjs/js/tokenizer/module.f.d.mts +26 -6
  133. package/fjs/js/tokenizer/module.f.mjs +145 -159
  134. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  135. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  136. package/fjs/js/tokenizer/types.d.ts +33 -24
  137. package/fjs/mcp/cas/module.f.d.mts +1 -6
  138. package/fjs/mcp/cas/module.f.mjs +55 -51
  139. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  140. package/fjs/mcp/cas/proof.f.mjs +174 -0
  141. package/fjs/mcp/evo/module.f.d.mts +19 -10
  142. package/fjs/mcp/evo/module.f.mjs +48 -27
  143. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  144. package/fjs/mcp/evo/proof.f.mjs +115 -31
  145. package/fjs/mcp/module.f.d.mts +4 -4
  146. package/fjs/mcp/module.f.mjs +6 -6
  147. package/fjs/mcp/proof.f.d.mts +5 -3
  148. package/fjs/mcp/proof.f.mjs +112 -46
  149. package/fjs/media/html/module.f.mjs +1 -1
  150. package/fjs/media/json/extended/module.f.d.mts +82 -0
  151. package/fjs/media/json/extended/module.f.mjs +153 -0
  152. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  153. package/fjs/media/json/extended/proof.f.mjs +127 -0
  154. package/fjs/media/json/extended/types.d.ts +23 -0
  155. package/fjs/media/json/module.f.d.mts +8 -2
  156. package/fjs/media/json/module.f.mjs +43 -41
  157. package/fjs/media/json/number/module.f.d.mts +59 -0
  158. package/fjs/media/json/number/module.f.mjs +136 -0
  159. package/fjs/media/json/number/proof.f.d.mts +24 -0
  160. package/fjs/media/json/number/proof.f.mjs +86 -0
  161. package/fjs/media/json/number/types.d.ts +28 -0
  162. package/fjs/media/json/parser/module.f.d.mts +25 -13
  163. package/fjs/media/json/parser/module.f.mjs +114 -70
  164. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  165. package/fjs/media/json/parser/proof.f.mjs +31 -1
  166. package/fjs/media/json/parser/types.d.ts +33 -14
  167. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  168. package/fjs/media/json/rtti/module.f.mjs +1 -1
  169. package/fjs/media/json/rtti/proof.f.mjs +9 -9
  170. package/fjs/media/json/schema/module.f.mjs +3 -13
  171. package/fjs/media/json/schema/proof.f.d.mts +0 -1
  172. package/fjs/media/json/schema/proof.f.mjs +1 -2
  173. package/fjs/media/json/serializer/module.f.d.mts +32 -1
  174. package/fjs/media/json/serializer/module.f.mjs +64 -2
  175. package/fjs/media/json/tokenizer/module.f.mjs +7 -3
  176. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  177. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  178. package/fjs/media/json/types.d.ts +36 -10
  179. package/fjs/media/lock/module.f.d.mts +100 -0
  180. package/fjs/media/lock/module.f.mjs +125 -0
  181. package/fjs/media/lock/proof.f.d.mts +33 -0
  182. package/fjs/media/lock/proof.f.mjs +196 -0
  183. package/fjs/media/lock/types.d.ts +15 -0
  184. package/fjs/media/module.f.d.mts +6 -5
  185. package/fjs/media/module.f.mjs +8 -7
  186. package/fjs/media/note/module.f.d.mts +121 -0
  187. package/fjs/media/note/module.f.mjs +131 -0
  188. package/fjs/media/note/proof.f.d.mts +29 -0
  189. package/fjs/media/note/proof.f.mjs +150 -0
  190. package/fjs/media/note/types.d.ts +10 -0
  191. package/fjs/media/proof.f.d.mts +4 -1
  192. package/fjs/media/proof.f.mjs +40 -21
  193. package/fjs/media/revision/module.f.d.mts +78 -7
  194. package/fjs/media/revision/module.f.mjs +119 -12
  195. package/fjs/media/revision/proof.f.d.mts +10 -0
  196. package/fjs/media/revision/proof.f.mjs +88 -0
  197. package/fjs/media/revision/types.d.ts +34 -5
  198. package/fjs/media/type/module.f.d.mts +33 -15
  199. package/fjs/media/type/module.f.mjs +35 -29
  200. package/fjs/media/type/proof.f.d.mts +2 -1
  201. package/fjs/media/type/proof.f.mjs +30 -10
  202. package/fjs/module.f.mjs +29 -8
  203. package/fjs/nanvm/proof.f.mjs +3 -3
  204. package/fjs/nanvm/rust/module.f.mjs +1 -1
  205. package/fjs/nanvm/update/module.f.d.mts +4 -4
  206. package/fjs/nanvm/update/module.f.mjs +8 -9
  207. package/fjs/nanvm/update/proof.f.mjs +4 -3
  208. package/fjs/proof.f.d.mts +3 -3
  209. package/fjs/proof.f.mjs +36 -10
  210. package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
  211. package/fjs/protocol/json_rpc/module.f.mjs +3 -3
  212. package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
  213. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  214. package/fjs/protocol/mcp/module.f.mjs +74 -58
  215. package/fjs/protocol/mcp/proof.f.d.mts +13 -4
  216. package/fjs/protocol/mcp/proof.f.mjs +193 -61
  217. package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
  218. package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
  219. package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
  220. package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
  221. package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
  222. package/fjs/protocol/mcp/types.d.ts +17 -6
  223. package/fjs/sul/id/module.f.d.mts +0 -1
  224. package/fjs/sul/id/module.f.mjs +2 -3
  225. package/fjs/sul/level/hash/module.f.mjs +2 -1
  226. package/fjs/sul/level/hash/proof.f.mjs +2 -2
  227. package/fjs/sul/module.f.mjs +18 -13
  228. package/fjs/text/code_point/module.f.d.mts +8 -0
  229. package/fjs/text/code_point/module.f.mjs +8 -1
  230. package/fjs/text/code_point/proof.f.d.mts +1 -0
  231. package/fjs/text/code_point/proof.f.mjs +11 -0
  232. package/fjs/text/sgr/module.f.d.mts +4 -6
  233. package/fjs/text/sgr/module.f.mjs +6 -7
  234. package/fjs/text/utf16/module.f.mjs +7 -2
  235. package/fjs/text/utf16/proof.f.mjs +3 -3
  236. package/fjs/text/utf8/module.f.mjs +4 -2
  237. package/fjs/types/array/module.f.mjs +14 -2
  238. package/fjs/types/bit_vec/module.f.d.mts +0 -2
  239. package/fjs/types/bit_vec/module.f.mjs +46 -32
  240. package/fjs/types/bit_vec/proof.f.mjs +2 -2
  241. package/fjs/types/btree/remove/module.f.mjs +1 -1
  242. package/fjs/types/btree/set/module.f.mjs +9 -11
  243. package/fjs/types/btree/set/proof.f.mjs +12 -0
  244. package/fjs/types/byte_set/module.f.d.mts +11 -4
  245. package/fjs/types/byte_set/module.f.mjs +14 -6
  246. package/fjs/types/byte_set/proof.f.mjs +7 -7
  247. package/fjs/types/function/compare/module.f.mjs +10 -3
  248. package/fjs/types/list/module.f.d.mts +1 -1
  249. package/fjs/types/list/module.f.mjs +1 -1
  250. package/fjs/types/nullable/module.f.d.mts +18 -4
  251. package/fjs/types/nullable/module.f.mjs +21 -4
  252. package/fjs/types/nullable/proof.f.d.mts +4 -0
  253. package/fjs/types/nullable/proof.f.mjs +15 -0
  254. package/fjs/types/object/module.f.d.mts +12 -2
  255. package/fjs/types/object/module.f.mjs +11 -1
  256. package/fjs/types/patricia_trie/module.f.mjs +26 -11
  257. package/fjs/types/result/module.f.d.mts +3 -3
  258. package/fjs/types/result/module.f.mjs +3 -3
  259. package/fjs/types/rtti/common/module.f.d.mts +25 -28
  260. package/fjs/types/rtti/common/module.f.mjs +36 -32
  261. package/fjs/types/rtti/common/proof.f.mjs +5 -5
  262. package/fjs/types/rtti/data/module.f.d.mts +14 -0
  263. package/fjs/types/rtti/data/module.f.mjs +25 -2
  264. package/fjs/types/rtti/data/proof.f.d.mts +1 -0
  265. package/fjs/types/rtti/data/proof.f.mjs +25 -2
  266. package/fjs/types/rtti/parse/module.f.d.mts +24 -14
  267. package/fjs/types/rtti/parse/module.f.mjs +37 -28
  268. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  269. package/fjs/types/rtti/parse/proof.f.mjs +33 -14
  270. package/fjs/types/rtti/proof.f.mjs +3 -1
  271. package/fjs/types/rtti/ts/module.f.mjs +13 -17
  272. package/fjs/types/rtti/ts/types.d.ts +14 -1
  273. package/fjs/types/sorted_set/module.f.d.mts +18 -0
  274. package/fjs/types/sorted_set/module.f.mjs +22 -0
  275. package/fjs/types/sorted_set/proof.f.d.mts +1 -0
  276. package/fjs/types/sorted_set/proof.f.mjs +16 -1
  277. package/fjs/types/uint8array/module.f.d.mts +1 -1
  278. package/fjs/types/uint8array/module.f.mjs +1 -1
  279. package/fjs/website/module.f.d.mts +3 -3
  280. package/fjs/website/module.f.mjs +4 -7
  281. package/fjs/website/proof.f.mjs +2 -1
  282. package/package.json +2 -2
  283. package/fjs/dev/package_json/module.f.d.mts +0 -39
  284. package/fjs/dev/package_json/module.f.mjs +0 -40
  285. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  286. package/fjs/dev/package_json/proof.f.mjs +0 -32
  287. package/fjs/effects/eff/module.f.d.mts +0 -20
  288. package/fjs/effects/eff/module.f.mjs +0 -70
  289. package/fjs/effects/eff/proof.f.d.mts +0 -15
  290. package/fjs/effects/eff/proof.f.mjs +0 -69
  291. package/fjs/effects/eff/types.d.ts +0 -71
  292. package/fjs/types/rtti/validate/module.f.d.mts +0 -41
  293. package/fjs/types/rtti/validate/module.f.mjs +0 -171
  294. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  295. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  296. package/fjs/types/rtti/validate/types.d.ts +0 -6
@@ -7,7 +7,7 @@
7
7
  * - `tools/list` — advertise available tools
8
8
  * - `tools/call` — invoke a tool and return text content
9
9
  *
10
- * Each schema is both a runtime decoder (`validate(schema)`) and a static
10
+ * Each schema is both a runtime decoder (`parse(schema)`) and a static
11
11
  * TypeScript type (`Ts<typeof schema>`). Transport framing (stdio) and the
12
12
  * JSON-RPC dispatcher are in `fjs/protocol/json_rpc/module.f.mjs`.
13
13
  *
@@ -15,26 +15,23 @@
15
15
  *
16
16
  * @import { Unknown } from '../../media/json/types.ts'
17
17
  * @import { Ts } from '../../types/rtti/ts/types.ts'
18
- * @import { Operation, Effect } from '../../effects/types.ts'
18
+ * @import { Effect, Operation } from '../../effects/types.ts'
19
19
  * @import { Key, MemOp } from '../../effects/memory/types.ts'
20
20
  * @import { Response, Id, RpcError } from '../json_rpc/types.ts'
21
21
  * @import { Type } from '../../types/rtti/types.ts'
22
- * @import {
23
- * Implementation, ServerCapabilities, InitializeResult, Tool,
24
- * ToolsListParams, ToolsCallResult, McpHandlers, ToolEntry,
25
- * InitializedState, McpSessionState, McpConfig,
26
- * } from './types.ts'
22
+ * @import { Implementation, ServerCapabilities, InitializeResult, Tool, ToolsListParams, ToolsCallResult, McpHandlers, ToolEntry, McpSessionState, McpConfig } from './types.ts'
27
23
  */
28
24
 
29
25
  import { boolean, string, option, array, record, or } from '../../types/rtti/module.f.mjs'
30
- import { pure, step } from '../../effects/module.f.mjs'
26
+ import { pureOk, resultMapStep, resultStep, step as ioStep } from '../../effects/module.f.mjs'
27
+ import { ok } from '../../types/result/module.f.mjs'
31
28
  import { read, write } from '../../effects/memory/module.f.mjs'
32
29
  import {
33
30
  decodeRequest,
34
- rpcError, invalidRequest, invalidParams, methodNotFound,
31
+ rpcError, internalError, invalidRequest, invalidParams, methodNotFound,
35
32
  jsonrpc,
36
33
  } from '../json_rpc/module.f.mjs'
37
- import { validate } from '../../types/rtti/validate/module.f.mjs'
34
+ import { parse } from '../../types/rtti/parse/module.f.mjs'
38
35
  import { toJsonSchema } from '../../media/json/schema/module.f.mjs'
39
36
  import { unknown } from '../../media/json/rtti/module.f.mjs'
40
37
 
@@ -152,18 +149,18 @@ export const toolsCallResult = /** @type {const} */ ({
152
149
  * @param {string} name - The tool name (used in `tools/call` requests)
153
150
  * @param {string} description - Human-readable description for `tools/list`
154
151
  * @param {T} inputRtti - Runtime type info for input validation
155
- * @param {(args: Ts<T>) => Effect<O, ToolsCallResult>} handle - Handler receiving validated arguments of type `Ts<inputRtti>`
152
+ * @param {(args: Ts<T>) => Effect<O, ToolsCallResult, never>} handle - Handler receiving validated arguments of type `Ts<inputRtti>`
156
153
  * @returns {ToolEntry<O>} A `ToolEntry` ready to be added to a registry
157
154
  */
158
155
  export const toolEntry = (name, description, inputRtti, handle) => ({
159
156
  name,
160
157
  description,
161
158
  inputRtti,
162
- /** @type {(a: Unknown) => Effect<O, ToolsCallResult>} */
159
+ /** @type {(a: Unknown) => Effect<O, ToolsCallResult, never>} */
163
160
  handle: a => {
164
- const [t, r] = validate(/** @type {any} */ (inputRtti))(a)
161
+ const [t, r] = parse(/** @type {any} */ (inputRtti))(a)
165
162
  return t === 'error'
166
- ? pure(errorResult(`invalid arguments: ${r.message}`))
163
+ ? pureOk(errorResult(`invalid arguments: ${r.message}`))
167
164
  : handle(/** @type {Ts<T>} */ (r))
168
165
  }
169
166
  })
@@ -206,12 +203,12 @@ export const fromRegistry = registry => ({
206
203
  description: entry.description,
207
204
  inputSchema: toJsonSchema(entry.inputRtti),
208
205
  }))
209
- return pure({ tools })
206
+ return pureOk({ tools })
210
207
  },
211
208
  toolsCall: ({ name, arguments: args }) => {
212
209
  const entry = registry.find(e => e.name === name)
213
210
  return entry === undefined
214
- ? pure(errorResult(`unknown tool: ${name}`))
211
+ ? pureOk(errorResult(`unknown tool: ${name}`))
215
212
  : entry.handle(args === undefined ? {} : args)
216
213
  },
217
214
  })
@@ -232,13 +229,14 @@ export const notInitialized = rpcError(-32002)('Server not initialized')
232
229
  const _noParams = option(record(unknown))
233
230
 
234
231
  /** Initial session state — always start here. */
235
- export const uninitializedState = /** @type {McpSessionState} */ (['uninitialized'])
232
+ /** @type {McpSessionState} */
233
+ export const uninitializedState = ['uninitialized']
236
234
 
237
235
  /**
238
236
  * State-machine step for an MCP session using memory effects.
239
237
  *
240
238
  * Given configuration, handlers, and a memory key holding the session state,
241
- * returns a function `(value) => Effect<MemOp | O, Response | null>`.
239
+ * returns a function `(value) => Effect<MemOp | O, Response | null, never>`.
242
240
  *
243
241
  * Rules:
244
242
  * - `ping` returns an empty success regardless of session state; non-object
@@ -255,7 +253,7 @@ export const uninitializedState = /** @type {McpSessionState} */ (['uninitialize
255
253
  * to the handler; invalid params → -32602.
256
254
  *
257
255
  * @param {McpConfig} config
258
- * @returns {<O extends Operation>(handlers: McpHandlers<O>) => (stateKey: Key<McpSessionState>) => (value: Unknown) => Effect<MemOp | O, Response | null>}
256
+ * @returns {<O extends Operation>(handlers: McpHandlers<O>) => (stateKey: Key<McpSessionState>) => (value: Unknown) => Effect<MemOp | O, Response | null, never>}
259
257
  */
260
258
  export const mcpStep = ({
261
259
  protocolVersion,
@@ -267,7 +265,7 @@ export const mcpStep = ({
267
265
  value => {
268
266
  const [t, message] = decodeRequest(value)
269
267
  if (t === 'error') {
270
- return pure(_errResponse(null)(invalidRequest))
268
+ return pureOk(_errResponse(null)(invalidRequest))
271
269
  }
272
270
  const { id, method, params } = message
273
271
 
@@ -275,44 +273,51 @@ export const mcpStep = ({
275
273
  // `notifications/initialized` transitions the session from initializing → initialized.
276
274
  if (id === undefined) {
277
275
  if (method === 'notifications/initialized') {
278
- const [pt] = validate(_noParams)(params)
276
+ const [pt] = parse(_noParams)(params)
279
277
  if (pt === 'error') {
280
278
  // Malformed handshake — ignore it; the session stays gated.
281
- return pure(null)
279
+ return pureOk(null)
282
280
  }
283
- return step(
284
- read(stateKey),
285
- ([t]) => t === 'initializing'
286
- ? step(
287
- write(stateKey, ['initialized', /** @type {InitializedState} */ (true)]),
288
- () => pure(null),
289
- )
290
- : pure(null),
291
- )
281
+ // A notification never receives a response, so a session-state
282
+ // failure here has nowhere to be reported: the transition is
283
+ // skipped and the session stays gated, which the client then
284
+ // observes as `notInitialized` on its next call. That is the
285
+ // honest degradation better than a panic, and there is no
286
+ // response frame to put an error in.
287
+ return resultStep(read(stateKey), r => {
288
+ if (r[0] === 'error' || r[1][0] !== 'initializing') {
289
+ return pureOk(null)
290
+ }
291
+ // `resultMapStep`: a notification has no response frame, so
292
+ // the write's own outcome is absorbed here for the same
293
+ // reason the read's is above.
294
+ return resultMapStep(write(stateKey, ['initialized', true]), () => ok(null))
295
+ })
292
296
  }
293
- return pure(null)
297
+ return pureOk(null)
294
298
  }
295
299
 
296
300
  // `ping` is always valid regardless of session state, but its params
297
301
  // (if present) must be an object.
298
302
  if (method === 'ping') {
299
- const [pt] = validate(_noParams)(params)
303
+ const [pt] = parse(_noParams)(params)
300
304
  return pt === 'error'
301
- ? pure(_errResponse(id)(invalidParams))
302
- : pure(_okResponse(id)({}))
305
+ ? pureOk(_errResponse(id)(invalidParams))
306
+ : pureOk(_okResponse(id)({}))
303
307
  }
304
308
 
305
309
  // `initialize` transitions uninitialized → initializing; reject if already done.
306
310
  if (method === 'initialize') {
307
- return step(
311
+ return resultStep(
308
312
  read(stateKey),
309
- ([t]) => {
310
- if (t !== 'uninitialized') {
311
- return pure(_errResponse(id)(invalidRequest))
313
+ r => {
314
+ if (r[0] === 'error') { return pureOk(_errResponse(id)(internalError)) }
315
+ if (r[1][0] !== 'uninitialized') {
316
+ return pureOk(_errResponse(id)(invalidRequest))
312
317
  }
313
- const [pr] = validate(initializeParams)(params)
318
+ const [pr] = parse(initializeParams)(params)
314
319
  if (pr === 'error') {
315
- return pure(_errResponse(id)(invalidParams))
320
+ return pureOk(_errResponse(id)(invalidParams))
316
321
  }
317
322
  /** @type {InitializeResult} */
318
323
  const result = {
@@ -320,50 +325,61 @@ export const mcpStep = ({
320
325
  capabilities,
321
326
  serverInfo,
322
327
  }
323
- return step(
328
+ // The write's outcome decides the answer. It used to be
329
+ // discarded by a `() =>` continuation, so a session that
330
+ // failed to record the transition still replied with a
331
+ // successful handshake and then rejected every call after
332
+ // it as `notInitialized`.
333
+ return resultStep(
324
334
  write(stateKey, ['initializing']),
325
- () => pure(_okResponse(id)(result))
335
+ w => pureOk(w[0] === 'error'
336
+ ? _errResponse(id)(internalError)
337
+ : _okResponse(id)(result)),
326
338
  )
327
339
  },
328
340
  )
329
341
  }
330
342
 
331
343
  // All other methods require fully initialized state — read it first.
332
- return step(
344
+ // A session whose state cannot be read is an internal server error, not
345
+ // an uninitialized one: `notInitialized` tells the client to run the
346
+ // handshake it has already run, and it would run it again forever.
347
+ return resultStep(
333
348
  read(stateKey),
334
- ([t]) => {
335
- if (t !== 'initialized') {
336
- return pure(_errResponse(id)(notInitialized))
349
+ r => {
350
+ if (r[0] === 'error') { return pureOk(_errResponse(id)(internalError)) }
351
+ if (r[1][0] !== 'initialized') {
352
+ return pureOk(_errResponse(id)(notInitialized))
337
353
  }
338
354
 
339
355
  if (method === 'tools/list') {
340
356
  if (capabilities.tools === undefined) {
341
- return pure(_errResponse(id)(methodNotFound))
357
+ return pureOk(_errResponse(id)(methodNotFound))
342
358
  }
343
359
  // `params` may be absent — `tools/list` without a cursor.
344
- const [t, pr] = validate(toolsListParams)(params === undefined ? {} : params)
360
+ const [t, pr] = parse(toolsListParams)(params === undefined ? {} : params)
345
361
  return t === 'error'
346
- ? pure(_errResponse(id)(invalidParams))
347
- : step(
362
+ ? pureOk(_errResponse(id)(invalidParams))
363
+ : ioStep(
348
364
  handlers.toolsList(pr),
349
- r => pure(_okResponse(id)(r)),
365
+ r => pureOk(_okResponse(id)(r)),
350
366
  )
351
367
  }
352
368
 
353
369
  if (method === 'tools/call') {
354
370
  if (capabilities.tools === undefined) {
355
- return pure(_errResponse(id)(methodNotFound))
371
+ return pureOk(_errResponse(id)(methodNotFound))
356
372
  }
357
- const [t, pr] = validate(toolsCallParams)(params)
373
+ const [t, pr] = parse(toolsCallParams)(params)
358
374
  return t === 'error'
359
- ? pure(_errResponse(id)(invalidParams))
360
- : step(
375
+ ? pureOk(_errResponse(id)(invalidParams))
376
+ : ioStep(
361
377
  handlers.toolsCall(pr),
362
- r => pure(_okResponse(id)(r)),
378
+ r => pureOk(_okResponse(id)(r)),
363
379
  )
364
380
  }
365
381
 
366
- return pure(_errResponse(id)(methodNotFound))
382
+ return pureOk(_errResponse(id)(methodNotFound))
367
383
  },
368
384
  )
369
385
  }
@@ -1,12 +1,15 @@
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
- * @import { Ts } from '../../types/rtti/ts/types.ts'
7
7
  * @import {
8
- * ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
9
- * McpHandlers, McpConfig, McpSessionState,
8
+ * ToolsListParams,
9
+ * ToolsCallParams,
10
+ * McpHandlers,
11
+ * McpConfig,
12
+ * McpSessionState,
10
13
  * } from './types.ts'
11
14
  */
12
15
  import type { McpSessionState } from './types.ts';
@@ -19,6 +22,12 @@ export type _MemoryState = {
19
22
  export type _Op = never;
20
23
  export type _StepResult = readonly [unknown, McpSessionState];
21
24
  export declare const proof: {
25
+ sessionStateFailure: {
26
+ initializeRead: () => void;
27
+ initializeWrite: () => void;
28
+ gatedMethod: () => void;
29
+ initializedNotification: () => void;
30
+ };
22
31
  lifecycle: {
23
32
  initialStateIsUninitialized: () => void;
24
33
  initializeTransitionsToInitializing: () => void;