# rashbox
Fast Rust+WASM bash sandbox for LLM agents. Mount files, run real Unix commands in an isolated WASM sandbox, let an AI agent explore and analyze them.
## What it does
- **WASM isolation** -- all commands run inside a Wasmtime sandbox (no host access)
- **23 Unix commands** compiled to a single 258KB WASM binary
- **Multi-LLM support** -- Claude, OpenAI, Ollama, llama-server, llama.cpp
- **Agent loop** -- LLM calls tools (exec, write_file, done), results fed back automatically
- **Pipes** -- `cat /in/file | grep error | awk '{print $1}' | sort | uniq -c`
- **Safety limits** -- max steps, max tokens, memory limits
## Quick start
```bash
# Analyze files with Claude
export ANTHROPIC_API_KEY=sk-...
rashbox src/*.rs --goal "Find bugs and security issues"
# Use a local model (Ollama)
rashbox --llm ollama --model qwen3.5:27b data.csv --goal "Analyze this dataset"
# Use llama-server
rashbox --llm llama --model my-model sales.csv access.log
# Interactive shell (no LLM)
rashbox --shell myfiles/
# Copy agent output files locally
rashbox --output-dir ./results src/ --goal "Generate a report"
```
## Available commands
| File viewing | `cat` `-n`, `head`, `tail`, `ls` `-alR` |
| Search | `grep` (regex: `^.$*+?[...]`), `find` `-name -type` |
| Text processing | `sed` `s///g`, `awk` (fields, math, conditions), `cut`, `tr`, `sort`, `uniq` |
| Analysis | `wc`, `csv_stats` (column types, min/max/mean/sum, uniques), `calc` (arithmetic) |
| Comparison | `diff` `-u` (unified diff) |
| File ops | `cp` `-r`, `mv`, `rm` `-r`, `mkdir` `-p`, `tee`, `echo`, `pwd` |
### Highlights
**awk** -- field extraction, math, conditions:
```bash
awk '{print $1, $3}' file # print fields
awk -F, '{sum+=$4} END {print sum}' # sum a CSV column
awk '$2 > 100 {print $1}' file # conditional filter
awk 'NR>1 {print $1}' file # skip header
```
**csv_stats** -- instant CSV profiling:
```bash
csv_stats sales.csv
# Rows: 24 Columns: 6
# -- date (string) --
# non-null: 24 null: 0 unique: 16
# -- units (numeric) --
# min: 25 max: 220 mean: 111 sum: 2670
```
**calc** -- arithmetic (LLMs can't do math):
```bash
calc '150 * 12.99 + 89 * 24.50' # => 4133.0
calc '(2 + 3) * 4 ^ 2' # => 80
```
**grep** with regex:
```bash
grep '^ERROR' log.txt # lines starting with ERROR
grep 'status_[0-9]+' file # regex patterns
```
## Architecture
```
rashbox (Rust binary)
|-- Agent loop (LLM <-> tools)
|-- Sandbox (Wasmtime + WASI preview1)
| |-- /skills (read-only, from ~/.skills/)
| '-- tools.wasm (258KB, 23 commands)
'-- LLM backends
|-- Claude (Anthropic API)
|-- OpenAI (+ compatible: Ollama, llama-server)
'-- llama.cpp (optional, via feature flag)
```
## CLI options
```
rashbox [OPTIONS] <FILES>...
--llm <BACKEND> claude, openai, ollama, llama, llamacpp, noop
--model <MODEL> Model name (default: claude-sonnet-4-6)
--api-key <KEY> API key (or set ANTHROPIC_API_KEY / OPENAI_API_KEY)
--base-url <URL> Custom endpoint for OpenAI-compatible APIs
--goal <GOAL> Task for the agent
--system <PROMPT> Override system prompt (prefix with @ to read from file)
--max-mem <MB> Sandbox memory limit (default: 40)
--max-steps <N> Max agent tool calls (default: 50)
--max-tokens <N> Max total tokens (default: 0 = unlimited)
--shell Interactive shell mode (no LLM)
--output-dir <DIR> Copy /out files here when done
```
## Building
```bash
# Build the WASM tools (requires wasm32-wasip1 target)
rustup target add wasm32-wasip1
cd wasm-tools && cargo build --release --target wasm32-wasip1
cp target/wasm32-wasip1/release/rashbox-tools.wasm ../wasm/tools.wasm
# Build rashbox
cargo build --release
```
## Testing
```bash
cargo test --test sandbox_test # 23 integration tests
```
## License
MIT