functionalscript 0.45.0 → 0.46.1
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.
- package/README.md +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +10 -0
- package/fjs/asn.1/proof.f.mjs +16 -0
- package/fjs/basen/base128/module.f.mjs +22 -5
- package/fjs/bnf/data/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -3
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +28 -14
- package/fjs/bnf/descent/module.f.mjs +122 -77
- package/fjs/bnf/descent/proof.f.d.mts +2 -0
- package/fjs/bnf/descent/proof.f.mjs +117 -31
- package/fjs/bnf/descent/types.d.ts +12 -14
- package/fjs/bnf/ll1/module.f.d.mts +64 -22
- package/fjs/bnf/ll1/module.f.mjs +214 -154
- package/fjs/bnf/ll1/proof.f.d.mts +15 -2
- package/fjs/bnf/ll1/proof.f.mjs +323 -149
- package/fjs/bnf/ll1/types.d.ts +16 -24
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- package/fjs/bnf/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- package/fjs/cas/cli/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +1 -3
- package/fjs/cas/cli/proof.f.mjs +44 -33
- package/fjs/cas/evo/module.f.d.mts +64 -18
- package/fjs/cas/evo/module.f.mjs +148 -70
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +305 -223
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +129 -128
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- package/fjs/ci/config/module.f.d.mts +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.mjs +9 -5
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.mjs +17 -16
- package/fjs/cli/types.d.ts +2 -3
- package/fjs/common/monoid/types.d.ts +1 -1
- package/fjs/crypto/hmac/module.f.mjs +2 -2
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +1 -0
- package/fjs/crypto/sha2/proof.f.mjs +24 -0
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- package/fjs/dev/module.f.d.mts +13 -4
- package/fjs/dev/module.f.mjs +56 -27
- package/fjs/dev/update/module.f.d.mts +9 -4
- package/fjs/dev/update/module.f.mjs +14 -10
- package/fjs/dev/update/proof.f.d.mts +1 -3
- package/fjs/dev/update/proof.f.mjs +10 -5
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +13 -3
- package/fjs/djs/parser/module.f.mjs +117 -16
- package/fjs/djs/parser/proof.f.d.mts +5 -1
- package/fjs/djs/parser/proof.f.mjs +274 -12
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +18 -2
- package/fjs/djs/proof.f.mjs +187 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +61 -15
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +99 -60
- package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
- package/fjs/djs/tokenizer/proof.f.mjs +74 -67
- package/fjs/djs/transpiler/module.f.d.mts +12 -7
- package/fjs/djs/transpiler/module.f.mjs +82 -56
- package/fjs/djs/transpiler/types.d.ts +7 -3
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +14 -11
- package/fjs/effects/list/module.f.mjs +13 -11
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +2 -1
- package/fjs/effects/memory/module.f.mjs +3 -4
- package/fjs/effects/memory/proof.f.mjs +13 -7
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +20 -4
- package/fjs/effects/mock/module.f.mjs +37 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +4 -2
- package/fjs/effects/module.f.d.mts +466 -280
- package/fjs/effects/module.f.mjs +537 -299
- package/fjs/effects/module.mjs +2 -1
- package/fjs/effects/node/memory/module.d.mts +4 -2
- package/fjs/effects/node/memory/module.mjs +6 -3
- package/fjs/effects/node/memory/proof.mjs +10 -4
- package/fjs/effects/node/module.d.mts +4 -3
- package/fjs/effects/node/module.f.d.mts +168 -33
- package/fjs/effects/node/module.f.mjs +256 -52
- package/fjs/effects/node/module.mjs +57 -34
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +18 -4
- package/fjs/effects/node/virtual/module.f.mjs +110 -68
- package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
- package/fjs/effects/node/virtual/proof.f.mjs +190 -9
- package/fjs/effects/proof.f.d.mts +69 -37
- package/fjs/effects/proof.f.mjs +410 -130
- package/fjs/effects/types.d.ts +161 -33
- package/fjs/emergent_testing/module.f.d.mts +19 -12
- package/fjs/emergent_testing/module.f.mjs +93 -33
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +166 -32
- package/fjs/emergent_testing/types.d.ts +22 -4
- package/fjs/fsm/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +2 -0
- package/fjs/fsm/proof.f.mjs +83 -114
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/js/keywords/proof.f.d.mts +3 -0
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +26 -6
- package/fjs/js/tokenizer/module.f.mjs +145 -159
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +4 -4
- package/fjs/mcp/module.f.mjs +6 -6
- package/fjs/mcp/proof.f.d.mts +5 -3
- package/fjs/mcp/proof.f.mjs +112 -46
- package/fjs/media/html/module.f.mjs +1 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +114 -70
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +33 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.mjs +9 -9
- package/fjs/media/json/schema/module.f.mjs +3 -13
- package/fjs/media/json/schema/proof.f.d.mts +0 -1
- package/fjs/media/json/schema/proof.f.mjs +1 -2
- package/fjs/media/json/serializer/module.f.d.mts +32 -1
- package/fjs/media/json/serializer/module.f.mjs +64 -2
- package/fjs/media/json/tokenizer/module.f.mjs +7 -3
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- package/fjs/media/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +78 -7
- package/fjs/media/revision/module.f.mjs +119 -12
- package/fjs/media/revision/proof.f.d.mts +10 -0
- package/fjs/media/revision/proof.f.mjs +88 -0
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +33 -15
- package/fjs/media/type/module.f.mjs +35 -29
- package/fjs/media/type/proof.f.d.mts +2 -1
- package/fjs/media/type/proof.f.mjs +30 -10
- package/fjs/module.f.mjs +29 -8
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/proof.f.d.mts +3 -3
- package/fjs/proof.f.mjs +36 -10
- package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
- package/fjs/protocol/json_rpc/module.f.mjs +3 -3
- package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +13 -4
- package/fjs/protocol/mcp/proof.f.mjs +193 -61
- package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
- package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
- package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
- package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +0 -1
- package/fjs/sul/id/module.f.mjs +2 -3
- package/fjs/sul/level/hash/module.f.mjs +2 -1
- package/fjs/sul/level/hash/proof.f.mjs +2 -2
- package/fjs/sul/module.f.mjs +18 -13
- package/fjs/text/code_point/module.f.d.mts +8 -0
- package/fjs/text/code_point/module.f.mjs +8 -1
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +11 -0
- package/fjs/text/sgr/module.f.d.mts +4 -6
- package/fjs/text/sgr/module.f.mjs +6 -7
- package/fjs/text/utf16/module.f.mjs +7 -2
- package/fjs/text/utf16/proof.f.mjs +3 -3
- package/fjs/text/utf8/module.f.mjs +4 -2
- package/fjs/types/array/module.f.mjs +14 -2
- package/fjs/types/bit_vec/module.f.d.mts +0 -2
- package/fjs/types/bit_vec/module.f.mjs +46 -32
- package/fjs/types/bit_vec/proof.f.mjs +2 -2
- package/fjs/types/btree/remove/module.f.mjs +1 -1
- package/fjs/types/btree/set/module.f.mjs +9 -11
- package/fjs/types/btree/set/proof.f.mjs +12 -0
- package/fjs/types/byte_set/module.f.d.mts +11 -4
- package/fjs/types/byte_set/module.f.mjs +14 -6
- package/fjs/types/byte_set/proof.f.mjs +7 -7
- package/fjs/types/function/compare/module.f.mjs +10 -3
- package/fjs/types/list/module.f.d.mts +1 -1
- package/fjs/types/list/module.f.mjs +1 -1
- package/fjs/types/nullable/module.f.d.mts +18 -4
- package/fjs/types/nullable/module.f.mjs +21 -4
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- package/fjs/types/object/module.f.d.mts +12 -2
- package/fjs/types/object/module.f.mjs +11 -1
- package/fjs/types/patricia_trie/module.f.mjs +26 -11
- package/fjs/types/result/module.f.d.mts +3 -3
- package/fjs/types/result/module.f.mjs +3 -3
- package/fjs/types/rtti/common/module.f.d.mts +25 -28
- package/fjs/types/rtti/common/module.f.mjs +36 -32
- package/fjs/types/rtti/common/proof.f.mjs +5 -5
- package/fjs/types/rtti/data/module.f.d.mts +14 -0
- package/fjs/types/rtti/data/module.f.mjs +25 -2
- package/fjs/types/rtti/data/proof.f.d.mts +1 -0
- package/fjs/types/rtti/data/proof.f.mjs +25 -2
- package/fjs/types/rtti/parse/module.f.d.mts +24 -14
- package/fjs/types/rtti/parse/module.f.mjs +37 -28
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +33 -14
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.mjs +13 -17
- package/fjs/types/rtti/ts/types.d.ts +14 -1
- package/fjs/types/rtti/validate/module.f.d.mts +81 -19
- package/fjs/types/rtti/validate/module.f.mjs +107 -61
- package/fjs/types/rtti/validate/proof.f.d.mts +13 -10
- package/fjs/types/rtti/validate/proof.f.mjs +186 -197
- package/fjs/types/sorted_set/module.f.d.mts +18 -0
- package/fjs/types/sorted_set/module.f.mjs +22 -0
- package/fjs/types/sorted_set/proof.f.d.mts +1 -0
- package/fjs/types/sorted_set/proof.f.mjs +16 -1
- package/fjs/types/uint8array/module.f.d.mts +1 -1
- package/fjs/types/uint8array/module.f.mjs +1 -1
- package/fjs/website/module.f.d.mts +3 -3
- package/fjs/website/module.f.mjs +4 -7
- package/fjs/website/proof.f.mjs +2 -1
- package/package.json +2 -2
- package/fjs/dev/package_json/module.f.d.mts +0 -39
- package/fjs/dev/package_json/module.f.mjs +0 -40
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- package/fjs/effects/eff/module.f.d.mts +0 -20
- package/fjs/effects/eff/module.f.mjs +0 -70
- package/fjs/effects/eff/proof.f.d.mts +0 -15
- package/fjs/effects/eff/proof.f.mjs +0 -69
- package/fjs/effects/eff/types.d.ts +0 -71
- 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 (`
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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] =
|
|
161
|
+
const [t, r] = parse(/** @type {any} */ (inputRtti))(a)
|
|
165
162
|
return t === 'error'
|
|
166
|
-
?
|
|
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
|
|
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
|
-
?
|
|
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
|
-
|
|
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
|
|
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] =
|
|
276
|
+
const [pt] = parse(_noParams)(params)
|
|
279
277
|
if (pt === 'error') {
|
|
280
278
|
// Malformed handshake — ignore it; the session stays gated.
|
|
281
|
-
return
|
|
279
|
+
return pureOk(null)
|
|
282
280
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
|
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] =
|
|
303
|
+
const [pt] = parse(_noParams)(params)
|
|
300
304
|
return pt === 'error'
|
|
301
|
-
?
|
|
302
|
-
:
|
|
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
|
|
311
|
+
return resultStep(
|
|
308
312
|
read(stateKey),
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
|
|
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] =
|
|
318
|
+
const [pr] = parse(initializeParams)(params)
|
|
314
319
|
if (pr === 'error') {
|
|
315
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
335
|
-
if (
|
|
336
|
-
|
|
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
|
|
357
|
+
return pureOk(_errResponse(id)(methodNotFound))
|
|
342
358
|
}
|
|
343
359
|
// `params` may be absent — `tools/list` without a cursor.
|
|
344
|
-
const [t, pr] =
|
|
360
|
+
const [t, pr] = parse(toolsListParams)(params === undefined ? {} : params)
|
|
345
361
|
return t === 'error'
|
|
346
|
-
?
|
|
347
|
-
:
|
|
362
|
+
? pureOk(_errResponse(id)(invalidParams))
|
|
363
|
+
: ioStep(
|
|
348
364
|
handlers.toolsList(pr),
|
|
349
|
-
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
|
|
371
|
+
return pureOk(_errResponse(id)(methodNotFound))
|
|
356
372
|
}
|
|
357
|
-
const [t, pr] =
|
|
373
|
+
const [t, pr] = parse(toolsCallParams)(params)
|
|
358
374
|
return t === 'error'
|
|
359
|
-
?
|
|
360
|
-
:
|
|
375
|
+
? pureOk(_errResponse(id)(invalidParams))
|
|
376
|
+
: ioStep(
|
|
361
377
|
handlers.toolsCall(pr),
|
|
362
|
-
r =>
|
|
378
|
+
r => pureOk(_okResponse(id)(r)),
|
|
363
379
|
)
|
|
364
380
|
}
|
|
365
381
|
|
|
366
|
-
return
|
|
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 {
|
|
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,
|
|
9
|
-
*
|
|
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;
|