About
Coding Agent singularly focused efficiency and context curation. Reduces API costs by 50-80% vs other agent AND improves the code quality at the same time. Uses
# Dirac, an Open-source AI coding agent for efficiently doing complex work
Dirac is built for long-running software-engineering work, precise codebase changes, and efficient model use.
## What is Dirac?
Dirac is an open-source coding agent you can use in VS Code, from the terminal, or through any compatible [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) client. It supports **dozens of providers and hundreds of models**, so you can bring the models and credentials that fit your workflow instead of being locked into one stack.
Dirac combines autonomous task execution with purpose-built code tools: hash-anchored file editing, syntax-tree inspection and refactoring, parallel operations, subagents, continuous steering, and configurable permission controls. The goal is simple: give capable models better infrastructure so they can work longer, faster, and with less token overhead.
## Why Dirac?
Available in VS Code, Open VSX, the CLI, and ACP clients
Install the extension from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=dirac-run.dirac) or [Open VSX](https://open-vsx.org/extension/dirac-run/dirac), run Dirac in any terminal with the CLI, or use it from ACP-compatible editors such as JetBrains IDEs and Zed. Your provider configuration stays with Dirac across these interfaces.
Goal mode: give Dirac a goal and walk away
Start an interactive CLI session with `/goal `. Dirac can keep working toward the same objective for hours or days without drifting, autonomously creating and coordinating tasks until the goal is achieved. It pauses when it needs your input, and you can check in, steer, pause, resume, or stop it at any time.
Dirac can extend itself
Use `/new-tool ` to build a tool tailored to your workflow while you work. Dirac turns the requirements into a typed tool, compiles it, validates it, and smoke-tests it. Task-scoped tools are available immediately; persistent workspace and global tools appear in the **Tools** tab and can be enabled without starting a new conversation.
Tool creation must be enabled. Smoke commands follow your configured approval policy.
Low-verbosity responses
Models do not need to narrate every routine step. Enable **Low-verbosity responses** to keep progress and final answers concise while preserving decisions, caveats, failures, and verification results.
Steer it while it works
If something occurs to you after a task starts, send another message at any time. Dirac queues it and delivers it to the model with the next tool response, updating the work without cancelling or restarting the task.
Use a separate Utility model for supporting work
Route context compaction, new-task handoffs, commit-message generation, and permission decisions to a separate, cheaper model so the main model can stay focused on implementation. In our context-compaction case study, this model arbitrage reduced cost by more than 80%: [Sol vs. Luna: token arbitrage for AI agents](https://dirac.run/posts/token-arbitrage-sol-vs-luna).
No more approval fatigue
Configure the Utility model as the first pass for permission requests and give it an explicit natural-language policy. It approves requests that satisfy the policy and escalates unsafe or uncertain requests to you. Every automatic approval remains visible in the transcript with its reason.
Hash-anchored file editing
Dirac uses a custom stable line-anchor protocol instead of brittle search-and-replace blocks. The model can identify an exact source range by its anchors and replace only that range, even after nearby lines move. This reduces edit payloads, ambiguity, and retries. [Read how hash anchors and Myers diff make editing more efficient](https://dirac.run/posts/hash-anchors-myers-diff-single-token).
AST code inspection
Dirac uses the codebase's syntax trees to inspect structure without reading entire files. The model can request outlines of many files or retrieve one exact implementation and its references:
```text
inspect_ast(operation: "outline", paths: ["utils/db.py"])
inspect_ast(operation: "implementation", paths: ["utils/db.py"], symbols: ["DBManager.init_db"])
```
Structural results depend on parser and index coverage. Dynamic references require separate verification.
AST code manipulation
Structural edits operate on symbols rather than approximate text matches. Dirac can replace one complete function or rename hundreds of indexed references in one call:
```text
edit_ast(operation: "replace", targets: [{ path: "utils/db.py", symbol: "DBManager.init_db", replacement: "..." }])
edit_ast(operation: "rename", targets: [{ path: "src/", symbol: "old_name", replacement: "new_name" }])
```
Ask Dirac questions about itself
Every Dirac build ships with its source. Use `/askDirac ` to ask how the installed version works; Dirac receives read-only access to its own functional source so it can answer against the build you are running.
Parallel code edits
Dirac's tool protocol lets models batch independent reads, searches, edits, and commands in one response. Coordinated changes across multiple files happen together instead of requiring a separate model round trip for every operation.
Review one multi-file change
When automatic approval is disabled, Dirac groups related changes into a single multi-file diff view. You can review the complete change as one unit instead of opening and approving a sequence of disconnected file edits.
Opportunistic first-request enrichment
Before the first request reaches the model, Dirac detects likely filenames, directory paths, and symbol names and assembles a bounded context packet. Named symbols receive definition-first context and indexed references.
You can also mention Git changes, workspace diagnostics, terminal output, URLs, text files, PDFs, DOCX files, spreadsheets, notebooks, and images. Applicable `AGENTS.md` instructions, matching rules, and active skills join the request as repository guidance.
Concurrent, first-class subagents
Subagents can research, edit, run commands, and validate work concurrently. Each can receive its own prompt, tools, timeout, and optional parent context. Dirac tracks source freshness and rejects stale edits at write time, allowing independent agents to work safely in the same codebase.
Repository-aware execution
Path-aware instructions, rules, skills, workflows, and hooks carry repository guidance into each task. Permissions are evaluated at tool boundaries, command batches report exit status and bounded output, and Chromium checks return screenshots, console messages, page errors, and the current URL.
Dirac can also isolate work in a Git worktree with integration and cleanup controls. Browser interaction uses screenshots and coordinates; the main-worktree flow expects a clean, single-root Git workspace.
Continuity for long-running tasks
Context condensation preserves decisions, exact paths, failed attempts, and validation state. Separate bounded recovery paths handle transient provider errors, context overflow, empty responses, and interrupted tool loops.
Plan, Act, and Utility work can use separate model configurations. Reviewed handoffs can move remaining work into a fresh task, while task IDs support resuming work across VS Code, the CLI, pipelines, and compatible ACP clients.
Completion checks and restore points
The optional completion verifier reviews acceptance criteria and claimed validation in a separate model pass. If a required criterion is missing, it returns concrete follow-up work to the active task. This model-based check does not replace tests or human review.
Checkpoints capture workspace files and operational task state. Restore can apply to the workspace, the task, or both, including queued steering, active skills, task tools, and context tracking.
## Harness comparison
We benchmarked Dirac and other open-source agent harnesses on eight multi-file refactoring tasks from public GitHub repositories. In this comparison, every harness used `gemini-3-flash-preview` with thinking set to `high`. Dirac completed all eight tasks at the lowest average cost.
> **Cost note:** A bug discovered in Cline after these runs ([issue #10314](https://github.com/cline/cline/issues/10314), [PR #10315](https://github.com/cline/cline/pull/10315)) caused the Dirac and Cline results to slightly underreport cache-read costs ($0.03 instead of $0.05 per million tokens).
| Task (repository) | Files* | Cline | Kilo | Ohmypi | Opencode | Pimono | Roo | **Dirac** |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| DynamicCache ([Transformers](https://github.com/huggingface/transformers)) | 8 | [(diff)](evals/cline/cline_refactor_DynamicCache) [$0.37] | [(diff)](evals/kilo/kilo_code_refactor_DynamicCache_FAILURE) [N/A] | [(diff)](evals/ohmypi/ohmypi_refactor_DynamicCache) [$0.24] | [(diff)](evals/opencode/opencode_refactor_DynamicCache) [$0.20] | [(diff)](evals/pimono/pimono_refactor_DynamicCache) [$0.34] | [(diff)](evals/roo/roo_code_refactor_DynamicCache) [$0.49] | ** [(diff)](evals/dirac/dirac_refactor_DynamicCache) [$0.13]** |
| IOverlayWidget ([VS Code](https://github.com/microsoft/vscode)) | 21 | [(diff)](evals/cline/cline_refactor_IOverlayWidget) [$0.67] | [(diff)](evals/kilo/kilo_code_refactor_IOverlayWidget) [$0.78] | [(diff)](evals/ohmypi/ohmypi_refactor_IOverlayWidget) [$0.63] | [(diff)](evals/opencode/opencode_refactor_IOverlayWidget) [$0.40] | [(diff)](evals/pimono/pimono_refactor_IOverlayWidget) [$0.48] | [(diff)](evals/roo/roo_code_refactor_IOverlayWidget) [$0.58] | ** [(diff)](evals/dirac/dirac_refactor_IOverlayWidget) [$0.23]** |
| addLogging ([VS Code](https://github.com/microsoft/vscode)) | 12 | [(diff)](evals/cline/cline_refactor_addLogging) [$0.42] | [(diff)](evals/kilo/kilo_code_refactor_addLogging) [$0.70] | [(diff)](evals/ohmypi/ohmypi_refactor_addLogging) [$0.64] | [(diff)](evals/opencode/opencode_refactor_addLogging) [$0.32] | [(diff)](evals/pimono/pimono_refactor_addLogging) [$0.25] | [(diff)](evals/roo/roo_code_refactor_addLogging) [$0.45] | ** [(diff)](evals/dirac/dirac_refactor_addLogging) [$0.16]** |
| datadict ([Django](https://github.com/django/django)) | 14 | [(diff)](evals/cline/cline_refactor_datadict) [$0.36] | [(diff)](evals/kilo/kilo_code_refactor_datadict) [$0.42] | [(diff)](evals/ohmypi/ohmypi_refactor_datadict) [$0.32] | [(diff)](evals/opencode/opencode_refactor_datadict) [$0.24] | [(diff)](evals/pimono/pimono_refactor_datadict) [$0.24] | [(diff)](evals/roo/roo_code_refactor_datadict) [$0.17] | ** [(diff)](evals/dirac/dirac_refactor_datadict) [$0.08]** |
| extensionsWorkbenchService ([VS Code](https://github.com/microsoft/vscode)) | 3 | [(diff)](evals/cline/cline_refactor_extensionswb_service_FAILURE) [N/A] | [(diff)](evals/kilo/kilo_code_refactor_extensionswb_serv