# Cursor AI Agent Architecture - Agent & Planning Mode
**Stand**: Februar 2026
**Zweck**: Technische Dokumentation der AI-Agenten-Integration in Cursor (VS Code Fork) als Grundlage fuer die Entwicklung einer eigenstaendigen Chat-Komponente mit API-Zugang
---
## 1. Ueberblick
Cursor ist ein Fork von Visual Studio Code, erweitert um tiefgreifende AI-Faehigkeiten. Im Gegensatz zu VS Code Extensions, die durch die Extension-API limitiert sind, hat Cursor als echter Fork vollen Zugriff auf den Rendering-Pipeline, den AST-Level und die Language Server Infrastructure.
Die AI-Integration besteht aus zwei Hauptkomponenten:
1. **Client (Body)**: Die Electron/VS Code-basierte Desktop-Applikation mit Custom-UI-Elementen (Chat-Sidebar, Composer-Panel, Inline-Completions)
2. **Backend (Brain)**: Cloud-Services fuer LLM-Orchestrierung, Prompt-Konstruktion, Codebase-Indexierung und Embedding-Storage
```
User Interaction
↓
Cursor Client (Electron / VS Code Fork)
├─> Chat Panel UI (Custom Webview)
├─> Composer Panel (Multi-File Editor)
├─> Inline Completions (Tab)
└─> Cmd/Ctrl+K (Inline Edit)
↓
Context Assembly Layer
├─> Open Files / Cursor Position
├─> Semantic Search (RAG)
├─> AST / Language Server Data
└─> Conversation History
↓
Cursor Backend (Cloud)
├─> Prompt Construction
├─> Model Routing (GPT / Claude / Gemini / Custom)
├─> Tool Orchestration
└─> Response Streaming
↓
Response Processing (Client)
├─> Text Rendering (Markdown)
├─> Code Diff Application
├─> Tool Call Execution
└─> Plan/Todo Management
```
---
## 2. Interaction Modes
Cursor bietet vier Modi, die ueber `Ctrl+.` gewechselt werden koennen:
### 2.1 Agent Mode (Standard-Ausfuehrungsmodus)
**Zweck**: Autonomes Implementieren, Refactoring, Bug-Fixing
**Faehigkeiten**:
- Multi-File Exploration und Editing
- Terminal-Kommando-Ausfuehrung (sandboxed)
- Codebase-Suche (semantisch + grep)
- Iterative Verfeinerung mit Compiler/Linter-Feedback
- Parallele Tool-Aufrufe fuer Geschwindigkeit
**Ablauf**:
```
User Prompt
↓
Context Assembly
├─> user_info (OS, Shell, Workspace)
├─> project_layout (File Tree Snapshot)
├─> open_files / cursor_position
└─> edit_history / linter_errors
↓
System Prompt Injection
├─> Role Definition ("AI coding assistant, pair programmer")
├─> Communication Guidelines (Markdown, Code Citations)
├─> Tool Calling Rules (15+ Tools)
├─> Context Strategy (Parallel Execution, Thorough Exploration)
└─> Code Change Guidelines (Read before Edit, Fix Lints)
↓
LLM Request (POST /v1/chat/completions)
├─> model: "claude-4.6-opus" | "gpt-5.2" | ...
├─> temperature: 0
├─> messages: [system, user_context, user_query]
├─> tools: [15+ tool definitions]
├─> tool_choice: "auto"
└─> stream: true
↓
Streaming Response
├─> Text Chunks (Markdown)
├─> Tool Calls (JSON)
│ ├─> Tool Execution (Client-Side)
│ └─> Tool Results → Next LLM Turn
└─> Completion
```
### 2.2 Plan Mode (Planungsmodus)
**Zweck**: Komplexe Features zerlegen, Codebase analysieren, Implementierungsplaene erstellen
**Aktivierung**: `Shift+Tab` im Agent Input oder `Ctrl+.` → Plan
**Kernmerkmal**: Read-Only - es werden keine Aenderungen am Code vorgenommen
**System Reminder bei Plan Mode**:
```
Plan mode is active. The user indicated that they do not want you to execute
yet -- you MUST NOT make any edits, run any non-readonly tools (including
changing configs or making commits), or otherwise make any changes to the
system.
```
**Plan-Mode-Workflow**:
```
User beschreibt komplexe Aufgabe
↓
Codebase Research (Read-Only)
├─> Semantic Search nach relevanten Dateien
├─> File Reading fuer Kontextverstaendnis
└─> Grep fuer spezifische Symbole
↓
Klaerende Fragen an User
├─> Anforderungen praezisieren
├─> Implementierungsvarianten abklaeren
└─> Scope eingrenzen
↓
Plan-Erstellung (create_plan Tool)
├─> Markdown-Dokument mit Datei-Referenzen
├─> Code-Beispiele und Snippets
├─> Strukturierte Todos mit IDs und Abhaengigkeiten
└─> Uebersicht (1-2 Saetze)
↓
User Review & Inline-Editing
├─> Plan direkt im Editor bearbeitbar
├─> Todos hinzufuegen/entfernen
└─> Bei Zufriedenheit: Ausfuehrung starten
```
**Plan-Datenmodell** (`create_plan` Tool):
```json
{
"name": "Kurzer Plan-Name (3-4 Worte)",
"overview": "1-2 Saetze Zusammenfassung",
"plan": "# Plan Title\n\nMarkdown-Inhalt mit Dateireferenzen...",
"todos": [
{
"id": "setup-auth",
"content": "Auth-Middleware implementieren",
"dependencies": []
},
{
"id": "implement-ui",
"content": "Login-Formular erstellen",
"dependencies": ["setup-auth"]
}
]
}
```
### 2.3 Ask Mode (Frage-Modus)
**Zweck**: Code verstehen, Fragen beantworten ohne Aenderungen
**Einschraenkung**: Read-Only, keine Write-Tools verfuegbar
### 2.4 Debug Mode (Fehlerbehebungs-Modus)
**Zweck**: Systematische Fehleranalyse mit Hypothesen, Log-Instrumentierung, Runtime-Analyse
---
## 3. Communication Protocol
### 3.1 Transport Layer
Cursor kommuniziert mit dem Backend ueber **ConnectRPC** (gRPC-Web Variante) mit **Protocol Buffers (Protobuf)** als Serialisierungsformat.
**Primaerer Endpoint**: `https://api2.cursor.sh`
**Encoding**: HTTP/2 mit binaerer Protobuf-Kodierung im Envelope-Format:
```
[type:1 byte][length:4 bytes Big-Endian][payload:N bytes]
```
### 3.2 Protobuf-Schema (Reverse Engineered)
**Service**: `aiserver.v1.ChatService`
**Kern-Messages**:
```protobuf
message GetChatRequest {
ModelDetails modelDetails = 1;
repeated ConversationMessage conversation = 2;
}
message ModelDetails {
optional string modelName = 1;
}
message ConversationMessage {
string text = 1;
MessageType type = 2;
enum MessageType {
MESSAGE_TYPE_HUMAN = 0;
MESSAGE_TYPE_AI = 1;
}
}
```
**Streaming-Methode**: `StreamChat()` bzw. `StreamUnifiedChatWithTools()`
- Antworten kommen als iterativer Stream
- Jeder Chunk enthaelt ein `text`-Feld mit partiellem Content
### 3.3 OpenAI-kompatibles Chat Completions API
Parallel zum Protobuf-Protokoll nutzt Cursor intern das **OpenAI Chat Completions Format**:
```
POST /v1/chat/completions
```
**Request-Struktur**:
```json
{
"model": "claude-4.6-opus",
"temperature": 0,
"user": "github|user_ID",
"messages": [
{
"role": "system",
"content": "[System Prompt mit allen Instruktionen]"
},
{
"role": "user",
"content": "...\n..."
},
{
"role": "user",
"content": "...\n..."
}
],
"tools": [ /* 15+ Tool-Definitionen */ ],
"tool_choice": "auto",
"stream": true
}
```
**Kontext-Injection im User-Message**:
| Tag | Inhalt |
|---|---|
| `` | OS, Datum, Shell, Workspace-Pfad |
| `` | Dateibaum-Snapshot (einmalig zu Gespraechsbeginn) |
| `` | Der eigentliche User-Prompt |
| `` | Dynamische Modus-Instruktionen (z.B. Plan Mode aktiv) |
| `` | Offene und kuerzlich angesehene Dateien |
---
## 4. System Prompt Architektur
Der System Prompt ist das Herzstrueck der AI-Steuerung. Er wird vom Cursor-Backend zusammengebaut und besteht aus folgenden Bloecken:
### 4.1 Prompt-Bloecke
```
System Prompt Assembly
├─> Role Definition
│ "You are an AI coding assistant, powered by [model]. You operate in Cursor."
│ "You are pair programming with a USER to solve their coding task."
│
├─>
│ Markdown-Formatierung, Code-Citations, Math-Notation
│
├─>
│ Regeln fuer Tool-Nutzung: Nicht Tool-Namen erwaehnen, Standard-Format nutzen
│
├─>
│ Unabhaengige Tool-Calls parallel ausfuehren
│
├─>
│ Gruendliche Exploration, Symbol-Tracing, Semantic Search Strategie
│
├─>
│ Read before Edit, Dependency Files, Linter-Fixes
│
├─>
│ CODE REFERENCES (startLine:endLine:filepath) vs MARKDOWN CODE BLOCKS
│
├─>
│ todo_write Tool fuer komplexe Tasks
│
├─> Workspace Rules (.cursor/rules/)
│ Projekt-spezifische Coding-Konventionen
│
├─> User Rules
│ Benutzerdefinierte Praeferenzen
│
└─> MCP Instructions
Konfigurierte MCP-Server und deren Nutzungshinweise
```
### 4.2 Mode-spezifische Anpassungen
Der System Prompt wird je nach aktivem Mode modifiziert:
| Mode | Zusatz-Instruktionen |
|---|---|
| **Agent** | Volle Tool-Palette, Edit-Berechtigung, Terminal-Zugang |
| **Plan** | Read-Only Reminder, `create_plan` Tool verfuegbar, keine Edits |
| **Ask** | Read-Only, eingeschraenkte Tools, Erklaer-Fokus |
| **Debug** | Hypothesen-getriebene Analyse, Log-Instrumentierung |
---
## 5. Tool-System
Cursor stellt dem LLM 15+ spezialisierte Tools zur Verfuegung, definiert im OpenAI Function Calling Format.
### 5.1 Tool-Kategorien
**Code-Verstaendnis**:
- `codebase_search` / `SemanticSearch` - Semantische Suche nach Bedeutung
- `grep` / `Grep` - Exakte Text/Regex-Suche (basiert auf ripgrep)
- `read_file` / `Read` - Dateien lesen mit optionalem Offset/Limit
- `glob_file_search` / `Glob` - Dateien nach Muster finden
- `list_dir` - Verzeichnisinhalt auflisten
**Code-Aenderung**:
- `edit_file` - Intelligentes Code-Editing mit `// ... existing code ...` Markern
- `StrReplace` - Exakte String-Ersetzungen
- `Write` - Neue Dateien erstellen / ueberschreiben
- `delete_file` / `Delete` - Dateien loeschen
- `edit_notebook` / `EditNotebook` - Jupyter Notebook Zellen bearbeiten
**Ausfuehrung**:
- `run_terminal_cmd` / `Shell` - Sandboxed Terminal-Kommandos
- `web_search` / `WebSearch` - Web-Recherche
- `WebFetch` - URL-Inhalte abrufen
**Projekt-Management**:
- `todo_write` / `TodoWrite` - Task-Tracking mit Status
- `create_plan` - Strukturierte Planungsdokumente
**Linting**:
- `read_lints` / `ReadLints` - Linter-Fehler auslesen
**Subagenten**:
- `Task` - Spezialisierte Sub-Agenten starten (generalPurpose, explore, browser-use)
- `SwitchMode` - Modus wechseln
### 5.2 Tool-Definition Format
Jedes Tool wird als OpenAI Function Definition spezifiziert:
```json
{
"type": "function",
"function": {
"name": "codebase_search",
"description": "semantic search that finds code by meaning...",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "A complete question about what you want to understand"
},
"target_directories": {
"type": "array",
"items": { "type": "string" }
},
"explanation": {
"type": "string",
"description": "Why this tool is being used"
}
},
"required": ["query", "target_directories", "explanation"]
}
}
}
```
### 5.3 Tool-Aufruf und Antwort-Zyklus
```
LLM generiert Tool-Call
↓
{
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "read_file",
"arguments": "{\"target_file\": \"src/main.py\"}"
}
}]
}
↓
Client fuehrt Tool aus (lokal)
↓
Tool-Result wird als neue Message eingefuegt
↓
{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "1|import os\n2|import sys\n..."
}
↓
Naechster LLM-Turn mit Tool-Result im Kontext
↓
LLM generiert Text-Antwort oder weitere Tool-Calls
```
### 5.4 Parallele Tool-Ausfuehrung
Cursor optimiert auf parallele Tool-Calls. Wenn keine Abhaengigkeiten bestehen, werden mehrere Tools gleichzeitig aufgerufen:
```
Beispiel: "Fuege Authentication hinzu"
↓
Parallel:
├─> codebase_search("How does authentication work?")
├─> grep("auth|login|session")
├─> read_file("src/app.py")
└─> web_search("best practices authentication 2026")
↓
Sequential (abhaengig von Ergebnissen):
├─> read_file("src/middleware/auth.py") [gefunden durch search]
└─> edit_file("src/routes/login.py") [basierend auf Kontext]
```
---
## 6. Codebase-Indexierung und RAG
### 6.1 Indexierungs-Pipeline
```
Projekt oeffnen
↓
Background Scanning
├─> Dateien in Chunks aufteilen (tree-sitter fuer AST-basiertes Splitting)
├─> Chunks: ~einige hundert Tokens, an logischen Grenzen (Funktionen, Klassen)
└─> .gitignore / .cursorignore respektieren
↓
Embedding-Berechnung
├─> OpenAI Embedding Model oder Custom Model
└─> Vektor-Repraesentation des semantischen Inhalts
↓
Vektor-Datenbank (Backend)
├─> Embeddings mit Metadaten (Datei, Zeilen, Chunk-ID)
└─> Nearest-Neighbor-Suche fuer Queries
```
### 6.2 Retrieval-Augmented Generation (RAG)
```
User-Query
↓
Query → Embedding-Vektor
↓
Nearest-Neighbor-Suche in Vektor-DB
↓
Top-K relevante Code-Chunks
├─> Dateiname + Zeilennummern
└─> Code-Inhalt
↓
In LLM-Prompt eingebettet als Kontext
↓
LLM generiert Antwort basierend auf Projekt-Kontext
```
---
## 7. Shadow Workspace
Cursor implementiert ein **Shadow Workspace** Konzept: ein verstecktes Electron-Fenster, das das Projekt spiegelt.
**Zweck**:
- AI-generierte Code-Aenderungen sicher testen bevor sie dem User praesentiert werden
- Language Server Feedback (Type-Checking, Linting) auf vorgeschlagene Aenderungen anwenden
- Selbst-Verbesserungsschleife: Fehler werden zurueck an das LLM gegeben
**Ablauf**:
```
AI generiert Code-Aenderung
↓
Shadow Workspace (verstecktes Fenster)
├─> Aenderungen anwenden (nicht in echten Dateien)
├─> Language Server pruefen (TypeScript, Python, etc.)
└─> Diagnostics sammeln
↓
[Wenn Fehler] → Feedback an LLM → Neuer Versuch
[Wenn OK] → Aenderung dem User praesentieren
```
---
## 8. Subagenten-Architektur
Seit Januar 2026 unterstuetzt Cursor das Starten spezialisierter Subagenten:
### 8.1 Subagent-Typen
| Typ | Zweck | Faehigkeiten |
|---|---|---|
| `generalPurpose` | Komplexe, mehrstufige Tasks | Voller Tool-Zugang, Code-Suche, Ausfuehrung |
| `explore` | Schnelle Codebase-Exploration | Glob, Grep, Read - optimiert fuer Geschwindigkeit |
| `browser-use` | Browser-basiertes Testing | Navigation, Interaktion, Screenshots |
### 8.2 Subagent-Kommunikation
```
Parent Agent
├─> Task(prompt="...", subagent_type="explore")
│ ├─> Subagent erhaelt eigenen Kontext
│ ├─> Subagent fuehrt Tools aus
│ └─> Subagent gibt Ergebnis zurueck (einzelne Message)
│
└─> Bis zu 4 Subagenten parallel
```
**Wichtig**: Subagenten haben keinen Zugriff auf den Chat-Verlauf des Parent-Agenten. Der Prompt muss alle noetige Information enthalten.
---
## 9. Background Agent API
Cursor bietet seit 2026 eine **Background Agent API** fuer programmatischen Zugriff:
### 9.1 Authentifizierung
Ueber `WorkosCursorSessionToken` (Cookie/Environment Variable)
### 9.2 Endpunkte
| Endpunkt | Methode | Beschreibung |
|---|---|---|
| Composer erstellen | POST | Neuen Background Composer mit Task-Beschreibung starten |
| Composer auflisten | GET | Alle laufenden Background Composer abrufen |
| Composer Details | GET | Status und Details eines spezifischen Composers |
| Settings | GET | User-Einstellungen abrufen |
### 9.3 Programmatischer Zugriff (TypeScript)
```typescript
import { CursorAPIClient } from 'cursor-api-client';
const client = new CursorAPIClient('session-token');
const result = await client.createBackgroundComposer({
taskDescription: 'Add user authentication',
repositoryUrl: 'https://github.com/user/repo.git',
branch: 'main',
model: 'claude-4-sonnet-thinking'
});
const composers = await client.listComposers();
```
### 9.4 Direkter RPC-Zugriff (Go)
```go
creds, _ := cursor.GetDefaultCredentials()
aiService := cursor.NewAiServiceClient()
model := "gpt-4"
resp, _ := aiService.StreamChat(context.TODO(), cursor.NewRequest(creds, &aiserverv1.GetChatRequest{
ModelDetails: &aiserverv1.ModelDetails{
ModelName: &model,
},
Conversation: []*aiserverv1.ConversationMessage{
{
Text: "Hello, who are you?",
Type: aiserverv1.ConversationMessage_MESSAGE_TYPE_HUMAN,
},
},
}))
for resp.Receive() {
next := resp.Msg()
fmt.Printf(next.Text)
}
```
---
## 10. Model-Routing
Cursor verwendet verschiedene Modelle je nach Aufgabentyp:
| Aufgabe | Modell-Typ | Beispiele |
|---|---|---|
| Chat / komplexe Analyse | Frontier LLM | Claude 4.6 Opus, GPT-5.2/5.3, Gemini 3 Pro |
| Tab Completion | Custom Fast Model | "Copilot++" (basierend auf Llama 70B) |
| Fast Apply (Diffs) | Spezialisiertes Fine-Tuned Model | Optimiert fuer Code-Diffs, >1000 Tokens/s |
| Embeddings | Embedding Model | OpenAI Embedding oder Custom |
**Speculative Decoding**: Ein kleineres "Draft"-Modell generiert mehrere Token voraus, die das Hauptmodell parallel verifiziert → signifikant schnellere Inferenz.
---
## 11. Sicherheitsmodell
### 11.1 Terminal Sandbox
Kommandos laufen standardmaessig in einer Sandbox:
- Erlaubt: Schreiben im Workspace, Lesen im Dateisystem
- Blockiert: Netzwerk, Git-Write, ignorierte Dateien, USB
- Erweiterbar: `network`, `git_write`, `all` Permissions
### 11.2 Privacy Mode
- Wenn aktiviert: Kein Code wird nach Erfuellung des Requests gespeichert
- Wenn deaktiviert: Anonymisierte Telemetrie, kein langfristiges Code-Speichern
### 11.3 Rules System
- `.cursor/rules/` - Projekt-spezifische AI-Verhaltensregeln
- User Rules - Globale Praeferenzen
- `` Tags - Dynamische Instruktionen (nie sichtbar fuer User)
---
## Quellen und Referenzen
- Cursor Offizielle Dokumentation: https://docs.cursor.com
- Cursor Blog - Plan Mode: https://cursor.com/blog/plan-mode
- Cursor Blog - Dynamic Context Discovery: https://cursor.com/blog/dynamic-context-discovery
- Cursor Blog - Codex Model Harness: https://cursor.com/blog/codex-model-harness
- Reverse-Engineered RPC Client: https://github.com/everestmz/cursor-rpc
- Background Agent API Client: https://github.com/mjdierkes/cursor-background-agent-api
- Architecture Analysis: https://adityarohilla.com/2025/05/08/how-cursor-works-internally/
- System Prompt Analysis: https://medium.com/@lakkannawalikar/cursor-ai-architecture-system-prompts-and-tools-deep-dive-77f44cb1c6b0