ALEX Control Layer
KI-Chat für VS Code mit deinen eigenen API-Keys (Anthropic, OpenAI, DeepSeek, Ollama/LM Studio) – und einer Kontrollschicht darüber: Das Modell schlägt vor, deine Schicht entscheidet.
Die Control Layer schlägt vor und führt nach deiner Karte aus. Sie signiert keine Akte.
VERIFIED auf alexproof.de kommt ausschließlich aus dem serverseitigen Sidecar-Lauf (Marketplace-Extension „Auftrag & Nachweis") plus unabhängigem Verifier – Signatur, Hash-Kette, Konsistenz. Diese Extension ist das kostenlose, lokale Werkzeug davor, kein Ersatz dafür. Details: Lokaler Lauf vs. Akte.
VS Code
│
┌───────▼────────┐
│ Chat-Panel │ ← nur Anzeige und Eingabe
└───────┬────────┘
┌───────▼────────┐
│ Control Layer │ ← Rechte, Datenschutz-Filter, Audit, Budget, Git-Checkpoints
└───────┬────────┘
┌──────┬┴─────┬──────────┐
Claude GPT DeepSeek Ollama
Installieren
- VS Code → Erweiterungen (Strg+Umschalt+X) → „ALEX Control Layer" suchen → Installieren.
- Befehlspalette (Strg+Umschalt+P): ALEX: API-Key setzen – je Anbieter einmal. Die Keys liegen im VS-Code-SecretStorage, nie in Dateien.
- ALEX-Symbol in der Seitenleiste öffnen.
Eigenes .vsix bauen oder am Quellcode mitarbeiten? Siehe Entwicklung.
Was drin ist
| Funktion |
Wie es funktioniert |
| Provider-Abstraktion |
alex.models ist eine Liste. ALEX: Modell hinzufügen/entfernen aus der Befehlspalette (oder Command-Center-Buttons) pflegt sie per Assistent – kein Hand-Edit von settings.json nötig. |
| Token- und Kostenanzeige |
Tokens kommen aus der API-Antwort (sonst als „geschätzt“ markiert). Kosten nur, wenn du Preise einträgst (inputPer1M/outputPer1M, USD) – ich habe keine Preise fest eingebaut, weil sie sich ändern. |
| Kontext-Schieberegler |
Kein Kontext · Nur Auswahl · Aktuelle Datei · Geöffnete Dateien · Gesamtes Projekt. Limit: alex.context.maxChars. |
| @-Mentions |
@file:pfad, @folder:pfad, @selection, @problems, @git, @open – mit Autovervollständigung. |
| Diff statt Überschreiben |
Änderungen erscheinen als Karte: Diff ansehen · Übernehmen · Ablehnen. Übernommen wird über VS-Code-Edits, also mit Strg+Z rückgängig. |
| Agenten-Schleife |
write_to_file, replace_in_file, execute_command sind native Tool-Calls (wie das Lesen) statt Markdown-Fences. Nach Übernehmen/Ausführen fließt das Ergebnis (Diff + Diagnostics bzw. Exit-Code + Ausgabe) zurück ins Modell, das selbstständig weitermacht – begrenzt durch alex.agent.maxRounds/maxSteps, abbrechbar per Stop-Button auch mitten in einer offenen Karte. Zusätzliche Bremse alex.agent.autonomyBreakAfter: nach N automatisch übernommenen Edits in Folge kommt eine native Zwischenbestätigung. Jede Änderung/jeder Befehl bleibt trotzdem eine Karte mit Bestätigung. Nach einem Stop erscheint ein Weiter-Knopf, der an genau der Stelle fortsetzt (gleiches Modell, gleicher Werkzeug-Verlauf) statt eine neue Nachricht zu brauchen. |
| Prompt-Presets |
Debuggen, Refactoring, Erklären, Tests, Code-Review, Fakten vs. Annahmen, Sicherheits-Check, Nur planen. Eigene über alex.presets. |
| Verbundenes GitHub-Repo |
ALEX: GitHub-Repo verbinden – Anmeldung über VS Codes eingebaute GitHub-Authentifizierung, kein eigenes OAuth-Setup. Danach können die Werkzeuge gezielt dort statt im offenen Ordner suchen/lesen (source: "connected_repo") – das Modell kann aber nie ein anderes als das eine verbundene Repo wählen. |
| Projektregeln |
.alexrules (oder .ai-rules) im Projekt. Können Stil/Workflow steuern, nie Berechtigungen. |
| Fallback |
Bei JEDEM Anbieter-Fehler (nicht nur 429/5xx), solange noch kein Token der Antwort kam: nächstes Modell aus alex.routing.fallback. Standardmäßig leer – ohne das sendest du denselben Prompt/Kontext still an einen zweiten Anbieter, sobald du Mehrfach-Keys konfigurierst. Zum Aktivieren bewusst eine Liste eintragen, z. B. ["claude-sonnet","openai-main"]. Kein Fallback von lokal auf Cloud. |
| Lokale Modelle |
Ollama/LM Studio über die OpenAI-kompatible Schnittstelle. |
| Audit-Log |
.alex/audit.jsonl: Anfrage → Modell → Kontext (Pfade + Hashes) → Vorschlag → Entscheidung → Ausführung. Mit Hash-Kette, aber ohne externen Anker nur manipulationssicher erkennbar, nicht manipulationssicher – siehe Grenzen unten. |
| Beleg-Export |
.alex/receipts.jsonl: ein kleiner, flacher Eintrag pro bestätigter Karte (Prompt-Hash, Diff-Hash/Befehl, Entscheidung, Checkpoint, Modell) – zum Referenzieren durch einen externen Nachweis-Lauf. Siehe Lokaler Lauf vs. Akte. |
| Explain-before-execute |
Das Modell muss vor jedem Befehl erklären, was und warum. Jeder Befehl braucht zusätzlich eine native Bestätigung mit dem exakten Wortlaut, auch bei permissions.terminal=allow und bei Auto-Apply. |
| Tool-Berechtigungen |
alex.permissions.read / write / terminal / git je allow · ask · deny. Terminal-Standard ist deny – Befehlsfilter sind Best-Effort (umgehbar), keine Sandbox. |
| Git-Sicherheit |
Vor der ersten Änderung bei unsauberem Working Tree: Checkpoint anbieten (nicht-destruktiv, über git stash create). Wiederherstellen: ALEX: Git-Checkpoint wiederherstellen. |
| Modell-Routing |
Bei „Auto“: kleine Frage → small, normal → normal, Refactoring/viel Kontext → complex, localOnly-Dateien → local. |
| Provider-unabhängiger Verlauf |
Der Verlauf liegt in der Extension. Du kannst mitten im Gespräch das Modell wechseln. |
Zusätzlich (meine Ergänzungen)
- neverSend: Dateien wie
.env, *.pem, secrets/** gehen nie an ein Modell (auch nicht per @file).
- localOnly: Dateien, die nur an lokale Modelle gehen dürfen. Gibt es keins, wird blockiert statt auf Cloud auszuweichen.
- Secret-Schwärzung: typische API-Keys, Tokens, private Schlüssel werden vor dem Senden durch
[REDACTED] ersetzt.
- Prompt-Injection-Warnung: Steht im Kontext z. B. „ignore all previous instructions“, warnt ALEX – egal ob die Datei vorab mitgeschickt wurde oder sich das Modell sie per
read_file mitten im Zug selbst nachlädt. Kontext wird dem Modell außerdem ausdrücklich als unvertrauenswürdige Daten markiert.
- Selbstschutz: Das Modell kann nicht in
.git/, .alex/ (Audit-Log) und nicht in neverSend-Dateien schreiben. .vscode/settings.json, .alexrules, CI-Workflows erfordern immer Extra-Bestätigung.
- Harte Befehlssperren:
rm -rf /, curl … | sh, mkfs, dd of=/dev/… u. a. werden nie ausgeführt. sudo, git push, rm -r, curl, ssh, Zugriff auf .env fragen immer extra nach – auch bei terminal = allow.
- Kosten-Bremse:
alex.budget.maxCostPerRequestUSD und dailyLimitUSD (Rückfrage vor dem Senden).
- Zweitmeinung: unter jeder Antwort dasselbe von einem anderen Modell einholen.
- Kontrollinstanz-Hook (
alex.control.endpoint): ALEX OS (oder jeder Dienst) bekommt jede Aktion per POST ({kind, detail, model}) und antwortet {"decision":"allow|ask|deny"}. deny gewinnt immer; bei Ausfall wird nachgefragt, nie stillschweigend erlaubt.
- Audit-Prüfung: ALEX: Audit-Log auf Manipulation prüfen und ein lesbarer Audit-Bericht.
- Sichere Einstellungen: Berechtigungen, Datenschutz, Modelle und Basis-URLs haben
scope: machine – ein geklontes Fremdprojekt kann sie über .vscode/settings.json nicht ändern. Die Extension läuft nur in vertrauenswürdigen Workspaces.
Lokaler Lauf vs. Akte
Diese Extension ist nicht alexproof.de. Was du hier machst, ist ein lokaler, bestätigter Arbeitsschritt – kein geprüfter, unabhängig verifizierbarer Nachweis. Die beiden Dinge sind absichtlich getrennt:
|
ALEX Control Layer (hier) |
Auftrag & Nachweis (Sidecar-Extension) + alexproof.de |
| Läuft wo |
Lokal, in deinem VS Code |
Serverseitig |
| Was es ist |
KI-Chat mit Berechtigungsschicht |
Kontrollierter Auftrag mit menschlicher Freigabe |
| Woraus VERIFIED entsteht |
— (erzeugt es nicht) |
Signatur + Hash-Kette + Konsistenzprüfung durch einen unabhängigen Verifier |
| Was VERIFIED bedeutet |
— |
„Signatur/Kette stimmen“ – nicht „die Arbeit ist inhaltlich richtig“ |
| Preis |
Kostenlos, dein eigener API-Key |
Free (5 Nachweise) / Pro (19 €) |
Jede bestätigte Karte hier erzeugt einen kleinen Beleg in .alex/receipts.jsonl (Prompt-Hash, Diff-Hash oder Befehl, Entscheidung, Git-Checkpoint, Modell) – das ist ein Hinweis, der an eine Akte angehängt werden kann, nicht die Akte selbst. .alex/audit.jsonl ist eine lokale Hash-Kette; sie zeigt zuverlässig Manipulation, beweist aber nichts nach außen, solange niemand den head-Hash extern verankert (committen, an einen Verifier melden). Ein Audit-Log, das nur auf deiner eigenen Festplatte liegt, ist kein unabhängiger Nachweis – das ist technisch nicht anders möglich und kein Mangel dieser Extension, sondern der Grund, warum es den Sidecar-Schritt überhaupt gibt.
Datenfluss
|
|
| Verlässt den Rechner |
Prompt, mitgeschickter Dateikontext, Werkzeug-Ergebnisse (list_files/search_files/read_file) – an den Anbieter, den du gewählt hast (Anthropic/OpenAI/DeepSeek). Bei alex.routing.fallback zusätzlich an jeden dort eingetragenen weiteren Anbieter (standardmäßig leer, siehe oben). |
| Bleibt lokal |
API-Keys (VS-Code-SecretStorage), .alex/audit.jsonl, .alex/receipts.jsonl. |
| Sieht GitHub |
Nur bei verbundenem Repo: Lesezugriffe über die GitHub-Contents-/Trees-/Code-Search-API, ausschließlich auf das eine per ALEX: GitHub-Repo verbinden gewählte Repo (source: "connected_repo", siehe oben – kein beliebiges anderes Repo möglich). |
Wie der Chat Änderungen vorschlägt
Das Modell ruft write_to_file (Vollinhalt), replace_in_file (ein oder mehrere SEARCH/REPLACE-Blöcke) bzw. execute_command (ein Shell-Befehl) als native Tools auf – genau wie beim Lesen. ALEX prüft bei replace_in_file, ob der SEARCH-Text genau einmal in der Datei vorkommt, und zeigt jeden Aufruf sofort als Karte (Diff ansehen · Übernehmen · Ablehnen; bei Befehlen zusätzlich eine native Rückfrage mit dem exakten Wortlaut). Voll-Ersetzungen mit Platzhaltern („… rest unchanged“) oder starker Kürzung werden markiert. Nach einer Entscheidung fließt das Ergebnis zurück ins Modell, das weitermacht – bis die Aufgabe fertig ist oder alex.agent.maxRounds/maxSteps greift.
Ein Modell, das dieses Tool-Schema ignoriert (z. B. ein schwächeres lokales Modell), kann weiterhin die alte Form nutzen: Blöcke mit vier Backticks (alex-edit/alex-run), die ALEX nach Ende der Antwort per Regex herausparst. Dieser Fallback läuft dann aber nicht in der Schleife mit – das Ergebnis geht erst mit der nächsten Nachricht zurück.
Nach jedem übernommenen Edit sammelt ALEX kurz VS-Code-Diagnostics (Compiler/Linter) für die geänderte Datei ein und gibt sie als Teil des Werkzeug-Ergebnisses zurück. Terminal-Ausgaben aus dem Fence-Fallback werden beim nächsten Senden automatisch als Kontext angehängt.
Grenzen – bitte ehrlich lesen
- Automatisiert getestet, plus echte Nutzung in echtem VS Code. Die Logik-Module (Streaming-Parser für Anthropic/OpenAI-kompatibel inkl. Tool-Use, Routing, Berechtigungen, Aktionen, Audit-Kette, Redaktion, Werkzeuge, Modell-Assistent, GitHub-Repo-Anbindung) und der Controller laufen automatisiert gegen ein simuliertes VS Code (
npm test, läuft per CI bei jedem Push gegen integrations/alex-control-layer/**). Das Haupt-Repo (alex-core) ist privat, deshalb spiegelt github.com/Alex-Proof/alex-control-layer nur den Quellcode dieser Extension öffentlich – ein manuell gepushter Snapshot ohne eigene CI, kein automatischer Sync bei jedem Release. Die Testzahl selbst bleibt deshalb eine Eigenangabe, nicht von außen per CI-Badge nachprüfbar. Zusätzlich: die Oberfläche im echten Seitenpanel, die GitHub-Anbindung und die Kernfunktionen (Diff/Übernehmen/Ablehnen/Rückgängig, Stop inkl. echtem Prozess-Kill, Audit-Bericht, Autonomie-Bremse, Injection-Warnung) wurden über mehrere Tage in echter täglicher Nutzung durchgeklickt – dabei gefundene Probleme sind in den jeweiligen Changelog-Einträgen dokumentiert, nicht verschwiegen.
- GitHub Code-Search hat eigene Grenzen.
search_files im verbundenen Repo nutzt GitHubs Code-Search-API: nur der Default-Branch wird durchsucht, sehr kurze/häufige Suchbegriffe können abgelehnt werden, eigene Rate-Limits gelten. read_file/list_files sind davon nicht betroffen.
- Modell-IDs prüfen. ALEX: Modell hinzufügen bietet eine kurze, kuratierte Vorschlagsliste je Anbieter plus manuelle Eingabe – Vorschläge können trotzdem veralten, bei Zweifel die ID beim Anbieter nachsehen.
- Lesen, Schreiben und Ausführen laufen in derselben Schleife (list_files/search_files/read_file sowie write_to_file/replace_in_file/execute_command als Werkzeuge, je Zug einmal per alex.permissions.read freigegeben, begrenzt durch alex.agent.maxRounds/maxSteps). Jede Datei-Änderung und jeder Befehl bleibt trotzdem eine Karte, die du bestätigst (außer bei permissions=allow ohne Warnungen – dafür gibt es alex.agent.autonomyBreakAfter als zusätzliche Bremse). Kein MCP, kein Plan/Act-Modus, kein Browser-Werkzeug – dafür bleibt Cline/Roo/Claude Code der umfassendere Weg, ALEX ist die Kontrollschicht und der Chat mit eigenen API-Keys.
- Hash-Kette = manipulationssicher erkennbar, nicht manipulationssicher. Wer die ganze Datei neu schreibt, kann die Kette neu berechnen. Für echte Beweiskraft: Hash des letzten Eintrags (
head) extern ablegen (z. B. committen oder an ALEX melden).
- Schwärzung und Befehlsfilter sind Best-Effort, keine Sandbox. Regeln erkennen Muster; wer sie umgehen will (z. B. Befehle verschleiert zusammensetzen), kann das. Der eigentliche Schutz ist die Bestätigung durch dich.
- Kontext ist nur für den aktuellen Zug. Frühere Dateiinhalte stehen nicht im Verlauf (nur deine Fragen und die Antworten), um Tokens zu sparen – das Modell kann sich fehlenden Dateiinhalt aber per read_file selbst zurückholen. Innerhalb eines Zugs werden ältere Werkzeug-Ergebnisse ab alex.agent.compactBudgetChars automatisch gekürzt (die letzten beiden Runden bleiben voll erhalten), und bei Anthropic-Modellen cached alex.agent.promptCaching den wachsenden Verlauf.
- Git-Checkpoints sichern nur getrackte Dateien. Neue, ungetrackte Dateien sind nicht abgedeckt. Git-Checkpoint wiederherstellen setzt ALLE getrackten Dateien zurück (mit Warnhinweis) und braucht ein Git-Repo. Letzten Zug rückgängig machen (auch als Knopf im Chat) setzt gezielt nur die Dateien zurück, die ALEX in diesem Zug selbst geschrieben hat – andere Änderungen bleiben unberührt, funktioniert auch ganz ohne Git, und überspringt eine Datei statt sie zu überschreiben, falls sie seit Alex' Änderung nochmal von außen verändert wurde.
- Stop killt einen laufenden Befehl wirklich, nicht nur die Karte in der UI (das Abort-Signal des Zugs geht direkt an den Kindprozess). Bei einem
write_to_file, das zwischen Vorschlag und Übernahme auf eine inzwischen geänderte Datei träfe, lehnt ALEX die Übernahme ab statt die Änderung zu überschreiben. Wurde eine Datei-Änderung oder ein Befehl durch einen Absturz/Kill mitten in der Ausführung unterbrochen, meldet ALEX das beim nächsten Öffnen der Seitenleiste – wiederholt aber nichts automatisch.
- Symlinks innerhalb des Workspace, die nach außen zeigen, werden per
realpath erkannt und blockiert (Datei UND nächster existierender Vorfahre bei neuen Dateien). Nicht geprüft: TOCTOU (Symlink wird exakt zwischen Prüfung und Dateizugriff ausgetauscht) – theoretisch möglich, in der Praxis nur mit Zugriff auf denselben Rechner zur selben Zeit.
- Fallback sendet denselben Kontext an einen anderen Anbieter, falls
alex.routing.fallback nicht leer ist (Standard: leer). Explizit eintragen, wenn du das willst – oder localOnly/neverSend für Dateien, die bestimmte Anbieter nie sehen sollen.
- Preise in USD pro 1 Mio Tokens; ohne Eintrag zeigt ALEX „Preis nicht konfiguriert“.
Einstellungen im Überblick
// Benutzer-Einstellungen (settings.json)
"alex.permissions.write": "ask", // allow | ask | deny
"alex.permissions.terminal": "ask",
"alex.privacy.localOnly": ["src/intern/**"],
"alex.budget.dailyLimitUSD": 2,
"alex.agent.maxRounds": 10, // Streaming-Aufrufe pro Zug
"alex.agent.maxSteps": 20, // Werkzeug-Aufrufe (lesen+schreiben+ausführen) pro Zug
"alex.agent.autonomyBreakAfter": 5, // 0 = aus
"alex.agent.promptCaching": true, // nur Anthropic-Modelle
"alex.models": [
{ "id": "claude-sonnet", "label": "Claude Sonnet", "kind": "anthropic", "provider": "anthropic",
"model": "<aktuelle Modell-ID>", "inputPer1M": 3, "outputPer1M": 15 },
{ "id": "deepseek-chat", "label": "DeepSeek", "kind": "openai-compat", "provider": "deepseek",
"model": "deepseek-v4-flash", "maxOutputTokens": 8192 }
]
Entwicklung
npm test # keine Abhängigkeiten, Zahl siehe eigene Ausgabe
npx @vscode/vsce package --allow-missing-repository # .vsix bauen
code --install-extension alex-control-layer-<version>.vsix --force # eigenen Build installieren
Zum Debuggen: Ordner in VS Code öffnen und F5 (Extension Development Host).
| |