bashkit 0.1.20__tar.gz → 0.1.21__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 (439) hide show
  1. {bashkit-0.1.20 → bashkit-0.1.21}/Cargo.lock +28 -28
  2. {bashkit-0.1.20 → bashkit-0.1.21}/Cargo.toml +4 -2
  3. {bashkit-0.1.20 → bashkit-0.1.21}/PKG-INFO +19 -6
  4. {bashkit-0.1.20/crates/bashkit-python → bashkit-0.1.21}/README.md +17 -5
  5. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/__init__.py +2 -0
  6. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/_bashkit.pyi +39 -11
  7. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/README.md +2 -1
  8. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/python.md +8 -2
  9. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/threat-model.md +1 -0
  10. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/python_external_functions.rs +1 -0
  11. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/python_scripts.rs +4 -1
  12. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/archive.rs +137 -21
  13. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/awk.rs +173 -112
  14. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/date.rs +17 -1
  15. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/dirstack.rs +18 -0
  16. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/expand.rs +22 -1
  17. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/expr.rs +15 -1
  18. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/fileops.rs +80 -39
  19. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/grep.rs +192 -35
  20. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/jq.rs +16 -0
  21. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/ls.rs +89 -14
  22. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/mod.rs +11 -0
  23. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/nl.rs +15 -1
  24. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/numfmt.rs +35 -6
  25. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/python.rs +155 -22
  26. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/read.rs +74 -8
  27. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/retry.rs +14 -0
  28. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/rg.rs +11 -1
  29. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/sed.rs +168 -14
  30. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/sortuniq.rs +28 -8
  31. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/split.rs +32 -3
  32. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/strings.rs +20 -8
  33. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/timeout.rs +23 -4
  34. bashkit-0.1.21/crates/bashkit/src/builtins/yes.rs +86 -0
  35. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/zip_cmd.rs +58 -2
  36. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/credential.rs +38 -13
  37. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/memory.rs +44 -2
  38. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/overlay.rs +112 -21
  39. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/posix.rs +114 -1
  40. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/realfs.rs +109 -41
  41. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/git/config.rs +63 -13
  42. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/interpreter/glob.rs +85 -24
  43. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/interpreter/mod.rs +1573 -486
  44. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/lib.rs +430 -20
  45. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/limits.rs +58 -17
  46. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/logging_impl.rs +32 -0
  47. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/network/bot_auth.rs +57 -11
  48. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/network/client.rs +218 -83
  49. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/budget.rs +18 -14
  50. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/lexer.rs +89 -8
  51. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/mod.rs +202 -194
  52. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/scripted_tool/execute.rs +13 -1
  53. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/scripted_tool/mod.rs +24 -0
  54. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/scripted_tool/toolset.rs +48 -0
  55. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/snapshot.rs +15 -12
  56. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/tool.rs +3 -0
  57. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/trace.rs +9 -2
  58. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/awk_pattern_tests.rs +18 -0
  59. bashkit-0.1.21/crates/bashkit/tests/awk_range_pattern_tests.rs +108 -0
  60. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/background_exec_tests.rs +13 -0
  61. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/byte_range_panic_tests.rs +26 -0
  62. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/coproc_tests.rs +32 -0
  63. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/final_env_tests.rs +25 -0
  64. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/find_multi_path_tests.rs +26 -0
  65. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/git_remote_security_tests.rs +12 -2
  66. bashkit-0.1.21/crates/bashkit/tests/harness_example_tests.rs +136 -0
  67. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_274_test.rs +17 -0
  68. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_853_test.rs +22 -0
  69. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/output_truncation_tests.rs +14 -0
  70. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/python_integration_tests.rs +19 -4
  71. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/python_security_tests.rs +43 -3
  72. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/realfs_tests.rs +57 -0
  73. bashkit-0.1.21/crates/bashkit/tests/release_profile_tests.rs +39 -0
  74. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/set_e_and_or_tests.rs +32 -1
  75. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/snapshot_tests.rs +167 -3
  76. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +23 -0
  77. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +17 -0
  78. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +13 -0
  79. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +10 -0
  80. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +10 -0
  81. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +23 -0
  82. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +9 -0
  83. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +10 -0
  84. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +8 -0
  85. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/source.test.sh +34 -0
  86. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +19 -0
  87. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_tests.rs +6 -1
  88. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/threat_model_tests.rs +107 -4
  89. {bashkit-0.1.20 → bashkit-0.1.21/crates/bashkit-python}/README.md +17 -5
  90. bashkit-0.1.21/crates/bashkit-python/examples/jupyter_async_test.ipynb +641 -0
  91. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/src/lib.rs +269 -49
  92. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/_bashkit_categories.py +14 -0
  93. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_ai_adapters.py +12 -0
  94. bashkit-0.1.21/crates/bashkit-python/tests/test_jupyter_compat.py +220 -0
  95. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_registered_tools.py +62 -1
  96. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_vfs.py +1 -0
  97. {bashkit-0.1.20 → bashkit-0.1.21}/pyproject.toml +1 -0
  98. bashkit-0.1.20/crates/bashkit/src/builtins/yes.rs +0 -44
  99. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/deepagents.py +0 -0
  100. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/langchain.py +0 -0
  101. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/py.typed +0 -0
  102. {bashkit-0.1.20 → bashkit-0.1.21}/bashkit/pydantic_ai.py +0 -0
  103. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/Cargo.toml +0 -0
  104. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/benches/parallel_execution.rs +0 -0
  105. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/compatibility.md +0 -0
  106. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/credential-injection.md +0 -0
  107. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/custom_builtins.md +0 -0
  108. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/hooks.md +0 -0
  109. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/live_mounts.md +0 -0
  110. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/logging.md +0 -0
  111. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/ssh.md +0 -0
  112. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/docs/typescript.md +0 -0
  113. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/agent_tool.rs +0 -0
  114. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/basic.rs +0 -0
  115. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/custom_backend.rs +0 -0
  116. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/custom_builtins.rs +0 -0
  117. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  118. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/custom_fs.rs +0 -0
  119. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/git_workflow.rs +0 -0
  120. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/live_mounts.rs +0 -0
  121. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  122. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  123. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/resource_limits.rs +0 -0
  124. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/scripted_tool.rs +0 -0
  125. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/show_tool_output.rs +0 -0
  126. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  127. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/streaming_output.rs +0 -0
  128. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/text_files.rs +0 -0
  129. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/text_processing.rs +0 -0
  130. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  131. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  132. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/examples/virtual_identity.rs +0 -0
  133. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/alias.rs +0 -0
  134. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  135. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/assert.rs +0 -0
  136. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/base64.rs +0 -0
  137. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/bc.rs +0 -0
  138. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/caller.rs +0 -0
  139. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/cat.rs +0 -0
  140. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/checksum.rs +0 -0
  141. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/clear.rs +0 -0
  142. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/column.rs +0 -0
  143. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/comm.rs +0 -0
  144. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/compgen.rs +0 -0
  145. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/csv.rs +0 -0
  146. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/curl.rs +0 -0
  147. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  148. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/diff.rs +0 -0
  149. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/disk.rs +0 -0
  150. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  151. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/echo.rs +0 -0
  152. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/environ.rs +0 -0
  153. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  154. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/export.rs +0 -0
  155. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/fc.rs +0 -0
  156. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/flow.rs +0 -0
  157. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/fold.rs +0 -0
  158. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/git.rs +0 -0
  159. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  160. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/headtail.rs +0 -0
  161. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/help.rs +0 -0
  162. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/hextools.rs +0 -0
  163. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/http.rs +0 -0
  164. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/iconv.rs +0 -0
  165. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/inspect.rs +0 -0
  166. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/introspect.rs +0 -0
  167. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/join.rs +0 -0
  168. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/json.rs +0 -0
  169. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/log.rs +0 -0
  170. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  171. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  172. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/navigation.rs +0 -0
  173. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/parallel.rs +0 -0
  174. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/paste.rs +0 -0
  175. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/patch.rs +0 -0
  176. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/path.rs +0 -0
  177. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  178. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/printf.rs +0 -0
  179. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/search_common.rs +0 -0
  180. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/semver.rs +0 -0
  181. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/seq.rs +0 -0
  182. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/sleep.rs +0 -0
  183. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/source.rs +0 -0
  184. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/ssh.rs +0 -0
  185. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/system.rs +0 -0
  186. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/template.rs +0 -0
  187. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/test.rs +0 -0
  188. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/textrev.rs +0 -0
  189. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  190. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/trap.rs +0 -0
  191. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/tree.rs +0 -0
  192. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/typescript.rs +0 -0
  193. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/vars.rs +0 -0
  194. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/verify.rs +0 -0
  195. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/wait.rs +0 -0
  196. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/wc.rs +0 -0
  197. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/builtins/yaml.rs +0 -0
  198. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/error.rs +0 -0
  199. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/backend.rs +0 -0
  200. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/limits.rs +0 -0
  201. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/mod.rs +0 -0
  202. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/mountable.rs +0 -0
  203. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/search.rs +0 -0
  204. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/fs/traits.rs +0 -0
  205. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/git/client.rs +0 -0
  206. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/git/mod.rs +0 -0
  207. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/hooks.rs +0 -0
  208. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  209. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/interpreter/state.rs +0 -0
  210. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/network/allowlist.rs +0 -0
  211. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/network/mod.rs +0 -0
  212. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/ast.rs +0 -0
  213. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/span.rs +0 -0
  214. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/parser/tokens.rs +0 -0
  215. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/allowlist.rs +0 -0
  216. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/client.rs +0 -0
  217. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/config.rs +0 -0
  218. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/handler.rs +0 -0
  219. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/mod.rs +0 -0
  220. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/ssh/russh_handler.rs +0 -0
  221. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/src/tool_def.rs +0 -0
  222. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/allexport_tests.rs +0 -0
  223. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/awk_fuzz_scaffold_tests.rs +0 -0
  224. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/awk_newline_tests.rs +0 -0
  225. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/awk_printf_expr_test.rs +0 -0
  226. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/bash_source_tests.rs +0 -0
  227. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/blackbox_security_tests.rs +0 -0
  228. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/builtin_error_security_tests.rs +0 -0
  229. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/cancellation_tests.rs +0 -0
  230. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/cmdsub_quote_test.rs +0 -0
  231. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/credential_injection_tests.rs +0 -0
  232. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/custom_builtins_tests.rs +0 -0
  233. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/custom_fs_tests.rs +0 -0
  234. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/dev_null_tests.rs +0 -0
  235. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/git_advanced_tests.rs +0 -0
  236. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/git_inspection_tests.rs +0 -0
  237. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/git_integration_tests.rs +0 -0
  238. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/git_security_tests.rs +0 -0
  239. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/history_tests.rs +0 -0
  240. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_1175_test.rs +0 -0
  241. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_275_279_282_test.rs +0 -0
  242. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_276_test.rs +0 -0
  243. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_277_test.rs +0 -0
  244. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_289_test.rs +0 -0
  245. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_290_test.rs +0 -0
  246. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_291_test.rs +0 -0
  247. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_872_test.rs +0 -0
  248. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_873_test.rs +0 -0
  249. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/issue_875_test.rs +0 -0
  250. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/jq_fuzz_scaffold_tests.rs +0 -0
  251. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/live_mount_tests.rs +0 -0
  252. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  253. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/mkfifo_tests.rs +0 -0
  254. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/nested_subscript_tests.rs +0 -0
  255. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/network_security_tests.rs +0 -0
  256. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/overlay_path_validation_tests.rs +0 -0
  257. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/proptest_differential.rs +0 -0
  258. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/proptest_security.rs +0 -0
  259. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/regex_limit_tests.rs +0 -0
  260. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/script_execution_tests.rs +0 -0
  261. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/security_audit_pocs.rs +0 -0
  262. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  263. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  264. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  265. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  266. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  267. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  268. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  269. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  270. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  271. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  272. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  273. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/skills_tests.rs +0 -0
  274. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/source_function_tests.rs +0 -0
  275. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  276. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  277. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  278. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  279. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  280. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  281. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  282. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  283. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  284. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  285. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  286. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  287. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  288. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  289. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  290. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  291. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  292. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  293. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  294. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  295. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  296. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  297. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  298. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  299. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  300. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  301. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  302. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  303. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  304. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  305. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  306. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  307. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  308. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  309. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  310. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  311. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  312. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  313. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  314. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  315. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  316. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  317. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  318. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  319. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  320. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  321. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  322. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  323. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  324. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  325. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  326. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  327. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  328. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  329. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  330. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  331. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  332. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  333. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  334. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  335. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  336. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
  337. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  338. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  339. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  340. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  341. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  342. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  343. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  344. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  345. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  346. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  347. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  348. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  349. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  350. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  351. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  352. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  353. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  354. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  355. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  356. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  357. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  358. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  359. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  360. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  361. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  362. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  363. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  364. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  365. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  366. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  367. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  368. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  369. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  370. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  371. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  372. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  373. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  374. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  375. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  376. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  377. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  378. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  379. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  380. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  381. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  382. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  383. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  384. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  385. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  386. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  387. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  388. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  389. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  390. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  391. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  392. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  393. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  394. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  395. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  396. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  397. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  398. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  399. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  400. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  401. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  402. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  403. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  404. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/spec_runner.rs +0 -0
  405. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  406. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
  407. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/stack_overflow_regression_tests.rs +0 -0
  408. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/subst_depth_limit_tests.rs +0 -0
  409. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/symlink_overlay_security_tests.rs +0 -0
  410. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/tty_tests.rs +0 -0
  411. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/typescript_integration_tests.rs +0 -0
  412. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/typescript_security_tests.rs +0 -0
  413. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/unicode_security_tests.rs +0 -0
  414. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/unset_function_tests.rs +0 -0
  415. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit/tests/urandom_tests.rs +0 -0
  416. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/Cargo.toml +0 -0
  417. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/bash_basics.py +0 -0
  418. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  419. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  420. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  421. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  422. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/examples/llm_tool.py +0 -0
  423. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  424. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/_security_core.py +0 -0
  425. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  426. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_basic.py +0 -0
  427. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_builtins.py +0 -0
  428. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  429. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  430. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  431. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_integration.py +0 -0
  432. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  433. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_python_security.py +0 -0
  434. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_scripts.py +0 -0
  435. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_security.py +0 -0
  436. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  437. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  438. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  439. {bashkit-0.1.20 → bashkit-0.1.21}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
@@ -167,7 +167,7 @@ version = "1.1.5"
167
167
  source = "registry+https://github.com/rust-lang/crates.io-index"
168
168
  checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
169
169
  dependencies = [
170
- "windows-sys 0.61.2",
170
+ "windows-sys 0.60.2",
171
171
  ]
172
172
 
173
173
  [[package]]
@@ -178,7 +178,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
178
178
  dependencies = [
179
179
  "anstyle",
180
180
  "once_cell_polyfill",
181
- "windows-sys 0.61.2",
181
+ "windows-sys 0.60.2",
182
182
  ]
183
183
 
184
184
  [[package]]
@@ -304,7 +304,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
304
304
 
305
305
  [[package]]
306
306
  name = "bashkit"
307
- version = "0.1.20"
307
+ version = "0.1.21"
308
308
  dependencies = [
309
309
  "anyhow",
310
310
  "async-trait",
@@ -349,7 +349,7 @@ dependencies = [
349
349
 
350
350
  [[package]]
351
351
  name = "bashkit-bench"
352
- version = "0.1.20"
352
+ version = "0.1.21"
353
353
  dependencies = [
354
354
  "anyhow",
355
355
  "bashkit",
@@ -363,7 +363,7 @@ dependencies = [
363
363
 
364
364
  [[package]]
365
365
  name = "bashkit-cli"
366
- version = "0.1.20"
366
+ version = "0.1.21"
367
367
  dependencies = [
368
368
  "anyhow",
369
369
  "bashkit",
@@ -379,7 +379,7 @@ dependencies = [
379
379
 
380
380
  [[package]]
381
381
  name = "bashkit-eval"
382
- version = "0.1.20"
382
+ version = "0.1.21"
383
383
  dependencies = [
384
384
  "anyhow",
385
385
  "async-trait",
@@ -395,7 +395,7 @@ dependencies = [
395
395
 
396
396
  [[package]]
397
397
  name = "bashkit-js"
398
- version = "0.1.20"
398
+ version = "0.1.21"
399
399
  dependencies = [
400
400
  "bashkit",
401
401
  "napi",
@@ -408,7 +408,7 @@ dependencies = [
408
408
 
409
409
  [[package]]
410
410
  name = "bashkit-python"
411
- version = "0.1.20"
411
+ version = "0.1.21"
412
412
  dependencies = [
413
413
  "bashkit",
414
414
  "num-bigint",
@@ -810,7 +810,7 @@ version = "3.1.1"
810
810
  source = "registry+https://github.com/rust-lang/crates.io-index"
811
811
  checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34"
812
812
  dependencies = [
813
- "windows-sys 0.61.2",
813
+ "windows-sys 0.52.0",
814
814
  ]
815
815
 
816
816
  [[package]]
@@ -1400,7 +1400,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1400
1400
  checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1401
1401
  dependencies = [
1402
1402
  "libc",
1403
- "windows-sys 0.61.2",
1403
+ "windows-sys 0.52.0",
1404
1404
  ]
1405
1405
 
1406
1406
  [[package]]
@@ -1417,7 +1417,7 @@ checksum = "fe5e43d0f78a42ad591453aedb1d7ae631ce7ee445c7643691055a9ed8d3b01c"
1417
1417
  dependencies = [
1418
1418
  "log",
1419
1419
  "once_cell",
1420
- "rand 0.8.5",
1420
+ "rand 0.8.6",
1421
1421
  ]
1422
1422
 
1423
1423
  [[package]]
@@ -2276,7 +2276,7 @@ dependencies = [
2276
2276
  "portable-atomic",
2277
2277
  "portable-atomic-util",
2278
2278
  "serde_core",
2279
- "windows-sys 0.61.2",
2279
+ "windows-sys 0.52.0",
2280
2280
  ]
2281
2281
 
2282
2282
  [[package]]
@@ -2732,7 +2732,7 @@ dependencies = [
2732
2732
  "num-integer",
2733
2733
  "num-iter",
2734
2734
  "num-traits",
2735
- "rand 0.8.5",
2735
+ "rand 0.8.6",
2736
2736
  "serde",
2737
2737
  "smallvec",
2738
2738
  ]
@@ -3073,7 +3073,7 @@ dependencies = [
3073
3073
  "delegate",
3074
3074
  "futures",
3075
3075
  "log",
3076
- "rand 0.8.5",
3076
+ "rand 0.8.6",
3077
3077
  "sha2 0.10.9",
3078
3078
  "thiserror 1.0.69",
3079
3079
  "tokio",
@@ -3207,7 +3207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3207
3207
  checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
3208
3208
  dependencies = [
3209
3209
  "phf_shared 0.11.3",
3210
- "rand 0.8.5",
3210
+ "rand 0.8.6",
3211
3211
  ]
3212
3212
 
3213
3213
  [[package]]
@@ -3725,9 +3725,9 @@ dependencies = [
3725
3725
 
3726
3726
  [[package]]
3727
3727
  name = "rand"
3728
- version = "0.8.5"
3728
+ version = "0.8.6"
3729
3729
  source = "registry+https://github.com/rust-lang/crates.io-index"
3730
- checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
3730
+ checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
3731
3731
  dependencies = [
3732
3732
  "libc",
3733
3733
  "rand_chacha 0.3.1",
@@ -4043,9 +4043,9 @@ dependencies = [
4043
4043
 
4044
4044
  [[package]]
4045
4045
  name = "russh"
4046
- version = "0.60.0"
4046
+ version = "0.60.1"
4047
4047
  source = "registry+https://github.com/rust-lang/crates.io-index"
4048
- checksum = "3b530252dc3ff163b73a7e48c97b925450d2ca53edcb466a46ad0a231e45f998"
4048
+ checksum = "d937f3f4a79bffd67fc12fd437785effdfc8b94edc89ab90392f9ac9e11cc9fc"
4049
4049
  dependencies = [
4050
4050
  "aes 0.8.4",
4051
4051
  "aws-lc-rs",
@@ -4177,7 +4177,7 @@ dependencies = [
4177
4177
  "errno",
4178
4178
  "libc",
4179
4179
  "linux-raw-sys",
4180
- "windows-sys 0.61.2",
4180
+ "windows-sys 0.52.0",
4181
4181
  ]
4182
4182
 
4183
4183
  [[package]]
@@ -4234,7 +4234,7 @@ dependencies = [
4234
4234
  "security-framework",
4235
4235
  "security-framework-sys",
4236
4236
  "webpki-root-certs",
4237
- "windows-sys 0.61.2",
4237
+ "windows-sys 0.52.0",
4238
4238
  ]
4239
4239
 
4240
4240
  [[package]]
@@ -4245,9 +4245,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
4245
4245
 
4246
4246
  [[package]]
4247
4247
  name = "rustls-webpki"
4248
- version = "0.103.12"
4248
+ version = "0.103.13"
4249
4249
  source = "registry+https://github.com/rust-lang/crates.io-index"
4250
- checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06"
4250
+ checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
4251
4251
  dependencies = [
4252
4252
  "aws-lc-rs",
4253
4253
  "ring",
@@ -4676,7 +4676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4676
4676
  checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
4677
4677
  dependencies = [
4678
4678
  "libc",
4679
- "windows-sys 0.61.2",
4679
+ "windows-sys 0.60.2",
4680
4680
  ]
4681
4681
 
4682
4682
  [[package]]
@@ -4870,7 +4870,7 @@ dependencies = [
4870
4870
  "getrandom 0.4.2",
4871
4871
  "once_cell",
4872
4872
  "rustix",
4873
- "windows-sys 0.61.2",
4873
+ "windows-sys 0.52.0",
4874
4874
  ]
4875
4875
 
4876
4876
  [[package]]
@@ -4880,7 +4880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4880
4880
  checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874"
4881
4881
  dependencies = [
4882
4882
  "rustix",
4883
- "windows-sys 0.61.2",
4883
+ "windows-sys 0.60.2",
4884
4884
  ]
4885
4885
 
4886
4886
  [[package]]
@@ -5214,7 +5214,7 @@ dependencies = [
5214
5214
  "getopts",
5215
5215
  "log",
5216
5216
  "phf_codegen",
5217
- "rand 0.8.5",
5217
+ "rand 0.8.6",
5218
5218
  ]
5219
5219
 
5220
5220
  [[package]]
@@ -5490,7 +5490,7 @@ version = "0.1.11"
5490
5490
  source = "registry+https://github.com/rust-lang/crates.io-index"
5491
5491
  checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
5492
5492
  dependencies = [
5493
- "windows-sys 0.61.2",
5493
+ "windows-sys 0.52.0",
5494
5494
  ]
5495
5495
 
5496
5496
  [[package]]
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.1.20"
10
+ version = "0.1.21"
11
11
  edition = "2024"
12
12
  license = "MIT"
13
13
  authors = ["Everruns"]
@@ -105,5 +105,7 @@ napi-build = "2"
105
105
  [profile.release]
106
106
  lto = "thin"
107
107
  codegen-units = 1
108
- panic = "abort"
108
+ # Security: interpreter relies on catch_unwind around builtins.
109
+ # Keep release unwinding enabled so panic containment works.
110
+ panic = "unwind"
109
111
  strip = "symbols"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bashkit
3
- Version: 0.1.20
3
+ Version: 0.1.21
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
13
14
  Classifier: Programming Language :: Rust
14
15
  Classifier: Topic :: Software Development :: Interpreters
15
16
  Classifier: Topic :: Security
@@ -334,10 +335,22 @@ print(result.stdout) # widget
334
335
  ```
335
336
 
336
337
  Callbacks receive a `BuiltinContext` object with raw `argv` tokens, optional
337
- pipeline `stdin`, the current `cwd`, and visible `env`, and must return the
338
- builtin stdout string. Async callbacks are also supported. `BashTool` exposes
339
- the same `custom_builtins` constructor kwarg and includes registered command
340
- names in `help()` output for LLM-facing metadata.
338
+ pipeline `stdin`, the current `cwd`, and visible `env`. They may return either
339
+ the builtin stdout string directly or a `BuiltinResult(stdout=..., stderr=...,
340
+ exit_code=...)` for explicit shell-shaped failures. Raise an exception for
341
+ unexpected callback failures. Async callbacks support the same return shapes.
342
+ `BashTool` exposes the same `custom_builtins` constructor kwarg and includes
343
+ registered command names in `help()` output for LLM-facing metadata.
344
+
345
+ ```python
346
+ from bashkit import BuiltinResult
347
+
348
+
349
+ def view_image(ctx):
350
+ if not ctx.argv:
351
+ return BuiltinResult(stderr="view-image: missing path\n", exit_code=1)
352
+ return BuiltinResult(stdout="")
353
+ ```
341
354
 
342
355
  When you use `await bash.execute(...)` or `await bash_tool.execute(...)`,
343
356
  async callbacks are scheduled back onto the caller's active asyncio loop, so
@@ -503,7 +516,7 @@ from bashkit.deepagents import BashkitBackend, BashkitMiddleware
503
516
  - Linux: `x86_64`, `aarch64` (glibc and musl wheels)
504
517
  - macOS: `x86_64`, `aarch64`
505
518
  - Windows: `x86_64`
506
- - Python: `3.9` through `3.13`
519
+ - Python: `3.9` through `3.14`
507
520
 
508
521
  ## How It Works
509
522
 
@@ -298,10 +298,22 @@ print(result.stdout) # widget
298
298
  ```
299
299
 
300
300
  Callbacks receive a `BuiltinContext` object with raw `argv` tokens, optional
301
- pipeline `stdin`, the current `cwd`, and visible `env`, and must return the
302
- builtin stdout string. Async callbacks are also supported. `BashTool` exposes
303
- the same `custom_builtins` constructor kwarg and includes registered command
304
- names in `help()` output for LLM-facing metadata.
301
+ pipeline `stdin`, the current `cwd`, and visible `env`. They may return either
302
+ the builtin stdout string directly or a `BuiltinResult(stdout=..., stderr=...,
303
+ exit_code=...)` for explicit shell-shaped failures. Raise an exception for
304
+ unexpected callback failures. Async callbacks support the same return shapes.
305
+ `BashTool` exposes the same `custom_builtins` constructor kwarg and includes
306
+ registered command names in `help()` output for LLM-facing metadata.
307
+
308
+ ```python
309
+ from bashkit import BuiltinResult
310
+
311
+
312
+ def view_image(ctx):
313
+ if not ctx.argv:
314
+ return BuiltinResult(stderr="view-image: missing path\n", exit_code=1)
315
+ return BuiltinResult(stdout="")
316
+ ```
305
317
 
306
318
  When you use `await bash.execute(...)` or `await bash_tool.execute(...)`,
307
319
  async callbacks are scheduled back onto the caller's active asyncio loop, so
@@ -467,7 +479,7 @@ from bashkit.deepagents import BashkitBackend, BashkitMiddleware
467
479
  - Linux: `x86_64`, `aarch64` (glibc and musl wheels)
468
480
  - macOS: `x86_64`, `aarch64`
469
481
  - Windows: `x86_64`
470
- - Python: `3.9` through `3.13`
482
+ - Python: `3.9` through `3.14`
471
483
 
472
484
  ## How It Works
473
485
 
@@ -48,6 +48,7 @@ from bashkit._bashkit import (
48
48
  BashError,
49
49
  BashTool,
50
50
  BuiltinContext,
51
+ BuiltinResult,
51
52
  ExecResult,
52
53
  FileSystem,
53
54
  ScriptedTool,
@@ -61,6 +62,7 @@ __all__ = [
61
62
  "Bash",
62
63
  "BashError",
63
64
  "BuiltinContext",
65
+ "BuiltinResult",
64
66
  "BashTool",
65
67
  "ExecResult",
66
68
  "FileSystem",
@@ -23,7 +23,25 @@ class BuiltinContext:
23
23
  env: dict[str, str]
24
24
  cwd: str
25
25
 
26
- BuiltinCallback = Callable[[BuiltinContext], str | Awaitable[str]]
26
+ class BuiltinResult:
27
+ """Shell-facing result for a custom builtin callback.
28
+
29
+ Attributes:
30
+ stdout: Text written to stdout.
31
+ stderr: Text written to stderr.
32
+ exit_code: Shell exit status.
33
+ """
34
+
35
+ stdout: str
36
+ stderr: str
37
+ exit_code: int
38
+
39
+ def __init__(self, stdout: str = "", stderr: str = "", exit_code: int = 0) -> None: ...
40
+
41
+ BuiltinCallback = Callable[
42
+ [BuiltinContext],
43
+ str | BuiltinResult | Awaitable[str | BuiltinResult],
44
+ ]
27
45
 
28
46
  class FileSystem:
29
47
  """Direct access to BashKit's virtual filesystem or a standalone mountable FS.
@@ -358,7 +376,7 @@ class Bash:
358
376
  external_handler: ExternalHandler | None = None,
359
377
  files: dict[str, str | Callable[[], str]] | None = None,
360
378
  mounts: list[dict[str, Any]] | None = None,
361
- custom_builtins: dict[str, BuiltinCallback] | None = None,
379
+ custom_builtins: Mapping[str, BuiltinCallback] | None = None,
362
380
  ) -> None:
363
381
  """Create a new Bash interpreter.
364
382
 
@@ -380,9 +398,10 @@ class Bash:
380
398
  custom_builtins: Constructor-time Python callbacks exposed as
381
399
  bash builtins. Each callback receives a ``BuiltinContext``
382
400
  with raw ``argv`` tokens and optional pipeline ``stdin``,
383
- and must return a stdout string or await one. Async callbacks
384
- run on the caller's active asyncio loop for ``await execute()``
385
- and on a private loop for ``execute_sync()``.
401
+ and must return a stdout string, a ``BuiltinResult``, or
402
+ await either. Async callbacks run on the caller's active
403
+ asyncio loop for ``await execute()`` and on a private loop
404
+ for ``execute_sync()``.
386
405
 
387
406
  Example::
388
407
 
@@ -424,6 +443,10 @@ class Bash:
424
443
  Not supported when ``external_handler`` is configured — use
425
444
  ``execute()`` (async) instead. ``on_output`` must be synchronous.
426
445
  Async ``custom_builtins`` callbacks run on a private loop here.
446
+ When called from inside a running event loop (e.g. Jupyter / IPython),
447
+ callbacks are dispatched to a background thread with their own loop so
448
+ that asyncio's "cannot run while another loop is running" restriction
449
+ is not triggered.
427
450
 
428
451
  Example::
429
452
 
@@ -552,7 +575,7 @@ class Bash:
552
575
  external_handler: ExternalHandler | None = None,
553
576
  files: dict[str, str] | None = None,
554
577
  mounts: list[dict[str, Any]] | None = None,
555
- custom_builtins: dict[str, BuiltinCallback] | None = None,
578
+ custom_builtins: Mapping[str, BuiltinCallback] | None = None,
556
579
  ) -> Bash:
557
580
  """Create a new ``Bash`` from snapshot bytes and optional constructor kwargs."""
558
581
  ...
@@ -727,7 +750,7 @@ class BashTool:
727
750
  timeout_seconds: float | None = None,
728
751
  files: dict[str, str | Callable[[], str]] | None = None,
729
752
  mounts: list[dict[str, Any]] | None = None,
730
- custom_builtins: dict[str, BuiltinCallback] | None = None,
753
+ custom_builtins: Mapping[str, BuiltinCallback] | None = None,
731
754
  ) -> None:
732
755
  """Create a new BashTool.
733
756
 
@@ -742,9 +765,10 @@ class BashTool:
742
765
  mounts: List of real host directory mount configs.
743
766
  custom_builtins: Constructor-time Python callbacks exposed as
744
767
  bash builtins. Each callback receives a ``BuiltinContext``
745
- and must return a stdout string or await one. Async callbacks
746
- run on the caller's active asyncio loop for ``await execute()``
747
- and on a private loop for ``execute_sync()``.
768
+ and must return a stdout string, a ``BuiltinResult``, or
769
+ await either. Async callbacks run on the caller's active
770
+ asyncio loop for ``await execute()`` and on a private loop
771
+ for ``execute_sync()``.
748
772
 
749
773
  Example::
750
774
 
@@ -778,6 +802,10 @@ class BashTool:
778
802
  """Execute bash commands synchronously (blocking).
779
803
 
780
804
  Async ``custom_builtins`` callbacks run on a private loop here.
805
+ When called from inside a running event loop (e.g. Jupyter / IPython),
806
+ callbacks are dispatched to a background thread with their own loop so
807
+ that asyncio's "cannot run while another loop is running" restriction
808
+ is not triggered.
781
809
 
782
810
  ``on_output`` must be synchronous.
783
811
 
@@ -962,7 +990,7 @@ class BashTool:
962
990
  timeout_seconds: float | None = None,
963
991
  files: dict[str, str] | None = None,
964
992
  mounts: list[dict[str, Any]] | None = None,
965
- custom_builtins: dict[str, BuiltinCallback] | None = None,
993
+ custom_builtins: Mapping[str, BuiltinCallback] | None = None,
966
994
  ) -> BashTool:
967
995
  """Create a new ``BashTool`` from snapshot bytes and optional constructor kwargs."""
968
996
  ...
@@ -273,7 +273,8 @@ Path('/tmp/data.txt').write_text('hello from python')
273
273
  bash.exec("cat /tmp/data.txt").await?; // "hello from python"
274
274
  ```
275
275
 
276
- Stdlib modules: `math`, `re`, `pathlib`, `os` (getenv/environ), `sys`, `typing`.
276
+ Stdlib modules: `math`, `pathlib`, `os` (getenv/environ), `sys`, `typing`.
277
+ Security note: `re` is intentionally disabled due to regex backtracking DoS risk.
277
278
  Limitations: no `open()` (use `pathlib.Path`), no network, no classes, no third-party imports.
278
279
  See [crates/bashkit/docs/python.md](crates/bashkit/docs/python.md) for the full guide.
279
280
 
@@ -23,7 +23,10 @@ use bashkit::Bash;
23
23
 
24
24
  # #[tokio::main]
25
25
  # async fn main() -> bashkit::Result<()> {
26
- let mut bash = Bash::builder().python().build();
26
+ let mut bash = Bash::builder()
27
+ .python()
28
+ .env("BASHKIT_ALLOW_INPROCESS_PYTHON", "1")
29
+ .build();
27
30
 
28
31
  let result = bash.exec("python3 -c \"print('hello from Monty')\"").await?;
29
32
  assert_eq!(result.stdout, "hello from Monty\n");
@@ -187,7 +190,10 @@ Monty has no network primitives and no OsCall variants for network operations.
187
190
  **No classes.** Class definitions are not yet supported by Monty (planned upstream).
188
191
 
189
192
  **No third-party imports.** Only builtin modules (`sys`, `typing`, `os`, `pathlib`,
190
- `math`, `re`, `json`, `datetime`) are available. No `pip install`, no `import numpy`.
193
+ `math`, `json`, `datetime`) are available. No `pip install`, no `import numpy`.
194
+
195
+ **No `re` module.** Disabled due to catastrophic backtracking DoS risk in
196
+ untrusted code execution.
191
197
 
192
198
  **No `str.format()`.** Use f-strings instead: `f"value={x}"` not `"value={}".format(x)`.
193
199
 
@@ -109,6 +109,7 @@ through configurable limits.
109
109
  | Unbounded builtin output (TM-DOS-058) | `seq 1 1000000` produces 1M lines | Add `max_stdout_bytes` limit | **OPEN** |
110
110
  | Param expansion bomb (TM-DOS-059) | `${x//a/bigstring}` multiplicative amplification | `max_total_variable_bytes` + `max_stdout_bytes` | MITIGATED |
111
111
  | Sparse array huge-index (TM-DOS-060) | `arr[999999999]=x` | HashMap storage; `max_array_entries` | MITIGATED |
112
+ | Snapshot restore bypasses function/parser limits (TM-DOS-061) | Crafted snapshot with oversized/deep function bodies | Re-parse restored function source under current limits; re-check function memory budget | MITIGATED |
112
113
 
113
114
  **Configuration:**
114
115
  ```rust
@@ -32,6 +32,7 @@ async fn main() -> Result<()> {
32
32
 
33
33
  let mut bash = Bash::builder()
34
34
  .python_with_external_handler(PythonLimits::default(), vec!["add".to_string()], handler)
35
+ .env("BASHKIT_ALLOW_INPROCESS_PYTHON", "1")
35
36
  .build();
36
37
 
37
38
  let result = bash.exec("python3 -c \"print(add(20, 22))\"").await?;
@@ -13,7 +13,10 @@ use bashkit::Bash;
13
13
  async fn main() -> anyhow::Result<()> {
14
14
  println!("=== BashKit Python Integration ===\n");
15
15
 
16
- let mut bash = Bash::builder().python().build();
16
+ let mut bash = Bash::builder()
17
+ .python()
18
+ .env("BASHKIT_ALLOW_INPROCESS_PYTHON", "1")
19
+ .build();
17
20
 
18
21
  // --- 1. Inline expressions ---
19
22
  println!("--- Inline Expressions ---");