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.
Files changed (579) hide show
  1. {bashkit-0.14.5 → bashkit-0.15.0}/Cargo.lock +20 -10
  2. {bashkit-0.14.5 → bashkit-0.15.0}/Cargo.toml +1 -1
  3. {bashkit-0.14.5 → bashkit-0.15.0}/PKG-INFO +1 -1
  4. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/__init__.py +8 -0
  5. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/_bashkit.pyi +139 -0
  6. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/Cargo.toml +4 -0
  7. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/README.md +7 -0
  8. bashkit-0.15.0/crates/bashkit/benches/results/criterion-snapshot-history-baseline-linux-x86_64-1785444523.md +118 -0
  9. bashkit-0.15.0/crates/bashkit/benches/snapshot_history.rs +213 -0
  10. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/threat-model.md +10 -0
  11. bashkit-0.15.0/crates/bashkit/examples/generate_snapshot_fixtures.rs +51 -0
  12. bashkit-0.15.0/crates/bashkit/examples/large_binary_probe.rs +86 -0
  13. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/analysis.rs +46 -2
  14. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/error.rs +20 -0
  15. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/memory.rs +2 -2
  16. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/traits.rs +0 -6
  17. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/arithmetic.rs +19 -4
  18. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/glob.rs +107 -65
  19. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/mod.rs +54 -6
  20. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/lib.rs +120 -5
  21. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/lexer.rs +64 -11
  22. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/mod.rs +31 -2
  23. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/capabilities.rs +1 -5
  24. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/container.rs +14 -20
  25. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/graph.rs +4 -10
  26. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/mod.rs +70 -44
  27. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/tool.rs +3 -0
  28. bashkit-0.15.0/crates/bashkit/tests/integration/exec_options_tests.rs +269 -0
  29. bashkit-0.15.0/crates/bashkit/tests/integration/glob_intermediate_component_tests.rs +226 -0
  30. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/main.rs +2 -0
  31. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/proptest_differential.rs +29 -0
  32. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/script_analysis.rs +61 -0
  33. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/security_audit_pocs.rs +50 -4
  34. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/snapshot_fixture_tests.rs +10 -3
  35. bashkit-0.15.0/crates/bashkit/tests/integration/snapshot_history_tests.rs +1336 -0
  36. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/snapshot_tests.rs +22 -10
  37. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/proptest_security.rs +56 -10
  38. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +29 -0
  39. bashkit-0.15.0/crates/bashkit-python/examples/session_history.py +174 -0
  40. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/src/lib.rs +468 -0
  41. bashkit-0.15.0/crates/bashkit-python/tests/test_snapshot_history.py +310 -0
  42. bashkit-0.14.5/crates/bashkit/tests/integration/exec_options_tests.rs +0 -73
  43. {bashkit-0.14.5 → bashkit-0.15.0}/README.md +0 -0
  44. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/deepagents.py +0 -0
  45. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/langchain.py +0 -0
  46. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/py.typed +0 -0
  47. {bashkit-0.14.5 → bashkit-0.15.0}/bashkit/pydantic_ai.py +0 -0
  48. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/file_ops.rs +0 -0
  49. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/hotpath.rs +0 -0
  50. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/parallel_execution.rs +0 -0
  51. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/README.md +0 -0
  52. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-file_ops-linux-x86_64-1779759850.md +0 -0
  53. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-hotpath-attrs+shopt-linux-x86_64-1779759850.md +0 -0
  54. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-hotpath-perf-linux-x86_64-1779744742.md +0 -0
  55. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-(none)-linux-x86_64-1773469129.md +0 -0
  56. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782162173.md +0 -0
  57. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782168239.md +0 -0
  58. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1777865268.md +0 -0
  59. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/benches/sqlite.rs +0 -0
  60. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/clap-builtins.md +0 -0
  61. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/compatibility.md +0 -0
  62. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/credential-injection.md +0 -0
  63. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/custom_builtins.md +0 -0
  64. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/hooks.md +0 -0
  65. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/jq.md +0 -0
  66. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/live_mounts.md +0 -0
  67. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/logging.md +0 -0
  68. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/namespace_filesystems.md +0 -0
  69. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/python.md +0 -0
  70. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/script-analysis.md +0 -0
  71. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/sqlite.md +0 -0
  72. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/ssh.md +0 -0
  73. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/docs/typescript.md +0 -0
  74. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/agent_tool.rs +0 -0
  75. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/basic.rs +0 -0
  76. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/clap_builtin.rs +0 -0
  77. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
  78. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_backend.rs +0 -0
  79. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_builtins.rs +0 -0
  80. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  81. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/custom_fs.rs +0 -0
  82. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/dump_builtins.rs +0 -0
  83. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/git_workflow.rs +0 -0
  84. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/live_mounts.rs +0 -0
  85. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/namespace_rebase.rs +0 -0
  86. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/namespace_sandbox.rs +0 -0
  87. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/python_external_functions.rs +0 -0
  88. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/python_scripts.rs +0 -0
  89. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  90. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  91. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/resource_limits.rs +0 -0
  92. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/scripted_tool.rs +0 -0
  93. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/show_tool_output.rs +0 -0
  94. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/sqlite_basic.rs +0 -0
  95. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
  96. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  97. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/streaming_output.rs +0 -0
  98. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/text_files.rs +0 -0
  99. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/text_processing.rs +0 -0
  100. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  101. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  102. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/examples/virtual_identity.rs +0 -0
  103. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/out file.txt +0 -0
  104. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
  105. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/alias.rs +0 -0
  106. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/archive.rs +0 -0
  107. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  108. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/assert.rs +0 -0
  109. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/interpreter.rs +0 -0
  110. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/mod.rs +0 -0
  111. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/parser.rs +0 -0
  112. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/awk/tests.rs +0 -0
  113. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/base64.rs +0 -0
  114. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/bc.rs +0 -0
  115. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/caller.rs +0 -0
  116. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/cat.rs +0 -0
  117. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/checksum.rs +0 -0
  118. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/clap_env.rs +0 -0
  119. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/clear.rs +0 -0
  120. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/column.rs +0 -0
  121. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/comm.rs +0 -0
  122. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/compgen.rs +0 -0
  123. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/csv.rs +0 -0
  124. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/curl.rs +0 -0
  125. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  126. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/date.rs +0 -0
  127. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/diff.rs +0 -0
  128. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  129. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/disk.rs +0 -0
  130. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  131. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/echo.rs +0 -0
  132. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/environ.rs +0 -0
  133. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  134. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/expand.rs +0 -0
  135. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/export.rs +0 -0
  136. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/expr.rs +0 -0
  137. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fc.rs +0 -0
  138. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fileops.rs +0 -0
  139. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/flow.rs +0 -0
  140. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/fold.rs +0 -0
  141. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/cat_args.rs +0 -0
  142. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/extendedbigdecimal.rs +0 -0
  143. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/argument.rs +0 -0
  144. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/escape.rs +0 -0
  145. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/human.rs +0 -0
  146. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/mod.rs +0 -0
  147. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/num_format.rs +0 -0
  148. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format/spec.rs +0 -0
  149. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/format_support.rs +0 -0
  150. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/ls_args.rs +0 -0
  151. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/mktemp_args.rs +0 -0
  152. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/mod.rs +0 -0
  153. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/num_parser.rs +0 -0
  154. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/od_args.rs +0 -0
  155. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/readlink_args.rs +0 -0
  156. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/realpath_args.rs +0 -0
  157. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/shuf_args.rs +0 -0
  158. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/stat_args.rs +0 -0
  159. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/tac_args.rs +0 -0
  160. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/tee_args.rs +0 -0
  161. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/generated/truncate_args.rs +0 -0
  162. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/client.rs +0 -0
  163. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
  164. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/config.rs +0 -0
  165. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/git/mod.rs +0 -0
  166. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  167. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/grep.rs +0 -0
  168. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/headtail.rs +0 -0
  169. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/help.rs +0 -0
  170. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/helpers.rs +0 -0
  171. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/hextools.rs +0 -0
  172. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/http.rs +0 -0
  173. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/iconv.rs +0 -0
  174. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/inspect.rs +0 -0
  175. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/introspect.rs +0 -0
  176. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/join.rs +0 -0
  177. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/args.rs +0 -0
  178. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
  179. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
  180. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
  181. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/format.rs +0 -0
  182. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
  183. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
  184. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
  185. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/json.rs +0 -0
  186. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/limits.rs +0 -0
  187. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/log.rs +0 -0
  188. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/find.rs +0 -0
  189. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/glob.rs +0 -0
  190. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/list.rs +0 -0
  191. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/mod.rs +0 -0
  192. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/rmdir.rs +0 -0
  193. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ls/tests.rs +0 -0
  194. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  195. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  196. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/mod.rs +0 -0
  197. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/navigation.rs +0 -0
  198. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/nl.rs +0 -0
  199. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/numfmt.rs +0 -0
  200. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/parallel.rs +0 -0
  201. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/paste.rs +0 -0
  202. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/patch.rs +0 -0
  203. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/path.rs +0 -0
  204. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  205. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/printf.rs +0 -0
  206. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/python.rs +0 -0
  207. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/read.rs +0 -0
  208. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/retry.rs +0 -0
  209. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/rg/mod.rs +0 -0
  210. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/runtime_limits.rs +0 -0
  211. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/search_common.rs +0 -0
  212. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sed.rs +0 -0
  213. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/semver.rs +0 -0
  214. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/seq.rs +0 -0
  215. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/shuf.rs +0 -0
  216. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sleep.rs +0 -0
  217. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  218. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/source.rs +0 -0
  219. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/split.rs +0 -0
  220. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
  221. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
  222. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
  223. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
  224. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
  225. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
  226. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
  227. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
  228. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
  229. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
  230. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
  231. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
  232. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
  233. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
  234. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/strings.rs +0 -0
  235. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/system.rs +0 -0
  236. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/template.rs +0 -0
  237. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/test.rs +0 -0
  238. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/textrev.rs +0 -0
  239. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/timeout.rs +0 -0
  240. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  241. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/trap.rs +0 -0
  242. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/tree.rs +0 -0
  243. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/truncate.rs +0 -0
  244. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/typescript.rs +0 -0
  245. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/vars.rs +0 -0
  246. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/verify.rs +0 -0
  247. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/wait.rs +0 -0
  248. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/wc.rs +0 -0
  249. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/yaml.rs +0 -0
  250. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/yes.rs +0 -0
  251. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  252. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/credential.rs +0 -0
  253. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/backend.rs +0 -0
  254. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/limits.rs +0 -0
  255. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/mod.rs +0 -0
  256. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/mountable.rs +0 -0
  257. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/namespace.rs +0 -0
  258. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/overlay.rs +0 -0
  259. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/posix.rs +0 -0
  260. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/readonly.rs +0 -0
  261. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/realfs.rs +0 -0
  262. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/fs/search.rs +0 -0
  263. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/hooks.rs +0 -0
  264. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interop/fs.rs +0 -0
  265. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interop/mod.rs +0 -0
  266. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/brace_expansion.rs +0 -0
  267. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/expansion.rs +0 -0
  268. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  269. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/redirection.rs +0 -0
  270. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/interpreter/state.rs +0 -0
  271. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/limits.rs +0 -0
  272. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/logging_impl.rs +0 -0
  273. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/allowlist.rs +0 -0
  274. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/bot_auth.rs +0 -0
  275. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/client.rs +0 -0
  276. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/mod.rs +0 -0
  277. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/network/transport.rs +0 -0
  278. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/ast.rs +0 -0
  279. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/budget.rs +0 -0
  280. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/span.rs +0 -0
  281. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/parser/tokens.rs +0 -0
  282. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
  283. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
  284. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
  285. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  286. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/chunker.rs +0 -0
  287. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/snapshot/objects.rs +0 -0
  288. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/testing.rs +0 -0
  289. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/time_compat.rs +0 -0
  290. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/tool_def.rs +0 -0
  291. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/src/trace.rs +0 -0
  292. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/fixtures/snapshots/v1.snapshot +0 -0
  293. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/fixtures/snapshots/v2.snapshot +0 -0
  294. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/agent_skills_publication_tests.rs +0 -0
  295. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/allexport_tests.rs +0 -0
  296. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_fuzz_scaffold_tests.rs +0 -0
  297. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_newline_tests.rs +0 -0
  298. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_pattern_tests.rs +0 -0
  299. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_printf_expr_test.rs +0 -0
  300. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/awk_range_pattern_tests.rs +0 -0
  301. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/background_exec_tests.rs +0 -0
  302. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/base64_binary_tests.rs +0 -0
  303. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/bash_source_tests.rs +0 -0
  304. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/blackbox_security_tests.rs +0 -0
  305. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/builtin_error_security_tests.rs +0 -0
  306. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/builtin_registry_tests.rs +0 -0
  307. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/byte_range_panic_tests.rs +0 -0
  308. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/cancellation_tests.rs +0 -0
  309. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/cmdsub_quote_test.rs +0 -0
  310. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/compgen_tests.rs +0 -0
  311. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/coproc_tests.rs +0 -0
  312. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/coreutils_differential_tests.rs +0 -0
  313. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/credential_injection_tests.rs +0 -0
  314. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/custom_builtins_tests.rs +0 -0
  315. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/custom_fs_tests.rs +0 -0
  316. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/dev_null_tests.rs +0 -0
  317. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/final_env_tests.rs +0 -0
  318. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/find_multi_path_tests.rs +0 -0
  319. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/for_in_reserved_word_tests.rs +0 -0
  320. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_advanced_tests.rs +0 -0
  321. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_inspection_tests.rs +0 -0
  322. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_integration_tests.rs +0 -0
  323. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_remote_security_tests.rs +0 -0
  324. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/git_security_tests.rs +0 -0
  325. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/harness_example_tests.rs +0 -0
  326. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/history_tests.rs +0 -0
  327. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1175_test.rs +0 -0
  328. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1776_test.rs +0 -0
  329. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_1777_test.rs +0 -0
  330. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_274_test.rs +0 -0
  331. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_275_279_282_test.rs +0 -0
  332. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_276_test.rs +0 -0
  333. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_277_test.rs +0 -0
  334. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_289_test.rs +0 -0
  335. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_290_test.rs +0 -0
  336. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_291_test.rs +0 -0
  337. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_853_test.rs +0 -0
  338. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_872_test.rs +0 -0
  339. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_873_test.rs +0 -0
  340. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/issue_875_test.rs +0 -0
  341. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/jq_fuzz_scaffold_tests.rs +0 -0
  342. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/limitations_doc_tests.rs +0 -0
  343. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/limitations_evidence_tests.rs +0 -0
  344. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/live_mount_tests.rs +0 -0
  345. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/mkfifo_tests.rs +0 -0
  346. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/namespace_fs_tests.rs +0 -0
  347. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/nested_subscript_tests.rs +0 -0
  348. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/network_security_tests.rs +0 -0
  349. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/output_truncation_tests.rs +0 -0
  350. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/parallel_sessions_tests.rs +0 -0
  351. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/python_integration_tests.rs +0 -0
  352. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/python_security_tests.rs +0 -0
  353. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/regex_limit_tests.rs +0 -0
  354. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/release_profile_tests.rs +0 -0
  355. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/script_execution_tests.rs +0 -0
  356. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/set_e_and_or_tests.rs +0 -0
  357. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/shuf_resource_tests.rs +0 -0
  358. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/skills_tests.rs +0 -0
  359. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/source_function_tests.rs +0 -0
  360. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/spec_runner.rs +0 -0
  361. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/spec_tests.rs +0 -0
  362. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_compat_tests.rs +0 -0
  363. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_differential_tests.rs +0 -0
  364. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_fuzz_tests.rs +0 -0
  365. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_integration_tests.rs +0 -0
  366. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/sqlite_security_tests.rs +0 -0
  367. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/stack_overflow_regression_tests.rs +0 -0
  368. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/subst_depth_limit_tests.rs +0 -0
  369. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/symlink_overlay_security_tests.rs +0 -0
  370. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/threat_model_doc_tests.rs +0 -0
  371. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/threat_model_tests.rs +0 -0
  372. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/time_compat_scan_tests.rs +0 -0
  373. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/tty_tests.rs +0 -0
  374. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/typescript_integration_tests.rs +0 -0
  375. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/typescript_security_tests.rs +0 -0
  376. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/unicode_security_tests.rs +0 -0
  377. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/unset_function_tests.rs +0 -0
  378. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/urandom_tests.rs +0 -0
  379. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/integration/workflow_security_tests.rs +0 -0
  380. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  381. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/realfs_tests.rs +0 -0
  382. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  383. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  384. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  385. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  386. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  387. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  388. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  389. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  390. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  391. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  392. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  393. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  394. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  395. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  396. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  397. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  398. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  399. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  400. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  401. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  402. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
  403. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  404. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  405. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  406. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  407. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  408. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  409. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  410. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  411. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  412. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  413. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  414. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  415. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  416. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  417. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  418. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  419. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  420. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cat.test.sh +0 -0
  421. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  422. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  423. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  424. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  425. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  426. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  427. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  428. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  429. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  430. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  431. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  432. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  433. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  434. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  435. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  436. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  437. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  438. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  439. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  440. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  441. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  442. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  443. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  444. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  445. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  446. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  447. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  448. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  449. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  450. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  451. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  452. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  453. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  454. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  455. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  456. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  457. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  458. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  459. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  460. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  461. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  462. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
  463. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  464. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  465. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  466. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  467. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  468. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  469. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  470. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  471. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  472. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  473. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/mktemp.test.sh +0 -0
  474. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  475. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  476. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  477. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  478. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  479. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  480. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/od.test.sh +0 -0
  481. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  482. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  483. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  484. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  485. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  486. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  487. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  488. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  489. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  490. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  491. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +0 -0
  492. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  493. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  494. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  495. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  496. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  497. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  498. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  499. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +0 -0
  500. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  501. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  502. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  503. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  504. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  505. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  506. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
  507. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  508. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  509. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  510. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  511. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  512. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  513. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  514. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  515. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  516. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  517. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  518. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +0 -0
  519. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  520. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  521. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  522. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  523. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  524. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  525. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  526. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  527. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  528. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  529. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  530. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  531. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  532. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  533. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  534. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  535. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  536. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  537. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  538. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  539. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
  540. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/Cargo.toml +0 -0
  541. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/README.md +0 -0
  542. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/bash_basics.py +0 -0
  543. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
  544. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  545. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  546. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
  547. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  548. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  549. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/examples/llm_tool.py +0 -0
  550. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
  551. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  552. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/_security_core.py +0 -0
  553. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
  554. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_analyze.py +0 -0
  555. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  556. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_basic.py +0 -0
  557. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_builtins.py +0 -0
  558. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  559. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_custom_builtin_fs.py +0 -0
  560. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  561. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  562. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
  563. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_integration.py +0 -0
  564. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
  565. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  566. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_network_config.py +0 -0
  567. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
  568. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_python_security.py +0 -0
  569. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
  570. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_scripts.py +0 -0
  571. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_security.py +0 -0
  572. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  573. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_sqlite.py +0 -0
  574. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  575. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  576. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_teardown_determinism.py +0 -0
  577. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
  578. {bashkit-0.14.5 → bashkit-0.15.0}/crates/bashkit-python/tests/test_vfs.py +0 -0
  579. {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.14.5"
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.14.5"
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.14.5"
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.14.5"
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.14.5"
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.14.5"
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.14.5"
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.14.5"
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.4"
4330
+ version = "0.62.5"
4321
4331
  source = "registry+https://github.com/rust-lang/crates.io-index"
4322
- checksum = "b8b67b5a0d8068c89dcbe9d95df986af7a851d1f3c604525274c37468e60464f"
4332
+ checksum = "da7c230e0ed9cbeb92fbad6c8848985d6df2a1464c0dc247a021abd666e9005e"
4323
4333
  dependencies = [
4324
4334
  "aes 0.9.1",
4325
4335
  "aws-lc-rs",
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.14.5"
10
+ version = "0.15.0"
11
11
  edition = "2024"
12
12
  license = "MIT"
13
13
  authors = ["Mykhailo Chalyi <mike@chaliy.name>", "Everruns"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bashkit
3
- Version: 0.14.5
3
+ Version: 0.15.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -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
+ ...
@@ -206,6 +206,10 @@ harness = false
206
206
  name = "file_ops"
207
207
  harness = false
208
208
 
209
+ [[bench]]
210
+ name = "snapshot_history"
211
+ harness = false
212
+
209
213
  [[bench]]
210
214
  name = "sqlite"
211
215
  harness = false
@@ -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