vsh-python 0.4.0__tar.gz → 0.5.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 (81) hide show
  1. {vsh_python-0.4.0 → vsh_python-0.5.0}/Cargo.lock +11 -11
  2. {vsh_python-0.4.0 → vsh_python-0.5.0}/Cargo.toml +9 -9
  3. {vsh_python-0.4.0 → vsh_python-0.5.0}/PKG-INFO +42 -14
  4. {vsh_python-0.4.0 → vsh_python-0.5.0}/README.md +38 -13
  5. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/README.md +38 -13
  6. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/native_benchmark.rs +1 -1
  7. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/artifact.rs +296 -6
  8. vsh_python-0.5.0/crates/vbash/src/hook.rs +513 -0
  9. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/lib.rs +13 -5
  10. vsh_python-0.5.0/crates/vbash/src/review.rs +98 -0
  11. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/runtime.rs +951 -28
  12. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh/Cargo.toml +1 -1
  13. vsh_python-0.5.0/crates/vsh/README.md +220 -0
  14. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/README.md +38 -13
  15. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/README.md +38 -13
  16. vsh_python-0.5.0/crates/vsh-policy/README.md +220 -0
  17. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/src/lib.rs +57 -28
  18. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-python/Cargo.toml +1 -1
  19. vsh_python-0.5.0/crates/vsh-python/README.md +220 -0
  20. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-python/src/lib.rs +543 -1
  21. vsh_python-0.5.0/crates/vsh-store/README.md +220 -0
  22. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/lib.rs +1 -1
  23. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/persistent.rs +2 -0
  24. vsh_python-0.5.0/crates/vsh-types/README.md +220 -0
  25. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-types/src/lib.rs +38 -2
  26. vsh_python-0.5.0/crates/vsh-vfs/README.md +220 -0
  27. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-vfs/src/lib.rs +34 -0
  28. vsh_python-0.5.0/crates/vsh-worker/README.md +220 -0
  29. {vsh_python-0.4.0 → vsh_python-0.5.0}/pyproject.toml +15 -53
  30. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/__init__.py +24 -0
  31. vsh_python-0.5.0/src/vsh/_judge.py +347 -0
  32. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/_native.pyi +176 -0
  33. vsh_python-0.5.0/src/vsh/hooks.py +217 -0
  34. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/codemode_server.py +1 -13
  35. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/surface.py +1 -6
  36. vsh_python-0.5.0/src/vsh/pydantic_ai.py +317 -0
  37. vsh_python-0.4.0/crates/vsh/README.md +0 -195
  38. vsh_python-0.4.0/crates/vsh-policy/README.md +0 -195
  39. vsh_python-0.4.0/crates/vsh-python/README.md +0 -195
  40. vsh_python-0.4.0/crates/vsh-store/README.md +0 -195
  41. vsh_python-0.4.0/crates/vsh-types/README.md +0 -195
  42. vsh_python-0.4.0/crates/vsh-vfs/README.md +0 -195
  43. vsh_python-0.4.0/crates/vsh-worker/README.md +0 -195
  44. {vsh_python-0.4.0 → vsh_python-0.5.0}/LICENSE +0 -0
  45. {vsh_python-0.4.0 → vsh_python-0.5.0}/THIRD_PARTY_NOTICES.md +0 -0
  46. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/Cargo.toml +0 -0
  47. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/staged_release.monty +0 -0
  48. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/staged_release.rs +0 -0
  49. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh/src/lib.rs +0 -0
  50. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/Cargo.toml +0 -0
  51. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/committer.rs +0 -0
  52. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/host.rs +0 -0
  53. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/journal.rs +0 -0
  54. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/lib.rs +0 -0
  55. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/plan.rs +0 -0
  56. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/tests.rs +0 -0
  57. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/Cargo.toml +0 -0
  58. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/lib.rs +0 -0
  59. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/tools.rs +0 -0
  60. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/worker.rs +0 -0
  61. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/Cargo.toml +0 -0
  62. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/examples/policy_benchmark.rs +0 -0
  63. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/Cargo.toml +0 -0
  64. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/directory.rs +0 -0
  65. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-types/Cargo.toml +0 -0
  66. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-vfs/Cargo.toml +0 -0
  67. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/Cargo.toml +0 -0
  68. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/child.rs +0 -0
  69. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/lib.rs +0 -0
  70. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/main.rs +0 -0
  71. {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/tests/subprocess.rs +0 -0
  72. {vsh_python-0.4.0 → vsh_python-0.5.0}/rust-toolchain.toml +0 -0
  73. {vsh_python-0.4.0 → vsh_python-0.5.0}/scripts/vsh_build_backend.py +0 -0
  74. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/__main__.py +0 -0
  75. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/_version.py +0 -0
  76. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/cli.py +0 -0
  77. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/__init__.py +0 -0
  78. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/native_tools.py +0 -0
  79. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/prompts.py +0 -0
  80. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/server.py +0 -0
  81. {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/py.typed +0 -0
@@ -1686,7 +1686,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1686
1686
 
1687
1687
  [[package]]
1688
1688
  name = "vbash"
1689
- version = "0.4.0"
1689
+ version = "0.5.0"
1690
1690
  dependencies = [
1691
1691
  "vsh",
1692
1692
  ]
@@ -1699,14 +1699,14 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
1699
1699
 
1700
1700
  [[package]]
1701
1701
  name = "vsh"
1702
- version = "0.4.0"
1702
+ version = "0.5.0"
1703
1703
  dependencies = [
1704
1704
  "vsh-runtime",
1705
1705
  ]
1706
1706
 
1707
1707
  [[package]]
1708
1708
  name = "vsh-commit"
1709
- version = "0.4.0"
1709
+ version = "0.5.0"
1710
1710
  dependencies = [
1711
1711
  "blake3",
1712
1712
  "cap-fs-ext",
@@ -1719,7 +1719,7 @@ dependencies = [
1719
1719
 
1720
1720
  [[package]]
1721
1721
  name = "vsh-monty"
1722
- version = "0.4.0"
1722
+ version = "0.5.0"
1723
1723
  dependencies = [
1724
1724
  "get-size2",
1725
1725
  "monty",
@@ -1733,7 +1733,7 @@ dependencies = [
1733
1733
 
1734
1734
  [[package]]
1735
1735
  name = "vsh-monty-worker"
1736
- version = "0.4.0"
1736
+ version = "0.5.0"
1737
1737
  dependencies = [
1738
1738
  "monty",
1739
1739
  "monty-alloc",
@@ -1748,7 +1748,7 @@ dependencies = [
1748
1748
 
1749
1749
  [[package]]
1750
1750
  name = "vsh-policy"
1751
- version = "0.4.0"
1751
+ version = "0.5.0"
1752
1752
  dependencies = [
1753
1753
  "vsh-store",
1754
1754
  "vsh-types",
@@ -1757,7 +1757,7 @@ dependencies = [
1757
1757
 
1758
1758
  [[package]]
1759
1759
  name = "vsh-python"
1760
- version = "0.4.0"
1760
+ version = "0.5.0"
1761
1761
  dependencies = [
1762
1762
  "monty-proto",
1763
1763
  "pyo3",
@@ -1767,7 +1767,7 @@ dependencies = [
1767
1767
 
1768
1768
  [[package]]
1769
1769
  name = "vsh-runtime"
1770
- version = "0.4.0"
1770
+ version = "0.5.0"
1771
1771
  dependencies = [
1772
1772
  "postcard",
1773
1773
  "vsh-commit",
@@ -1780,7 +1780,7 @@ dependencies = [
1780
1780
 
1781
1781
  [[package]]
1782
1782
  name = "vsh-store"
1783
- version = "0.4.0"
1783
+ version = "0.5.0"
1784
1784
  dependencies = [
1785
1785
  "blake3",
1786
1786
  "cap-fs-ext",
@@ -1790,14 +1790,14 @@ dependencies = [
1790
1790
 
1791
1791
  [[package]]
1792
1792
  name = "vsh-types"
1793
- version = "0.4.0"
1793
+ version = "0.5.0"
1794
1794
  dependencies = [
1795
1795
  "blake3",
1796
1796
  ]
1797
1797
 
1798
1798
  [[package]]
1799
1799
  name = "vsh-vfs"
1800
- version = "0.4.0"
1800
+ version = "0.5.0"
1801
1801
  dependencies = [
1802
1802
  "vsh-store",
1803
1803
  "vsh-types",
@@ -3,7 +3,7 @@ resolver = "3"
3
3
  members = ["crates/vsh-types", "crates/vsh-store", "crates/vsh-vfs", "crates/vsh-policy", "crates/vsh-monty", "crates/vsh-commit", "crates/vbash", "crates/vsh", "crates/vsh-python", "crates/vsh-worker"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.4.0"
6
+ version = "0.5.0"
7
7
  edition = "2024"
8
8
  rust-version = "1.95"
9
9
  license = "Apache-2.0"
@@ -23,14 +23,14 @@ monty-proto = { version = "=0.0.22", default-features = false }
23
23
  monty-types = { version = "=0.0.22", default-features = false }
24
24
  postcard = { version = "=1.1.3", default-features = false, features = ["alloc"] }
25
25
  pyo3 = { version = "=0.29.2", default-features = false }
26
- vsh-monty = { path = "crates/vsh-monty", version = "=0.4.0" }
27
- vsh-commit = { path = "crates/vsh-commit", version = "=0.4.0" }
28
- vsh-policy = { path = "crates/vsh-policy", version = "=0.4.0" }
29
- vsh-types = { path = "crates/vsh-types", version = "=0.4.0" }
30
- vsh-store = { path = "crates/vsh-store", version = "=0.4.0" }
31
- vsh-vfs = { path = "crates/vsh-vfs", version = "=0.4.0" }
32
- vsh-runtime = { path = "crates/vbash", version = "=0.4.0" }
33
- vsh = { path = "crates/vsh", version = "=0.4.0" }
26
+ vsh-monty = { path = "crates/vsh-monty", version = "=0.5.0" }
27
+ vsh-commit = { path = "crates/vsh-commit", version = "=0.5.0" }
28
+ vsh-policy = { path = "crates/vsh-policy", version = "=0.5.0" }
29
+ vsh-types = { path = "crates/vsh-types", version = "=0.5.0" }
30
+ vsh-store = { path = "crates/vsh-store", version = "=0.5.0" }
31
+ vsh-vfs = { path = "crates/vsh-vfs", version = "=0.5.0" }
32
+ vsh-runtime = { path = "crates/vbash", version = "=0.5.0" }
33
+ vsh = { path = "crates/vsh", version = "=0.5.0" }
34
34
 
35
35
  [workspace.lints.rust]
36
36
  elided_lifetimes_in_paths = "deny"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vsh-python
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3
@@ -11,6 +11,7 @@ Classifier: Programming Language :: Python :: 3.14
11
11
  Classifier: Programming Language :: Rust
12
12
  Requires-Dist: basedpyright ; extra == 'dev'
13
13
  Requires-Dist: maturin==1.15.0 ; extra == 'dev'
14
+ Requires-Dist: pydantic-ai-slim==2.40.0 ; extra == 'dev'
14
15
  Requires-Dist: pytest ; extra == 'dev'
15
16
  Requires-Dist: pytest-cov ; extra == 'dev'
16
17
  Requires-Dist: ruff ; extra == 'dev'
@@ -18,8 +19,10 @@ Requires-Dist: setuptools==84.0.0 ; extra == 'dev'
18
19
  Requires-Dist: ty ; extra == 'dev'
19
20
  Requires-Dist: zensical==0.0.57 ; extra == 'dev'
20
21
  Requires-Dist: fastmcp==3.4.7 ; extra == 'mcp'
22
+ Requires-Dist: pydantic-ai-slim==2.40.0 ; extra == 'pydantic-ai'
21
23
  Provides-Extra: dev
22
24
  Provides-Extra: mcp
25
+ Provides-Extra: pydantic-ai
23
26
  License-File: LICENSE
24
27
  Summary: VSH is a low-latency transactional filesystem simulator backed by Rust.
25
28
  Keywords: agents,commands,mcp,simulation,workspaces
@@ -84,11 +87,39 @@ print(receipt.state, receipt.result, receipt.changes)
84
87
  The GIL is released while snapshotting, executing Monty, generating the diff,
85
88
  evaluating policy, revalidating dependencies, and committing.
86
89
 
90
+ ### Pydantic AI
91
+
92
+ Install the exact-pinned optional integration:
93
+
94
+ ```bash
95
+ uv add "vsh-python[pydantic-ai]"
96
+ ```
97
+
98
+ ```python
99
+ from pydantic_ai import Agent
100
+ from vsh.pydantic_ai import VshCapability
101
+
102
+ capability = VshCapability("/path/to/workspace")
103
+ agent = Agent("openai:gpt-5", capabilities=[capability])
104
+ ```
105
+
106
+ The capability contributes the ten native `vsh_*` filesystem operations plus
107
+ `vsh_run` for atomic multi-step work. Every call executes in a virtual snapshot first.
108
+ Policy-controlled changes commit exactly once or return `pending_approval`; no internal
109
+ LLM judge is created implicitly.
110
+
111
+ For explicitly configured model review, attach a
112
+ [`CommitJudge`](https://fswair.github.io/vsh/python/commit-judge/) through
113
+ `hook_handler=judge.hook_handler`. It evaluates canonical changes, before/after
114
+ content, effects and intent together. A valid approval can directly commit pending
115
+ work; native hard-deny and stale checks remain enforced. Review returns actionable
116
+ feedback to the main agent.
117
+
87
118
  ## Rust
88
119
 
89
120
  ```toml
90
121
  [dependencies]
91
- vsh = "=0.4.0"
122
+ vsh = "=0.5.0"
92
123
  ```
93
124
 
94
125
  ```rust,no_run
@@ -114,7 +145,7 @@ wheels bundle it; native embedders configure its trusted path through
114
145
 
115
146
  ## Active-snapshot filesystem functions
116
147
 
117
- VSH 0.4.0 injects ten bounded `vsh_*` functions into each Monty program: read, write,
148
+ VSH injects ten bounded `vsh_*` functions into each Monty program: read, write,
118
149
  list, make directory, remove, move, copy, glob, literal search and exact text patch.
119
150
  They share the same copy-on-write snapshot as `pathlib`, so earlier virtual writes are
120
151
  visible to later calls without creating a nested runtime or crossing MCP.
@@ -168,19 +199,16 @@ and sampled process-tree RSS does not establish a repeatable memory reduction. S
168
199
  - Process-local preview retention is fail-closed and bounded by both artifact count and
169
200
  encoded bytes; it cannot become an unbounded parent-process cache.
170
201
 
171
- See the [threat model](https://fswair.github.io/vsh/rust-rewrite/THREAT_MODEL/),
172
- [guarantees](https://fswair.github.io/vsh/rust-rewrite/GUARANTEES/), and
173
- [dependency record](https://fswair.github.io/vsh/rust-rewrite/DEPENDENCY_POLICY/).
174
- Upgrade and benchmark details are in the
175
- [migration guide](https://fswair.github.io/vsh/rust-rewrite/MIGRATION/) and current
176
- [performance report](https://fswair.github.io/vsh/performance/). Merge coverage scope
177
- and floors are recorded in the
178
- [coverage contract](https://fswair.github.io/vsh/rust-rewrite/COVERAGE/).
202
+ See the [threat model](https://fswair.github.io/vsh/threat-model/),
203
+ [guarantees](https://fswair.github.io/vsh/guarantees/),
204
+ [dependency policy](https://fswair.github.io/vsh/dependency-policy/), current
205
+ [performance report](https://fswair.github.io/vsh/performance/), and
206
+ [coverage contract](https://fswair.github.io/vsh/coverage/).
179
207
 
180
- ## Compatibility handles
208
+ ## Package names
181
209
 
182
- Existing declarations may continue to install `vbash==0.4.0` from PyPI or depend on
183
- `vbash = "=0.4.0"` from crates.io. Both packages are implementation-free mirrors of
210
+ Existing declarations may install `vbash==0.5.0` from PyPI or depend on
211
+ `vbash = "=0.5.0"` from crates.io. Both names are implementation-free mirrors of
184
212
  the exact matching VSH release. New projects should use `vsh-python` and `vsh`
185
213
  directly; Python code continues to write `import vsh` either way.
186
214
 
@@ -54,11 +54,39 @@ print(receipt.state, receipt.result, receipt.changes)
54
54
  The GIL is released while snapshotting, executing Monty, generating the diff,
55
55
  evaluating policy, revalidating dependencies, and committing.
56
56
 
57
+ ### Pydantic AI
58
+
59
+ Install the exact-pinned optional integration:
60
+
61
+ ```bash
62
+ uv add "vsh-python[pydantic-ai]"
63
+ ```
64
+
65
+ ```python
66
+ from pydantic_ai import Agent
67
+ from vsh.pydantic_ai import VshCapability
68
+
69
+ capability = VshCapability("/path/to/workspace")
70
+ agent = Agent("openai:gpt-5", capabilities=[capability])
71
+ ```
72
+
73
+ The capability contributes the ten native `vsh_*` filesystem operations plus
74
+ `vsh_run` for atomic multi-step work. Every call executes in a virtual snapshot first.
75
+ Policy-controlled changes commit exactly once or return `pending_approval`; no internal
76
+ LLM judge is created implicitly.
77
+
78
+ For explicitly configured model review, attach a
79
+ [`CommitJudge`](https://fswair.github.io/vsh/python/commit-judge/) through
80
+ `hook_handler=judge.hook_handler`. It evaluates canonical changes, before/after
81
+ content, effects and intent together. A valid approval can directly commit pending
82
+ work; native hard-deny and stale checks remain enforced. Review returns actionable
83
+ feedback to the main agent.
84
+
57
85
  ## Rust
58
86
 
59
87
  ```toml
60
88
  [dependencies]
61
- vsh = "=0.4.0"
89
+ vsh = "=0.5.0"
62
90
  ```
63
91
 
64
92
  ```rust,no_run
@@ -84,7 +112,7 @@ wheels bundle it; native embedders configure its trusted path through
84
112
 
85
113
  ## Active-snapshot filesystem functions
86
114
 
87
- VSH 0.4.0 injects ten bounded `vsh_*` functions into each Monty program: read, write,
115
+ VSH injects ten bounded `vsh_*` functions into each Monty program: read, write,
88
116
  list, make directory, remove, move, copy, glob, literal search and exact text patch.
89
117
  They share the same copy-on-write snapshot as `pathlib`, so earlier virtual writes are
90
118
  visible to later calls without creating a nested runtime or crossing MCP.
@@ -138,19 +166,16 @@ and sampled process-tree RSS does not establish a repeatable memory reduction. S
138
166
  - Process-local preview retention is fail-closed and bounded by both artifact count and
139
167
  encoded bytes; it cannot become an unbounded parent-process cache.
140
168
 
141
- See the [threat model](https://fswair.github.io/vsh/rust-rewrite/THREAT_MODEL/),
142
- [guarantees](https://fswair.github.io/vsh/rust-rewrite/GUARANTEES/), and
143
- [dependency record](https://fswair.github.io/vsh/rust-rewrite/DEPENDENCY_POLICY/).
144
- Upgrade and benchmark details are in the
145
- [migration guide](https://fswair.github.io/vsh/rust-rewrite/MIGRATION/) and current
146
- [performance report](https://fswair.github.io/vsh/performance/). Merge coverage scope
147
- and floors are recorded in the
148
- [coverage contract](https://fswair.github.io/vsh/rust-rewrite/COVERAGE/).
169
+ See the [threat model](https://fswair.github.io/vsh/threat-model/),
170
+ [guarantees](https://fswair.github.io/vsh/guarantees/),
171
+ [dependency policy](https://fswair.github.io/vsh/dependency-policy/), current
172
+ [performance report](https://fswair.github.io/vsh/performance/), and
173
+ [coverage contract](https://fswair.github.io/vsh/coverage/).
149
174
 
150
- ## Compatibility handles
175
+ ## Package names
151
176
 
152
- Existing declarations may continue to install `vbash==0.4.0` from PyPI or depend on
153
- `vbash = "=0.4.0"` from crates.io. Both packages are implementation-free mirrors of
177
+ Existing declarations may install `vbash==0.5.0` from PyPI or depend on
178
+ `vbash = "=0.5.0"` from crates.io. Both names are implementation-free mirrors of
154
179
  the exact matching VSH release. New projects should use `vsh-python` and `vsh`
155
180
  directly; Python code continues to write `import vsh` either way.
156
181
 
@@ -54,11 +54,39 @@ print(receipt.state, receipt.result, receipt.changes)
54
54
  The GIL is released while snapshotting, executing Monty, generating the diff,
55
55
  evaluating policy, revalidating dependencies, and committing.
56
56
 
57
+ ### Pydantic AI
58
+
59
+ Install the exact-pinned optional integration:
60
+
61
+ ```bash
62
+ uv add "vsh-python[pydantic-ai]"
63
+ ```
64
+
65
+ ```python
66
+ from pydantic_ai import Agent
67
+ from vsh.pydantic_ai import VshCapability
68
+
69
+ capability = VshCapability("/path/to/workspace")
70
+ agent = Agent("openai:gpt-5", capabilities=[capability])
71
+ ```
72
+
73
+ The capability contributes the ten native `vsh_*` filesystem operations plus
74
+ `vsh_run` for atomic multi-step work. Every call executes in a virtual snapshot first.
75
+ Policy-controlled changes commit exactly once or return `pending_approval`; no internal
76
+ LLM judge is created implicitly.
77
+
78
+ For explicitly configured model review, attach a
79
+ [`CommitJudge`](https://fswair.github.io/vsh/python/commit-judge/) through
80
+ `hook_handler=judge.hook_handler`. It evaluates canonical changes, before/after
81
+ content, effects and intent together. A valid approval can directly commit pending
82
+ work; native hard-deny and stale checks remain enforced. Review returns actionable
83
+ feedback to the main agent.
84
+
57
85
  ## Rust
58
86
 
59
87
  ```toml
60
88
  [dependencies]
61
- vsh = "=0.4.0"
89
+ vsh = "=0.5.0"
62
90
  ```
63
91
 
64
92
  ```rust,no_run
@@ -84,7 +112,7 @@ wheels bundle it; native embedders configure its trusted path through
84
112
 
85
113
  ## Active-snapshot filesystem functions
86
114
 
87
- VSH 0.4.0 injects ten bounded `vsh_*` functions into each Monty program: read, write,
115
+ VSH injects ten bounded `vsh_*` functions into each Monty program: read, write,
88
116
  list, make directory, remove, move, copy, glob, literal search and exact text patch.
89
117
  They share the same copy-on-write snapshot as `pathlib`, so earlier virtual writes are
90
118
  visible to later calls without creating a nested runtime or crossing MCP.
@@ -138,19 +166,16 @@ and sampled process-tree RSS does not establish a repeatable memory reduction. S
138
166
  - Process-local preview retention is fail-closed and bounded by both artifact count and
139
167
  encoded bytes; it cannot become an unbounded parent-process cache.
140
168
 
141
- See the [threat model](https://fswair.github.io/vsh/rust-rewrite/THREAT_MODEL/),
142
- [guarantees](https://fswair.github.io/vsh/rust-rewrite/GUARANTEES/), and
143
- [dependency record](https://fswair.github.io/vsh/rust-rewrite/DEPENDENCY_POLICY/).
144
- Upgrade and benchmark details are in the
145
- [migration guide](https://fswair.github.io/vsh/rust-rewrite/MIGRATION/) and current
146
- [performance report](https://fswair.github.io/vsh/performance/). Merge coverage scope
147
- and floors are recorded in the
148
- [coverage contract](https://fswair.github.io/vsh/rust-rewrite/COVERAGE/).
169
+ See the [threat model](https://fswair.github.io/vsh/threat-model/),
170
+ [guarantees](https://fswair.github.io/vsh/guarantees/),
171
+ [dependency policy](https://fswair.github.io/vsh/dependency-policy/), current
172
+ [performance report](https://fswair.github.io/vsh/performance/), and
173
+ [coverage contract](https://fswair.github.io/vsh/coverage/).
149
174
 
150
- ## Compatibility handles
175
+ ## Package names
151
176
 
152
- Existing declarations may continue to install `vbash==0.4.0` from PyPI or depend on
153
- `vbash = "=0.4.0"` from crates.io. Both packages are implementation-free mirrors of
177
+ Existing declarations may install `vbash==0.5.0` from PyPI or depend on
178
+ `vbash = "=0.5.0"` from crates.io. Both names are implementation-free mirrors of
154
179
  the exact matching VSH release. New projects should use `vsh-python` and `vsh`
155
180
  directly; Python code continues to write `import vsh` either way.
156
181
 
@@ -449,7 +449,7 @@ fn parse_arguments() -> io::Result<Arguments> {
449
449
  cold_iterations: 30,
450
450
  parallel_workers: 4,
451
451
  worker: PathBuf::from("vsh-monty-worker"),
452
- output: PathBuf::from("reports/rust-rewrite/native-rust.json"),
452
+ output: PathBuf::from("benchmarks/results/local/native-rust.json"),
453
453
  };
454
454
  let mut arguments = std::env::args_os().skip(1);
455
455
  while let Some(argument) = arguments.next() {