v2.11.0
A network-focused release: filtered egress can now reach a self-hosted service
on a private network, plus fixes for shadowed nested mounts and Antigravity
harness recognition.
Backward compatible: every pre-2.11.0 .ai-jail keeps working.
Added
--allow-private-host HOSTreaches a self-hosted service on a private
network. Like--allow-host, but the named host (and its subdomains) may
also resolve to RFC1918, ULA, or carrier-grade NAT addresses — a
self-hosted GitLab, a internal registry, a LAN-only CI endpoint. Loopback,
link-local, multicast, unspecified, and cloud-metadata addresses stay
denied for everyone, and the grant is trusted-only: CLI and global config
(allow_private_hosts = [...], including[commands.<name>]tables). An
untrusted project.ai-jailcannot add entries, and auto-save and--init
never write them. Entries count as filtered egress on their own, compose
with--lockdown, and appear in the audit log like any allowed host.
Fixed
-
Nested extra maps are no longer shadowed by their own ancestor (#183).
bwrap gives the later mount precedence, and user maps were emitted in list
order: a--rw-map ~/.cache/denolisted ahead of the auto-injected
toolchain cache map for~/.cachewas silently mounted under it — never
visible inside the sandbox, with Landlock then skipping its path as not
found. Extra mounts are now ordered parents-first by destination depth, so
a nested child always wins regardless of insertion order. Thanks @wtf9880. -
ai-memory run agyrecognizes Antigravity (#182). Theagy,
antigravity, andantigravity-clinames now map to the existing
antigravityagent entry, so~/.gemini(its OAuth home) is mounted and
theagyexecutable in~/.local/binis discovered under private home.
Previously the effective harness fell back toai-memory: re-login on
every launch, and no executable discovery. Thanks @JrRenato. -
Filtered egress handles local and private-network services correctly.
no_proxynow names loopback whenever the sandbox's loopback is isolated
from the host's (or a--forward-portdeliberately exposes it), so local
clients that honor the variable stop sending loopback traffic into the
proxy, where it was refused; on macOS, where the network stack is shared,
an inherited exclusion must not route around the proxy, and loopback stays
named only when a forward is active.
Documentation
-
Linux masks and denies pin the file's inode (GHSA-2gq6-9rhj-xrg4):
replacing a masked path on the host while the sandbox runs —mvof a temp
file over it, which is whatsed -iand many editors' saves do, or
delete-and-recreate — drops the rule for the running sandbox. Writing in
place keeps it, and the jailed process cannot trigger the replacement
itself. Keep a secret you will edit inside a masked directory, or restart
the sandbox after saving. macOS matches by path and is not affected. -
Test suites now share
tests/commonhelpers (PR #178), and the docs
received a repository-wide formatting pass.
Checksums (SHA256)
5676895c1eb921fafa22fcb9736ab3e8fbe1e9c0e4d321639a2a26e48b64a4fd ai-jail-linux-x86_64.tar.gz
b093c17271f3826c6088ed438a1217811a2af3391b53435d3199df953119b135 ai-jail-macos-aarch64.tar.gz
Install
brew tap akitaonrails/tap && brew install ai-jail
yay -S ai-jail-bin
cargo install --locked ai-jail