functionalscript 0.37.0 → 0.38.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 +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/proof.f.js +12 -36
- package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
- package/{fs → fjs}/basen/base64/proof.f.js +15 -1
- package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +53 -3
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +54 -19
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +10 -11
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +29 -66
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +54 -76
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +27 -1
- package/{fs → fjs}/cas/proof.f.d.ts +4 -0
- package/{fs → fjs}/cas/proof.f.js +77 -86
- package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
- package/{fs → fjs}/ci/config/module.f.js +5 -5
- package/{fs → fjs}/ci/proof.f.js +14 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
- package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +7 -4
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
- package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
- package/{fs → fjs}/dev/proof.f.js +2 -4
- package/{fs → fjs}/djs/ast/proof.f.js +4 -12
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +20 -0
- package/{fs → fjs}/djs/parser/proof.f.js +138 -400
- package/{fs → fjs}/djs/proof.f.js +13 -36
- package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/{fs → fjs}/effects/memory/proof.f.js +8 -21
- package/{fs → fjs}/effects/node/memory/proof.js +5 -12
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.js +3 -3
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/{fs → fjs}/effects/proof.f.js +16 -45
- package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +12 -34
- package/{fs → fjs}/fsm/proof.f.js +5 -12
- package/{fs → fjs}/mcp/module.f.d.ts +7 -0
- package/{fs → fjs}/mcp/module.f.js +9 -2
- package/{fs → fjs}/mcp/proof.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
- package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
- package/{fs → fjs}/media/html/proof.f.js +12 -33
- package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/media/json/parser/module.f.js +14 -0
- package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
- package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
- package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
- package/{fs → fjs}/media/json/schema/module.f.js +23 -39
- package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
- package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
- package/{fs → fjs}/media/module.f.d.ts +6 -6
- package/{fs → fjs}/media/module.f.js +3 -4
- package/{fs → fjs}/media/proof.f.js +5 -4
- package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
- package/{fs → fjs}/media/revision/module.f.js +35 -23
- package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs → fjs}/media/type/proof.f.js +2 -6
- package/{fs → fjs}/module.f.js +1 -1
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs → fjs}/proof.f.js +2 -0
- package/{fs → fjs}/sul/id/proof.f.js +7 -21
- package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/{fs → fjs}/text/ascii/proof.f.js +4 -14
- package/{fs → fjs}/text/code_point/module.f.js +10 -10
- package/{fs → fjs}/text/proof.f.js +4 -9
- package/{fs → fjs}/text/sgr/proof.f.js +6 -15
- package/{fs → fjs}/text/utf16/module.f.js +1 -1
- package/{fs → fjs}/text/utf16/proof.f.js +23 -66
- package/{fs → fjs}/text/utf8/proof.f.js +56 -125
- package/{fs → fjs}/types/array/proof.f.js +18 -52
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
- package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
- package/{fs → fjs}/types/btree/proof.f.js +5 -12
- package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
- package/{fs → fjs}/types/btree/set/module.f.js +5 -2
- package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
- package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
- package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
- package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
- package/{fs → fjs}/types/function/proof.f.js +2 -3
- package/{fs → fjs}/types/list/proof.f.js +55 -163
- package/{fs → fjs}/types/map/proof.f.js +4 -12
- package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/proof.f.js +9 -24
- package/{fs → fjs}/types/object/proof.f.js +3 -6
- package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
- package/{fs → fjs}/types/prime_field/module.f.js +2 -7
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/proof.f.js +28 -81
- package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
- package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
- package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
- package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
- package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
- package/fjs/types/string/proof.f.js +77 -0
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.js +15 -42
- package/{fs → fjs}/types/uint8array/module.f.js +7 -7
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +6 -6
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/media/revision/proof.f.js +0 -119
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/module.f.js +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.js +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.js +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
- /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base64/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.js +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.js +0 -0
- /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/common/module.f.js +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.js +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.js +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.js +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.js +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.js +0 -0
- /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.js +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/module.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/module.f.js +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/bnf.f.js +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.js +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.js +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.js +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
- /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/html/module.f.js +0 -0
- /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.js +0 -0
- /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/media/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.js +0 -0
- /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
- /package/{fs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/module.f.d.ts +0 -0
- /package/{fs → fjs}/module.js +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.js +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.js +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.js +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.js +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.js +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.js +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.js +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.js +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.js +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.js +0 -0
- /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.js +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.js +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.js +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
- /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.js +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/result/module.js +0 -0
- /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.js +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.js +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.js +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { assertEq } from '../../../asserts/module.f.js';
|
|
2
|
-
import { awaitIfPromise, fetch, rm, writeFile, readFile, readdir, import_, rename, readBytes, writeBytes } from '../module.f.js';
|
|
1
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
2
|
+
import { access, awaitIfPromise, fetch, rm, writeFile, readFile, readdir, import_, rename, readBytes, writeBytes } from '../module.f.js';
|
|
3
3
|
import { maxLengthBytes, vec, vec8 } from '../../../types/bit_vec/module.f.js';
|
|
4
4
|
import { emptyState, virtual } from './module.f.js';
|
|
5
5
|
export const proof = {
|
|
@@ -7,24 +7,24 @@ export const proof = {
|
|
|
7
7
|
success: () => {
|
|
8
8
|
const root = { 'a.txt': [vec8(0x42n)] };
|
|
9
9
|
const [, result] = virtual({ ...emptyState, root })(rm('a.txt'));
|
|
10
|
-
|
|
10
|
+
assert(result[0] === 'ok');
|
|
11
11
|
},
|
|
12
12
|
notFound: () => {
|
|
13
13
|
const [, result] = virtual(emptyState)(rm('notexist.txt'));
|
|
14
|
-
|
|
14
|
+
assert(result[0] === 'error');
|
|
15
15
|
},
|
|
16
16
|
isDirectory: () => {
|
|
17
17
|
const inner = {};
|
|
18
18
|
const root = { 'mydir': inner };
|
|
19
19
|
const [, result] = virtual({ ...emptyState, root })(rm('mydir'));
|
|
20
|
-
|
|
20
|
+
assert(result[0] === 'error');
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
23
|
writeFileOnDirectory: () => {
|
|
24
24
|
const inner = {};
|
|
25
25
|
const root = { 'mydir': inner };
|
|
26
26
|
const [, result] = virtual({ ...emptyState, root })(writeFile('mydir', vec8(0x42n)));
|
|
27
|
-
|
|
27
|
+
assert(result[0] === 'error');
|
|
28
28
|
},
|
|
29
29
|
readdirRecursive: () => {
|
|
30
30
|
const file = [vec8(0x42n)];
|
|
@@ -32,12 +32,19 @@ export const proof = {
|
|
|
32
32
|
const outer = { 'sub': sub };
|
|
33
33
|
const root = { 'mydir': outer };
|
|
34
34
|
const [, result] = virtual({ ...emptyState, root })(readdir('mydir', { recursive: true }));
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
throw result;
|
|
38
|
-
}
|
|
35
|
+
assert(result[0] === 'ok');
|
|
36
|
+
assert(result[0] === 'ok', result);
|
|
39
37
|
assertEq(result[1].length, 2);
|
|
40
38
|
},
|
|
39
|
+
accessNestedPathThroughFile: () => {
|
|
40
|
+
// 'a/b/c' where 'a' is a file: the operation wrapper's "not a directory"
|
|
41
|
+
// fallback passes the full remaining path through unchanged, covering the
|
|
42
|
+
// path.length !== 1 branch of the access op (only path.length === 0 was
|
|
43
|
+
// otherwise exercised).
|
|
44
|
+
const root = { 'a': [vec8(0x42n)] };
|
|
45
|
+
const [, result] = virtual({ ...emptyState, root })(access('a/b/c'));
|
|
46
|
+
assert(result[0] === 'error');
|
|
47
|
+
},
|
|
41
48
|
readFileIntoDir: () => {
|
|
42
49
|
// 'a/b' where both 'a' and 'b' are directories
|
|
43
50
|
// hits path.length === 0 in operation's f and path.length !== 1 in readFile op
|
|
@@ -45,7 +52,7 @@ export const proof = {
|
|
|
45
52
|
const outer = { 'b': inner };
|
|
46
53
|
const root = { 'a': outer };
|
|
47
54
|
const [, result] = virtual({ ...emptyState, root })(readFile('a/b'));
|
|
48
|
-
|
|
55
|
+
assert(result[0] === 'error');
|
|
49
56
|
},
|
|
50
57
|
awaitNonPromise: () => {
|
|
51
58
|
// a non-promise value passes through the virtual `await` handler as-is
|
|
@@ -55,19 +62,19 @@ export const proof = {
|
|
|
55
62
|
fetchNotFound: () => {
|
|
56
63
|
// covers the `result === undefined` branch of the `fetch` handler
|
|
57
64
|
const [, result] = virtual(emptyState)(fetch('https://example.com/missing'));
|
|
58
|
-
|
|
65
|
+
assert(result[0] === 'error');
|
|
59
66
|
},
|
|
60
67
|
importNestedPath: () => {
|
|
61
68
|
// import_ on a path whose parent does not exist covers the
|
|
62
69
|
// path.length !== 1 branch of the import_ op
|
|
63
70
|
const [, result] = virtual(emptyState)(import_('a/b'));
|
|
64
|
-
|
|
71
|
+
assert(result[0] === 'error');
|
|
65
72
|
},
|
|
66
73
|
importNonModule: () => {
|
|
67
74
|
// import_ on a Vec (not a JsModule) covers typeof entry !== 'function' branch
|
|
68
75
|
const root = { 'module.f.ts': [vec8(0x42n)] };
|
|
69
76
|
const [, result] = virtual({ ...emptyState, root })(import_('module.f.ts'));
|
|
70
|
-
|
|
77
|
+
assert(result[0] === 'error');
|
|
71
78
|
},
|
|
72
79
|
throw: {
|
|
73
80
|
readFileOnJsModule: () => {
|
|
@@ -80,37 +87,37 @@ export const proof = {
|
|
|
80
87
|
// rename('a', 'a') should succeed as a no-op, not reject
|
|
81
88
|
const root = { 'a': [vec8(0x42n)] };
|
|
82
89
|
const [, result] = virtual({ ...emptyState, root })(rename('a', 'a'));
|
|
83
|
-
|
|
90
|
+
assert(result[0] === 'ok');
|
|
84
91
|
},
|
|
85
92
|
renameIntoOwnSubtree: () => {
|
|
86
93
|
// rename('a', 'a/b') should fail (dst inside src's subtree)
|
|
87
94
|
const root = { 'a': { 'b': [vec8(0x42n)] } };
|
|
88
95
|
const [, result] = virtual({ ...emptyState, root })(rename('a', 'a/b'));
|
|
89
|
-
|
|
96
|
+
assert(result[0] === 'error');
|
|
90
97
|
},
|
|
91
98
|
renameOntoOwnAncestor: () => {
|
|
92
99
|
// rename('a/b', 'a') should fail (src inside dst's subtree)
|
|
93
100
|
const root = { 'a': { 'b': [vec8(0x42n)] } };
|
|
94
101
|
const [, result] = virtual({ ...emptyState, root })(rename('a/b', 'a'));
|
|
95
|
-
|
|
102
|
+
assert(result[0] === 'error');
|
|
96
103
|
},
|
|
97
104
|
renameNonEmptyDirOverEmptyDir: () => {
|
|
98
105
|
// rename a directory onto an empty directory should succeed
|
|
99
106
|
const root = { 'src': { 'file': [vec8(0x42n)] }, 'dst': {} };
|
|
100
107
|
const [, result] = virtual({ ...emptyState, root })(rename('src', 'dst'));
|
|
101
|
-
|
|
108
|
+
assert(result[0] === 'ok');
|
|
102
109
|
},
|
|
103
110
|
renameEmptyDirOverNonEmptyDir: () => {
|
|
104
111
|
// rename an empty directory onto a non-empty directory should fail
|
|
105
112
|
const root = { 'src': {}, 'dst': { 'file': [vec8(0x42n)] } };
|
|
106
113
|
const [, result] = virtual({ ...emptyState, root })(rename('src', 'dst'));
|
|
107
|
-
|
|
114
|
+
assert(result[0] === 'error');
|
|
108
115
|
},
|
|
109
116
|
renameFileOntoDirectory: () => {
|
|
110
117
|
// rename a file to a path that is already an existing directory should fail
|
|
111
118
|
const root = { 'myfile': [vec8(0x42n)], 'mydir': {} };
|
|
112
119
|
const [, result] = virtual({ ...emptyState, root })(rename('myfile', 'mydir'));
|
|
113
|
-
|
|
120
|
+
assert(result[0] === 'error');
|
|
114
121
|
},
|
|
115
122
|
readFileTooLarge: () => {
|
|
116
123
|
// a file stored as two max-size chunks exceeds the limit; readFile must return an error
|
|
@@ -118,37 +125,37 @@ export const proof = {
|
|
|
118
125
|
const chunk1 = vec(1n)(1n);
|
|
119
126
|
const root = { 'big': [chunk0, chunk1] };
|
|
120
127
|
const [, result] = virtual({ ...emptyState, root })(readFile('big'));
|
|
121
|
-
|
|
128
|
+
assert(result[0] === 'error');
|
|
122
129
|
},
|
|
123
130
|
readBytesNegativeSize: () => {
|
|
124
131
|
// readBytes with negative size should fail
|
|
125
132
|
const root = { 'file': [vec8(0x42n)] };
|
|
126
133
|
const [, result] = virtual({ ...emptyState, root })(readBytes('file', 0, -1));
|
|
127
|
-
|
|
134
|
+
assert(result[0] === 'error');
|
|
128
135
|
},
|
|
129
136
|
readBytesZeroSize: () => {
|
|
130
137
|
// readBytes with zero size should succeed and return empty vec
|
|
131
138
|
const root = { 'file': [vec8(0x42n)] };
|
|
132
139
|
const [, result] = virtual({ ...emptyState, root })(readBytes('file', 0, 0));
|
|
133
|
-
|
|
140
|
+
assert(result[0] === 'ok');
|
|
134
141
|
},
|
|
135
142
|
readBytesNegativeOffset: () => {
|
|
136
143
|
// readBytes with negative offset should fail
|
|
137
144
|
const root = { 'file': [vec8(0x42n)] };
|
|
138
145
|
const [, result] = virtual({ ...emptyState, root })(readBytes('file', -1, 1));
|
|
139
|
-
|
|
146
|
+
assert(result[0] === 'error');
|
|
140
147
|
},
|
|
141
148
|
readBytesFractionalSize: () => {
|
|
142
149
|
// readBytes with fractional size should fail rather than throw RangeError
|
|
143
150
|
const root = { 'file': [vec8(0x42n)] };
|
|
144
151
|
const [, result] = virtual({ ...emptyState, root })(readBytes('file', 0, 1.5));
|
|
145
|
-
|
|
152
|
+
assert(result[0] === 'error');
|
|
146
153
|
},
|
|
147
154
|
readBytesFractionalOffset: () => {
|
|
148
155
|
// readBytes with fractional offset should fail rather than throw RangeError
|
|
149
156
|
const root = { 'file': [vec8(0x42n)] };
|
|
150
157
|
const [, result] = virtual({ ...emptyState, root })(readBytes('file', 0.5, 1));
|
|
151
|
-
|
|
158
|
+
assert(result[0] === 'error');
|
|
152
159
|
},
|
|
153
160
|
readBytesAcrossChunkBoundary: () => {
|
|
154
161
|
// Two 128 KiB chunks; read 2 bytes spanning the boundary (last byte of chunk 0, first of chunk 1).
|
|
@@ -157,14 +164,14 @@ export const proof = {
|
|
|
157
164
|
const chunk1 = vec(maxLengthBytes * 8n)(0xbbn);
|
|
158
165
|
const root = { 'big': [chunk0, chunk1] };
|
|
159
166
|
const [, result] = virtual({ ...emptyState, root })(readBytes('big', chunkSize - 1, 2));
|
|
160
|
-
|
|
167
|
+
assert(result[0] === 'ok');
|
|
161
168
|
},
|
|
162
169
|
writeBytesWrongOffset: () => {
|
|
163
170
|
// writeBytes is append-only; an offset that doesn't match the current
|
|
164
171
|
// file size must fail rather than silently create a hole.
|
|
165
172
|
const root = { 'file': [vec8(0x42n)] };
|
|
166
173
|
const [, result] = virtual({ ...emptyState, root })(writeBytes('file', 5, vec8(0x43n)));
|
|
167
|
-
|
|
174
|
+
assert(result[0] === 'error');
|
|
168
175
|
},
|
|
169
176
|
largeFileReadBytes: () => {
|
|
170
177
|
// A file stored as two 128 KiB chunks is larger than maxLengthBytes.
|
|
@@ -174,6 +181,6 @@ export const proof = {
|
|
|
174
181
|
const chunk1 = vec(maxLengthBytes * 8n)(0xffn);
|
|
175
182
|
const root = { 'large': [chunk0, chunk1] };
|
|
176
183
|
const [, result] = virtual({ ...emptyState, root })(readBytes('large', chunkSize, 1));
|
|
177
|
-
|
|
184
|
+
assert(result[0] === 'ok');
|
|
178
185
|
},
|
|
179
186
|
};
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { decode, do_, foldStep, forEachStep, lazy, match, okStep, pure } from './module.f.js';
|
|
2
2
|
import { error, ok } from '../types/result/module.f.js';
|
|
3
|
+
import { assert, assertEq } from '../asserts/module.f.js';
|
|
3
4
|
const assertPure = (e, expected) => {
|
|
4
5
|
const d = decode(e);
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
if (d.result !== expected) {
|
|
9
|
-
throw d.result;
|
|
10
|
-
}
|
|
6
|
+
assert(d.done, e.value);
|
|
7
|
+
assertEq(d.result, expected);
|
|
11
8
|
};
|
|
12
9
|
const next = match({ add: (a, b) => a + b });
|
|
13
10
|
export const proof = {
|
|
@@ -19,13 +16,9 @@ export const proof = {
|
|
|
19
16
|
// The thunk runs only when the effect is decoded, not when `lazy` is called.
|
|
20
17
|
let evaluated = false;
|
|
21
18
|
const e = lazy(() => { evaluated = true; return 7; });
|
|
22
|
-
|
|
23
|
-
throw 'lazy must not evaluate eagerly';
|
|
24
|
-
}
|
|
19
|
+
assert(!(evaluated), 'lazy must not evaluate eagerly');
|
|
25
20
|
assertPure(e, 7);
|
|
26
|
-
|
|
27
|
-
throw 'decode must force the thunk';
|
|
28
|
-
}
|
|
21
|
+
assert(evaluated, 'decode must force the thunk');
|
|
29
22
|
},
|
|
30
23
|
step: () => {
|
|
31
24
|
const e = lazy(() => 5).step(v => pure(v * 2));
|
|
@@ -60,56 +53,34 @@ export const proof = {
|
|
|
60
53
|
ok: () => {
|
|
61
54
|
const e = pure(ok(5)).step(okStep((v) => pure(ok(v * 2))));
|
|
62
55
|
const d = decode(e);
|
|
63
|
-
|
|
64
|
-
throw e.value;
|
|
65
|
-
}
|
|
56
|
+
assert(!(!d.done || d.result[0] !== 'ok' || d.result[1] !== 10), e.value);
|
|
66
57
|
},
|
|
67
58
|
error: () => {
|
|
68
59
|
const e = pure(error('oops')).step(okStep(v => pure(ok(v * 2))));
|
|
69
60
|
const d = decode(e);
|
|
70
|
-
|
|
71
|
-
throw e.value;
|
|
72
|
-
}
|
|
61
|
+
assert(!(!d.done || d.result[0] !== 'error' || d.result[1] !== 'oops'), e.value);
|
|
73
62
|
},
|
|
74
63
|
},
|
|
75
64
|
decode: () => {
|
|
76
65
|
const d = decode(do_('add')(2, 3));
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (d.command !== 'add') {
|
|
81
|
-
throw d.command;
|
|
82
|
-
}
|
|
83
|
-
if (d.payload[0] !== 2 || d.payload[1] !== 3) {
|
|
84
|
-
throw d.payload;
|
|
85
|
-
}
|
|
66
|
+
assert(!(d.done), d);
|
|
67
|
+
assertEq(d.command, 'add');
|
|
68
|
+
assert(!(d.payload[0] !== 2 || d.payload[1] !== 3), d.payload);
|
|
86
69
|
assertPure(d.continuation(5), 5);
|
|
87
70
|
},
|
|
88
71
|
match: {
|
|
89
72
|
done: () => {
|
|
90
73
|
const r = next(pure(7));
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
if (r[1] !== 7) {
|
|
95
|
-
throw r[1];
|
|
96
|
-
}
|
|
74
|
+
assert(r[0] === 'done', r);
|
|
75
|
+
assertEq(r[1], 7);
|
|
97
76
|
},
|
|
98
77
|
cont: () => {
|
|
99
78
|
const r = next(do_('add')(2, 3));
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
if (r[1] !== 5) {
|
|
104
|
-
throw r[1];
|
|
105
|
-
}
|
|
79
|
+
assert(r[0] === 'cont', r);
|
|
80
|
+
assertEq(r[1], 5);
|
|
106
81
|
const r2 = next(r[2](r[1]));
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
if (r2[1] !== 5) {
|
|
111
|
-
throw r2[1];
|
|
112
|
-
}
|
|
82
|
+
assert(r2[0] === 'done', r2);
|
|
83
|
+
assertEq(r2[1], 5);
|
|
113
84
|
},
|
|
114
85
|
},
|
|
115
86
|
};
|
|
@@ -42,7 +42,7 @@ export const flat = () => {
|
|
|
42
42
|
const [e0, e1, e2] = events;
|
|
43
43
|
assert(e0[0] === 'result' && e0[2][0] === 'a');
|
|
44
44
|
assert(e1[0] === 'result' && e1[2][0] === 'b');
|
|
45
|
-
|
|
45
|
+
assert(e2[0] === 'summary');
|
|
46
46
|
const [, pass, fail] = e2;
|
|
47
47
|
assertEq(pass, 2);
|
|
48
48
|
assertEq(fail, 0);
|
|
@@ -56,7 +56,7 @@ export const nested = () => {
|
|
|
56
56
|
const [e0, e1, e2] = events;
|
|
57
57
|
assert(e0[0] === 'result' && e0[2][1] === 'add');
|
|
58
58
|
assert(e1[0] === 'result' && e1[2][1] === 'sub');
|
|
59
|
-
|
|
59
|
+
assert(e2[0] === 'summary');
|
|
60
60
|
const [, pass, fail] = e2;
|
|
61
61
|
assertEq(pass, 2);
|
|
62
62
|
assertEq(fail, 0);
|
|
@@ -69,7 +69,7 @@ export const throwKey = () => {
|
|
|
69
69
|
assertEq(exit, 0);
|
|
70
70
|
const [e0, e1] = events;
|
|
71
71
|
assert(e0[0] === 'result' && e0[2][0] === 'throw' && e0[2][1] === 'a');
|
|
72
|
-
|
|
72
|
+
assert(e1[0] === 'summary');
|
|
73
73
|
const [, pass, fail] = e1;
|
|
74
74
|
assertEq(pass, 1);
|
|
75
75
|
assertEq(fail, 0);
|
|
@@ -81,7 +81,7 @@ export const throwKeyFail = () => {
|
|
|
81
81
|
});
|
|
82
82
|
assertEq(exit, 1);
|
|
83
83
|
const [e0, e1] = events;
|
|
84
|
-
|
|
84
|
+
assert(e0[0] === 'result');
|
|
85
85
|
const [, pass, fail] = e1;
|
|
86
86
|
assertEq(pass, 0);
|
|
87
87
|
assertEq(fail, 1);
|
|
@@ -93,7 +93,7 @@ export const mixedPassFail = () => {
|
|
|
93
93
|
});
|
|
94
94
|
assertEq(exit, 1);
|
|
95
95
|
const summary = events[events.length - 1];
|
|
96
|
-
|
|
96
|
+
assert(summary[0] === 'summary');
|
|
97
97
|
const [, pass, fail] = summary;
|
|
98
98
|
assertEq(pass, 1);
|
|
99
99
|
assertEq(fail, 1);
|
|
@@ -245,12 +245,12 @@ export const registerSuffixes = () => {
|
|
|
245
245
|
// Node (star = ''): no suffixes
|
|
246
246
|
const [nodeNames] = runner([])(registerModule(noopCtx, './a.f.ts', proof, ''));
|
|
247
247
|
assertEq(nodeNames.length, 2);
|
|
248
|
-
|
|
248
|
+
assert(nodeNames[0] === 'import("./a.f.ts").proof.ok()');
|
|
249
249
|
assertEq(nodeNames[1], 'import("./a.f.ts").proof.throw.a()');
|
|
250
250
|
// Bun/Playwright (star = ' ...'): ... on normal tests, path shows throw for throw-tests
|
|
251
251
|
const [inlineNames] = runner([])(registerModule(noopCtx, './a.f.ts', proof, ' ...'));
|
|
252
252
|
assertEq(inlineNames.length, 2);
|
|
253
|
-
|
|
253
|
+
assert(inlineNames[0] === 'import("./a.f.ts").proof.ok() ...');
|
|
254
254
|
assertEq(inlineNames[1], 'import("./a.f.ts").proof.throw.a()');
|
|
255
255
|
};
|
|
256
256
|
// direct unit tests for the pure path-format helpers
|
|
@@ -15,24 +15,18 @@ Object.getOwnPropertyDescriptor({ [name]: () => undefined }, name).value;
|
|
|
15
15
|
export const proof = {
|
|
16
16
|
a: () => {
|
|
17
17
|
const x = f('1');
|
|
18
|
-
|
|
19
|
-
throw x;
|
|
20
|
-
}
|
|
18
|
+
assertEq(x, '["1"]');
|
|
21
19
|
},
|
|
22
20
|
b: () => {
|
|
23
21
|
// exercises toInit: terminal returns empty output and loops back to init
|
|
24
22
|
const result = init(terminal);
|
|
25
|
-
|
|
26
|
-
throw result[0];
|
|
27
|
-
}
|
|
23
|
+
assertEq(result[0].length, 0, result[0]);
|
|
28
24
|
},
|
|
29
25
|
c: () => {
|
|
30
26
|
// exercises unexpectedSymbol: next state after a token returns an error message
|
|
31
27
|
const next = init(one('1'))[1];
|
|
32
28
|
const result = next(42);
|
|
33
|
-
|
|
34
|
-
throw result[0][0];
|
|
35
|
-
}
|
|
29
|
+
assertEq(result[0][0], 'unexpected symbol 42');
|
|
36
30
|
},
|
|
37
31
|
fn: () => {
|
|
38
32
|
const o = {
|
|
@@ -40,58 +34,42 @@ export const proof = {
|
|
|
40
34
|
};
|
|
41
35
|
const f = o["hello world!"];
|
|
42
36
|
const { name } = f;
|
|
43
|
-
|
|
44
|
-
throw name;
|
|
45
|
-
}
|
|
37
|
+
assertEq(name, "hello world!");
|
|
46
38
|
//
|
|
47
39
|
const f1 = { ["boring"]: () => undefined }["boring"];
|
|
48
|
-
|
|
49
|
-
throw f1.name;
|
|
50
|
-
}
|
|
40
|
+
assertEq(f1.name, "boring");
|
|
51
41
|
//
|
|
52
42
|
const x = fn(() => undefined, "hello").name;
|
|
53
|
-
|
|
54
|
-
throw x;
|
|
55
|
-
}
|
|
43
|
+
assertEq(x, "");
|
|
56
44
|
//
|
|
57
45
|
const m = withName("boring2").name;
|
|
58
|
-
|
|
59
|
-
throw m;
|
|
60
|
-
}
|
|
46
|
+
assertEq(m, "boring2");
|
|
61
47
|
//
|
|
62
48
|
const a = function x() { return undefined; };
|
|
63
|
-
|
|
64
|
-
throw a.name;
|
|
65
|
-
}
|
|
49
|
+
assertEq(a.name, "x");
|
|
66
50
|
},
|
|
67
51
|
//
|
|
68
52
|
f1: () => {
|
|
69
53
|
const m1 = () => undefined;
|
|
70
|
-
|
|
71
|
-
throw m1.name;
|
|
72
|
-
}
|
|
54
|
+
assertEq(m1.name, "m1");
|
|
73
55
|
},
|
|
74
56
|
//
|
|
75
57
|
f2: () => {
|
|
76
58
|
const m11 = (() => undefined);
|
|
77
|
-
|
|
78
|
-
throw m11.name;
|
|
79
|
-
}
|
|
59
|
+
assertEq(m11.name, "m11");
|
|
80
60
|
},
|
|
81
61
|
//
|
|
82
62
|
f3: () => {
|
|
83
63
|
const m2 = true ? () => undefined : () => undefined;
|
|
84
64
|
// for `bun` it is `m2`:
|
|
85
|
-
//
|
|
65
|
+
// assertEq(m2.name, "")
|
|
86
66
|
// see also https://github.com/oven-sh/bun/issues/20398
|
|
87
67
|
},
|
|
88
68
|
f4: () => {
|
|
89
69
|
const id = (i) => i;
|
|
90
70
|
const f = id(() => undefined);
|
|
91
71
|
// for `bun` it is `m2`:
|
|
92
|
-
|
|
93
|
-
throw f.name;
|
|
94
|
-
}
|
|
72
|
+
assertEq(f.name, "");
|
|
95
73
|
},
|
|
96
74
|
chars: {
|
|
97
75
|
whitespace: () => {
|
|
@@ -5,6 +5,7 @@ import { stringify } from '../media/json/module.f.js';
|
|
|
5
5
|
import { identity } from '../types/function/module.f.js';
|
|
6
6
|
import { toArray } from '../types/list/module.f.js';
|
|
7
7
|
import { stringToList } from '../text/utf16/module.f.js';
|
|
8
|
+
import { assertEq } from '../asserts/module.f.js';
|
|
8
9
|
const stringifyIdentity = stringify(identity);
|
|
9
10
|
const buildDfa = () => {
|
|
10
11
|
const lowercaseAlpha = toRange('az');
|
|
@@ -85,9 +86,7 @@ export const proof = {
|
|
|
85
86
|
'["id"]'
|
|
86
87
|
];
|
|
87
88
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
88
|
-
|
|
89
|
-
throw result;
|
|
90
|
-
}
|
|
89
|
+
assertEq(result, expectedResult);
|
|
91
90
|
},
|
|
92
91
|
() => {
|
|
93
92
|
const dfa = buildDfa();
|
|
@@ -99,9 +98,7 @@ export const proof = {
|
|
|
99
98
|
'["float"]'
|
|
100
99
|
];
|
|
101
100
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
102
|
-
|
|
103
|
-
throw result;
|
|
104
|
-
}
|
|
101
|
+
assertEq(result, expectedResult);
|
|
105
102
|
},
|
|
106
103
|
() => {
|
|
107
104
|
const dfa = buildDfa();
|
|
@@ -112,9 +109,7 @@ export const proof = {
|
|
|
112
109
|
'[]'
|
|
113
110
|
];
|
|
114
111
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
115
|
-
|
|
116
|
-
throw result;
|
|
117
|
-
}
|
|
112
|
+
assertEq(result, expectedResult);
|
|
118
113
|
},
|
|
119
114
|
() => {
|
|
120
115
|
const dfa = buildDfa();
|
|
@@ -125,9 +120,7 @@ export const proof = {
|
|
|
125
120
|
'[]'
|
|
126
121
|
];
|
|
127
122
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
128
|
-
|
|
129
|
-
throw result;
|
|
130
|
-
}
|
|
123
|
+
assertEq(result, expectedResult);
|
|
131
124
|
}
|
|
132
125
|
]
|
|
133
126
|
};
|
|
@@ -166,6 +166,13 @@ export type ToolEntry<O extends Operation> = {
|
|
|
166
166
|
* @returns A `ToolEntry` ready to be added to a registry
|
|
167
167
|
*/
|
|
168
168
|
export declare const toolEntry: <T extends Type, O extends Operation>(name: string, description: string, inputRtti: T, handle: (args: Ts<T>) => Effect<O, ToolsCallResult>) => ToolEntry<O>;
|
|
169
|
+
/**
|
|
170
|
+
* Helper to create a successful single-text-block tool result.
|
|
171
|
+
*
|
|
172
|
+
* @param text - The text to return to the client
|
|
173
|
+
* @returns A `ToolsCallResult` with the text content
|
|
174
|
+
*/
|
|
175
|
+
export declare const okResult: (text: string) => ToolsCallResult;
|
|
169
176
|
/**
|
|
170
177
|
* Helper to create a tool-level error result with plain text explanation.
|
|
171
178
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Each schema is both a runtime decoder (`validate(schema)`) and a static
|
|
11
11
|
* TypeScript type (`Ts<typeof schema>`). Transport framing (stdio) and the
|
|
12
|
-
* JSON-RPC dispatcher are in `
|
|
12
|
+
* JSON-RPC dispatcher are in `fjs/media/json/rpc/module.f.ts`.
|
|
13
13
|
*
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
@@ -125,13 +125,20 @@ export const toolEntry = (name, description, inputRtti, handle) => ({
|
|
|
125
125
|
: handle(r);
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
|
+
/**
|
|
129
|
+
* Helper to create a successful single-text-block tool result.
|
|
130
|
+
*
|
|
131
|
+
* @param text - The text to return to the client
|
|
132
|
+
* @returns A `ToolsCallResult` with the text content
|
|
133
|
+
*/
|
|
134
|
+
export const okResult = (text) => ({ content: [{ type: 'text', text }] });
|
|
128
135
|
/**
|
|
129
136
|
* Helper to create a tool-level error result with plain text explanation.
|
|
130
137
|
*
|
|
131
138
|
* @param text - The error message to return to the client
|
|
132
139
|
* @returns A `ToolsCallResult` with `isError: true` and the text explanation
|
|
133
140
|
*/
|
|
134
|
-
export const errorResult = (text) => ({
|
|
141
|
+
export const errorResult = (text) => ({ ...okResult(text), isError: true });
|
|
135
142
|
/**
|
|
136
143
|
* Builds `McpHandlers` from a registry of tool entries.
|
|
137
144
|
*
|
|
@@ -49,16 +49,16 @@ const initNotif = { jsonrpc: '2.0', method: 'notifications/initialized' };
|
|
|
49
49
|
export const proof = {
|
|
50
50
|
lifecycle: {
|
|
51
51
|
initialStateIsUninitialized: () => {
|
|
52
|
-
|
|
52
|
+
assert(uninitializedState[0] === 'uninitialized');
|
|
53
53
|
},
|
|
54
54
|
initializeTransitionsToInitializing: () => {
|
|
55
55
|
const [, newState] = step1(config)(initMsg);
|
|
56
|
-
|
|
56
|
+
assert(newState[0] === 'initializing');
|
|
57
57
|
},
|
|
58
58
|
initializedNotificationTransitionsToInitialized: () => {
|
|
59
59
|
const [resp, newState] = step2(config)(initMsg)(initNotif);
|
|
60
60
|
assertEq(resp, null);
|
|
61
|
-
|
|
61
|
+
assert(newState[0] === 'initialized');
|
|
62
62
|
},
|
|
63
63
|
initializeReturnsResult: () => {
|
|
64
64
|
const [resp] = step1(config)(initMsg);
|
|
@@ -69,12 +69,12 @@ export const proof = {
|
|
|
69
69
|
initializeWithBadParamsReturnsInvalidParams: () => {
|
|
70
70
|
const bad = { jsonrpc: '2.0', method: 'initialize', id: 2, params: { wrong: true } };
|
|
71
71
|
const [resp, newState] = step1(config)(bad);
|
|
72
|
-
|
|
72
|
+
assert(newState[0] === 'uninitialized');
|
|
73
73
|
assertEq(resp.error.code, -32602);
|
|
74
74
|
},
|
|
75
75
|
notificationBeforeInitReturnNull: () => {
|
|
76
76
|
const [resp, newState] = step1(config)(initNotif);
|
|
77
|
-
|
|
77
|
+
assert(newState[0] === 'uninitialized');
|
|
78
78
|
assertEq(resp, null);
|
|
79
79
|
},
|
|
80
80
|
unknownNotificationReturnNull: () => {
|
|
@@ -84,19 +84,19 @@ export const proof = {
|
|
|
84
84
|
},
|
|
85
85
|
doubleInitializeReturnsInvalidRequest: () => {
|
|
86
86
|
const [resp, newState] = step2(config)(initMsg)(initMsg);
|
|
87
|
-
|
|
87
|
+
assert(newState[0] === 'initializing');
|
|
88
88
|
assertEq(resp.error.code, -32600);
|
|
89
89
|
},
|
|
90
90
|
pingBeforeInitSucceeds: () => {
|
|
91
91
|
const msg = { jsonrpc: '2.0', method: 'ping', id: 11 };
|
|
92
92
|
const [resp, newState] = step1(config)(msg);
|
|
93
|
-
|
|
93
|
+
assert(newState[0] === 'uninitialized');
|
|
94
94
|
assert(!('error' in resp));
|
|
95
95
|
},
|
|
96
96
|
pingDuringInitializingSucceeds: () => {
|
|
97
97
|
const msg = { jsonrpc: '2.0', method: 'ping', id: 12 };
|
|
98
98
|
const [resp, newState] = step2(config)(initMsg)(msg);
|
|
99
|
-
|
|
99
|
+
assert(newState[0] === 'initializing');
|
|
100
100
|
assert(!('error' in resp));
|
|
101
101
|
},
|
|
102
102
|
pingAfterInitSucceeds: () => {
|
|
@@ -118,24 +118,24 @@ export const proof = {
|
|
|
118
118
|
const notif = { jsonrpc: '2.0', method: 'notifications/initialized', params: {} };
|
|
119
119
|
const [resp, newState] = step2(config)(initMsg)(notif);
|
|
120
120
|
assertEq(resp, null);
|
|
121
|
-
|
|
121
|
+
assert(newState[0] === 'initialized');
|
|
122
122
|
},
|
|
123
123
|
initializedNotificationBadParamsIgnored: () => {
|
|
124
124
|
const notif = { jsonrpc: '2.0', method: 'notifications/initialized', params: 1 };
|
|
125
125
|
const [resp, newState] = step2(config)(initMsg)(notif);
|
|
126
126
|
assertEq(resp, null);
|
|
127
|
-
|
|
127
|
+
assert(newState[0] === 'initializing');
|
|
128
128
|
},
|
|
129
129
|
methodBeforeInitReturnsNotInitialized: () => {
|
|
130
130
|
const msg = { jsonrpc: '2.0', method: 'tools/list', id: 3 };
|
|
131
131
|
const [resp, newState] = step1(config)(msg);
|
|
132
|
-
|
|
132
|
+
assert(newState[0] === 'uninitialized');
|
|
133
133
|
assertEq(resp.error.code, notInitialized.code);
|
|
134
134
|
},
|
|
135
135
|
methodDuringInitializingReturnsNotInitialized: () => {
|
|
136
136
|
const msg = { jsonrpc: '2.0', method: 'tools/list', id: 16 };
|
|
137
137
|
const [resp, newState] = step2(config)(initMsg)(msg);
|
|
138
|
-
|
|
138
|
+
assert(newState[0] === 'initializing');
|
|
139
139
|
assertEq(resp.error.code, notInitialized.code);
|
|
140
140
|
},
|
|
141
141
|
invalidEnvelopeReturnsInvalidRequest: () => {
|
|
@@ -2,10 +2,10 @@
|
|
|
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 `
|
|
5
|
+
* `(value) => Effect<O, Response | null>` from `fjs/mcp/module.f.ts` — 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
|
-
* mock stdin / stdout (see `
|
|
8
|
+
* mock stdin / stdout (see `fjs/effects/node/virtual`) with no real process.
|
|
9
9
|
*
|
|
10
10
|
* The loop only consumes `Read` (stdin, one byte at a time, via the pure
|
|
11
11
|
* `readLine` combinator) and emits `Write` (stdout) on top of whatever `O` the
|