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