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
|
@@ -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,26 +29,20 @@
|
|
|
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
38
|
|
|
38
|
-
import {
|
|
39
|
-
import { readLine, write } from '../../../effects/node/module.f.mjs'
|
|
39
|
+
import { pureError, pureOk, resultStep, step } from '../../../effects/module.f.mjs'
|
|
40
|
+
import { ioError, readLine, write } from '../../../effects/node/module.f.mjs'
|
|
40
41
|
import { tryUtf8 } from '../../../text/module.f.mjs'
|
|
41
42
|
import { parse, stringify } from '../../../media/json/module.f.mjs'
|
|
42
43
|
import { sort } from '../../../types/object/module.f.mjs'
|
|
43
44
|
import { internalError, jsonrpc, parseError } from '../../json_rpc/module.f.mjs'
|
|
44
|
-
import { error
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* A transport step: maps one parsed JSON-RPC message to a response, or `null`
|
|
48
|
-
* for a notification that needs no reply. The shape of `mcpStep(config)(handlers)(key)`.
|
|
49
|
-
* @template {Operation} O
|
|
50
|
-
* @typedef {(value: Unknown) => Effect<O, Response | null>} Step
|
|
51
|
-
*/
|
|
45
|
+
import { error } from '../../../types/result/module.f.mjs'
|
|
52
46
|
|
|
53
47
|
const stringifyJson = stringify(sort)
|
|
54
48
|
|
|
@@ -62,16 +56,13 @@ const parseErrorResponse = { jsonrpc, error: parseError, id: null }
|
|
|
62
56
|
const internalErrorResponse = id => ({ jsonrpc, error: internalError, id })
|
|
63
57
|
|
|
64
58
|
/** Encodes a response as a newline-terminated UTF-8 line and writes it to `stdout`.
|
|
65
|
-
* @type {(resp: Response) => Effect<Write,
|
|
59
|
+
* @type {(resp: Response) => Effect<Write, void, IoChannel>}
|
|
66
60
|
*/
|
|
67
61
|
const writeResponse = resp => {
|
|
68
62
|
const v = tryUtf8(stringifyJson(resp) + '\n')
|
|
69
63
|
return v === null
|
|
70
|
-
?
|
|
71
|
-
:
|
|
72
|
-
write('stdout', v),
|
|
73
|
-
() => pure(ok(undefined)),
|
|
74
|
-
)
|
|
64
|
+
? pureError(ioError({ message: 'response does not encode as UTF-8' }))
|
|
65
|
+
: write('stdout', v)
|
|
75
66
|
}
|
|
76
67
|
|
|
77
68
|
/**
|
|
@@ -80,35 +71,48 @@ const writeResponse = resp => {
|
|
|
80
71
|
* Recurses after each handled line; terminates (resolving to `void`) when
|
|
81
72
|
* `readLine` reports EOF.
|
|
82
73
|
*
|
|
74
|
+
* A transport that cannot read its own input has no fallback to choose, but it
|
|
75
|
+
* does not have to decide that here: the failure ends the loop and travels to
|
|
76
|
+
* whoever started the server, which for `fjs mcp` is a message on `stderr` and
|
|
77
|
+
* exit `1`. EOF is not that — `readLine` answers `ok(null)`, the loop ends, and
|
|
78
|
+
* the server has done its job.
|
|
79
|
+
*
|
|
83
80
|
* @template {Operation} O
|
|
84
81
|
* @param {Step<O>} handler
|
|
85
|
-
* @returns {Effect<Read | Write | O, void>}
|
|
82
|
+
* @returns {Effect<Read | Write | O, void, IoChannel>}
|
|
86
83
|
*/
|
|
87
84
|
export const stdioTransport = handler =>
|
|
88
85
|
step(
|
|
89
86
|
readLine('stdin'),
|
|
90
87
|
line => line === null
|
|
91
|
-
?
|
|
88
|
+
? pureOk(undefined)
|
|
92
89
|
: handleLine(handler)(line),
|
|
93
90
|
)
|
|
94
91
|
|
|
95
92
|
/**
|
|
96
93
|
* @template {Operation} O
|
|
97
94
|
* @param {Step<O>} handler
|
|
98
|
-
* @returns {(line: string) => Effect<Read | Write | O, void>}
|
|
95
|
+
* @returns {(line: string) => Effect<Read | Write | O, void, IoChannel>}
|
|
99
96
|
*/
|
|
100
97
|
const handleLine = handler => line => {
|
|
101
98
|
const [t, value] = parse(line)
|
|
102
|
-
return
|
|
99
|
+
return resultStep(
|
|
103
100
|
t === 'error'
|
|
104
101
|
? writeResponse(parseErrorResponse)
|
|
102
|
+
// `step`, because a `Handle` answers `Effect<O, Response | null,
|
|
103
|
+
// never>` — it absorbs its own failures into the response body — so
|
|
104
|
+
// the continuation receives the response itself and there is no
|
|
105
|
+
// error branch left for this chain to consider.
|
|
105
106
|
: step(
|
|
106
107
|
handler(value),
|
|
107
108
|
resp => resp === null
|
|
108
|
-
?
|
|
109
|
-
:
|
|
109
|
+
? pureOk(undefined)
|
|
110
|
+
// `resultStep` from here down: each write's *failure* is
|
|
111
|
+
// what selects the next, smaller fallback, so these are the
|
|
112
|
+
// both-branches case rather than a chain to short-circuit.
|
|
113
|
+
: resultStep(
|
|
110
114
|
writeResponse(resp),
|
|
111
|
-
|
|
115
|
+
r2 => r2[0] === 'error'
|
|
112
116
|
// The real response didn't fit. Retry with a fixed, small
|
|
113
117
|
// internal-error body carrying `resp.id` — but a
|
|
114
118
|
// caller-controlled `id` (e.g. a very large string) can
|
|
@@ -116,17 +120,19 @@ const handleLine = handler => line => {
|
|
|
116
120
|
// that retry is bounded by one more: an `id: null`
|
|
117
121
|
// internal-error, whose fully-constant shape is the only
|
|
118
122
|
// line in this transport guaranteed to always encode.
|
|
119
|
-
?
|
|
123
|
+
? resultStep(
|
|
120
124
|
writeResponse(internalErrorResponse(resp.id)),
|
|
121
|
-
|
|
122
|
-
?
|
|
125
|
+
r3 => r3[0] === 'error'
|
|
126
|
+
? resultStep(
|
|
123
127
|
writeResponse(internalErrorResponse(null)),
|
|
124
|
-
() =>
|
|
128
|
+
() => pureOk(undefined),
|
|
125
129
|
)
|
|
126
|
-
:
|
|
130
|
+
: pureOk(undefined)
|
|
127
131
|
)
|
|
128
|
-
:
|
|
132
|
+
: pureOk(undefined)),
|
|
129
133
|
),
|
|
134
|
+
// The loop continues whatever the line's own handling answered: a
|
|
135
|
+
// transport that could not write one response still serves the next.
|
|
130
136
|
() => stdioTransport(handler),
|
|
131
137
|
)
|
|
132
138
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @import { Unknown } from '../../../media/json/types.ts'
|
|
3
|
-
* @import { Effect } from '../../../effects/types.ts'
|
|
4
3
|
* @import { State } from '../../../effects/node/virtual/types.ts'
|
|
5
|
-
* @import { Id
|
|
6
|
-
* @import { Step } from './
|
|
4
|
+
* @import { Id } from '../../json_rpc/types.ts'
|
|
5
|
+
* @import { Step } from './types.ts'
|
|
6
|
+
* @import { Read, Write } from '../../../effects/node/types.ts'
|
|
7
7
|
*/
|
|
8
8
|
export declare const proof: {
|
|
9
|
+
readFailurePropagates: () => void;
|
|
10
|
+
readFailureAfterALinePropagates: () => void;
|
|
9
11
|
eofImmediately: () => void;
|
|
10
12
|
requestWritesResponse: () => void;
|
|
11
13
|
requestWithoutTrailingNewline: () => void;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @import { Unknown } from '../../../media/json/types.ts'
|
|
3
|
-
* @import { Effect } from '../../../effects/types.ts'
|
|
4
3
|
* @import { State } from '../../../effects/node/virtual/types.ts'
|
|
5
|
-
* @import { Id
|
|
6
|
-
* @import { Step } from './
|
|
4
|
+
* @import { Id } from '../../json_rpc/types.ts'
|
|
5
|
+
* @import { Step } from './types.ts'
|
|
6
|
+
* @import { Read, Write } from '../../../effects/node/types.ts'
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { assertEq } from '../../../asserts/module.f.mjs'
|
|
9
|
+
import { assert, assertEq } from '../../../asserts/module.f.mjs'
|
|
10
10
|
import { pure } from '../../../effects/module.f.mjs'
|
|
11
|
+
import { pureOk } from '../../../effects/module.f.mjs'
|
|
11
12
|
import { emptyState, virtual } from '../../../effects/node/virtual/module.f.mjs'
|
|
12
13
|
import { stringify } from '../../../media/json/module.f.mjs'
|
|
13
14
|
import { utf8 } from '../../../text/module.f.mjs'
|
|
@@ -16,6 +17,8 @@ import { maxLengthBytes } from '../../../types/bit_vec/module.f.mjs'
|
|
|
16
17
|
import { sort } from '../../../types/object/module.f.mjs'
|
|
17
18
|
import { internalError, jsonrpc, parseError } from '../../json_rpc/module.f.mjs'
|
|
18
19
|
import { stdioTransport } from './module.f.mjs'
|
|
20
|
+
import { run as mockRun } from '../../../effects/mock/module.f.mjs'
|
|
21
|
+
import { error, ok } from '../../../types/result/module.f.mjs'
|
|
19
22
|
|
|
20
23
|
const stringifyJson = stringify(sort)
|
|
21
24
|
|
|
@@ -32,7 +35,7 @@ const idOf = value =>
|
|
|
32
35
|
/** @type {Step<never>} */
|
|
33
36
|
const echoStep = value => {
|
|
34
37
|
const id = idOf(value)
|
|
35
|
-
return
|
|
38
|
+
return pureOk(id === undefined
|
|
36
39
|
? null
|
|
37
40
|
: { jsonrpc, result: { ok: true }, id })
|
|
38
41
|
}
|
|
@@ -51,15 +54,15 @@ const run = runStep(echoStep)
|
|
|
51
54
|
|
|
52
55
|
/** @type {(id: Id) => string} */
|
|
53
56
|
const okResponse = id =>
|
|
54
|
-
stringifyJson(
|
|
57
|
+
stringifyJson({ jsonrpc, result: { ok: true }, id }) + '\n'
|
|
55
58
|
|
|
56
59
|
/** @type {string} */
|
|
57
60
|
const parseErrorLine =
|
|
58
|
-
stringifyJson(
|
|
61
|
+
stringifyJson({ jsonrpc, error: parseError, id: null }) + '\n'
|
|
59
62
|
|
|
60
63
|
/** @type {(id: Id) => string} */
|
|
61
64
|
const internalErrorLine = id =>
|
|
62
|
-
stringifyJson(
|
|
65
|
+
stringifyJson({ jsonrpc, error: internalError, id }) + '\n'
|
|
63
66
|
|
|
64
67
|
/** @type {(id: number) => string} */
|
|
65
68
|
const ping = id => `{"jsonrpc":"2.0","method":"ping","id":${id}}`
|
|
@@ -71,6 +74,36 @@ const oversizedString = 'a'.repeat(Number(maxLengthBytes) + 1)
|
|
|
71
74
|
const notification = '{"jsonrpc":"2.0","method":"notifications/initialized"}'
|
|
72
75
|
|
|
73
76
|
export const proof = {
|
|
77
|
+
// A stdin that cannot be read ends the loop and hands the failure back,
|
|
78
|
+
// where it used to panic. EOF is not this case: that is `ok(null)`, and
|
|
79
|
+
// `eofImmediately` above pins it as the clean shutdown it should be.
|
|
80
|
+
readFailurePropagates: () => {
|
|
81
|
+
const runner = mockRun(/** @type {Parameters<typeof mockRun<Read | Write, undefined>>[0]} */ ({
|
|
82
|
+
read: () => (/** @type {undefined} */ s) => [s, error(/** @type {const} */ (['notImplemented', 'read']))],
|
|
83
|
+
write: () => (/** @type {undefined} */ s) => [s, ok(undefined)],
|
|
84
|
+
}))
|
|
85
|
+
const [, result] = runner(undefined)(stdioTransport(echoStep))
|
|
86
|
+
assert(result[0] === 'error', result)
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
// The same, one turn of the loop later. The proof above only reaches the
|
|
90
|
+
// *first* read, so a tail that swallowed the failure on recursion would
|
|
91
|
+
// still pass it: here stdin yields one complete line, the handler answers
|
|
92
|
+
// it, and the read after that fails.
|
|
93
|
+
readFailureAfterALinePropagates: () => {
|
|
94
|
+
const bytes = toBytes(ping(1) + '\n')
|
|
95
|
+
const runner = mockRun(/** @type {Parameters<typeof mockRun<Read | Write, readonly number[]>>[0]} */ ({
|
|
96
|
+
read: () => (/** @type {readonly number[]} */ s) =>
|
|
97
|
+
s.length === 0
|
|
98
|
+
? [s, error(/** @type {const} */ (['notImplemented', 'read']))]
|
|
99
|
+
: [s.slice(1), ok(s[0])],
|
|
100
|
+
write: () => (/** @type {readonly number[]} */ s) => [s, ok(undefined)],
|
|
101
|
+
}))
|
|
102
|
+
const [rest, result] = runner(bytes)(stdioTransport(echoStep))
|
|
103
|
+
assertEq(rest.length, 0, 'expected the line to be consumed before the failure')
|
|
104
|
+
assert(result[0] === 'error', result)
|
|
105
|
+
},
|
|
106
|
+
|
|
74
107
|
// EOF on the very first read: clean shutdown, nothing written, no further reads.
|
|
75
108
|
eofImmediately: () => {
|
|
76
109
|
const state = run('')
|
|
@@ -120,9 +153,9 @@ export const proof = {
|
|
|
120
153
|
/** @type {Step<never>} */
|
|
121
154
|
const step = value => {
|
|
122
155
|
const id = idOf(value)
|
|
123
|
-
return
|
|
156
|
+
return pureOk(id === undefined
|
|
124
157
|
? null
|
|
125
|
-
:
|
|
158
|
+
: { jsonrpc, result: { ok: true, nextCursor: undefined }, id })
|
|
126
159
|
}
|
|
127
160
|
const state = runStep(step)(ping(1) + '\n')
|
|
128
161
|
assertEq(state.stdout, okResponse(1))
|
|
@@ -137,7 +170,7 @@ export const proof = {
|
|
|
137
170
|
/** @type {Step<never>} */
|
|
138
171
|
const step = value => {
|
|
139
172
|
const id = idOf(value)
|
|
140
|
-
return
|
|
173
|
+
return pureOk(id === undefined
|
|
141
174
|
? null
|
|
142
175
|
: { jsonrpc, result: { big: oversizedString }, id })
|
|
143
176
|
}
|
|
@@ -151,7 +184,7 @@ export const proof = {
|
|
|
151
184
|
/** @type {Step<never>} */
|
|
152
185
|
const step = value => {
|
|
153
186
|
const id = idOf(value)
|
|
154
|
-
return
|
|
187
|
+
return pureOk(id === undefined
|
|
155
188
|
? null
|
|
156
189
|
: id === 1
|
|
157
190
|
? { jsonrpc, result: { big: oversizedString }, id }
|
|
@@ -171,7 +204,7 @@ export const proof = {
|
|
|
171
204
|
/** @type {Step<never>} */
|
|
172
205
|
const step = value => {
|
|
173
206
|
const id = idOf(value)
|
|
174
|
-
return
|
|
207
|
+
return pureOk(id === undefined
|
|
175
208
|
? null
|
|
176
209
|
: { jsonrpc, result: { ok: true }, id: oversizedString })
|
|
177
210
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the stdio transport of JSON-RPC / MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Unknown } from '../../../media/json/types.ts';
|
|
7
|
+
import type { Effect, Operation } from '../../../effects/types.ts';
|
|
8
|
+
import type { Response } from '../../json_rpc/types.ts';
|
|
9
|
+
/**
|
|
10
|
+
* A transport step: maps one parsed JSON-RPC message to a response, or `null`
|
|
11
|
+
* for a notification that needs no reply. The shape of
|
|
12
|
+
* `mcpStep(config)(handlers)(key)`.
|
|
13
|
+
*/
|
|
14
|
+
export type Step<O extends Operation> = (value: Unknown) => Effect<O, Response | null, never>;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { Ts } from '../../types/rtti/ts/types.ts';
|
|
9
9
|
import type { Unknown } from '../../media/json/types.ts';
|
|
10
|
-
import type {
|
|
10
|
+
import type { Effect, Operation } from '../../effects/types.ts';
|
|
11
11
|
import type { Type } from '../../types/rtti/types.ts';
|
|
12
12
|
import type { Response } from '../json_rpc/types.ts';
|
|
13
13
|
import type { implementation, serverCapabilities, initializeParams, initializeResult, textContent, blobResource, embeddedResource, contentItem, tool, toolsListParams, toolsListResult, toolsCallParams, toolsCallResult } from './module.f.mjs';
|
|
@@ -26,8 +26,8 @@ export type ToolsCallParams = Ts<typeof toolsCallParams>;
|
|
|
26
26
|
export type ToolsCallResult = Ts<typeof toolsCallResult>;
|
|
27
27
|
/** Per-method handlers for a hello-world MCP tool server. */
|
|
28
28
|
export type McpHandlers<O extends Operation> = {
|
|
29
|
-
readonly toolsList: (params: ToolsListParams) => Effect<O, ToolsListResult>;
|
|
30
|
-
readonly toolsCall: (params: ToolsCallParams) => Effect<O, ToolsCallResult>;
|
|
29
|
+
readonly toolsList: (params: ToolsListParams) => Effect<O, ToolsListResult, never>;
|
|
30
|
+
readonly toolsCall: (params: ToolsCallParams) => Effect<O, ToolsCallResult, never>;
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* A single declarative tool entry combining metadata, input schema, and type-safe handler.
|
|
@@ -39,10 +39,21 @@ export type ToolEntry<O extends Operation> = {
|
|
|
39
39
|
readonly name: string;
|
|
40
40
|
readonly description: string;
|
|
41
41
|
readonly inputRtti: Type;
|
|
42
|
-
readonly handle: (args: Unknown) => Effect<O, ToolsCallResult>;
|
|
42
|
+
readonly handle: (args: Unknown) => Effect<O, ToolsCallResult, never>;
|
|
43
43
|
};
|
|
44
|
-
/**
|
|
45
|
-
|
|
44
|
+
/**
|
|
45
|
+
* A JSON-RPC step: given a decoded message, produce the response to write, or
|
|
46
|
+
* `null` for a notification.
|
|
47
|
+
*
|
|
48
|
+
* **`never` is a claim, not an absence.** The handler behind this does perform
|
|
49
|
+
* effects and they can fail — a session-state read is dispatched by a runner
|
|
50
|
+
* that may decline it. It says `never` because it has *absorbed* those: a
|
|
51
|
+
* request's failure becomes `_errResponse(id)(internalError)` and a
|
|
52
|
+
* notification's is dropped, there being no frame to put it in. Spelling that
|
|
53
|
+
* as `Effect<…, never>` puts the decision in the type where a reader can
|
|
54
|
+
* disagree with it, which an opaque payload could not.
|
|
55
|
+
*/
|
|
56
|
+
export type Handle<O extends Operation> = (value: Unknown) => Effect<O, Response | null, never>;
|
|
46
57
|
/** State carried before the peer sends `initialize`. */
|
|
47
58
|
export type Uninitialized = readonly ['uninitialized'];
|
|
48
59
|
/** State after `initialize` response was sent but before `notifications/initialized` arrives. */
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
* See `./types.ts` for the `Id` type.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
|
+
*
|
|
9
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
10
|
+
* @import { V8 } from '../../crypto/sha2/types.ts'
|
|
11
|
+
* @import { Id } from './types.ts'
|
|
8
12
|
*/
|
|
9
13
|
import type { Vec } from '../../types/bit_vec/types.ts';
|
|
10
14
|
import type { Id } from './types.ts';
|
package/fjs/sul/id/module.f.mjs
CHANGED
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
* See `./types.ts` for the `Id` type.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
|
+
*
|
|
9
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
10
|
+
* @import { V8 } from '../../crypto/sha2/types.ts'
|
|
11
|
+
* @import { Id } from './types.ts'
|
|
8
12
|
*/
|
|
9
13
|
|
|
10
14
|
import { toArray } from '../../types/list/module.f.mjs'
|
|
11
|
-
/** @import { Vec } from '../../types/bit_vec/types.ts' */
|
|
12
15
|
import { length, msb, uint, uintChunkList, unpack, vec } from '../../types/bit_vec/module.f.mjs'
|
|
13
|
-
import { assertEq } from '../../asserts/module.f.mjs'
|
|
16
|
+
import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs'
|
|
14
17
|
import { utf8 } from '../../text/module.f.mjs'
|
|
15
|
-
/** @import { Point2D } from '../../crypto/secp/types.ts' */
|
|
16
18
|
import { secp256r1 } from '../../crypto/secp/module.f.mjs'
|
|
17
|
-
/** @import { V8 } from '../../crypto/sha2/types.ts' */
|
|
18
19
|
import { base32 } from '../../crypto/sha2/module.f.mjs'
|
|
19
20
|
import { literal3ToVec } from '../level/literal/module.f.mjs'
|
|
20
21
|
import { log2 } from '../../types/bigint/module.f.mjs'
|
|
21
22
|
import { asBase, asNominal } from '../../types/nominal/module.f.mjs'
|
|
22
|
-
/** @import { Id } from './types.ts' */
|
|
23
23
|
|
|
24
24
|
// 32 bytes = 256 bits.
|
|
25
25
|
//
|
|
@@ -32,7 +32,7 @@ const utf8IvSeed = utf8(ivSeed)
|
|
|
32
32
|
const c = secp256r1
|
|
33
33
|
|
|
34
34
|
/** @type {bigint} */
|
|
35
|
-
const ivUint =
|
|
35
|
+
const ivUint = assertNotNullish(c.mul(uint(utf8IvSeed))(c.g))[0]
|
|
36
36
|
|
|
37
37
|
// 64 hex = 256 bits = 32 bytes:
|
|
38
38
|
assertEq(
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
* See `./types.ts` for the `Add`/`EncodeState` type-level API.
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
|
+
*
|
|
7
|
+
* @import { Create } from '../../../types/patricia_trie/types.ts'
|
|
8
|
+
* @import { Id } from '../../id/types.ts'
|
|
9
|
+
* @import { Add, EncodeState } from './types.ts'
|
|
6
10
|
*/
|
|
7
11
|
import type { Id } from '../../id/types.ts';
|
|
8
12
|
import type { Add, EncodeState } from './types.ts';
|
|
9
|
-
/** @import { Add, EncodeState } from './types.ts' */
|
|
10
13
|
/**
|
|
11
14
|
* Returns a streaming encoder for hash-level symbols.
|
|
12
15
|
*
|
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
* See `./types.ts` for the `Add`/`EncodeState` type-level API.
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
|
+
*
|
|
7
|
+
* @import { Create } from '../../../types/patricia_trie/types.ts'
|
|
8
|
+
* @import { Id } from '../../id/types.ts'
|
|
9
|
+
* @import { Add, EncodeState } from './types.ts'
|
|
6
10
|
*/
|
|
7
11
|
|
|
8
|
-
|
|
12
|
+
import { assertNotNullish } from '../../../asserts/module.f.mjs'
|
|
9
13
|
import { emptyState, patriciaTrie } from '../../../types/patricia_trie/module.f.mjs'
|
|
10
14
|
import { compress } from '../../id/module.f.mjs'
|
|
11
|
-
/** @import { Id } from '../../id/types.ts' */
|
|
12
15
|
import { asBase } from '../../../types/nominal/module.f.mjs'
|
|
13
|
-
/** @import { Add, EncodeState } from './types.ts' */
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* Returns a streaming encoder for hash-level symbols.
|
|
@@ -48,7 +50,7 @@ export const encode =
|
|
|
48
50
|
return [undefined, push([asBase(symbol), symbol], state)]
|
|
49
51
|
}
|
|
50
52
|
const [root1, storage1] = end(state)
|
|
51
|
-
const [root2, storage2] = rootCreate(
|
|
53
|
+
const [root2, storage2] = rootCreate(assertNotNullish(root1), symbol, storage1)
|
|
52
54
|
return [root2, [storage2, []]]
|
|
53
55
|
}
|
|
54
56
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { Id } from '../../id/types.ts'
|
|
3
|
+
* @import { EncodeState } from './types.ts'
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { assert, assertEq, assertNotNullish } from '../../../asserts/module.f.mjs'
|
|
2
7
|
import { compress, level3Id } from '../../id/module.f.mjs'
|
|
3
|
-
/** @import { Id } from '../../id/types.ts' */
|
|
4
8
|
import { emptyEncodeState, encode } from './module.f.mjs'
|
|
5
|
-
/** @import { EncodeState } from './types.ts' */
|
|
6
9
|
|
|
7
10
|
/** @typedef {readonly (readonly [Id, Id, Id, boolean])[]} _NodeList */
|
|
8
11
|
|
|
@@ -77,7 +80,7 @@ export const proof = {
|
|
|
77
80
|
// Output equals the merged value in the last add call
|
|
78
81
|
output_is_last_add: () => {
|
|
79
82
|
const [out, storage] = runWord([s1, s0, s1])
|
|
80
|
-
assertEq(out,
|
|
83
|
+
assertEq(out, assertNotNullish(storage.at(-1))[2])
|
|
81
84
|
},
|
|
82
85
|
|
|
83
86
|
// Stack is empty after flush; storage is preserved
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
* `Word`/`EncodeState`/`Level`/`PipelineState`/`LiteralToVec` type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Equal, StateScan } from '../../../types/function/operator/types.ts'
|
|
9
|
+
* @import { List } from '../../../types/list/types.ts'
|
|
10
|
+
* @import { EncodeState, Level, LiteralToVec, PipelineState } from './types.ts'
|
|
7
11
|
*/
|
|
8
12
|
import type { Equal, StateScan } from '../../../types/function/operator/types.ts';
|
|
9
13
|
import type { List } from '../../../types/list/types.ts';
|
|
10
14
|
import type { EncodeState, Level, LiteralToVec, PipelineState } from './types.ts';
|
|
11
|
-
/** @import { EncodeState, Level, LiteralToVec, PipelineState } from './types.ts' */
|
|
12
15
|
/** @type {(s: bigint) => string} */
|
|
13
16
|
export declare const symbolToString: (s: bigint) => string;
|
|
14
17
|
/** @type {(word: List<bigint>) => string} */
|
|
@@ -4,16 +4,17 @@
|
|
|
4
4
|
* `Word`/`EncodeState`/`Level`/`PipelineState`/`LiteralToVec` type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Equal, StateScan } from '../../../types/function/operator/types.ts'
|
|
9
|
+
* @import { List } from '../../../types/list/types.ts'
|
|
10
|
+
* @import { EncodeState, Level, LiteralToVec, PipelineState } from './types.ts'
|
|
7
11
|
*/
|
|
8
12
|
|
|
9
13
|
import { log2 } from '../../../types/bigint/module.f.mjs'
|
|
10
14
|
import { msb, vec } from '../../../types/bit_vec/module.f.mjs'
|
|
11
|
-
/** @import { Equal, StateScan } from '../../../types/function/operator/types.ts' */
|
|
12
15
|
import { strictEqual } from '../../../types/function/operator/module.f.mjs'
|
|
13
|
-
/** @import { List } from '../../../types/list/types.ts' */
|
|
14
16
|
import { equal, map } from '../../../types/list/module.f.mjs'
|
|
15
17
|
import { join } from '../../../types/string/module.f.mjs'
|
|
16
|
-
/** @import { EncodeState, Level, LiteralToVec, PipelineState } from './types.ts' */
|
|
17
18
|
|
|
18
19
|
/** @type {(s: bigint) => string} */
|
|
19
20
|
export const symbolToString = s => s.toString(16)
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../../types/bit_vec/types.ts'
|
|
3
|
+
*/
|
|
4
|
+
|
|
2
5
|
import { chunkList, msb, vec } from '../../../types/bit_vec/module.f.mjs'
|
|
3
6
|
import { assert, assertEq } from '../../../asserts/module.f.mjs'
|
|
4
7
|
import { map, stateScan, toArray } from '../../../types/list/module.f.mjs'
|
package/fjs/sul/module.f.d.mts
CHANGED
|
@@ -4,15 +4,17 @@
|
|
|
4
4
|
* See `./types.ts` for the `EncodeState`/`Encode` type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Add } from './level/hash/types.ts'
|
|
9
|
+
* @import { Id } from './id/types.ts'
|
|
10
|
+
* @import { InternalState } from '../types/patricia_trie/types.ts'
|
|
11
|
+
* @import { EncodeState, Encode } from './types.ts'
|
|
7
12
|
*/
|
|
8
13
|
import type { Add } from './level/hash/types.ts';
|
|
9
14
|
import type { Id } from './id/types.ts';
|
|
10
15
|
import type { InternalState } from '../types/patricia_trie/types.ts';
|
|
11
16
|
import type { EncodeState, Encode } from './types.ts';
|
|
12
17
|
export type _HashState = InternalState<Id>;
|
|
13
|
-
/** @import { Id } from './id/types.ts' */
|
|
14
|
-
/** @import { InternalState } from '../types/patricia_trie/types.ts' */
|
|
15
|
-
/** @import { EncodeState, Encode } from './types.ts' */
|
|
16
18
|
/** @typedef {InternalState<Id>} _HashState */
|
|
17
19
|
/** @type {<S>(storage: S) => EncodeState<S>} */
|
|
18
20
|
export declare const emptyEncodeState: <S>(storage: S) => EncodeState<S>;
|
package/fjs/sul/module.f.mjs
CHANGED
|
@@ -4,15 +4,16 @@
|
|
|
4
4
|
* See `./types.ts` for the `EncodeState`/`Encode` type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Add } from './level/hash/types.ts'
|
|
9
|
+
* @import { Id } from './id/types.ts'
|
|
10
|
+
* @import { InternalState } from '../types/patricia_trie/types.ts'
|
|
11
|
+
* @import { EncodeState, Encode } from './types.ts'
|
|
7
12
|
*/
|
|
8
13
|
|
|
9
14
|
import { emptyPipelineState, pipelineStep } from './level/literal/module.f.mjs'
|
|
10
15
|
import { encode as hashEncode } from './level/hash/module.f.mjs'
|
|
11
|
-
/** @import { Add } from './level/hash/types.ts' */
|
|
12
16
|
import { level3Id } from './id/module.f.mjs'
|
|
13
|
-
/** @import { Id } from './id/types.ts' */
|
|
14
|
-
/** @import { InternalState } from '../types/patricia_trie/types.ts' */
|
|
15
|
-
/** @import { EncodeState, Encode } from './types.ts' */
|
|
16
17
|
|
|
17
18
|
/** @typedef {InternalState<Id>} _HashState */
|
|
18
19
|
|
|
@@ -31,22 +32,27 @@ export const encode =
|
|
|
31
32
|
|
|
32
33
|
/** @typedef {readonly [Id | undefined, S, readonly _HashState[]]} _CascadeResult */
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const [
|
|
43
|
-
|
|
44
|
-
storage = newStorage
|
|
45
|
-
if (out === undefined) return [undefined, storage, stacks]
|
|
46
|
-
id = out
|
|
35
|
+
// Recursive rather than a `for(;;)` loop: every exit is one of the two
|
|
36
|
+
// `return`s below, so a bare `for(;;)` picks up a phantom "loop falls
|
|
37
|
+
// through" branch that V8's coverage instrumentation can never mark
|
|
38
|
+
// taken — there is no third way out to take it. Recursion has no such
|
|
39
|
+
// branch to begin with.
|
|
40
|
+
/** @type {(id: Id, storage: S, stacks: readonly _HashState[], index: number) => _CascadeResult} */
|
|
41
|
+
const cascadeFrom = (id, storage, stacks, index) => {
|
|
42
|
+
if (index >= stacks.length) {
|
|
43
|
+
const [, [newStorage, newStack]] = step(id, [storage, []])
|
|
44
|
+
return [id, newStorage, [...stacks, newStack]]
|
|
47
45
|
}
|
|
46
|
+
const [out, [newStorage, newStack]] = step(id, [storage, stacks[index]])
|
|
47
|
+
const newStacks = [...stacks.slice(0, index), newStack, ...stacks.slice(index + 1)]
|
|
48
|
+
return out === undefined
|
|
49
|
+
? [undefined, newStorage, newStacks]
|
|
50
|
+
: cascadeFrom(out, newStorage, newStacks, index + 1)
|
|
48
51
|
}
|
|
49
52
|
|
|
53
|
+
/** @type {(id0: Id, storage0: S, stacks0: readonly _HashState[]) => _CascadeResult} */
|
|
54
|
+
const cascade = (id0, storage0, stacks0) => cascadeFrom(id0, storage0, stacks0, 0)
|
|
55
|
+
|
|
50
56
|
/** @type {(bit: bigint, state: EncodeState<S>) => readonly [Id | undefined, EncodeState<S>]} */
|
|
51
57
|
const literalStep = (bit, state) => {
|
|
52
58
|
const [ps, storage, stacks] = state
|