functionalscript 0.37.0 → 0.39.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/fjs/bnf/token_symbol/module.f.d.ts +38 -0
- package/fjs/bnf/token_symbol/module.f.js +48 -0
- package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
- package/fjs/bnf/token_symbol/proof.f.js +37 -0
- package/{fs → fjs}/cas/cli/module.f.js +6 -9
- 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 +27 -0
- package/fjs/cas/evo/mcp/module.f.js +94 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
- package/fjs/cas/evo/mcp/proof.f.js +126 -0
- package/fjs/cas/evo/module.f.d.ts +202 -0
- package/fjs/cas/evo/module.f.js +421 -0
- package/fjs/cas/evo/proof.f.d.ts +39 -0
- package/fjs/cas/evo/proof.f.js +572 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +61 -81
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +89 -36
- package/fjs/cas/proof.f.d.ts +18 -0
- package/fjs/cas/proof.f.js +305 -0
- package/{fs → fjs}/ci/bun/module.f.js +3 -3
- package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
- package/{fs → fjs}/ci/common/module.f.js +1 -5
- package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
- package/{fs → fjs}/ci/config/module.f.js +8 -8
- package/{fs → fjs}/ci/deno/module.f.js +3 -3
- package/{fs → fjs}/ci/module.f.js +3 -4
- package/{fs → fjs}/ci/node/module.f.js +11 -9
- package/{fs → fjs}/ci/proof.f.js +16 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/module.f.js +2 -2
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
- package/fjs/common/monoid/module.f.js +88 -0
- package/fjs/common/monoid/proof.f.d.ts +9 -0
- package/fjs/common/monoid/proof.f.js +48 -0
- 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/module.f.js +25 -25
- 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/module.f.js +5 -8
- package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
- package/{fs → fjs}/djs/parser/module.f.js +37 -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/module.f.js +6 -6
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/fjs/effects/eff/module.f.d.ts +72 -0
- package/fjs/effects/eff/module.f.js +46 -0
- package/fjs/effects/eff/proof.f.d.ts +11 -0
- package/fjs/effects/eff/proof.f.js +58 -0
- package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
- package/{fs → fjs}/effects/list/module.f.js +2 -1
- package/{fs → fjs}/effects/memory/proof.f.js +15 -29
- package/fjs/effects/module.f.d.ts +388 -0
- package/fjs/effects/module.f.js +288 -0
- package/{fs → fjs}/effects/node/memory/proof.js +7 -13
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
- package/{fs → fjs}/effects/node/module.f.js +9 -11
- 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 +121 -299
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/fjs/effects/proof.f.d.ts +51 -0
- package/fjs/effects/proof.f.js +178 -0
- package/{fs → fjs}/emergent_testing/module.f.js +55 -39
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
- package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
- 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 +17 -10
- package/{fs → fjs}/mcp/proof.f.js +17 -16
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
- 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/module.f.js +2 -2
- package/{fs → fjs}/media/type/proof.f.js +8 -15
- package/{fs → fjs}/module.f.js +5 -9
- 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/module.f.js +4 -3
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
- 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/module.f.d.ts +5 -0
- package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
- 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/module.f.d.ts +21 -0
- package/{fs → fjs}/types/list/module.f.js +17 -0
- package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
- package/{fs → fjs}/types/list/proof.f.js +79 -164
- 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/module.f.js +2 -1
- 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/{fs → fjs}/types/string/module.f.js +10 -2
- 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/module.f.js +2 -3
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +8 -8
- 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/cas/proof.f.d.ts +0 -20
- package/fs/cas/proof.f.js +0 -294
- package/fs/common/monoid/module.f.js +0 -44
- package/fs/common/monoid/proof.f.d.ts +0 -4
- package/fs/common/monoid/proof.f.js +0 -27
- 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/effects/module.f.d.ts +0 -106
- package/fs/effects/module.f.js +0 -80
- package/fs/effects/proof.f.d.ts +0 -25
- package/fs/effects/proof.f.js +0 -115
- 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}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +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/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/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/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}/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.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/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +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/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/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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +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/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/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/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/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/proof.f.d.ts +0 -0
|
@@ -10,6 +10,8 @@ import { codePointListToString, stringToCodePointList } from '../text/utf16/modu
|
|
|
10
10
|
import { definedValues } from '../types/object/module.f.js';
|
|
11
11
|
import { isArray2 } from '../types/array/module.f.js';
|
|
12
12
|
import { map, toArray, repeat as listRepeat } from '../types/list/module.f.js';
|
|
13
|
+
import { contains } from '../types/range/module.f.js';
|
|
14
|
+
import { assert } from '../asserts/module.f.js';
|
|
13
15
|
/**
|
|
14
16
|
* Full 24-bit symbol range packed into a single {@link TerminalRange}.
|
|
15
17
|
*/
|
|
@@ -18,10 +20,6 @@ export const fullRange = 0x000000_FFFFFF;
|
|
|
18
20
|
* Unicode scalar value range packed into a single {@link TerminalRange}.
|
|
19
21
|
*/
|
|
20
22
|
export const unicodeRange = 0x000000_10FFFF;
|
|
21
|
-
/**
|
|
22
|
-
* Maximal non-Unicode symbol encoded as a string value.
|
|
23
|
-
*/
|
|
24
|
-
export const max = codePointListToString([0xFFFFFF]);
|
|
25
23
|
/**
|
|
26
24
|
* Maximal Unicode code point encoded as a string value.
|
|
27
25
|
*/
|
|
@@ -34,11 +32,9 @@ const { fromCodePoint } = String;
|
|
|
34
32
|
*/
|
|
35
33
|
const offset = 24;
|
|
36
34
|
const mask = (1 << offset) - 1;
|
|
37
|
-
const isValid = (
|
|
35
|
+
const isValid = contains(0, mask);
|
|
38
36
|
export const rangeEncode = (a, b) => {
|
|
39
|
-
|
|
40
|
-
throw `Invalid range ${a} ${b}.`;
|
|
41
|
-
}
|
|
37
|
+
assert(isValid(a) && isValid(b) && a <= b);
|
|
42
38
|
return Number((BigInt(a) << BigInt(offset)) | BigInt(b));
|
|
43
39
|
};
|
|
44
40
|
/**
|
|
@@ -46,13 +42,16 @@ export const rangeEncode = (a, b) => {
|
|
|
46
42
|
*/
|
|
47
43
|
export const oneEncode = (a) => rangeEncode(a, a);
|
|
48
44
|
/**
|
|
49
|
-
* End-of-file marker
|
|
45
|
+
* End-of-file marker: `mask`, the single largest value the 24-bit symbol
|
|
46
|
+
* space can hold (the top of `fullRange`). Deliberately outside Unicode
|
|
47
|
+
* (`unicodeRange` tops out at `0x10FFFF`) so it can never collide with a
|
|
48
|
+
* real code point.
|
|
50
49
|
*/
|
|
51
|
-
export const eof = oneEncode(
|
|
50
|
+
export const eof = oneEncode(mask);
|
|
52
51
|
/**
|
|
53
52
|
* Decodes a packed range into `[start, end]` symbols.
|
|
54
53
|
*/
|
|
55
|
-
export const rangeDecode = (r) => [Number(BigInt(r) >> BigInt(offset)),
|
|
54
|
+
export const rangeDecode = (r) => [Number(BigInt(r) >> BigInt(offset)), r & mask];
|
|
56
55
|
const mapOneEncode = map(oneEncode);
|
|
57
56
|
export const toSequence = (s) => toArray(mapOneEncode(stringToCodePointList(s)));
|
|
58
57
|
/**
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { assert, assertEq } from '../asserts/module.f.js';
|
|
2
|
+
import { classic, deterministic } from './testlib.f.js';
|
|
3
|
+
import { rangeEncode, str, set, range, commaJoin0Plus, isEmpty, oneEncode, repeat1Plus, } from './module.f.js';
|
|
4
|
+
export const proof = {
|
|
5
|
+
test: () => {
|
|
6
|
+
classic();
|
|
7
|
+
deterministic();
|
|
8
|
+
},
|
|
9
|
+
throw: {
|
|
10
|
+
rangeEncodeInvalid: [
|
|
11
|
+
() => { rangeEncode(-1, 0); },
|
|
12
|
+
() => { rangeEncode(0, -1); },
|
|
13
|
+
() => { rangeEncode(5, 3); },
|
|
14
|
+
],
|
|
15
|
+
rangeInvalid: [
|
|
16
|
+
() => { range('a'); },
|
|
17
|
+
() => { range('abc'); },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
str: [
|
|
21
|
+
() => {
|
|
22
|
+
const result = str('a');
|
|
23
|
+
assertEq(typeof result, 'number', result);
|
|
24
|
+
assertEq(result, oneEncode(0x61));
|
|
25
|
+
},
|
|
26
|
+
() => {
|
|
27
|
+
const result = str('ab');
|
|
28
|
+
assert(Array.isArray(result), result);
|
|
29
|
+
assertEq(result.length, 2, result);
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
set: () => {
|
|
33
|
+
const result = set('abc');
|
|
34
|
+
assert(!(typeof result !== 'object' || result === null), result);
|
|
35
|
+
assert('a' in result, result);
|
|
36
|
+
assert('b' in result, result);
|
|
37
|
+
assert('c' in result, result);
|
|
38
|
+
},
|
|
39
|
+
commaJoin0Plus: () => {
|
|
40
|
+
const ws = '';
|
|
41
|
+
const item = 'x';
|
|
42
|
+
const result = commaJoin0Plus(ws)('[]', item);
|
|
43
|
+
assert(Array.isArray(result), result);
|
|
44
|
+
assert(result[0] === '[', result);
|
|
45
|
+
},
|
|
46
|
+
isEmpty: [
|
|
47
|
+
() => { assert(isEmpty(''), 'empty string should be empty'); },
|
|
48
|
+
() => { assert(isEmpty([]), 'empty array should be empty'); },
|
|
49
|
+
() => { assert(!(isEmpty('a')), 'non-empty string should not be empty'); },
|
|
50
|
+
() => {
|
|
51
|
+
const f = () => '';
|
|
52
|
+
assert(isEmpty(f), 'function returning empty string should be empty');
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
repeat1Plus: [
|
|
56
|
+
() => {
|
|
57
|
+
const result = repeat1Plus('x');
|
|
58
|
+
assert(result[0] === 'x');
|
|
59
|
+
assertEq(typeof result[1], 'function', 'expected repeat0Plus function');
|
|
60
|
+
},
|
|
61
|
+
() => {
|
|
62
|
+
const rule = 'ab';
|
|
63
|
+
const result = repeat1Plus(rule);
|
|
64
|
+
assertEq(result[0], rule);
|
|
65
|
+
const inner = result[1]();
|
|
66
|
+
assert(!(!('some' in inner) || !('none' in inner)), 'expected Option shape');
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { commaJoin0Plus,
|
|
1
|
+
import { commaJoin0Plus, none, option, range, remove, repeat, repeat0Plus, set, unicodeMax } from './module.f.js';
|
|
2
2
|
export const classic = () => {
|
|
3
3
|
// https://www.json.org/json-en.html
|
|
4
4
|
const json = () => [element];
|
|
@@ -93,7 +93,7 @@ export const deterministic = () => {
|
|
|
93
93
|
const string = [
|
|
94
94
|
'"',
|
|
95
95
|
repeat0Plus({
|
|
96
|
-
...remove(range(` ${
|
|
96
|
+
...remove(range(` ${unicodeMax}`), set('"\\')),
|
|
97
97
|
escape: [
|
|
98
98
|
'\\',
|
|
99
99
|
{
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Nullable } from '../../types/nullable/module.f.ts';
|
|
2
|
+
/**
|
|
3
|
+
* How many names one encoding holds: every symbol from {@link start} up to but
|
|
4
|
+
* not including `eof` (`0xFFFFFF`, the top of the 24-bit symbol space).
|
|
5
|
+
*/
|
|
6
|
+
export declare const capacity: number;
|
|
7
|
+
/**
|
|
8
|
+
* A bidirectional map between a fixed alphabet of token names and the symbol
|
|
9
|
+
* range reserved for them.
|
|
10
|
+
*/
|
|
11
|
+
export type Encoding<T extends string> = {
|
|
12
|
+
/**
|
|
13
|
+
* The input symbol standing for `name`.
|
|
14
|
+
*
|
|
15
|
+
* The result is a bare symbol, the form a tokenizer emits. Wrap it in
|
|
16
|
+
* `oneEncode` to use it as a terminal of a grammar rule — a symbol and a
|
|
17
|
+
* `TerminalRange` are both plain numbers, so passing one where the other
|
|
18
|
+
* belongs is not a type error.
|
|
19
|
+
*/
|
|
20
|
+
readonly encode: (name: T) => number;
|
|
21
|
+
/**
|
|
22
|
+
* The name a symbol stands for, or `null` when the symbol belongs to no
|
|
23
|
+
* registered name — a code point, `eof`, or a symbol past the end of the
|
|
24
|
+
* alphabet.
|
|
25
|
+
*/
|
|
26
|
+
readonly decode: (symbol: number) => Nullable<T>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Builds an encoding over the complete list of token names.
|
|
30
|
+
*
|
|
31
|
+
* A name takes the symbol at its index in `names`, so the list is append-only:
|
|
32
|
+
* inserting or reordering names changes the symbols of everything after the
|
|
33
|
+
* edit.
|
|
34
|
+
*
|
|
35
|
+
* @throws When `names` holds more than {@link capacity} entries, or when a name
|
|
36
|
+
* repeats — a repeated name has no single symbol to decode back to.
|
|
37
|
+
*/
|
|
38
|
+
export declare const encoding: <T extends string>(names: readonly T[]) => Encoding<T>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding of multi-character token names as single BNF input symbols.
|
|
3
|
+
*
|
|
4
|
+
* A parser built on top of a tokenizer consumes one input symbol per token, so
|
|
5
|
+
* multi-character operators (`>>>=`) and keywords (`instanceof`) each need a
|
|
6
|
+
* symbol of their own. Names are registered as one fixed alphabet and get a
|
|
7
|
+
* symbol from their position in it, above the Unicode range and below `eof`.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { assert } from '../../asserts/module.f.js';
|
|
12
|
+
import { fromUndefined } from '../../types/nullable/module.f.js';
|
|
13
|
+
import { eof, rangeDecode, unicodeRange } from '../module.f.js';
|
|
14
|
+
const [, unicodeLast] = rangeDecode(unicodeRange);
|
|
15
|
+
const [eofSymbol] = rangeDecode(eof);
|
|
16
|
+
/**
|
|
17
|
+
* The symbol of the first registered name: `0x110000`, one past the last
|
|
18
|
+
* Unicode scalar value, so a token symbol can never be mistaken for a code
|
|
19
|
+
* point of the layer below.
|
|
20
|
+
*/
|
|
21
|
+
const start = unicodeLast + 1;
|
|
22
|
+
/**
|
|
23
|
+
* How many names one encoding holds: every symbol from {@link start} up to but
|
|
24
|
+
* not including `eof` (`0xFFFFFF`, the top of the 24-bit symbol space).
|
|
25
|
+
*/
|
|
26
|
+
export const capacity = eofSymbol - start;
|
|
27
|
+
/**
|
|
28
|
+
* Builds an encoding over the complete list of token names.
|
|
29
|
+
*
|
|
30
|
+
* A name takes the symbol at its index in `names`, so the list is append-only:
|
|
31
|
+
* inserting or reordering names changes the symbols of everything after the
|
|
32
|
+
* edit.
|
|
33
|
+
*
|
|
34
|
+
* @throws When `names` holds more than {@link capacity} entries, or when a name
|
|
35
|
+
* repeats — a repeated name has no single symbol to decode back to.
|
|
36
|
+
*/
|
|
37
|
+
export const encoding = (names) => {
|
|
38
|
+
assert(names.length <= capacity, ['too many token names', names.length]);
|
|
39
|
+
assert(new Set(names).size === names.length, ['duplicate token name', names]);
|
|
40
|
+
return {
|
|
41
|
+
encode: name => {
|
|
42
|
+
const index = names.indexOf(name);
|
|
43
|
+
assert(index !== -1, ['unregistered token name', name]);
|
|
44
|
+
return start + index;
|
|
45
|
+
},
|
|
46
|
+
decode: symbol => fromUndefined(names[symbol - start]),
|
|
47
|
+
};
|
|
48
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
2
|
+
import { capacity, encoding } from './module.f.js';
|
|
3
|
+
const names = ['>>', '>>>=', 'instanceof'];
|
|
4
|
+
export const proof = {
|
|
5
|
+
encode: () => {
|
|
6
|
+
const { encode } = encoding(names);
|
|
7
|
+
assertEq(encode('>>'), 0x110000);
|
|
8
|
+
assertEq(encode('instanceof'), 0x110002);
|
|
9
|
+
},
|
|
10
|
+
decode: [
|
|
11
|
+
() => {
|
|
12
|
+
const { decode } = encoding(names);
|
|
13
|
+
assertEq(decode(0x110000), '>>');
|
|
14
|
+
assertEq(decode(0x110002), 'instanceof');
|
|
15
|
+
},
|
|
16
|
+
() => {
|
|
17
|
+
const { decode } = encoding(names);
|
|
18
|
+
// past the end of the alphabet, a code point, and `eof`
|
|
19
|
+
assertEq(decode(0x110003), null);
|
|
20
|
+
assertEq(decode(0x10FFFF), null);
|
|
21
|
+
assertEq(decode(0xFFFFFF), null);
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
roundTrip: () => {
|
|
25
|
+
const { encode, decode } = encoding(names);
|
|
26
|
+
for (const name of names) {
|
|
27
|
+
assertEq(decode(encode(name)), name);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
throw: {
|
|
31
|
+
duplicateName: () => { encoding(['a', 'b', 'a']); },
|
|
32
|
+
unregisteredName: () => { encoding(['a']).encode('b'); },
|
|
33
|
+
// `capacity` names fit, so one more is the smallest list that doesn't.
|
|
34
|
+
// The array is sparse, so this costs a length, not the strings.
|
|
35
|
+
tooManyNames: () => { encoding(new Array(capacity + 1)); },
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { sha256 } from '../../crypto/sha2/module.f.js';
|
|
7
7
|
import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.js';
|
|
8
|
-
import { forEachStep, pure } from '../../effects/module.f.js';
|
|
8
|
+
import { forEachStep, pure, step } from '../../effects/module.f.js';
|
|
9
9
|
import { errorExit, log, writeFromStream } from '../../effects/node/module.f.js';
|
|
10
10
|
import { dispatch } from '../../cli/module.f.js';
|
|
11
11
|
import {} from '../../effects/memory/module.f.js';
|
|
@@ -19,10 +19,9 @@ export const commands = [
|
|
|
19
19
|
return errorExit("'cas add' expects one parameter");
|
|
20
20
|
}
|
|
21
21
|
const c = fileCas(sha256)(home);
|
|
22
|
-
return casAddFile(c)(path)
|
|
23
|
-
.step(hashResult => hashResult[0] === 'error'
|
|
22
|
+
return step(casAddFile(c)(path), hashResult => hashResult[0] === 'error'
|
|
24
23
|
? pure(1)
|
|
25
|
-
: log(vecToCBase32(hashResult[1]))
|
|
24
|
+
: step(log(vecToCBase32(hashResult[1])), () => pure(0)));
|
|
26
25
|
},
|
|
27
26
|
},
|
|
28
27
|
{
|
|
@@ -38,8 +37,7 @@ export const commands = [
|
|
|
38
37
|
}
|
|
39
38
|
const c = fileCas(sha256)(home);
|
|
40
39
|
const x = c.read(hash);
|
|
41
|
-
return writeFromStream(path, x)
|
|
42
|
-
.step(([r, v]) => r === 'error' ? errorExit(`e: ` + String(v)) : pure(0));
|
|
40
|
+
return step(writeFromStream(path, x), ([r, v]) => r === 'error' ? errorExit(`e: ` + String(v)) : pure(0));
|
|
43
41
|
},
|
|
44
42
|
},
|
|
45
43
|
{
|
|
@@ -47,9 +45,8 @@ export const commands = [
|
|
|
47
45
|
description: 'List all stored content hashes',
|
|
48
46
|
handler: ({ home }) => {
|
|
49
47
|
const c = fileCas(sha256)(home);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
.step(() => pure(0));
|
|
48
|
+
const x0 = forEachStep(c.list(), j => log(vecToCBase32(j)));
|
|
49
|
+
return step(x0, () => pure(0));
|
|
53
50
|
},
|
|
54
51
|
},
|
|
55
52
|
];
|
|
@@ -2,13 +2,16 @@ export declare const proof: {
|
|
|
2
2
|
mainAdd: () => void;
|
|
3
3
|
mainAddGetBig: () => void;
|
|
4
4
|
mainAddWrongArgs: () => void;
|
|
5
|
+
mainAddMissingFile: () => void;
|
|
5
6
|
mainGetFound: () => void;
|
|
6
7
|
mainGetNotFound: () => void;
|
|
7
8
|
mainGetWrongArgs: () => void;
|
|
8
9
|
mainGetInvalidHash: () => void;
|
|
9
10
|
mainList: () => void;
|
|
10
11
|
mainListEmptyStore: () => void;
|
|
11
|
-
mainListCorruptStore: () => void;
|
|
12
12
|
mainNoCmd: () => void;
|
|
13
13
|
mainUnknownCmd: () => void;
|
|
14
|
+
throw: {
|
|
15
|
+
mainListCorruptStore: () => readonly [import("../../effects/node/virtual/module.f.ts").State, number];
|
|
16
|
+
};
|
|
14
17
|
};
|
|
@@ -13,12 +13,8 @@ export const proof = {
|
|
|
13
13
|
const content = vec8(0x2an);
|
|
14
14
|
const state = { ...emptyState, root: { myfile: [content] } };
|
|
15
15
|
const [finalState, exitCode] = virtual(state)(main(makeOptions(['add', 'myfile'])));
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
if (finalState.stdout.length === 0) {
|
|
20
|
-
throw 'expected hash in stdout';
|
|
21
|
-
}
|
|
16
|
+
assertEq(exitCode, 0, ['expected exit 0', exitCode]);
|
|
17
|
+
assert(finalState.stdout.length !== 0, 'expected hash in stdout');
|
|
22
18
|
},
|
|
23
19
|
mainAddGetBig: () => {
|
|
24
20
|
const chunk = vec(maxLength)(1n);
|
|
@@ -47,18 +43,21 @@ export const proof = {
|
|
|
47
43
|
assertEq(exitCode, 1);
|
|
48
44
|
assert(finalState.stderr.length !== 0);
|
|
49
45
|
},
|
|
46
|
+
mainAddMissingFile: () => {
|
|
47
|
+
// The source path doesn't exist, so `streamFile`'s first read comes back as an
|
|
48
|
+
// error item; `write` fails closed with that error and the handler exits 1
|
|
49
|
+
// without ever calling `log` — covers the `hashResult[0] === 'error'` branch.
|
|
50
|
+
const [, exitCode] = virtual(emptyState)(main(makeOptions(['add', 'missing'])));
|
|
51
|
+
assertEq(exitCode, 1);
|
|
52
|
+
},
|
|
50
53
|
mainGetFound: () => {
|
|
51
54
|
const content = vec8(0x2an);
|
|
52
55
|
const state = { ...emptyState, root: { myfile: [content] } };
|
|
53
56
|
const [state1, exitCode1] = virtual(state)(main(makeOptions(['add', 'myfile'])));
|
|
54
|
-
|
|
55
|
-
throw ['expected add exit 0', exitCode1];
|
|
56
|
-
}
|
|
57
|
+
assertEq(exitCode1, 0, ['expected add exit 0', exitCode1]);
|
|
57
58
|
const hashStr = state1.stdout.trim();
|
|
58
59
|
const [, exitCode2] = virtual(state1)(main(makeOptions(['get', hashStr, 'output'])));
|
|
59
|
-
|
|
60
|
-
throw ['expected get exit 0', exitCode2];
|
|
61
|
-
}
|
|
60
|
+
assertEq(exitCode2, 0, ['expected get exit 0', exitCode2]);
|
|
62
61
|
},
|
|
63
62
|
mainGetNotFound: () => {
|
|
64
63
|
// valid cBase32 hash that has not been stored
|
|
@@ -68,82 +67,46 @@ export const proof = {
|
|
|
68
67
|
const hashStr = state1.stdout.trim();
|
|
69
68
|
// use an empty store so the hash is not found
|
|
70
69
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get', hashStr, 'output'])));
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
if (finalState.stderr.length === 0) {
|
|
75
|
-
throw 'expected error in stderr';
|
|
76
|
-
}
|
|
70
|
+
assertEq(exitCode, 1, ['expected exit 1', exitCode]);
|
|
71
|
+
assert(finalState.stderr.length !== 0, 'expected error in stderr');
|
|
77
72
|
},
|
|
78
73
|
mainGetWrongArgs: () => {
|
|
79
74
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get'])));
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
if (finalState.stderr.length === 0) {
|
|
84
|
-
throw 'expected error in stderr';
|
|
85
|
-
}
|
|
75
|
+
assertEq(exitCode, 1, ['expected exit 1', exitCode]);
|
|
76
|
+
assert(finalState.stderr.length !== 0, 'expected error in stderr');
|
|
86
77
|
},
|
|
87
78
|
mainGetInvalidHash: () => {
|
|
88
79
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get', 'not-a-valid-hash', 'output'])));
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
if (finalState.stderr.length === 0) {
|
|
93
|
-
throw 'expected error in stderr';
|
|
94
|
-
}
|
|
80
|
+
assertEq(exitCode, 1, ['expected exit 1', exitCode]);
|
|
81
|
+
assert(finalState.stderr.length !== 0, 'expected error in stderr');
|
|
95
82
|
},
|
|
96
83
|
mainList: () => {
|
|
97
84
|
const content = vec8(0x2an);
|
|
98
85
|
const state = { ...emptyState, root: { myfile: [content] } };
|
|
99
86
|
const [state1] = virtual(state)(main(makeOptions(['add', 'myfile'])));
|
|
100
87
|
const [, exitCode] = virtual(state1)(main(makeOptions(['list'])));
|
|
101
|
-
|
|
102
|
-
throw ['expected exit 0', exitCode];
|
|
103
|
-
}
|
|
88
|
+
assertEq(exitCode, 0, ['expected exit 0', exitCode]);
|
|
104
89
|
},
|
|
105
90
|
mainListEmptyStore: () => {
|
|
106
91
|
// A fresh directory has no `.cas` yet; listing must succeed (empty),
|
|
107
92
|
// not crash unwrapping a readdir ENOENT.
|
|
108
93
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['list'])));
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
if (finalState.stdout !== '') {
|
|
113
|
-
throw ['expected empty stdout', finalState.stdout];
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
mainListCorruptStore: () => {
|
|
117
|
-
// `.cas` exists but is a file, not a directory: a real storage error
|
|
118
|
-
// that must surface, not be masked as an empty list.
|
|
119
|
-
const state = { ...emptyState, root: { '.cas': [vec8(0x2an)] } };
|
|
120
|
-
let threw = false;
|
|
121
|
-
try {
|
|
122
|
-
virtual(state)(main(makeOptions(['list'])));
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
threw = true;
|
|
126
|
-
}
|
|
127
|
-
if (!threw) {
|
|
128
|
-
throw 'expected list to surface the storage error';
|
|
129
|
-
}
|
|
94
|
+
assertEq(exitCode, 0, ['expected exit 0', exitCode]);
|
|
95
|
+
assertEq(finalState.stdout, '', ['expected empty stdout', finalState.stdout]);
|
|
130
96
|
},
|
|
131
97
|
mainNoCmd: () => {
|
|
132
98
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions([])));
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
if (finalState.stderr.length === 0) {
|
|
137
|
-
throw 'expected error in stderr';
|
|
138
|
-
}
|
|
99
|
+
assertEq(exitCode, 1, ['expected exit 1', exitCode]);
|
|
100
|
+
assert(finalState.stderr.length !== 0, 'expected error in stderr');
|
|
139
101
|
},
|
|
140
102
|
mainUnknownCmd: () => {
|
|
141
103
|
const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['bogus'])));
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
104
|
+
assertEq(exitCode, 1, ['expected exit 1', exitCode]);
|
|
105
|
+
assert(finalState.stderr.length !== 0, 'expected error in stderr');
|
|
106
|
+
},
|
|
107
|
+
throw: {
|
|
108
|
+
// `.cas` exists but is a file, not a directory: a real storage error
|
|
109
|
+
// that must surface, not be masked as an empty list.
|
|
110
|
+
mainListCorruptStore: () => virtual({ ...emptyState, root: { '.cas': [vec8(0x2an)] } })(main(makeOptions(['list']))),
|
|
148
111
|
},
|
|
149
112
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Operation } from '../../../effects/module.f.ts';
|
|
2
|
+
import { type MemOp } from '../../../effects/memory/module.f.ts';
|
|
3
|
+
import { type ToolEntry } from '../../../mcp/module.f.ts';
|
|
4
|
+
import { type Evo } from '../module.f.ts';
|
|
5
|
+
/** Arguments for `evo_list`: none. */
|
|
6
|
+
export declare const evoListArgs: {};
|
|
7
|
+
/** Arguments for `evo_head`: the subject whose current heads are requested. */
|
|
8
|
+
export declare const evoHeadArgs: {
|
|
9
|
+
readonly subject: import("../../../types/rtti/module.f.ts").String;
|
|
10
|
+
};
|
|
11
|
+
/** Arguments for `evo_revision`: the hash of the revision to read. */
|
|
12
|
+
export declare const evoRevisionArgs: {
|
|
13
|
+
readonly hash: import("../../../types/rtti/module.f.ts").String;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Arguments for `evo_add`: a new revision, per `fjs/cas/evo`'s
|
|
17
|
+
* `RevisionData` — every field of it the caller supplies, i.e. all but
|
|
18
|
+
* `generation`, which the server computes.
|
|
19
|
+
*/
|
|
20
|
+
export declare const evoAddArgs: {
|
|
21
|
+
readonly parents: import("../../../types/rtti/module.f.ts").Type1<"array", import("../../../types/rtti/module.f.ts").String>;
|
|
22
|
+
readonly snapshot: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").String, undefined]>;
|
|
23
|
+
readonly subject: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").String, undefined]>;
|
|
24
|
+
readonly archived: import("../../../types/rtti/module.f.ts").Or<readonly [true, undefined]>;
|
|
25
|
+
};
|
|
26
|
+
/** Registry of all Evo tools, bound to an `Evo<O>`. */
|
|
27
|
+
export declare const evoToolRegistry: <O extends Operation>(e: Evo<O>) => readonly ToolEntry<O | MemOp>[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool definitions for the Evo API (`fjs/cas/evo/module.f.ts`): subjects,
|
|
3
|
+
* revision heads, and the typed read of a single revision over the
|
|
4
|
+
* content-addressable store, backed by the in-memory cache the core module
|
|
5
|
+
* maintains.
|
|
6
|
+
*
|
|
7
|
+
* ## Tools
|
|
8
|
+
*
|
|
9
|
+
* | Tool | args | action | result |
|
|
10
|
+
* |----------------|-----------------------------------------------|-------------------|--------------------------------------|
|
|
11
|
+
* | `evo_list` | `{}` | `e.list()` | subjects, as a JSON array of strings |
|
|
12
|
+
* | `evo_head` | `{ subject }` | `e.head(...)` | head hashes, one per line |
|
|
13
|
+
* | `evo_revision` | `{ hash }` | `e.revision(...)` | the revision, as JSON `RevisionData` |
|
|
14
|
+
* | `evo_add` | `{ parents, snapshot?, subject?, archived? }` | `e.add(...)` | hash (cBase32) |
|
|
15
|
+
*
|
|
16
|
+
* `evo_add` and `evo_revision` speak the same structure — `fjs/cas/evo`'s
|
|
17
|
+
* `RevisionData` — in opposite directions, so a revision read back can be
|
|
18
|
+
* added again as-is. `evo_add`'s advertised arguments stay as they are: the
|
|
19
|
+
* one field `evo_revision` returns that `evo_add` does not accept is
|
|
20
|
+
* `generation`, which the server computes, and rtti's struct validation
|
|
21
|
+
* ignores properties the schema does not name, so a whole `evo_revision`
|
|
22
|
+
* result can be passed straight back to `evo_add`.
|
|
23
|
+
*
|
|
24
|
+
* ## Result size
|
|
25
|
+
*
|
|
26
|
+
* `evo_list` and `evo_revision` answer with JSON carried as MCP *text*
|
|
27
|
+
* content, so the JSON-RPC serializer escapes it a second time on the way
|
|
28
|
+
* out and a modest result can encode to a much longer line (a subject of
|
|
29
|
+
* quote characters is the worst case). A response whose encoded line exceeds
|
|
30
|
+
* the transport cap is not lost: `fjs/mcp/stdio` retries with a small
|
|
31
|
+
* `-32603` body carrying the request's `id`, so every request still gets a
|
|
32
|
+
* response and the process never crashes. That is the transport's contract
|
|
33
|
+
* for every tool — `cas_get` has proofs for the same double-escaping path —
|
|
34
|
+
* and no tool here can pre-empt it: whether the encoded response fits is
|
|
35
|
+
* known only by encoding it, which is the transport's job, and guessing from
|
|
36
|
+
* an unencoded size is exactly the size estimate that must never be made.
|
|
37
|
+
*
|
|
38
|
+
* These tools are not served by their own process: `fjs/cas/mcp` (the same
|
|
39
|
+
* server as `cas_add`/`cas_get`/`cas_list`) builds one `Evo<O>` from its own
|
|
40
|
+
* `Cas<O>` and cache slot, concatenates `evoToolRegistry` onto its own
|
|
41
|
+
* registry, and serves everything from that single process — one `~/.cas/`
|
|
42
|
+
* store, one Evo cache, one server.
|
|
43
|
+
*
|
|
44
|
+
* @module
|
|
45
|
+
*/
|
|
46
|
+
import { string, option, array } from '../../../types/rtti/module.f.js';
|
|
47
|
+
import { pure, step } from '../../../effects/module.f.js';
|
|
48
|
+
import {} from '../../../effects/memory/module.f.js';
|
|
49
|
+
import { toolEntry, errorResult, okResult, } from '../../../mcp/module.f.js';
|
|
50
|
+
import { stringify } from '../../../media/json/module.f.js';
|
|
51
|
+
import { identity } from '../../../types/function/module.f.js';
|
|
52
|
+
import {} from '../module.f.js';
|
|
53
|
+
// ── Argument schemas (declared once, used for both inputSchema and validate) ─────
|
|
54
|
+
/** Arguments for `evo_list`: none. */
|
|
55
|
+
export const evoListArgs = {};
|
|
56
|
+
/** Arguments for `evo_head`: the subject whose current heads are requested. */
|
|
57
|
+
export const evoHeadArgs = {
|
|
58
|
+
subject: string,
|
|
59
|
+
};
|
|
60
|
+
/** Arguments for `evo_revision`: the hash of the revision to read. */
|
|
61
|
+
export const evoRevisionArgs = {
|
|
62
|
+
hash: string,
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Arguments for `evo_add`: a new revision, per `fjs/cas/evo`'s
|
|
66
|
+
* `RevisionData` — every field of it the caller supplies, i.e. all but
|
|
67
|
+
* `generation`, which the server computes.
|
|
68
|
+
*/
|
|
69
|
+
export const evoAddArgs = {
|
|
70
|
+
parents: array(string),
|
|
71
|
+
snapshot: option(string),
|
|
72
|
+
subject: option(string),
|
|
73
|
+
archived: option(true),
|
|
74
|
+
};
|
|
75
|
+
// ── Tool registry ────────────────────────────────────────────────────────────────
|
|
76
|
+
/** Canonical JSON encoder for the `evo_list` and `evo_revision` results. */
|
|
77
|
+
const toJson = stringify(identity);
|
|
78
|
+
/** Registry of all Evo tools, bound to an `Evo<O>`. */
|
|
79
|
+
export const evoToolRegistry = (e) => [
|
|
80
|
+
toolEntry('evo_list', 'List all subjects with at least one stored revision, as a JSON array of strings.', evoListArgs,
|
|
81
|
+
// Subjects are arbitrary caller-supplied strings (unlike hashes, not
|
|
82
|
+
// constrained to a newline-free alphabet), so a `join('\n')` line
|
|
83
|
+
// format could not represent an empty subject or one containing a
|
|
84
|
+
// newline without ambiguity — JSON encoding can.
|
|
85
|
+
() => step(e.list(), subjects => pure(okResult(toJson(subjects))))),
|
|
86
|
+
toolEntry('evo_head', 'List the current head hashes (cBase32) of a subject, one per line. Empty when the subject is unknown.', evoHeadArgs, ({ subject }) => step(e.head(subject), heads => pure(okResult(heads.join('\n'))))),
|
|
87
|
+
toolEntry('evo_revision', 'Read one revision by hash, as JSON: `{ subject, parents, snapshot, generation, archived? }`. `parents[0]` is the mainline parent and every further entry is a merged-in branch; `parents` and `snapshot` come back in their canonical cBase32 spelling, so they compare directly against `evo_head` output. Errors when the hash is not cBase32, is not present in the store, could not be read, or does not hold a `vnd.fjs.revision` blob — use `cas_get` for raw bytes of non-revision content.', evoRevisionArgs,
|
|
88
|
+
// The revision goes out as JSON in a text content item, like
|
|
89
|
+
// `evo_list`'s. An encoded response that outgrows the transport cap is
|
|
90
|
+
// the transport's `-32603`, not a tool-level error — see "Result size"
|
|
91
|
+
// in the module doc.
|
|
92
|
+
({ hash }) => step(e.revision(hash), result => pure(result[0] === 'error' ? errorResult(result[1]) : okResult(toJson(result[1]))))),
|
|
93
|
+
toolEntry('evo_add', 'Add a new revision (a `vnd.fjs.revision` blob) and return its hash (cBase32). `subject` is required unless there is exactly one parent, from which it is inherited. `snapshot`, when omitted, is resolved from the parents (zero parents → `subject`, one parent → the parent\'s snapshot; a merge requires an explicit `snapshot`) and written explicitly. `generation` is computed by the server.', evoAddArgs, (input) => step(e.add(input), result => pure(result[0] === 'error' ? errorResult(result[1]) : okResult(result[1])))),
|
|
94
|
+
];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const proof: {
|
|
2
|
+
toolNamesMatchTheDesign: () => void;
|
|
3
|
+
evoListReflectsTheCache: () => void;
|
|
4
|
+
evoListEncodesArbitrarySubjectsAsJson: () => void;
|
|
5
|
+
evoHeadReflectsTheCache: () => void;
|
|
6
|
+
evoHeadMissingSubjectIsInvalidArguments: () => void;
|
|
7
|
+
evoRevisionReturnsRevisionJson: () => void;
|
|
8
|
+
evoRevisionDomainErrorIsError: () => void;
|
|
9
|
+
evoAddSuccessReturnsHash: () => void;
|
|
10
|
+
evoAddDomainErrorIsError: () => void;
|
|
11
|
+
};
|