Agent Deep Dives
Each AI coding agent has a distinct philosophy for file editing. Here's what makes each one uniqueβand what you can learn from them.
Jump to Agent
π― Cline β The Precision Specialist
Cline is a VS Code extension that takes a "trust but verify" approach. It doesn't trust the AI to get whitespace perfect, so it implements heavy fallback logic to handle the inevitable mismatches.
Philosophy
"Default to
β Cline's system prompt instructionsreplace_in_filefor safety and precision. Only usewrite_to_filefor new files or when edits fail repeatedly."
Primary Tools
| Tool | Purpose | Format |
|---|---|---|
replace_in_file |
Surgical search/replace edits | XML with SEARCH/REPLACE blocks |
write_to_file |
Create new files, fallback rewrite | XML with full content |
apply_patch |
V4A diff format (GPT-5 only) | Custom patch syntax |
The 4-Tier Matching Strategy
Cline's constructNewFileContent function in src/core/assistant-message/diff.ts implements this cascade:
Direct indexOf() β byte-for-byte string comparison
Compare lines after .trim() β handles indentation differences
Match first/last lines as anchors (for blocks β₯3 lines)
Search entire file from start β supports out-of-order replacements
Special Features
- Streaming UI updates: Real-time diff preview as AI generates content
- Model content fixes: Strips markdown code blocks, fixes HTML entities (
&β&) - Approval flow: Configurable auto-approval or manual confirmation
- After 3 failures: Suggests fallback to
write_to_file
What to Borrow
Cline's tiered fallback approach and model content fixes are battle-tested. If you're building a VS Code extension, study their streaming diff UI implementation.
π§ Codex / Claude Code β The Patch Master
Codex (the CLI behind Claude Code) treats file editing like version control. It uses a custom patch format that feels like git diff with enhanced semantics for add/update/delete operations.
Philosophy
"Patches are the native language of code changes. Make the AI speak in patches, and you get efficient, reviewable, multi-file edits."
The Patch Format
*** Begin Patch
*** Add File: src/new_module.py
+"""Module docstring"""
+
+def new_function():
+ return True
*** Update File: src/existing.py
@@ def greet():
@@ """Say hello"""
- print("Hi")
+ print("Hello, world!")
*** Delete File: src/deprecated.py
*** Move to: src/renamed.py
*** End Patch
Key Markers
| Marker | Purpose |
|---|---|
*** Begin Patch | Start of patch block |
*** Add File: <path> | Create a new file |
*** Update File: <path> | Modify existing file |
*** Delete File: <path> | Remove a file |
*** Move to: <path> | Rename file (with Update) |
@@ <context> | Context for locating edit |
+ / - | Add / remove lines |
*** End Patch | End of patch block |
Fuzzy Matching: seek_sequence
Codex's Rust implementation uses a seek_sequence function with 4 levels of tolerance:
- Exact match: Byte-for-byte equality
- Trailing whitespace tolerant: Ignore trailing spaces
- Leading/trailing tolerant: Ignore surrounding whitespace
- Unicode normalization: Handle different dashes (β, β, -), quotes (" vs "), etc.
Why Custom Format?
The custom patch format has several advantages over standard unified diff:
- No line numbers: Uses context lines (
@@) instead of fragile line counts - Multi-level context: Can stack
@@markers for unique identification - Semantic operations: Clear add/update/delete/move semantics
- Heredoc support: Can be embedded in shell scripts
What to Borrow
Unicode normalization is underrated. AI models often use "smart quotes" or em-dashes when matching code that uses ASCII equivalents. Codex handles this gracefully.
π οΈ OpenCode β The Fallback King
OpenCode takes the philosophy of "maximize success probability through redundancy" to its extreme. It implements 9 different matching algorithms that are tried sequentially.
Philosophy
"If we have enough fallbacks, eventually something will match. And if it doesn't, we tell the AI exactly what went wrong so it can self-correct."
Core Tools
| Tool | File | Purpose |
|---|---|---|
EditTool |
tool/edit.ts |
Primary search/replace with 9 fallbacks |
WriteTool |
tool/write.ts |
Full file creation/overwrite |
MultiEditTool |
tool/multiedit.ts |
Atomic multi-edit in one file |
PatchTool |
tool/patch.ts |
Unified diff-style patches |
ReadTool |
tool/read.ts |
Read with offset/limit (2000 lines) |
The 9 Fallback Replacers
When EditTool tries to apply an edit, it cascades through:
| # | Replacer | What It Does |
|---|---|---|
| 1 | SimpleReplacer |
Exact match, then escaped version |
| 2 | LineTrimmedReplacer |
Trim each line before comparing |
| 3 | BlockAnchorReplacer |
Match first/last lines + similarity check |
| 4 | WhitespaceNormalizedReplacer |
Convert multiple spaces/tabs to single space |
| 5 | IndentationFlexibleReplacer |
Remove common indentation prefix |
| 6 | EscapeNormalizedReplacer |
Unescape \n, \t, \", etc. |
| 7 | TrimmedBoundaryReplacer |
Trim entire block boundaries |
| 8 | ContextAwareReplacer |
50% similarity threshold with context |
| 9 | MultiOccurrenceReplacer |
Find all matches (for replaceAll) |
LSP Integration
OpenCode is unique in its deep Language Server Protocol integration. After every edit:
- Refresh the LSP file watcher
- Check for diagnostics (syntax errors, type errors)
- Append errors to the tool response in XML format
<file_diagnostics>
Line 14: 'subtotal' is not defined.
Line 22: Expected ';' but found '}'.
</file_diagnostics>
This immediate feedback loop helps the AI self-correct without human intervention.
What to Borrow
The 9-layer fallback system is overkill for most cases, but the EscapeNormalizedReplacer is brilliant. AI models often output \n as the literal string instead of a newlineβthis handles that case.
β‘ Aider β The Format Flexible
Aider stands out by supporting three different edit formats and choosing the right one based on the model's strengths. It's the most research-driven approach to format selection.
Philosophy
"Different models have different strengths. GPT-4 does better with whole files. Claude does better with search/replace. Match the format to the model."
The Three Formats
Format 1: SEARCH/REPLACE
filename.py
```python
<<<<<<< SEARCH
def old_function():
return False
=======
def old_function():
return True
>>>>>>> REPLACE
```
Best for: Targeted edits, most models
Model defaults: Claude 3.5, o3-mini
Format 2: WHOLE FILE
filename.py
```python
# Entire file content
import sys
def main():
print("Hello!")
if __name__ == '__main__':
main()
```
Best for: New files, small files, massive refactors
Model defaults: GPT-4o, Claude 3.5 Sonnet
Critical rule: No elision with ... β must include everything!
Format 3: UNIFIED DIFF
--- filename.py
+++ filename.py
@@ ... @@
-def old():
- return False
+def old():
+ return True
Best for: Models trained on diffs, token efficiency
Challenge: High cognitive load, easy to hallucinate context
Fuzzy Matching Cascade
Aider's search_replace.py implements 5 fallback strategies:
- Exact match: Direct string find
- Flexible whitespace: Normalize spaces/tabs
- Relative indentation: Transform to relative indents
- Git cherry-pick: Use git to apply patch
- Diff-match-patch: Google's fuzzy matching library
Model Configuration
Aider maintains a model-settings.yml with format defaults:
gpt-4o:
edit_format: "whole"
o3-mini:
edit_format: "diff"
claude-3.5-sonnet:
edit_format: "whole"
What to Borrow
The model-specific format defaults are based on empirical testing. If you support multiple models, consider profiling which format works best for each and making it configurable.
π Grok CLI β The Dual-Mode Agent
Grok CLI combines a traditional text editor tool with an optional Morph AI-powered fast editing mode. It's unique in offering both procedural and AI-assisted editing paths.
Philosophy
"Give the AI multiple tools for different situations. Use str_replace for precision, Morph for speed (4,500+ tokens/sec), and always show diffs before writing."
Core Tools
| Tool | Method | Purpose |
|---|---|---|
TextEditorTool |
view() |
Read file with line numbers |
TextEditorTool |
create() |
Create new file (confirmation required) |
TextEditorTool |
strReplace() |
Search/replace with fuzzy matching |
TextEditorTool |
replaceLines() |
Line-range replacement |
TextEditorTool |
insert() |
Insert at line number |
TextEditorTool |
undoEdit() |
Revert last edit |
MorphEditorTool |
editFile() |
AI-powered fast apply (4,500+ tok/sec) |
Morph Editor Syntax
The Morph editor uses a special // ... existing code ... syntax to represent unchanged sections:
// ... existing code ...
import { newDependency } from 'new-package';
// ... existing code ...
function updatedFunction() {
return newImplementation();
}
// ... existing code ...
The AI model writes what it wants to change, and the Morph Fast Apply API merges it with the existing file at high speed.
User Confirmation System
Grok CLI's ConfirmationService provides robust safety:
- Session flags: Users can skip confirmations for file ops, bash commands, or all
- Diff-style preview: Every change shows before/after with
+/-markers - Granular approval: Approve single operation or "don't ask again" per type
Updated example.js with 2 additions and 1 removal
--- a/example.js
+++ b/example.js
@@ -1,3 +1,4 @@
function test() {
+ console.log("added");
return "value";
- oldLine();
}
Fuzzy Function Matching
Grok CLI's strReplace includes intelligent function signature matching using token analysis and brace counting. It can find the right function even if the AI slightly misquotes the body.
What to Borrow
The confirmation service with session flags is excellent UX. Users can start cautious and "unlock" auto-approval as they build trust. The undo capability is also underused in other agents.
Side-by-Side Comparison
| Feature | Cline | Codex | OpenCode | Aider | Grok |
|---|---|---|---|---|---|
| Primary Method | Search/Replace | Custom Patch | Search/Replace | Format-flexible | Dual mode |
| Fallback Layers | 4 | 3-4 | 9 | 5 | 2+ |
| LSP Integration | Partial | Minimal | Full | Minimal | No |
| Multi-File Edits | Sequential | One Patch | Sequential | Sequential | Sequential |
| User Approval | Configurable | Required | Configurable | Auto | Full diff |
| Undo Support | Via git | Via git | Via git | Via git | Built-in |
| Token Format | XML | Custom | JSON-ish | Markdown | Mixed |
Design Philosophy Summary
Cline
"Don't trust AI whitespace. Build fallbacks that handle the inevitable mismatches."
Codex
"Make file editing feel like version control. Patches are the right abstraction."
OpenCode
"If we throw enough algorithms at the problem, something will stick. And validate with LSP."
Aider
"Different models need different formats. Test empirically and configure appropriately."
Grok CLI
"Give users control. Show diffs, ask for approval, and make everything reversible."