bashkit 0.14.5__tar.gz → 0.15.0__tar.gz
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.
- {bashkit-0.14.5 → bashkit-0.15.0}/Cargo.lock +20 -10
- {bashkit-0.14.5 → bashkit-0.15.0}/Cargo.toml +1 -1
- {bashkit-0.14.5 → bashkit-0.15.0}/PKG-INFO +1 -1
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/__init__.py +8 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/_bashkit.pyi +139 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/Cargo.toml +4 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/README.md +7 -0
- bashkit-0.15.0/crates/bashkit/benches/results/criterion-snapshot-history-baseline-linux-x86_64-1785444523.md +118 -0
- bashkit-0.15.0/crates/bashkit/benches/snapshot_history.rs +213 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/threat-model.md +10 -0
- bashkit-0.15.0/crates/bashkit/examples/generate_snapshot_fixtures.rs +51 -0
- bashkit-0.15.0/crates/bashkit/examples/large_binary_probe.rs +86 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/analysis.rs +46 -2
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/error.rs +20 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/memory.rs +2 -2
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/traits.rs +0 -6
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/arithmetic.rs +19 -4
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/glob.rs +107 -65
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/mod.rs +54 -6
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/lib.rs +120 -5
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/lexer.rs +64 -11
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/mod.rs +31 -2
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/capabilities.rs +1 -5
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/container.rs +14 -20
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/graph.rs +4 -10
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/mod.rs +70 -44
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/tool.rs +3 -0
- bashkit-0.15.0/crates/bashkit/tests/integration/exec_options_tests.rs +269 -0
- bashkit-0.15.0/crates/bashkit/tests/integration/glob_intermediate_component_tests.rs +226 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/main.rs +2 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/proptest_differential.rs +29 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/script_analysis.rs +61 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/security_audit_pocs.rs +50 -4
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/snapshot_fixture_tests.rs +10 -3
- bashkit-0.15.0/crates/bashkit/tests/integration/snapshot_history_tests.rs +1336 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/snapshot_tests.rs +22 -10
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/proptest_security.rs +56 -10
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +29 -0
- bashkit-0.15.0/crates/bashkit-python/examples/session_history.py +174 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/src/lib.rs +468 -0
- bashkit-0.15.0/crates/bashkit-python/tests/test_snapshot_history.py +310 -0
- bashkit-0.14.5/crates/bashkit/tests/integration/exec_options_tests.rs +0 -73
- {bashkit-0.14.5 → bashkit-0.15.0}/README.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/deepagents.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/langchain.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/py.typed +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/pydantic_ai.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/file_ops.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/hotpath.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/parallel_execution.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/README.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-file_ops-linux-x86_64-1779759850.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-hotpath-attrs+shopt-linux-x86_64-1779759850.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-hotpath-perf-linux-x86_64-1779744742.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-(none)-linux-x86_64-1773469129.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782162173.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782168239.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1777865268.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/sqlite.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/clap-builtins.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/compatibility.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/credential-injection.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/custom_builtins.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/hooks.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/jq.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/live_mounts.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/logging.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/namespace_filesystems.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/python.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/script-analysis.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/sqlite.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/ssh.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/typescript.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/agent_tool.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/basic.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/clap_builtin.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_backend.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_builtins.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_fs.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/dump_builtins.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/git_workflow.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/live_mounts.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/namespace_rebase.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/namespace_sandbox.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/python_external_functions.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/python_scripts.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/realfs_readonly.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/resource_limits.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/scripted_tool.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/show_tool_output.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/sqlite_basic.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/ssh_supabase.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/streaming_output.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/text_files.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/text_processing.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/typescript_scripts.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/virtual_identity.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/out file.txt +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/alias.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/archive.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/assert.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/interpreter.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/parser.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/base64.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/bc.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/caller.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/cat.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/checksum.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/clap_env.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/clear.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/column.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/comm.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/compgen.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/csv.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/curl.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/cuttr.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/date.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/diff.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/dirstack.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/disk.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/dotenv.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/echo.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/environ.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/envsubst.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/expand.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/export.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/expr.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fc.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fileops.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/flow.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fold.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/cat_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/extendedbigdecimal.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/argument.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/escape.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/human.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/num_format.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/spec.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format_support.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/ls_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/mktemp_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/num_parser.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/od_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/readlink_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/realpath_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/shuf_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/stat_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/tac_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/tee_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/truncate_args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/client.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/config.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/grep.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/headtail.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/help.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/helpers.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/hextools.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/http.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/iconv.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/inspect.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/introspect.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/join.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/args.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/format.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/json.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/limits.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/log.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/find.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/glob.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/list.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/rmdir.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mapfile.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/navigation.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/nl.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/numfmt.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/parallel.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/paste.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/patch.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/path.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/pipeline.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/printf.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/python.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/read.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/retry.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/rg/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/runtime_limits.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/search_common.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sed.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/semver.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/seq.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/shuf.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sleep.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/source.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/split.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/strings.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/system.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/template.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/textrev.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/timeout.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/tomlq.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/trap.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/tree.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/truncate.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/typescript.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/vars.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/verify.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/wait.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/wc.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/yaml.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/yes.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/credential.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/backend.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/limits.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/mountable.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/namespace.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/overlay.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/posix.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/readonly.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/realfs.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/search.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/hooks.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interop/fs.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interop/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/brace_expansion.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/expansion.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/jobs.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/redirection.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/state.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/limits.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/logging_impl.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/allowlist.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/bot_auth.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/client.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/transport.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/ast.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/budget.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/span.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/tokens.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/chunker.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/objects.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/testing.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/time_compat.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/tool_def.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/trace.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/fixtures/snapshots/v1.snapshot +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/fixtures/snapshots/v2.snapshot +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/agent_skills_publication_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/allexport_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_fuzz_scaffold_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_newline_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_pattern_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_printf_expr_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_range_pattern_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/background_exec_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/base64_binary_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/bash_source_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/blackbox_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/builtin_error_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/builtin_registry_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/byte_range_panic_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/cancellation_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/cmdsub_quote_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/compgen_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/coproc_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/coreutils_differential_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/credential_injection_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/custom_builtins_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/custom_fs_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/dev_null_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/final_env_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/find_multi_path_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/for_in_reserved_word_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_advanced_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_inspection_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_integration_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_remote_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/harness_example_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/history_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1175_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1776_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1777_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_274_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_275_279_282_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_276_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_277_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_289_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_290_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_291_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_853_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_872_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_873_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_875_test.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/jq_fuzz_scaffold_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/limitations_doc_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/limitations_evidence_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/live_mount_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/mkfifo_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/namespace_fs_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/nested_subscript_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/network_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/output_truncation_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/parallel_sessions_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/python_integration_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/python_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/regex_limit_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/release_profile_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/script_execution_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/set_e_and_or_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/shuf_resource_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/skills_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/source_function_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/spec_runner.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/spec_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_compat_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_differential_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_fuzz_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_integration_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/stack_overflow_regression_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/subst_depth_limit_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/symlink_overlay_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/threat_model_doc_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/threat_model_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/time_compat_scan_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/tty_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/typescript_integration_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/typescript_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/unicode_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/unset_function_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/urandom_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/workflow_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/logging_security_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/realfs_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cat.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/mktemp.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/od.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/Cargo.toml +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/README.md +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/bash_basics.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/data_pipeline.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/llm_tool.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_security_advanced.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_security_core.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_analyze.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_basic.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_builtins.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_control_flow.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_custom_builtin_fs.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_error_handling.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_integration.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_network_config.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_python_security.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_scripts.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_security.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_sqlite.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_teardown_determinism.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_vfs.py +0 -0
- {bashkit-0.14.5 → bashkit-0.15.0}/pyproject.toml +0 -0
|
@@ -386,7 +386,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
|
|
|
386
386
|
|
|
387
387
|
[[package]]
|
|
388
388
|
name = "bashkit"
|
|
389
|
-
version = "0.
|
|
389
|
+
version = "0.15.0"
|
|
390
390
|
dependencies = [
|
|
391
391
|
"anyhow",
|
|
392
392
|
"async-trait",
|
|
@@ -441,7 +441,7 @@ dependencies = [
|
|
|
441
441
|
|
|
442
442
|
[[package]]
|
|
443
443
|
name = "bashkit-bench"
|
|
444
|
-
version = "0.
|
|
444
|
+
version = "0.15.0"
|
|
445
445
|
dependencies = [
|
|
446
446
|
"anyhow",
|
|
447
447
|
"bashkit",
|
|
@@ -454,9 +454,19 @@ dependencies = [
|
|
|
454
454
|
"tokio",
|
|
455
455
|
]
|
|
456
456
|
|
|
457
|
+
[[package]]
|
|
458
|
+
name = "bashkit-capi"
|
|
459
|
+
version = "0.15.0"
|
|
460
|
+
dependencies = [
|
|
461
|
+
"bashkit",
|
|
462
|
+
"serde",
|
|
463
|
+
"serde_json",
|
|
464
|
+
"tokio",
|
|
465
|
+
]
|
|
466
|
+
|
|
457
467
|
[[package]]
|
|
458
468
|
name = "bashkit-cli"
|
|
459
|
-
version = "0.
|
|
469
|
+
version = "0.15.0"
|
|
460
470
|
dependencies = [
|
|
461
471
|
"anyhow",
|
|
462
472
|
"bashkit",
|
|
@@ -470,7 +480,7 @@ dependencies = [
|
|
|
470
480
|
|
|
471
481
|
[[package]]
|
|
472
482
|
name = "bashkit-coreutils-port"
|
|
473
|
-
version = "0.
|
|
483
|
+
version = "0.15.0"
|
|
474
484
|
dependencies = [
|
|
475
485
|
"anyhow",
|
|
476
486
|
"prettyplease",
|
|
@@ -484,7 +494,7 @@ dependencies = [
|
|
|
484
494
|
|
|
485
495
|
[[package]]
|
|
486
496
|
name = "bashkit-eval"
|
|
487
|
-
version = "0.
|
|
497
|
+
version = "0.15.0"
|
|
488
498
|
dependencies = [
|
|
489
499
|
"anyhow",
|
|
490
500
|
"async-trait",
|
|
@@ -501,7 +511,7 @@ dependencies = [
|
|
|
501
511
|
|
|
502
512
|
[[package]]
|
|
503
513
|
name = "bashkit-js"
|
|
504
|
-
version = "0.
|
|
514
|
+
version = "0.15.0"
|
|
505
515
|
dependencies = [
|
|
506
516
|
"bashkit",
|
|
507
517
|
"napi",
|
|
@@ -513,7 +523,7 @@ dependencies = [
|
|
|
513
523
|
|
|
514
524
|
[[package]]
|
|
515
525
|
name = "bashkit-python"
|
|
516
|
-
version = "0.
|
|
526
|
+
version = "0.15.0"
|
|
517
527
|
dependencies = [
|
|
518
528
|
"bashkit",
|
|
519
529
|
"num-bigint",
|
|
@@ -525,7 +535,7 @@ dependencies = [
|
|
|
525
535
|
|
|
526
536
|
[[package]]
|
|
527
537
|
name = "bashkit-wasm"
|
|
528
|
-
version = "0.
|
|
538
|
+
version = "0.15.0"
|
|
529
539
|
dependencies = [
|
|
530
540
|
"bashkit",
|
|
531
541
|
"console_error_panic_hook",
|
|
@@ -4317,9 +4327,9 @@ dependencies = [
|
|
|
4317
4327
|
|
|
4318
4328
|
[[package]]
|
|
4319
4329
|
name = "russh"
|
|
4320
|
-
version = "0.62.
|
|
4330
|
+
version = "0.62.5"
|
|
4321
4331
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
4322
|
-
checksum = "
|
|
4332
|
+
checksum = "da7c230e0ed9cbeb92fbad6c8848985d6df2a1464c0dc247a021abd666e9005e"
|
|
4323
4333
|
dependencies = [
|
|
4324
4334
|
"aes 0.9.1",
|
|
4325
4335
|
"aws-lc-rs",
|
|
@@ -51,11 +51,15 @@ from bashkit._bashkit import (
|
|
|
51
51
|
BashTool,
|
|
52
52
|
BuiltinContext,
|
|
53
53
|
BuiltinResult,
|
|
54
|
+
CapabilityFingerprint,
|
|
54
55
|
ExecResult,
|
|
55
56
|
FileSystem,
|
|
57
|
+
PackedCommit,
|
|
56
58
|
ScriptAnalysis,
|
|
57
59
|
ScriptedTool,
|
|
58
60
|
ShellState,
|
|
61
|
+
SnapshotDiff,
|
|
62
|
+
SnapshotGraph,
|
|
59
63
|
create_langchain_tool_spec,
|
|
60
64
|
get_version,
|
|
61
65
|
)
|
|
@@ -69,11 +73,15 @@ __all__ = [
|
|
|
69
73
|
"BuiltinContext",
|
|
70
74
|
"BuiltinResult",
|
|
71
75
|
"BashTool",
|
|
76
|
+
"CapabilityFingerprint",
|
|
72
77
|
"ExecResult",
|
|
73
78
|
"FileSystem",
|
|
79
|
+
"PackedCommit",
|
|
74
80
|
"ShellState",
|
|
75
81
|
"ScriptAnalysis",
|
|
76
82
|
"ScriptedTool",
|
|
83
|
+
"SnapshotDiff",
|
|
84
|
+
"SnapshotGraph",
|
|
77
85
|
"create_langchain_tool_spec",
|
|
78
86
|
"get_version",
|
|
79
87
|
]
|
|
@@ -688,6 +688,38 @@ class Bash:
|
|
|
688
688
|
"""
|
|
689
689
|
...
|
|
690
690
|
|
|
691
|
+
def commit(
|
|
692
|
+
self,
|
|
693
|
+
parents: list[str] | None = None,
|
|
694
|
+
meta: dict[str, str] | None = None,
|
|
695
|
+
have: list[str] | None = None,
|
|
696
|
+
exclude_filesystem: bool = False,
|
|
697
|
+
exclude_functions: bool = False,
|
|
698
|
+
) -> PackedCommit:
|
|
699
|
+
"""Capture state as a content-addressed commit for session history.
|
|
700
|
+
|
|
701
|
+
Pass ``have`` (ids your store already holds) to keep commits
|
|
702
|
+
incremental. A fork is a commit whose parent is not the branch tip.
|
|
703
|
+
"""
|
|
704
|
+
...
|
|
705
|
+
|
|
706
|
+
def checkout(
|
|
707
|
+
self,
|
|
708
|
+
commit_id: str,
|
|
709
|
+
objects: dict[str, bytes],
|
|
710
|
+
policy: str = "superset",
|
|
711
|
+
) -> None:
|
|
712
|
+
"""Restore the state a commit describes, pulling objects from a store.
|
|
713
|
+
|
|
714
|
+
``policy`` is ``"superset"`` (default), ``"strict"``, or ``"force"``.
|
|
715
|
+
Nothing is mutated if the checkout fails.
|
|
716
|
+
"""
|
|
717
|
+
...
|
|
718
|
+
|
|
719
|
+
def capabilities(self) -> CapabilityFingerprint:
|
|
720
|
+
"""Fingerprint this instance's environment."""
|
|
721
|
+
...
|
|
722
|
+
|
|
691
723
|
def snapshot(
|
|
692
724
|
self,
|
|
693
725
|
exclude_filesystem: bool = False,
|
|
@@ -1696,3 +1728,110 @@ def get_version() -> str:
|
|
|
1696
1728
|
True
|
|
1697
1729
|
"""
|
|
1698
1730
|
...
|
|
1731
|
+
|
|
1732
|
+
class PackedCommit:
|
|
1733
|
+
"""A commit plus the objects a host needs to persist."""
|
|
1734
|
+
|
|
1735
|
+
@property
|
|
1736
|
+
def id(self) -> str:
|
|
1737
|
+
"""Content address of this commit — store it per message."""
|
|
1738
|
+
...
|
|
1739
|
+
|
|
1740
|
+
@property
|
|
1741
|
+
def objects(self) -> dict[str, bytes]:
|
|
1742
|
+
"""Objects to persist, keyed by hex object id."""
|
|
1743
|
+
...
|
|
1744
|
+
|
|
1745
|
+
@property
|
|
1746
|
+
def object_count(self) -> int:
|
|
1747
|
+
"""Number of new objects this commit emitted."""
|
|
1748
|
+
...
|
|
1749
|
+
|
|
1750
|
+
@property
|
|
1751
|
+
def stored_bytes(self) -> int:
|
|
1752
|
+
"""Total encoded size of the new objects."""
|
|
1753
|
+
...
|
|
1754
|
+
|
|
1755
|
+
@property
|
|
1756
|
+
def is_self_contained(self) -> bool:
|
|
1757
|
+
"""Whether this commit carries every object needed to restore it."""
|
|
1758
|
+
...
|
|
1759
|
+
|
|
1760
|
+
def to_bytes(self) -> bytes:
|
|
1761
|
+
"""Serialize into one self-contained blob, like ``snapshot()``.
|
|
1762
|
+
|
|
1763
|
+
Raises ``BashError`` for an incremental commit, which omits objects.
|
|
1764
|
+
"""
|
|
1765
|
+
...
|
|
1766
|
+
|
|
1767
|
+
class SnapshotDiff:
|
|
1768
|
+
"""What changed between two commits."""
|
|
1769
|
+
|
|
1770
|
+
@property
|
|
1771
|
+
def files_added(self) -> list[str]: ...
|
|
1772
|
+
@property
|
|
1773
|
+
def files_modified(self) -> list[str]: ...
|
|
1774
|
+
@property
|
|
1775
|
+
def files_removed(self) -> list[str]: ...
|
|
1776
|
+
@property
|
|
1777
|
+
def shell_changed(self) -> bool: ...
|
|
1778
|
+
def is_empty(self) -> bool:
|
|
1779
|
+
"""True when nothing changed."""
|
|
1780
|
+
...
|
|
1781
|
+
|
|
1782
|
+
class CapabilityFingerprint:
|
|
1783
|
+
"""The environment that produced a commit."""
|
|
1784
|
+
|
|
1785
|
+
@property
|
|
1786
|
+
def bashkit_version(self) -> str: ...
|
|
1787
|
+
@property
|
|
1788
|
+
def builtins(self) -> list[str]: ...
|
|
1789
|
+
@property
|
|
1790
|
+
def features(self) -> list[str]: ...
|
|
1791
|
+
@property
|
|
1792
|
+
def fs_backend(self) -> str: ...
|
|
1793
|
+
|
|
1794
|
+
class SnapshotGraph:
|
|
1795
|
+
"""Read-only operations over a snapshot object graph.
|
|
1796
|
+
|
|
1797
|
+
Every method takes the objects it needs — bashkit never reaches into host
|
|
1798
|
+
storage — and walks only as far as the supplied store reaches.
|
|
1799
|
+
"""
|
|
1800
|
+
|
|
1801
|
+
@staticmethod
|
|
1802
|
+
def parents(commit_id: str, objects: dict[str, bytes]) -> list[str]:
|
|
1803
|
+
"""Commits this one descends from."""
|
|
1804
|
+
...
|
|
1805
|
+
|
|
1806
|
+
@staticmethod
|
|
1807
|
+
def meta(commit_id: str, objects: dict[str, bytes]) -> dict[str, str]:
|
|
1808
|
+
"""Host metadata attached when the commit was made."""
|
|
1809
|
+
...
|
|
1810
|
+
|
|
1811
|
+
@staticmethod
|
|
1812
|
+
def capabilities(commit_id: str, objects: dict[str, bytes]) -> CapabilityFingerprint:
|
|
1813
|
+
"""Capability fingerprint of the producing instance."""
|
|
1814
|
+
...
|
|
1815
|
+
|
|
1816
|
+
@staticmethod
|
|
1817
|
+
def ancestry(commit_id: str, objects: dict[str, bytes], limit: int = 100) -> list[str]:
|
|
1818
|
+
"""Walk ancestry newest-first, stopping at ``limit`` or a missing commit."""
|
|
1819
|
+
...
|
|
1820
|
+
|
|
1821
|
+
@staticmethod
|
|
1822
|
+
def plan_checkout(commit_id: str, objects: dict[str, bytes]) -> list[str]:
|
|
1823
|
+
"""Object ids needed to check out this commit that ``objects`` lacks.
|
|
1824
|
+
|
|
1825
|
+
Call repeatedly — each wave reveals the next — until it returns ``[]``.
|
|
1826
|
+
"""
|
|
1827
|
+
...
|
|
1828
|
+
|
|
1829
|
+
@staticmethod
|
|
1830
|
+
def reachable(commit_id: str, objects: dict[str, bytes]) -> list[str]:
|
|
1831
|
+
"""Every object this commit reaches, for host-side garbage collection."""
|
|
1832
|
+
...
|
|
1833
|
+
|
|
1834
|
+
@staticmethod
|
|
1835
|
+
def diff(commit_a: str, commit_b: str, objects: dict[str, bytes]) -> SnapshotDiff:
|
|
1836
|
+
"""Compare two commits."""
|
|
1837
|
+
...
|
|
@@ -532,6 +532,13 @@ See [crates/bashkit-bench/README.md](crates/bashkit-bench/README.md) for methodo
|
|
|
532
532
|
|
|
533
533
|
## Language Bindings
|
|
534
534
|
|
|
535
|
+
### C API
|
|
536
|
+
|
|
537
|
+
The experimental `libbashkit` native C ABI exposes opaque handles, synchronous
|
|
538
|
+
execution, and binary-safe virtual filesystem access. See
|
|
539
|
+
[`crates/bashkit-capi`](crates/bashkit-capi/README.md), including two runnable C
|
|
540
|
+
examples.
|
|
541
|
+
|
|
535
542
|
### Python
|
|
536
543
|
|
|
537
544
|
Python bindings with LangChain integration are available in [crates/bashkit-python](crates/bashkit-python/README.md).
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# criterion — snapshot_history — baseline
|
|
2
|
+
|
|
3
|
+
First run of `cargo bench -p bashkit --bench snapshot_history`, establishing the
|
|
4
|
+
baseline for the content-addressed snapshot object graph.
|
|
5
|
+
|
|
6
|
+
- **Host**: Intel Xeon @ 2.80 GHz, 4 vCPU, Linux x86_64 (no SHA-NI)
|
|
7
|
+
- **Command**: `cargo bench -p bashkit --bench snapshot_history -- --warm-up-time 1 --measurement-time 2`
|
|
8
|
+
- **Workload**: `N` small text files under `/w/src`, plus one 20 000-line file
|
|
9
|
+
under `/w/docs` so both the inline and chunked paths are exercised
|
|
10
|
+
- **Moniker**: `baseline` — first measurement of this bench, nothing to diff against
|
|
11
|
+
|
|
12
|
+
## Size — the number that motivated the work
|
|
13
|
+
|
|
14
|
+
Bytes for the same state, and the marginal cost of one more commit after
|
|
15
|
+
appending to a single file.
|
|
16
|
+
|
|
17
|
+
| files | v1 JSON | v2 packed | ratio | incremental commit |
|
|
18
|
+
|------:|--------:|----------:|------:|-------------------:|
|
|
19
|
+
| 10 | 330 594 | 43 816 | 7.55x | 1 151 |
|
|
20
|
+
| 100 | 354 896 | 56 600 | 6.27x | 4 419 |
|
|
21
|
+
| 500 | 464 496 | 113 756 | 4.08x | 18 929 |
|
|
22
|
+
|
|
23
|
+
The packed format alone is 4-7.5x smaller. The number that decides whether
|
|
24
|
+
per-message history is affordable is the last column: storing another commit
|
|
25
|
+
after a one-file edit costs **1.1 KB / 4.4 KB / 19 KB**, against a 330-464 KB
|
|
26
|
+
full v1 snapshot — 287x, 80x, and 24x cheaper respectively.
|
|
27
|
+
|
|
28
|
+
The ratio narrows as file count grows because the tree is a **single flat
|
|
29
|
+
object** listing every path, so each commit re-stores the whole tree. At 500
|
|
30
|
+
files that tree dominates the incremental cost. Splitting trees per directory
|
|
31
|
+
(git-style) would make it O(changed paths + depth) instead of O(total files);
|
|
32
|
+
see the known gaps in `knowledge/foundations/snapshot-history.md`.
|
|
33
|
+
|
|
34
|
+
## Capture
|
|
35
|
+
|
|
36
|
+
| workload | v1 JSON | v2 packed | v2 incremental |
|
|
37
|
+
|---|---:|---:|---:|
|
|
38
|
+
| 10 files | 2.02 ms | 4.41 ms | **715 µs** |
|
|
39
|
+
| 100 files | 2.21 ms | 5.81 ms | **853 µs** |
|
|
40
|
+
| 500 files | 2.88 ms | 11.25 ms | **1.46 ms** |
|
|
41
|
+
|
|
42
|
+
Packed capture is 2-4x *slower* than v1: it hashes, chunks, and deflates
|
|
43
|
+
everything, where v1 only serialized. That is the price of content addressing,
|
|
44
|
+
paid on the checkpoint/resume path.
|
|
45
|
+
|
|
46
|
+
The steady-state path is the incremental column — a warm store, so unchanged
|
|
47
|
+
objects are hashed but neither compressed nor emitted. It is 1.4-2.8x faster
|
|
48
|
+
than a v1 full snapshot *and* orders of magnitude smaller, which is the
|
|
49
|
+
combination session history needs.
|
|
50
|
+
|
|
51
|
+
## Restore
|
|
52
|
+
|
|
53
|
+
| workload | v1 JSON | v2 packed | v2 checkout |
|
|
54
|
+
|---|---:|---:|---:|
|
|
55
|
+
| 10 files | 2.78 ms | 1.38 ms | **1.16 ms** |
|
|
56
|
+
| 100 files | 3.00 ms | 1.74 ms | **1.43 ms** |
|
|
57
|
+
| 500 files | 4.04 ms | 3.70 ms | **3.05 ms** |
|
|
58
|
+
|
|
59
|
+
v2 restores faster than v1 at every size — decoding a binary container beats
|
|
60
|
+
parsing a JSON integer array per byte. `checkout` from a store beats unpacking
|
|
61
|
+
a container because it skips container framing entirely.
|
|
62
|
+
|
|
63
|
+
## Graph operations
|
|
64
|
+
|
|
65
|
+
100-file workspace, two commits.
|
|
66
|
+
|
|
67
|
+
| operation | time |
|
|
68
|
+
|---|---:|
|
|
69
|
+
| `diff` | 149 µs |
|
|
70
|
+
| `plan_checkout` (warm store) | 1.26 ms |
|
|
71
|
+
| `reachable` | 1.27 ms |
|
|
72
|
+
|
|
73
|
+
`diff` compares content addresses rather than content, so it never reads file
|
|
74
|
+
data — which is why it is an order of magnitude cheaper than the walks.
|
|
75
|
+
|
|
76
|
+
## Reading these numbers
|
|
77
|
+
|
|
78
|
+
Capture time is dominated by SHA-256, and this host has no SHA-NI (measured
|
|
79
|
+
~215 MB/s, against ~1.5-2 GB/s expected on hardware that has it). Expect the
|
|
80
|
+
packed-capture regression to shrink materially on production hardware. Nothing
|
|
81
|
+
here is hash-bound on the restore side.
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
## Large binary files
|
|
85
|
+
|
|
86
|
+
Separate probe (`cargo run --release -p bashkit --example large_binary_probe`),
|
|
87
|
+
incompressible pseudo-random content, single file, same host. Not a criterion
|
|
88
|
+
bench — one-shot timings, so treat them as magnitudes.
|
|
89
|
+
|
|
90
|
+
| size | objects | stored | commit | checkout | 16-byte edit | peak RSS |
|
|
91
|
+
|-----:|--------:|-------:|-------:|---------:|-------------:|---------:|
|
|
92
|
+
| 1 MB | 51 | 1.00x | 22 ms | 10 ms | 8.8 KB | 13 MB |
|
|
93
|
+
| 8 MB | 436 | 1.00x | 123 ms | 61 ms | 77 KB | 62 MB |
|
|
94
|
+
| 32 MB | 1 776 | 1.00x | 489 ms | 257 ms | 80 KB | 230 MB |
|
|
95
|
+
| 64 MB | 3 575 | 1.00x | 1 003 ms | 556 ms | 152 KB | 455 MB |
|
|
96
|
+
|
|
97
|
+
What this shows:
|
|
98
|
+
|
|
99
|
+
- **Chunking earns its keep on binary.** A 16-byte edit in the middle of a
|
|
100
|
+
64 MB file costs 152 KB, not 64 MB — roughly 440x better than re-storing.
|
|
101
|
+
Content round-trips byte for byte.
|
|
102
|
+
- **Incompressible data is stored raw** (1.00x), as intended: deflate is not
|
|
103
|
+
allowed to inflate an object.
|
|
104
|
+
- **Commit throughput is ~64 MB/s** after the compressibility probe landed.
|
|
105
|
+
Before it, deflating incompressible chunks and discarding every result cost
|
|
106
|
+
2 439 ms at 64 MB — the probe cut that to 1 003 ms with identical output.
|
|
107
|
+
- **Peak RSS runs ~5x file size** during commit (the figures above include the
|
|
108
|
+
probe's own two copies of the payload). `VfsSnapshot` clones every file's
|
|
109
|
+
content before the object encoder sees it, so a streaming `vfs_snapshot` is
|
|
110
|
+
what would fix this.
|
|
111
|
+
- **The per-edit floor is the file manifest**, at 32 bytes per chunk — about
|
|
112
|
+
2 KB per MB of file, re-stored whole on every edit. That is what dominates
|
|
113
|
+
the 152 KB figure at 64 MB, not the changed chunk. Chunking the manifest
|
|
114
|
+
itself would remove it, the same shape as the flat-tree limit above.
|
|
115
|
+
|
|
116
|
+
Practical read: files up to a few MB are comfortable. Tens of MB work but cost
|
|
117
|
+
seconds of commit time and hundreds of MB of transient memory, so a workspace
|
|
118
|
+
built around large binaries wants the streaming snapshot first.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
//! Snapshot history benchmark: what a per-message snapshot actually costs.
|
|
2
|
+
//!
|
|
3
|
+
//! Measures the two questions that decide whether storing a snapshot per
|
|
4
|
+
//! conversation turn is affordable:
|
|
5
|
+
//!
|
|
6
|
+
//! 1. **Time** — encode and restore latency for the v1 JSON format, the v2
|
|
7
|
+
//! packed container, and an incremental commit against a warm store.
|
|
8
|
+
//! 2. **Size** — bytes on the wire for the same state in each format, and the
|
|
9
|
+
//! marginal cost of one more commit after a small edit.
|
|
10
|
+
//!
|
|
11
|
+
//! The size table is printed once at startup, since criterion only reports
|
|
12
|
+
//! time. Results belong in `crates/bashkit/benches/results/` as
|
|
13
|
+
//! `criterion-snapshot-history-<moniker>-<timestamp>.md`.
|
|
14
|
+
|
|
15
|
+
use bashkit::{Bash, CheckoutPolicy, CommitOptions, ObjectId, SnapshotOptions};
|
|
16
|
+
use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
|
|
17
|
+
use std::collections::HashMap;
|
|
18
|
+
use tokio::runtime::Runtime;
|
|
19
|
+
|
|
20
|
+
type Store = HashMap<ObjectId, Vec<u8>>;
|
|
21
|
+
|
|
22
|
+
/// Workspace sizes, in files. A conversational agent's sandbox usually sits at
|
|
23
|
+
/// the low end; the large case shows how the cost scales.
|
|
24
|
+
const FILE_COUNTS: &[usize] = &[10, 100, 500];
|
|
25
|
+
|
|
26
|
+
/// Build a workspace with `files` text files plus one large file, so both the
|
|
27
|
+
/// inline and chunked paths are exercised.
|
|
28
|
+
fn workspace(rt: &Runtime, files: usize) -> Bash {
|
|
29
|
+
let mut bash = Bash::builder()
|
|
30
|
+
.limits(bashkit::ExecutionLimits::new().max_commands(1_000_000))
|
|
31
|
+
.build();
|
|
32
|
+
rt.block_on(async {
|
|
33
|
+
bash.exec("mkdir -p /w/src /w/docs").await.unwrap();
|
|
34
|
+
for i in 0..files {
|
|
35
|
+
bash.exec(&format!(
|
|
36
|
+
"echo 'module {i}: the quick brown fox jumps over the lazy dog' > /w/src/f{i}.txt"
|
|
37
|
+
))
|
|
38
|
+
.await
|
|
39
|
+
.unwrap();
|
|
40
|
+
}
|
|
41
|
+
// One file big enough to chunk, so chunk-level dedup is measured too.
|
|
42
|
+
bash.exec("seq 1 20000 > /w/docs/big.txt").await.unwrap();
|
|
43
|
+
});
|
|
44
|
+
bash
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Seed a store with a full commit and return it alongside the commit id.
|
|
48
|
+
fn warm_store(bash: &Bash) -> Store {
|
|
49
|
+
let packed = bash.commit(CommitOptions::new()).unwrap();
|
|
50
|
+
packed.into_objects().collect()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Print the size comparison the timing benchmarks cannot show.
|
|
54
|
+
fn report_sizes(rt: &Runtime) {
|
|
55
|
+
println!("\n=== snapshot size comparison ===");
|
|
56
|
+
println!(
|
|
57
|
+
"{:>6} | {:>10} | {:>10} | {:>7} | {:>14}",
|
|
58
|
+
"files", "v1 json", "v2 packed", "ratio", "incremental"
|
|
59
|
+
);
|
|
60
|
+
println!(
|
|
61
|
+
"{:->6}-+-{:->10}-+-{:->10}-+-{:->7}-+-{:->14}",
|
|
62
|
+
"", "", "", "", ""
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
for &files in FILE_COUNTS {
|
|
66
|
+
let mut bash = workspace(rt, files);
|
|
67
|
+
|
|
68
|
+
let v1 = bash
|
|
69
|
+
.snapshot_state(SnapshotOptions::default())
|
|
70
|
+
.to_bytes()
|
|
71
|
+
.unwrap()
|
|
72
|
+
.len();
|
|
73
|
+
let v2 = bash.snapshot().unwrap().len();
|
|
74
|
+
|
|
75
|
+
// Cost of the next commit after touching a single file — the number
|
|
76
|
+
// that decides whether per-message history is affordable.
|
|
77
|
+
let store = warm_store(&bash);
|
|
78
|
+
rt.block_on(async {
|
|
79
|
+
bash.exec("echo 'edited' >> /w/src/f0.txt").await.unwrap();
|
|
80
|
+
});
|
|
81
|
+
let incremental = bash
|
|
82
|
+
.commit(CommitOptions::new().have(store.keys()))
|
|
83
|
+
.unwrap()
|
|
84
|
+
.stored_bytes();
|
|
85
|
+
|
|
86
|
+
println!(
|
|
87
|
+
"{files:>6} | {v1:>10} | {v2:>10} | {:>6.2}x | {incremental:>14}",
|
|
88
|
+
v1 as f64 / v2 as f64
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
println!();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
fn bench_capture(c: &mut Criterion) {
|
|
95
|
+
let rt = Runtime::new().unwrap();
|
|
96
|
+
report_sizes(&rt);
|
|
97
|
+
|
|
98
|
+
let mut group = c.benchmark_group("snapshot_capture");
|
|
99
|
+
for &files in FILE_COUNTS {
|
|
100
|
+
let bash = workspace(&rt, files);
|
|
101
|
+
group.throughput(Throughput::Elements(files as u64));
|
|
102
|
+
|
|
103
|
+
group.bench_with_input(BenchmarkId::new("v1_json", files), &files, |b, _| {
|
|
104
|
+
b.iter(|| {
|
|
105
|
+
bash.snapshot_state(SnapshotOptions::default())
|
|
106
|
+
.to_bytes()
|
|
107
|
+
.unwrap()
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
group.bench_with_input(BenchmarkId::new("v2_packed", files), &files, |b, _| {
|
|
112
|
+
b.iter(|| bash.snapshot().unwrap());
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// The steady-state case for session history: a warm store, so only
|
|
116
|
+
// changed content is encoded.
|
|
117
|
+
let store = warm_store(&bash);
|
|
118
|
+
group.bench_with_input(BenchmarkId::new("v2_incremental", files), &files, |b, _| {
|
|
119
|
+
b.iter(|| {
|
|
120
|
+
bash.commit(CommitOptions::new().have(store.keys()))
|
|
121
|
+
.unwrap()
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
group.finish();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
fn bench_restore(c: &mut Criterion) {
|
|
129
|
+
let rt = Runtime::new().unwrap();
|
|
130
|
+
let mut group = c.benchmark_group("snapshot_restore");
|
|
131
|
+
|
|
132
|
+
for &files in FILE_COUNTS {
|
|
133
|
+
let bash = workspace(&rt, files);
|
|
134
|
+
group.throughput(Throughput::Elements(files as u64));
|
|
135
|
+
|
|
136
|
+
let v1 = bash
|
|
137
|
+
.snapshot_state(SnapshotOptions::default())
|
|
138
|
+
.to_bytes()
|
|
139
|
+
.unwrap();
|
|
140
|
+
group.bench_with_input(BenchmarkId::new("v1_json", files), &files, |b, _| {
|
|
141
|
+
b.iter(|| {
|
|
142
|
+
let mut target = Bash::new();
|
|
143
|
+
target
|
|
144
|
+
.restore_snapshot_with_policy(&v1, CheckoutPolicy::Force)
|
|
145
|
+
.unwrap();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
let v2 = bash.snapshot().unwrap();
|
|
150
|
+
group.bench_with_input(BenchmarkId::new("v2_packed", files), &files, |b, _| {
|
|
151
|
+
b.iter(|| {
|
|
152
|
+
let mut target = Bash::new();
|
|
153
|
+
target
|
|
154
|
+
.restore_snapshot_with_policy(&v2, CheckoutPolicy::Force)
|
|
155
|
+
.unwrap();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Checkout from a store, which is how a fork or a rewind is served.
|
|
160
|
+
let store = warm_store(&bash);
|
|
161
|
+
let id = bash.commit(CommitOptions::new()).unwrap().id();
|
|
162
|
+
group.bench_with_input(BenchmarkId::new("v2_checkout", files), &files, |b, _| {
|
|
163
|
+
b.iter(|| {
|
|
164
|
+
let mut target = Bash::new();
|
|
165
|
+
target.checkout(id, &store, CheckoutPolicy::Force).unwrap();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
group.finish();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
fn bench_history_ops(c: &mut Criterion) {
|
|
173
|
+
let rt = Runtime::new().unwrap();
|
|
174
|
+
let mut group = c.benchmark_group("snapshot_history_ops");
|
|
175
|
+
|
|
176
|
+
let mut bash = workspace(&rt, 100);
|
|
177
|
+
let mut store = Store::new();
|
|
178
|
+
let first = {
|
|
179
|
+
let packed = bash.commit(CommitOptions::new()).unwrap();
|
|
180
|
+
let id = packed.id();
|
|
181
|
+
store.extend(packed.into_objects());
|
|
182
|
+
id
|
|
183
|
+
};
|
|
184
|
+
rt.block_on(async {
|
|
185
|
+
bash.exec("echo more >> /w/src/f1.txt; rm /w/src/f2.txt; echo new > /w/src/added.txt")
|
|
186
|
+
.await
|
|
187
|
+
.unwrap();
|
|
188
|
+
});
|
|
189
|
+
let second = {
|
|
190
|
+
let packed = bash
|
|
191
|
+
.commit(CommitOptions::new().parent(first).have(store.keys()))
|
|
192
|
+
.unwrap();
|
|
193
|
+
let id = packed.id();
|
|
194
|
+
store.extend(packed.into_objects());
|
|
195
|
+
id
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Diff compares content addresses, so it never reads file content.
|
|
199
|
+
group.bench_function("diff", |b| {
|
|
200
|
+
b.iter(|| bashkit::SnapshotGraph::diff(first, second, &store).unwrap());
|
|
201
|
+
});
|
|
202
|
+
group.bench_function("plan_checkout_warm", |b| {
|
|
203
|
+
b.iter(|| bashkit::SnapshotGraph::plan_checkout(second, &store).unwrap());
|
|
204
|
+
});
|
|
205
|
+
group.bench_function("reachable", |b| {
|
|
206
|
+
b.iter(|| bashkit::SnapshotGraph::reachable(second, &store).unwrap());
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
group.finish();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
criterion_group!(benches, bench_capture, bench_restore, bench_history_ops);
|
|
213
|
+
criterion_main!(benches);
|
|
@@ -152,6 +152,7 @@ let bash = Bash::builder()
|
|
|
152
152
|
| Subshell snapshot amplification (TM-DOS-092) | Deeply nested `( … )` | `max_subshell_depth` counter (default 32) | MITIGATED |
|
|
153
153
|
| jq unbounded generator (TM-DOS-093) | `jq -n 'repeat(1)'` / `range(0;1e18)` | Cap output at `max_stdout_bytes`; poll deadline every 4096 values | FIXED |
|
|
154
154
|
| Persistent history memory DoS (TM-DOS-094) | Unbounded command history in long-lived instances | `ExecutionLimits` caps history entries/bytes/output | FIXED |
|
|
155
|
+
| Multi-component glob amplification (TM-DOS-095) | `/*/*/*/*` multiplies the candidate set at each component | Reject patterns deeper than `max_path_depth`; cap live candidates at `max_file_count` | FIXED |
|
|
155
156
|
|
|
156
157
|
### Sandbox Escape (TM-ESC-*)
|
|
157
158
|
|
|
@@ -532,6 +533,7 @@ All unexpected errors are caught and converted to safe, human-readable messages.
|
|
|
532
533
|
| Memory addr in errors (TM-INT-005) | Debug output shows addresses | Display impl hides addresses | MITIGATED |
|
|
533
534
|
| Stack trace exposure (TM-INT-006) | Panic unwinds show call stack | `catch_unwind` prevents propagation | MITIGATED |
|
|
534
535
|
| /dev/urandom empty with head -c (TM-INT-007) | `head -c 16 /dev/urandom` returns empty | Fix virtual device pipe handling | **MITIGATED** |
|
|
536
|
+
| C ABI unwind (TM-INT-008) | Rust panic enters a foreign runtime or leaks details | Catch every exported operation and return a generic error | **MITIGATED** |
|
|
535
537
|
|
|
536
538
|
**Panic Recovery:**
|
|
537
539
|
|
|
@@ -808,11 +810,19 @@ serialization API both handle key material and integrity tags.
|
|
|
808
810
|
| Hash agility (TM-SNAP-003) | A snapshot claims a hash algorithm the reader does not implement | Algorithm ID in the container header, rejected when unknown | MITIGATED |
|
|
809
811
|
| Chunk or decompression bomb (TM-SNAP-004) | A small snapshot expands into an unbounded allocation during checkout | Per-object decompression capped; filesystem limits validated before any mutation | MITIGATED |
|
|
810
812
|
| Malformed object graph (TM-SNAP-005) | Cyclic parents, absurd declared entry counts, or a chunk served where a tree is expected | Kind tags checked against context, declared counts bounded before allocation, ancestry walks track visited commits | MITIGATED |
|
|
813
|
+
| Capability mismatch on restore (TM-SNAP-006) | State captured with tools or features the restoring instance lacks is restored into it silently | Per-commit capability fingerprint with a `Superset` default policy, plus state-evidence checks that fire under every policy | MITIGATED |
|
|
811
814
|
|
|
812
815
|
`from_bytes` uses `SHA-256(BKSNAP01 || payload)` (the tag is a public constant,
|
|
813
816
|
so it detects accidental corruption, not forgery); `from_bytes_keyed` uses
|
|
814
817
|
`HMAC-SHA256(secret_key, payload)` with a caller-provided key for authenticity.
|
|
815
818
|
|
|
819
|
+
Within a commit graph every object is named by `SHA-256(kind || payload)` and
|
|
820
|
+
re-verified when loaded, so authenticating the root commit transitively
|
|
821
|
+
authenticates the shell state, tree, and file chunks beneath it. Note that
|
|
822
|
+
object identity covers *decoded* content, not its compressed framing: a host
|
|
823
|
+
may recompress its store freely, while bytes appended after a compressed stream
|
|
824
|
+
are rejected.
|
|
825
|
+
|
|
816
826
|
### RealFs Mount Security (TM-FS-*)
|
|
817
827
|
|
|
818
828
|
The `realfs` feature can mount real host directories into the VFS. Mounts are
|