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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
2
|
+
import { fileCas } from '../../module.f.js';
|
|
3
|
+
import { sha256 } from '../../../crypto/sha2/module.f.js';
|
|
4
|
+
import { emptyState, virtual } from '../../../effects/node/virtual/module.f.js';
|
|
5
|
+
import { vec8 } from '../../../types/bit_vec/module.f.js';
|
|
6
|
+
import { vecToCBase32 } from '../../../basen/cbase32/module.f.js';
|
|
7
|
+
import { initEvo, evo } from '../module.f.js';
|
|
8
|
+
import { evoToolRegistry } from './module.f.js';
|
|
9
|
+
const home = '/home/user';
|
|
10
|
+
const findEntry = (registry, name) => {
|
|
11
|
+
const entry = registry.find(e => e.name === name);
|
|
12
|
+
assert(entry !== undefined, ['missing tool entry', name]);
|
|
13
|
+
return entry;
|
|
14
|
+
};
|
|
15
|
+
const textOf = (result) => {
|
|
16
|
+
const [item] = result.content;
|
|
17
|
+
assert(item.type === 'text', ['expected a text content item', item]);
|
|
18
|
+
return item.text;
|
|
19
|
+
};
|
|
20
|
+
export const proof = {
|
|
21
|
+
toolNamesMatchTheDesign: () => {
|
|
22
|
+
const e = {
|
|
23
|
+
list: () => { throw 'unused'; },
|
|
24
|
+
head: () => { throw 'unused'; },
|
|
25
|
+
add: () => { throw 'unused'; },
|
|
26
|
+
revision: () => { throw 'unused'; },
|
|
27
|
+
};
|
|
28
|
+
assertEq(evoToolRegistry(e).map(entry => entry.name).join(','), 'evo_list,evo_head,evo_revision,evo_add');
|
|
29
|
+
},
|
|
30
|
+
evoListReflectsTheCache: () => {
|
|
31
|
+
const c = fileCas(sha256)(home);
|
|
32
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
33
|
+
const e = evo(c)(cacheKey);
|
|
34
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_list');
|
|
35
|
+
const [, result] = virtual(state0)(entry.handle({}));
|
|
36
|
+
assert(!result.isError);
|
|
37
|
+
assertEq(textOf(result), '[]');
|
|
38
|
+
},
|
|
39
|
+
// Regression: subjects are arbitrary strings, not constrained to a
|
|
40
|
+
// newline-free alphabet like hashes, so evo_list must not join them with
|
|
41
|
+
// '\n' — a subject containing a newline, or an empty subject, would be
|
|
42
|
+
// indistinguishable from multiple/no subjects in that format. JSON
|
|
43
|
+
// encoding preserves both exactly.
|
|
44
|
+
evoListEncodesArbitrarySubjectsAsJson: () => {
|
|
45
|
+
const c = fileCas(sha256)(home);
|
|
46
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
47
|
+
const e = evo(c)(cacheKey);
|
|
48
|
+
const [state1, addA] = virtual(state0)(e.add({ parents: [], subject: 'line one\nline two', snapshot: vecToCBase32(vec8(0x2an)) }));
|
|
49
|
+
assert(addA[0] === 'ok', ['expected add ok', addA]);
|
|
50
|
+
const [state2, addB] = virtual(state1)(e.add({ parents: [], subject: '', snapshot: vecToCBase32(vec8(0x2bn)) }));
|
|
51
|
+
assert(addB[0] === 'ok', ['expected add ok', addB]);
|
|
52
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_list');
|
|
53
|
+
const [, result] = virtual(state2)(entry.handle({}));
|
|
54
|
+
assert(!result.isError);
|
|
55
|
+
const subjects = JSON.parse(textOf(result));
|
|
56
|
+
assertEq(subjects.length, 2);
|
|
57
|
+
assert(subjects.includes('line one\nline two'), ['unexpected subjects', subjects]);
|
|
58
|
+
assert(subjects.includes(''), ['unexpected subjects', subjects]);
|
|
59
|
+
},
|
|
60
|
+
evoHeadReflectsTheCache: () => {
|
|
61
|
+
const c = fileCas(sha256)(home);
|
|
62
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
63
|
+
const e = evo(c)(cacheKey);
|
|
64
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_head');
|
|
65
|
+
const [, result] = virtual(state0)(entry.handle({ subject: 'nope' }));
|
|
66
|
+
assert(!result.isError);
|
|
67
|
+
assertEq(textOf(result), '');
|
|
68
|
+
},
|
|
69
|
+
evoHeadMissingSubjectIsInvalidArguments: () => {
|
|
70
|
+
const c = fileCas(sha256)(home);
|
|
71
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
72
|
+
const e = evo(c)(cacheKey);
|
|
73
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_head');
|
|
74
|
+
const [, result] = virtual(state0)(entry.handle({}));
|
|
75
|
+
assertEq(result.isError, true);
|
|
76
|
+
},
|
|
77
|
+
// Covers evo_revision's success branch: the stored revision comes back as
|
|
78
|
+
// the JSON of `RevisionData` — `dialect` dropped, `generation` and the
|
|
79
|
+
// resolved `snapshot` included.
|
|
80
|
+
evoRevisionReturnsRevisionJson: () => {
|
|
81
|
+
const c = fileCas(sha256)(home);
|
|
82
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
83
|
+
const e = evo(c)(cacheKey);
|
|
84
|
+
const subject = vecToCBase32(vec8(0x3n));
|
|
85
|
+
const [state1, added] = virtual(state0)(e.add({ parents: [], subject }));
|
|
86
|
+
assert(added[0] === 'ok', ['expected add ok', added]);
|
|
87
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_revision');
|
|
88
|
+
const [, result] = virtual(state1)(entry.handle({ hash: added[1] }));
|
|
89
|
+
assert(!result.isError);
|
|
90
|
+
assertEq(textOf(result), `{"subject":"${subject}","parents":[],"snapshot":"${subject}","generation":0}`);
|
|
91
|
+
},
|
|
92
|
+
// Covers evo_revision's error branch: a domain-level failure (a hash the
|
|
93
|
+
// store has nothing under) is surfaced as isError with the message.
|
|
94
|
+
evoRevisionDomainErrorIsError: () => {
|
|
95
|
+
const c = fileCas(sha256)(home);
|
|
96
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
97
|
+
const e = evo(c)(cacheKey);
|
|
98
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_revision');
|
|
99
|
+
const [, result] = virtual(state0)(entry.handle({ hash: vecToCBase32(vec8(0x4n)) }));
|
|
100
|
+
assertEq(result.isError, true);
|
|
101
|
+
assert(textOf(result).includes('revision not found'));
|
|
102
|
+
},
|
|
103
|
+
// Covers evo_add's success branch: a valid revision is stored and its
|
|
104
|
+
// hash comes back as plain, non-error text.
|
|
105
|
+
evoAddSuccessReturnsHash: () => {
|
|
106
|
+
const c = fileCas(sha256)(home);
|
|
107
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
108
|
+
const e = evo(c)(cacheKey);
|
|
109
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_add');
|
|
110
|
+
const args = { parents: [], subject: 'doc', snapshot: vecToCBase32(vec8(0x1n)) };
|
|
111
|
+
const [, result] = virtual(state0)(entry.handle(args));
|
|
112
|
+
assert(!result.isError);
|
|
113
|
+
assert(textOf(result).length > 0);
|
|
114
|
+
},
|
|
115
|
+
// Covers evo_add's error branch: a domain-level failure (Evo.add's
|
|
116
|
+
// Result) is surfaced as isError with the failure message as text.
|
|
117
|
+
evoAddDomainErrorIsError: () => {
|
|
118
|
+
const c = fileCas(sha256)(home);
|
|
119
|
+
const [state0, cacheKey] = virtual(emptyState)(initEvo(c));
|
|
120
|
+
const e = evo(c)(cacheKey);
|
|
121
|
+
const entry = findEntry(evoToolRegistry(e), 'evo_add');
|
|
122
|
+
const [, result] = virtual(state0)(entry.handle({ parents: [] }));
|
|
123
|
+
assertEq(result.isError, true);
|
|
124
|
+
assert(textOf(result).includes('subject is required'));
|
|
125
|
+
},
|
|
126
|
+
};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evo API: subjects and revision heads, cached in memory over an immutable
|
|
3
|
+
* content-addressable store.
|
|
4
|
+
*
|
|
5
|
+
* A `Cas<O>` stores `vnd.fjs.revision` blobs ([`fjs/media/revision`](../../media/revision/module.f.ts))
|
|
6
|
+
* like any other content: as immutable bytes under a hash. Resolving "what
|
|
7
|
+
* are the current heads of subject X" from that store means walking every
|
|
8
|
+
* stored revision and reversing the parent links — too expensive to redo on
|
|
9
|
+
* every query. This module scans the store once into an in-memory `Cache`
|
|
10
|
+
* ([`fjs/effects/memory`](../../effects/memory/module.f.ts)) mapping subject →
|
|
11
|
+
* head hashes, then keeps the cache current as new revisions are `add`ed
|
|
12
|
+
* through it — or, for a revision stored some other way (e.g. the generic
|
|
13
|
+
* `cas_add` MCP tool), via {@link syncRevision}.
|
|
14
|
+
*
|
|
15
|
+
* A **head** of a subject is any stored revision of that subject whose hash
|
|
16
|
+
* is not referenced as a `parents` entry by another revision of the same
|
|
17
|
+
* subject (see [`fjs/media/revision/README.md`](../../media/revision/README.md)).
|
|
18
|
+
* `Cache` therefore tracks, per subject, every revision hash seen and every
|
|
19
|
+
* hash referenced as somebody's parent; heads are the set difference between
|
|
20
|
+
* the two, computed at read time ({@link headsOf}). Storing both sets rather
|
|
21
|
+
* than a running head list is what makes folding revisions truly order
|
|
22
|
+
* independent: `cas.list()` (used by {@link buildCache} to scan an existing
|
|
23
|
+
* store) returns hashes in hash order, not revision ancestry, so a child can
|
|
24
|
+
* be seen before its parent — an incremental "drop this hash from the head
|
|
25
|
+
* set, then re-add whichever hash we just saw" would wrongly resurrect the
|
|
26
|
+
* parent as a head once it is scanned after its child. Tracking the two sets
|
|
27
|
+
* separately and only subtracting at read time has no such ordering
|
|
28
|
+
* dependency: whichever order revisions are folded in, `hashes − parents`
|
|
29
|
+
* converges to the same result. {@link buildCache} and {@link addRevision}
|
|
30
|
+
* both fold through the same {@link addRevisionToCache}, the former over the
|
|
31
|
+
* whole store at once, the latter incrementally for one new revision.
|
|
32
|
+
*
|
|
33
|
+
* Not everything here is cache-backed: {@link readRevision} answers "what is
|
|
34
|
+
* the revision at this hash" straight from the store, decoded, validated, and
|
|
35
|
+
* with every hash canonicalized ({@link toRevisionData}). It is the typed
|
|
36
|
+
* counterpart of a raw blob read — {@link addRevision} validates on the way
|
|
37
|
+
* in, {@link readRevision} on the way out — and both speak the same
|
|
38
|
+
* {@link RevisionData} vocabulary.
|
|
39
|
+
*
|
|
40
|
+
* @module
|
|
41
|
+
*/
|
|
42
|
+
import { type Effect, type Operation } from '../../effects/module.f.ts';
|
|
43
|
+
import { type Key, type MemOp } from '../../effects/memory/module.f.ts';
|
|
44
|
+
import { type Cas } from '../module.f.ts';
|
|
45
|
+
import { type Revision } from '../../media/revision/module.f.ts';
|
|
46
|
+
import { type Result } from '../../types/result/module.f.ts';
|
|
47
|
+
import { type StringMap } from '../../types/object/module.f.ts';
|
|
48
|
+
import type { Vec } from '../../types/bit_vec/module.f.ts';
|
|
49
|
+
/** A cBase32 content hash, as accepted/returned by `Cas<O>`. */
|
|
50
|
+
export type Hash = string;
|
|
51
|
+
/** The identity of a mutable object whose revisions are being evolved. */
|
|
52
|
+
export type Subject = string;
|
|
53
|
+
/**
|
|
54
|
+
* The semantic content of a revision: the media-level `Revision`
|
|
55
|
+
* (`fjs/media/revision`) minus `dialect`, which is a serialization tag
|
|
56
|
+
* carrying no information once decoding has validated it. One structure is
|
|
57
|
+
* the vocabulary of both directions — {@link addRevision} takes it,
|
|
58
|
+
* {@link readRevision} returns it — so what you add is what you get back, and
|
|
59
|
+
* a value read back can be fed to `add` unchanged, without stripping fields.
|
|
60
|
+
* Every direction-specific field is therefore optional, with the guarantees
|
|
61
|
+
* documented per field rather than typed:
|
|
62
|
+
*
|
|
63
|
+
* - `parents` — required in both directions; index 0 is the mainline parent.
|
|
64
|
+
* On output the entries are canonical cBase32 spellings
|
|
65
|
+
* ({@link canonicalHash}), so they compare directly against {@link Evo.head}
|
|
66
|
+
* output.
|
|
67
|
+
* - `subject` — input: absent means "inherit from my single parent" (see
|
|
68
|
+
* {@link resolveSubject}); output: always present.
|
|
69
|
+
* - `snapshot` — input: absent is a write-boundary convenience resolved from
|
|
70
|
+
* the parents (see {@link resolveSnapshot}), because the stored blob
|
|
71
|
+
* requires it explicitly; output: always present, canonical, and exactly
|
|
72
|
+
* what the stored blob names.
|
|
73
|
+
* - `archived` — genuinely optional in both directions; the only field that
|
|
74
|
+
* can be absent from a read.
|
|
75
|
+
* - `generation` — input: **ignored**, {@link computeGeneration} derives the
|
|
76
|
+
* authoritative value from the parents; output: always present. It exists as
|
|
77
|
+
* an input field only so a read value round-trips into `add` as-is.
|
|
78
|
+
*
|
|
79
|
+
* Relaxing what the format requires is the point, not an oversight. The stored
|
|
80
|
+
* `vnd.fjs.revision` blob requires `subject`, `snapshot` and `generation`, and
|
|
81
|
+
* {@link readRevision} does return all three — but this is not that blob's
|
|
82
|
+
* type. It is the type of the API that *reads and constructs* revisions, and
|
|
83
|
+
* its purpose is to make both easy: `add` asks only for what a caller can
|
|
84
|
+
* actually know, resolving or computing the rest at the write boundary, and a
|
|
85
|
+
* read hands back a value that goes straight into `add` again. A separate
|
|
86
|
+
* output type with `subject`/`snapshot`/`generation` required would state that
|
|
87
|
+
* one direction more precisely, at the cost of splitting the one vocabulary
|
|
88
|
+
* into two — the trade this API declines, deliberately and not by omission.
|
|
89
|
+
* `fjs/media/revision`'s `Revision` remains the all-required type of the
|
|
90
|
+
* stored blob for anyone who wants it.
|
|
91
|
+
*/
|
|
92
|
+
export type RevisionData = {
|
|
93
|
+
readonly parents: readonly Hash[];
|
|
94
|
+
readonly snapshot?: Hash | undefined;
|
|
95
|
+
readonly subject?: Subject | undefined;
|
|
96
|
+
readonly archived?: true | undefined;
|
|
97
|
+
readonly generation?: number | undefined;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Per-subject bookkeeping: every revision hash seen for the subject, and
|
|
101
|
+
* every hash any of those revisions names as a parent. See the module doc
|
|
102
|
+
* for why both sets are kept (rather than a running head list) and
|
|
103
|
+
* {@link headsOf} for how heads are derived from them.
|
|
104
|
+
*/
|
|
105
|
+
export type SubjectState = {
|
|
106
|
+
readonly hashes: readonly Hash[];
|
|
107
|
+
readonly parents: readonly Hash[];
|
|
108
|
+
};
|
|
109
|
+
/** In-memory index: subject → its {@link SubjectState}. */
|
|
110
|
+
export type Cache = {
|
|
111
|
+
readonly bySubject: StringMap<string, SubjectState>;
|
|
112
|
+
};
|
|
113
|
+
/** A cache with no known subjects yet — the starting point for {@link buildCache}. */
|
|
114
|
+
export declare const emptyCache: Cache;
|
|
115
|
+
/**
|
|
116
|
+
* Decodes already-read bytes as a `vnd.fjs.revision`. Returns `null` for
|
|
117
|
+
* anything that is not a valid revision — bytes that are not valid UTF-8, or
|
|
118
|
+
* text that does not parse/validate as the dialect.
|
|
119
|
+
*/
|
|
120
|
+
export declare const decodeRevisionVec: (value: Vec) => Revision | null;
|
|
121
|
+
/**
|
|
122
|
+
* Reads and decodes the blob at `hash` as a `vnd.fjs.revision`. Returns
|
|
123
|
+
* `null` for anything that is not a valid revision — a missing hash, or (via
|
|
124
|
+
* {@link decodeRevisionVec}) bytes that are not valid UTF-8 or do not
|
|
125
|
+
* parse/validate as the dialect — so a store containing arbitrary other
|
|
126
|
+
* content can be scanned without failing the whole cache build.
|
|
127
|
+
*/
|
|
128
|
+
export declare const decodeRevisionBlob: <O extends Operation>(cas: Cas<O>) => (hash: Vec) => Effect<O, Revision | null>;
|
|
129
|
+
/**
|
|
130
|
+
* Scans every hash in `cas` and builds a fresh {@link Cache} from the
|
|
131
|
+
* `vnd.fjs.revision` blobs found among them. Non-revision blobs are ignored.
|
|
132
|
+
*/
|
|
133
|
+
export declare const buildCache: <O extends Operation>(cas: Cas<O>) => Effect<O, Cache>;
|
|
134
|
+
/** Scans `cas` once and allocates a memory slot holding the resulting {@link Cache}. */
|
|
135
|
+
export declare const initEvo: <O extends Operation>(cas: Cas<O>) => Effect<O | MemOp, Key<Cache>>;
|
|
136
|
+
/**
|
|
137
|
+
* Folds `value` — bytes already written to a `Cas` at `hash` by some other
|
|
138
|
+
* caller — into the cache at `cacheKey` if it decodes as a `vnd.fjs.revision`
|
|
139
|
+
* ({@link decodeRevisionVec}); a no-op otherwise. `cas_add`/`evo_add`
|
|
140
|
+
* (`fjs/cas/mcp`) are two ways to reach the same store — a plain `cas_add`
|
|
141
|
+
* call can store a revision blob without going through {@link addRevision},
|
|
142
|
+
* and this is what keeps the cache honest about it without rescanning the
|
|
143
|
+
* whole store.
|
|
144
|
+
*/
|
|
145
|
+
export declare const syncRevision: (cacheKey: Key<Cache>) => (hash: Vec) => (value: Vec) => Effect<MemOp, void>;
|
|
146
|
+
/**
|
|
147
|
+
* Adds a new revision to `cas` and folds it into the cache at `cacheKey`.
|
|
148
|
+
*
|
|
149
|
+
* Steps: resolve and validate every parent ({@link resolveParents}), resolve
|
|
150
|
+
* `subject` from them ({@link resolveSubject}) and check every parent
|
|
151
|
+
* actually belongs to it ({@link validateParentSubjects}), resolve `snapshot`
|
|
152
|
+
* ({@link resolveSnapshot}) and compute `generation`
|
|
153
|
+
* ({@link computeGeneration}), assemble a `Revision` and check its hash /
|
|
154
|
+
* generation semantics (`fjs/media/revision` `checkReferences` — the same rule
|
|
155
|
+
* a reader applies; the shape itself is already guaranteed by this function's
|
|
156
|
+
* own field types), encode and write it to `cas`, then fold the new revision
|
|
157
|
+
* into the cache. Every failure — an invalid or missing parent, a
|
|
158
|
+
* cross-subject parent, an unresolvable subject or snapshot, an invalid
|
|
159
|
+
* revision, a blob too large to encode, or a store write failure — is
|
|
160
|
+
* reported as `error(message)` rather than thrown, so a caller (e.g. an MCP
|
|
161
|
+
* tool handler) can surface it without a `throw`/`catch`.
|
|
162
|
+
*
|
|
163
|
+
* `input.generation` is ignored: it exists on {@link RevisionData} only so a
|
|
164
|
+
* value read back by {@link readRevision} round-trips into `add` unchanged,
|
|
165
|
+
* and {@link computeGeneration} always derives the stored value from the
|
|
166
|
+
* resolved parents.
|
|
167
|
+
*/
|
|
168
|
+
export declare const addRevision: <O extends Operation>(cas: Cas<O>) => (cacheKey: Key<Cache>) => (input: RevisionData) => Effect<O | MemOp, Result<Hash, string>>;
|
|
169
|
+
/**
|
|
170
|
+
* Reads the revision at `hash`: decoded, validated, and canonicalized
|
|
171
|
+
* ({@link toRevisionData}). The typed counterpart of a raw `cas.read` — the
|
|
172
|
+
* store's generic "bytes by hash" read stays available for arbitrary content
|
|
173
|
+
* (snapshots and everything else that is not a revision), while this is the
|
|
174
|
+
* view for revisions specifically: `add` validates on the way in, this
|
|
175
|
+
* validates on the way out, so no caller re-implements JSON parsing, schema
|
|
176
|
+
* validation, the `dialect` check, or hash canonicalization.
|
|
177
|
+
*
|
|
178
|
+
* Every way to fail is its own message: `hash` is not cBase32, the store has
|
|
179
|
+
* nothing under it, the store has it but could not deliver it, or what it
|
|
180
|
+
* holds is not a `vnd.fjs.revision` (see {@link decodeReadRevision}).
|
|
181
|
+
*/
|
|
182
|
+
export declare const readRevision: <O extends Operation>(cas: Cas<O>) => (hash: Hash) => Effect<O, Result<RevisionData, string>>;
|
|
183
|
+
/** The Evo API described in `fjs/cas/evo/README.md`, bound to a `Cas<O>` and its cache slot. */
|
|
184
|
+
export type Evo<O extends Operation> = {
|
|
185
|
+
/** Returns every subject with at least one stored revision. */
|
|
186
|
+
readonly list: () => Effect<MemOp, readonly Subject[]>;
|
|
187
|
+
/** Returns the current head hashes of `subject` (empty if unknown). */
|
|
188
|
+
readonly head: (subject: Subject) => Effect<MemOp, readonly Hash[]>;
|
|
189
|
+
/** Adds a new head; see {@link addRevision}. */
|
|
190
|
+
readonly add: (input: RevisionData) => Effect<O | MemOp, Result<Hash, string>>;
|
|
191
|
+
/**
|
|
192
|
+
* The revision at `hash`, decoded, validated, and canonicalized; see
|
|
193
|
+
* {@link readRevision}. Served from the store today, so the `MemOp` in the
|
|
194
|
+
* declared operation set is unused — it is there because a revision is
|
|
195
|
+
* immutable and therefore memoizable in the same cache slot the other
|
|
196
|
+
* operations read, which must not become a breaking change to this type
|
|
197
|
+
* when it happens.
|
|
198
|
+
*/
|
|
199
|
+
readonly revision: (hash: Hash) => Effect<O | MemOp, Result<RevisionData, string>>;
|
|
200
|
+
};
|
|
201
|
+
/** Builds the {@link Evo} API over `cas`, backed by the cache at `cacheKey` (see {@link initEvo}). */
|
|
202
|
+
export declare const evo: <O extends Operation>(cas: Cas<O>) => (cacheKey: Key<Cache>) => Evo<O>;
|