A task, not a message
The unit of interaction has a real lifecycle: New → Planning → Executing → Waiting for you → Completed. You can close the laptop in the middle of it.
Desktop environment for AI agents · .NET 10 · Avalonia
A modern model can plan, run code, edit projects and chain actions. A chat window turns that into a terminal you hand-drive. Enactive is the environment the agent works in instead — the model is the engine, this is the workspace.
How it works
Workspace → Task → Worker → Artifact. Chat stays, as a side console for quick nudges — it is no longer where the work happens.
The unit of interaction has a real lifecycle: New → Planning → Executing → Waiting for you → Completed. You can close the laptop in the middle of it.
Structured progress — found 14 files → identified the bottleneck → 3 tests passed → changes ready. Never raw chain-of-thought.
A run ends in a diff, a file set, a report — with Apply, Review and Reject on it. Not fifty chat bubbles you have to read.
The agent runs the plan end to end and raises a decision card when the choice is genuinely yours — with the options and a recommendation.
What's in it
Everything below is implemented and running today, not a roadmap.
The planner emits step dependencies. The scheduler runs steps by readiness, cascade-skips dependents when one fails, and detects cycles.
Observe → Suggest → Execute → Autonomous. Shell and PowerShell ask first; you can remember an approval for the session or for the workspace.
Developer, Reviewer (read-only), Ops, Writer — each with its own tool allowlist, permission level and model. You pick a role, not a model.
Read-only discovery of host and OS, Git branch, remote and dirty state, Docker, WSL and services — fed into the prompt and shown in the UI.
Decisions and artifacts across every run fold into a persistent project memory, so the next run starts knowing what the last one did.
Drop ten tasks in the evening. The agent runs headless, declines to guess at forks, and leaves results and questions in your Inbox.
Optional staging: every write becomes a diff you Apply or Reject before it touches the disk.
Every prompt, response, tool call and event — with a raw-wire option. Live window plus a daily file, so a bad run can be read afterwards.
API keys are DPAPI-encrypted in settings.json. Run history, memory and approvals live in .enactive/ inside your own workspace.
The fork
The agent scans, plans, writes and tests on its own. When it reaches an ambiguity it cannot resolve honestly, it stops and asks — with the options laid out and a recommendation — instead of guessing and reporting success.
That pause is the whole point of the autonomy slider, and it is the gap in the logo.
The replica on ate-db-02 is 40 s behind. Probing it will hold a read lock for about a second.
Team of models
Configure any number of providers and bind a model to each phase of a run. One local model doing everything is just the simplest case of the same setup.
A reasoner turns the intent into a dependency graph and rates every step trivial, normal or complex.
Steps route themselves by that rating: trivial to a light model, normal to the worker's own, complex to the heavy one.
Each step is judged against the real tool transcript — not the model's summary of it. On a fail, the step is retried with the feedback.
num_ctx
Anthropic
OpenAI-compatible
OpenRouter · Groq · a second Ollama…
The awkward parts are handled for you: local <think> is off by default, Anthropic's
temperature is dropped for models that reject it, max_tokens is auto-sized to each
model's real cap, a truncation guard stops a half-written tool call from looping, and writes can be
verified by reading the file back.
Architecture
Seven projects on .NET 10. Core, Providers, Tools, Agents and the console host pull in zero external NuGet packages. Only storage and the Avalonia UI have dependencies at all.
run_command, run_powershell, git and docker, each gated by permission level.