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.
- {vsh_python-0.4.0 → vsh_python-0.5.0}/Cargo.lock +11 -11
- {vsh_python-0.4.0 → vsh_python-0.5.0}/Cargo.toml +9 -9
- {vsh_python-0.4.0 → vsh_python-0.5.0}/PKG-INFO +42 -14
- {vsh_python-0.4.0 → vsh_python-0.5.0}/README.md +38 -13
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/README.md +38 -13
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/native_benchmark.rs +1 -1
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/artifact.rs +296 -6
- vsh_python-0.5.0/crates/vbash/src/hook.rs +513 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/lib.rs +13 -5
- vsh_python-0.5.0/crates/vbash/src/review.rs +98 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/src/runtime.rs +951 -28
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh/Cargo.toml +1 -1
- vsh_python-0.5.0/crates/vsh/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/README.md +38 -13
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/README.md +38 -13
- vsh_python-0.5.0/crates/vsh-policy/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/src/lib.rs +57 -28
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-python/Cargo.toml +1 -1
- vsh_python-0.5.0/crates/vsh-python/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-python/src/lib.rs +543 -1
- vsh_python-0.5.0/crates/vsh-store/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/lib.rs +1 -1
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/persistent.rs +2 -0
- vsh_python-0.5.0/crates/vsh-types/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-types/src/lib.rs +38 -2
- vsh_python-0.5.0/crates/vsh-vfs/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-vfs/src/lib.rs +34 -0
- vsh_python-0.5.0/crates/vsh-worker/README.md +220 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/pyproject.toml +15 -53
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/__init__.py +24 -0
- vsh_python-0.5.0/src/vsh/_judge.py +347 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/_native.pyi +176 -0
- vsh_python-0.5.0/src/vsh/hooks.py +217 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/codemode_server.py +1 -13
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/surface.py +1 -6
- vsh_python-0.5.0/src/vsh/pydantic_ai.py +317 -0
- vsh_python-0.4.0/crates/vsh/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-policy/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-python/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-store/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-types/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-vfs/README.md +0 -195
- vsh_python-0.4.0/crates/vsh-worker/README.md +0 -195
- {vsh_python-0.4.0 → vsh_python-0.5.0}/LICENSE +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/THIRD_PARTY_NOTICES.md +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/staged_release.monty +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vbash/examples/staged_release.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh/src/lib.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/committer.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/host.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/journal.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/lib.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/plan.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-commit/src/tests.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/lib.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/tools.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-monty/src/worker.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-policy/examples/policy_benchmark.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-store/src/directory.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-types/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-vfs/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/Cargo.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/child.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/lib.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/src/main.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/crates/vsh-worker/tests/subprocess.rs +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/rust-toolchain.toml +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/scripts/vsh_build_backend.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/__main__.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/_version.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/cli.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/__init__.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/native_tools.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/prompts.py +0 -0
- {vsh_python-0.4.0 → vsh_python-0.5.0}/src/vsh/mcp/server.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
27
|
-
vsh-commit = { path = "crates/vsh-commit", version = "=0.
|
|
28
|
-
vsh-policy = { path = "crates/vsh-policy", version = "=0.
|
|
29
|
-
vsh-types = { path = "crates/vsh-types", version = "=0.
|
|
30
|
-
vsh-store = { path = "crates/vsh-store", version = "=0.
|
|
31
|
-
vsh-vfs = { path = "crates/vsh-vfs", version = "=0.
|
|
32
|
-
vsh-runtime = { path = "crates/vbash", version = "=0.
|
|
33
|
-
vsh = { path = "crates/vsh", version = "=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.
|
|
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.
|
|
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
|
|
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/
|
|
172
|
-
[guarantees](https://fswair.github.io/vsh/
|
|
173
|
-
[dependency
|
|
174
|
-
|
|
175
|
-
[
|
|
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
|
-
##
|
|
208
|
+
## Package names
|
|
181
209
|
|
|
182
|
-
Existing declarations may
|
|
183
|
-
`vbash = "=0.
|
|
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.
|
|
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
|
|
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/
|
|
142
|
-
[guarantees](https://fswair.github.io/vsh/
|
|
143
|
-
[dependency
|
|
144
|
-
|
|
145
|
-
[
|
|
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
|
-
##
|
|
175
|
+
## Package names
|
|
151
176
|
|
|
152
|
-
Existing declarations may
|
|
153
|
-
`vbash = "=0.
|
|
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.
|
|
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
|
|
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/
|
|
142
|
-
[guarantees](https://fswair.github.io/vsh/
|
|
143
|
-
[dependency
|
|
144
|
-
|
|
145
|
-
[
|
|
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
|
-
##
|
|
175
|
+
## Package names
|
|
151
176
|
|
|
152
|
-
Existing declarations may
|
|
153
|
-
`vbash = "=0.
|
|
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("
|
|
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() {
|