aido-runtime
Tu peux simuler avant, snapshot avant, annuler si ça casse.
No free-form actions, no string-blob arguments. Each primitive is a Rust enum Action variant · the policy engine, the simulator, the audit log all introspect the same tree. Add a primitive in one place, the safety chain picks it up everywhere.
The headline family. simulate projects what would happen; everything else gates or reverts.
Read + write through the policy + audit chain. Shell does the trivia (ls/cat/find); the runtime owns the writes.
The only ways the agent spawns a process · and each one is policy-gated. run_in_sandbox wraps in Podman.
btrfs/zfs reflink · O(1) create, < 200 ms restore. The agent's undo button.
Persistent remember store at ~/.aido/memory/. Survives restarts, agents, projects.
Reactive primitives + async handle bookkeeping. watch_and_react wires file events to actions.
The agent defines new tools at runtime. Rhai today, WASM next. Each defined function is exposed as its own MCP tool to other agents.
Wayland-native click / type / screenshot / clipboard. Gated by desktop.enabled and policy. For the agent that drives a host UI.
Sandboxed localhost-served outputs. The agent generates a webapp / canvas → user opens it at localhost:7800/a/<id>/.
Outbound HTTP + the agent's ability to call sibling LLMs. Multi-agent native · llm_call is just a tool.
Multi-pattern regex search + read combiner. The "give me the function and its 3 callers in one shot" primitive.
Approval gates + diff + structured logs. The bits that let the agent pause safely.
The policy engine is the heart of aido-runtime. Each Action variant falls into one of 8 side-effect classes. The classifier feeds every safety primitive · simulate uses it to project, policy_check uses it to gate, the audit log uses it to label. Classify once, reuse everywhere.
The agent's typed call goes through 6 independent layers before anything mutates state. Most never trigger · most calls are read_only on allowed paths. But when an action is risky, at least one of these stops it.
Boolean per action type · actions.toml can disable RunCommand entirely. Always-allow list bypasses for meta tools.
readonly blocks all writes/spawns/desktop. confirm turns every mutation into a RequireConfirmation verdict.
allowed_read_paths + allowed_write_paths with tilde expansion. Symlinks resolved before check · no ../ escapes.
Glob blacklist (**/.ssh/**, /etc/shadow, **/.env). Wins over allow paths. The "no matter what" backstop.
Composite actions (Pipeline / Try / SafeChange / If) get every leaf preflighted before the first step runs. Atomic refusal.
The dry-run primitive: walks the tree, projects side effects, returns the verdict aggregate · 0 mutations, < 1 ms typical.
Optional primitive families are cargo features. Build with just prim-network for a headless code agent. Add prim-desktop for computer-use. The default all-prims ships everything.
The crate compiles to a library (so aido-orchestrator can embed the executor in-process) and to the aido-runtime binary that exposes the same primitives over MCP stdio or HTTP.
cargo build to first action.
The runtime ships sane defaults (allowed paths under your home, deny patterns for .ssh + .env, network on, desktop off). Tighten with ~/.aido/config.toml.