Agent Mode
Agent Mode enables the LLM to autonomously explore and modify your codebase using built-in tools. Instead of relying solely on the context you provide, the agent can investigate your project on-demand—reading files, listing directories, searching for patterns, and even making changes to help you develop faster.

How Agent Mode Works
When Agent Mode is enabled, the LLM gains access to a set of built-in tools that allow it to explore and modify your project dynamically:
Read Tools
| Tool | Description |
|---|---|
read_file | Read the contents of a file in the project |
list_files | List files and directories (with optional recursion) |
search_files | Search for regex patterns across project files |
fetch_page | Fetch a web page by URL and return its readable text content (HTML/CSS/JS stripped) |
PSI Tools (Code Intelligence)
| Tool | Description |
|---|---|
find_symbols | Search for symbol definitions (classes, methods, fields) by name across the project |
document_symbols | List all symbol definitions in a file with their kind and line numbers |
find_references | Find all usages of a symbol using semantic reference search |
find_definition | Navigate from a symbol usage to its definition |
find_implementations | Find all implementations of an interface, abstract class, or method |
find_callees | List the methods a given method calls (outgoing edges — the inverse of find_references) |
trace_call_chains | Trace caller→callee (or callee→caller) chains between methods, depth-bounded |
calculate_complexity | Compute cyclomatic complexity per method and flag methods over a threshold |
find_dead_code | Report unreferenced symbols as heuristic dead-code candidates (require human confirmation) |
Write Tools
| Tool | Description |
|---|---|
write_file | Create new files with the specified content |
edit_file | Modify existing files by replacing text |
run_command | Execute terminal commands in the project directory (30s timeout) |
run_tests | Auto-detect build system and run tests with structured results (configurable timeout) |
As you chat with the LLM, it decides when to use these tools. For exploration tasks, the agent might search, list, and read files to understand your codebase. The fetch_page tool lets the agent read external documentation, API references, or web pages to gather additional context. The PSI tools give the agent IDE-level code intelligence — it can find symbol definitions, look up references, navigate to definitions, and discover implementations, all powered by IntelliJ's semantic index rather than text search. For development tasks, it can create new files, edit existing code, run commands, or run tests to verify changes.
Per-Tool Enable/Disable
Each built-in tool can be individually enabled or disabled in the Built-in Tools section of the Agent settings. Uncheck a tool to prevent the agent from using it. This is useful when you want to:
- Restrict capabilities — disable
run_commandto prevent terminal access, orfetch_pageto block web access - Reduce context window usage — each enabled tool adds its specification to the LLM prompt, consuming tokens. Disabling tools you don't need frees up context for your actual conversation, which is especially important with smaller context window models
The run_tests, parallel_explore, and backlog tools have their own dedicated toggles in separate settings sections.
Editing a Tool's Description
Every tool ships with a description that tells the LLM what the tool does and when to reach for it — that description is a large part of how the model decides which tool to call. Click the pencil button next to any built-in tool in the Agent settings to rewrite it.
Hovering a tool shows the description currently being sent to the model; the pencil opens it in an editor, and Reset to Default puts the shipped wording back. A tool whose description you have changed is marked custom description in the settings list. Clearing the text also restores the default, so you can never end up with a tool that has no description at all.
This is the lever for steering the agent without disabling capabilities outright. A common pattern is to combine it with the per-tool checkboxes:
- Uncheck
edit_file, then editrun_command's description to add "Use this for all file edits, e.g. viasedorpatch." — the agent stops reaching for the structured edit tool and works through the shell instead. - Add a house rule to
run_command, such as "Always use./gradlewrather than a globalgradle." - Make
search_filesthe preferred discovery path overlist_filesfor a very large repository.
Edits are saved with the rest of the Agent settings and apply from your next prompt onwards — no IDE restart needed. They also apply to the read-only tools handed to parallel sub-agents.
Descriptions are editable for the built-in tools only. Tools provided by MCP servers and Skills keep the descriptions their provider publishes. Tools left on their default keep tracking the shipped wording, so they pick up improvements in future plugin releases automatically.
Write operations require user approval by default, and the approval dialog shows a diff of the pending change. If you auto-approve writes instead, a finished run still lists every file it changed. Terminal commands get an extra layer of protection through the command blacklist.
Command Blacklist
run_command is the most powerful tool the agent has, and the one most worth constraining. The command blacklist lets you list shell commands the agent must never run unsupervised — even when you've auto-approved everything else.

The settings live directly under the run_command checkbox in Built-in Tools, alongside the shell environment configuration:
| Setting | Default | Description |
|---|---|---|
| Command blacklist | git reset --hard, git clean -f, git push --force, git push -f, rm -rf | One pattern per line. Leave empty to disable the check. |
| When a command matches the blacklist | Ask for approval | Ask for approval forces the approval dialog; Block refuses the command outright. |
Ask for approval opens the approval dialog and shows which pattern matched — this happens even if write approvals are disabled or you previously clicked "Don't ask again". A blacklist match always forces the dialog.
Block means the command is never executed. The agent receives an error explaining that the command is blocked by user policy, and is instructed not to retry it or attempt variations of it.
How matching works
Matching is token-based (whitespace-split) and case-insensitive, and a pattern may match starting at any position in the command:
| Behaviour | Pattern | Also matches |
|---|---|---|
| Matches inside compound commands | git reset --hard | cd modules/core && git reset --hard HEAD~3 |
| Tolerates extra flags between pattern tokens | git reset --hard | git reset -q --hard |
| Short-flag clusters are reordered/combined | rm -rf | rm -fr, rm -rfv, rm -rvf |
* acts as a wildcard within a token | git push --force* | git push --force-with-lease |
Only flag-like tokens (starting with -) may be skipped between two matched pattern tokens, so unrelated commands don't trigger false positives — rm build && grep -rf x does not match rm -rf.
The blacklist protects against an agent that misunderstood your intent or took a destructive shortcut. It is not a security boundary against a model deliberately trying to evade it. Combine it with per-tool disabling, approval dialogs, and the agent log panel.
Reviewing What the Agent Changed
(v1.13.0+) When an agent run finishes, its answer is followed by a list of every file it changed, with +added -removed line counts. Clicking a file opens an IDE diff of its content before the run against its current state.

- One row per file, not per edit. A file rewritten five times during a run shows a single cumulative diff.
- New files diff against an empty side.
- The right-hand side is live, so the diff keeps up if you edit the file while it's open.
- Snapshots are retained for the last 20 runs, so older messages in a conversation stay clickable. Files over 1 MB are listed but not diffable.
The switch is Show changed files with diffs after an agent run, enabled by default, under Settings > Tools > DevoxxGenie > Agent > Approval.

Reviewing Before a Write Happens
(v1.13.0+) With Write tools always require approval enabled, write_file and edit_file pause for confirmation — and the dialog shows a diff of the file as it is now against what the tool is about to write, rather than the tool's raw JSON arguments.

It's IntelliJ's own diff viewer, so side-by-side/unified toggling, difference navigation and whitespace policy all work as usual. Approve lets the write through; Deny stops it and tells the agent the user refused.
Tools with no file change to preview — run_command, MCP tools — still show the arguments view, which is the useful thing for a shell command. The same applies when a preview can't be resolved (for example an edit_file whose old_string matches ambiguously, which the tool would reject anyway).
Which Review Fits Your Workflow
The two reviews are complementary, and you don't have to choose:
| Write approvals on | Write approvals off (auto-approve) | |
|---|---|---|
| Before the write | Diff in the approval dialog, per file, with Approve/Deny | — |
| After the run | Changed-files list under the answer | Changed-files list under the answer |
Approve-as-you-go means nothing lands without you seeing it. Auto-approve plus the post-run list lets the agent work uninterrupted and reviews the result as a whole.
A cancelled run produces no change list — the files it already wrote are still changed, so fall back to IntelliJ's Local History. CLI and ACP runners are also not covered: their edits don't go through the built-in edit_file/write_file tools.
Getting Started
1. Enable Agent Mode
Go to Settings > Tools > DevoxxGenie > Agent and enable:
- Enable Agent Mode (required)
2. Start Chatting
Once enabled, simply ask the LLM questions about your codebase. The agent will automatically use tools when needed to investigate:
- "How does the database connection work in this project?"
- "Find where the user authentication is implemented"
- "Explain the project structure and main components"
Agent mode works best for exploratory questions where the LLM needs to discover information across multiple files. For simple questions with provided context, regular chat mode may be more efficient.
Automated Test Execution
The run_tests tool gives the agent the ability to run your project's tests and inspect the results. After modifying code with write_file or edit_file, the agent automatically runs relevant tests, analyzes any failures, fixes the code, and re-runs until the tests pass.
Build System Auto-Detection
The tool automatically detects your project's build system by looking for configuration files in the project root:
| Build System | Detected By | Test Command |
|---|---|---|
| Gradle | build.gradle or build.gradle.kts | ./gradlew test |
| Maven | pom.xml | mvn test |
| npm | package.json | npm test |
| Cargo | Cargo.toml | cargo test |
| Go | go.mod | go test ./... |
| Make | Makefile | make test |
The agent can also target specific tests (e.g., a single class or method) by passing a test_target parameter, which is translated into the appropriate flag for each build system.