diff --git a/README.MD b/README.MD index ec0f068..a98e948 100644 --- a/README.MD +++ b/README.MD @@ -32,11 +32,12 @@ Encrypted chat that runs in your terminal. You host the server, you control the - **SRP authentication** — the password is never sent over the network (zero-knowledge proof) - **Zero-knowledge server** — relays only ciphertext; cannot read messages, files, or terminal output - **RAM only** — nothing persisted on the server; close it and history is gone -- **Shared sandbox** — summon a disposable `local` / `docker` / `multipass` box the whole room can watch and drive +- **Shared sandbox** — summon a disposable `local` / `docker` / `podman` / `multipass` box the whole room can watch and drive. Docker defaults to **Parrot OS Security** (`parrotsec/core`) and Podman to **Kali** (`kalilinux/kali-rolling`) — pentest distros out of the box; Podman is rootless & daemonless, so **no sudo** to launch - **Snapshot save/load** — freeze a sandbox to a named snapshot and restore it later (`/sbx save` · `/sbx load` · `/sbx snaps`) - **Local VirtualBox VMs** — `/sbx vms` detects VirtualBox and lists your VMs; `/sbx gui ` opens a desktop VM locally for the room to gather around — per-user consent gate, with automatic resolution of VT-x conflicts (Docker Desktop / multipass) - **Real permissions** — the host grants/revokes *drive* (keyboard) and *sudo* (VM superuser) per user; **stacking roster badges** show exactly who holds what, both in the clergy panel and inline on every chat message - **Local-first AI agent** — `/ai start` summons an in-room AI that runs against *your own* [Ollama](https://ollama.com) (no API key, nothing leaves your machine); replies **stream token-by-token** with **in-RAM semantic recall** of the conversation for context; model-agnostic, addressed-only, end-to-end encrypted like every other client +- **AI that acts in the sandbox** — grant an agent *drive* and address it with `/ai !`; it works the shared box through a bounded, host-side **tool-calling loop** (run shell, write/read files, inspecting each result before the next step) and you watch its commands land live in the shared terminal. Ungranted, it stays **advisory-only** (tells you the commands, runs nothing); destructive commands are gated behind an explicit `/ai confirm` - **Encrypted file transfer** — `/send` → `/accept` with SHA-256 verification - **TLS** — self-signed by default, or bring your own cert; `--no-tls` for local/Tailscale use - **Themes** — seven switchable "vestments" (`crypt` default · `church` · `neon` · `blush` · `matrix` · `wraith` · `goldcrypt`), plus a live randomizer @@ -153,16 +154,18 @@ Type to chat. Slash commands and keys: | `/sendroom ` | Offer a file (or directory) to the whole room | | `/accept` · `/reject` | Respond to a pending file offer | | `/clear` | Wipe your chat scrollback (local only) | -| `/ai start [model\|profile]` | Summon a local AI agent (default `ollama/qwen2.5:3b`; a bare name is a `models.toml` profile) | +| `/ai start [model\|profile] [allow]` | Summon a local AI agent (default `ollama/qwen2.5:3b`; a bare name is a `models.toml` profile). `allow` auto-grants it sandbox drive at spawn | | `/ai stop` | Dismiss the agent you summoned | | `/ai ` | Ask the agent (`/ai ` if several present) | +| `/ai !` | Have a *granted* agent act in the shared sandbox (advisory-only if it has no drive) | +| `/ai confirm` | Approve a gated (destructive) command the agent proposed | | `/ai list` | List the agents present (or hint to `/ai start` if none) | | `/ai models` | Models the active agent can serve — or, with no agent, your local Ollama tags | -| `/sbx launch [local\|docker\|multipass] [image] [install]` | Summon the shared sandbox (`install` fetches a missing backend; `--start` boots a stopped Docker daemon) | +| `/sbx [image] [install]` | Summon the shared sandbox — the backend leads (`/sbx launch …` still works). Docker → **Parrot OS** (`parrotsec/core`), Podman → **Kali** (`kalilinux/kali-rolling`, rootless, no sudo). `install` fetches a missing backend; `docker --start` boots a stopped daemon | | `/sbx stop` | Tear down the sandbox you host | | `/sbx save [label]` · `/sbx load