Skip to content

Conversations & sandboxes

Every conversation owns a cold, dedicated Sandbox — not a claim from a shared pool. That is what makes a per-conversation ServiceAccount and persistent volumes possible: the sandbox is the conversation's durable body.

The sandbox

  • A NixOS image with systemd as PID 1 — real services, timers, and a login environment, not a bare shell in a scratch container.
  • The agent's tool calls exec into the pod via the Kubernetes API; there is no in-pod agent or HTTP server. The sandbox stays a clean execution environment.
  • The agent can modify its own environment declaratively: it edits the machine's Nix configuration and rebuilds, and the change persists with the conversation.

Suspend, don't delete

An idle conversation's sandbox is suspended (the pod is torn down; the Sandbox object and its volumes remain). The next prompt revives it:

  • the workspace volume comes back as it was,
  • the conversation's transcript is re-injected into the agent's fresh session, so it continues with full context — whichever provider serves the run, including a bring-your-own container that has never seen the conversation before,
  • suspended conversations cost no CPU; the platform autoscales its own hosts to live demand.

Multi-replica by construction

Conversation ownership lives in a Conversation custom resource — the source of truth for existence, ownership, and liveness. A controller assigns each conversation to a host pod; routing follows the assignment; phase (live/suspended) is continuously reconciled against the sandbox's real state. Any replica can serve any conversation after a reassignment, and a rollout cannot strand one.

Subagents

A conversation can spawn subagents: full conversations that share the parent's sandbox pod, run asynchronously, and report back. The parent can monitor, search, and interrupt a running subagent.