Zwei Nachbesserungen am Cockpit-Modus (noch Teil von 0.2.1.9): - Im Cockpit werden IMMER alle vier Kacheln gezeigt (Chat/Editor/Desktop/ Vorschau) statt erst bei Code-Projekten — Editor/Desktop/Vorschau als Platzhalter mit Status-Untertitel. Vorher wirkten sie "verschwunden". - Der "⤢ Uebersicht"-Button hing im Chat genau ueber dem Abbrechen-Button der "ARIA denkt"-Leiste. Jetzt sitzt er im Navigations-Header links (nur sichtbar im Cockpit + Fokus), via neuem cockpitNav-Signal-Singleton. In-Content-Button entfernt. tsc clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 KiB
ARIA — Changelog
Alle Änderungen am Projekt. Format: Keep a Changelog
Hinweis: Dieser Changelog hatte eine große Lücke — er endete bei
0.0.0.5(2026-03), das Projekt lief aber bis0.2.0.2(2026-07) weiter (u. a. OAuth, Voice-Streaming, Speaker-ID, Datei-Manager). Ab dem Projekte-/Multi-Threading- Epos (2026-07) wird wieder gepflegt; die dazwischenliegenden Versionen0.0.0.6–0.1.9.6sind nicht rückwirkend nacherfasst.
[0.2.1.9] — 2026-07-17 — Kompakt ↔ Cockpit: Umschalter für den Kachel-Desktop
Hinzugefügt
- Ansichts-Umschalter im Header („⧉ Kompakt" / „⧉ Cockpit"): Die App startet in Kompakt — der klassische Vollbild-Chat, exakt wie vor dem Umbau (Default, Mama-tauglich). Ein Tap auf den Button oben rechts schaltet auf Cockpit — den zoom-/verschiebbaren Kachel-Desktop. Persistiert über Neustart (
aria_view_mode). - Warum: Nach dem 0.2.1.8-Deploy sah die App „unverändert" aus — korrekt, denn im normalen Chat gibt es nur eine Kachel (= Vollbild-Chat). Der Umschalter macht den Cockpit-Modus jetzt explizit sichtbar/steuerbar, statt nur bei Code-Projekten aufzutauchen.
- Im Cockpit ist die Übersicht jetzt immer erreichbar (auch im Hauptchat): „⤢ Übersicht" sitzt im Header links (kollidiert nicht mehr mit dem Abbrechen-Button der „ARIA denkt"-Leiste), dazu 2-Finger-Pinch/Pan und Hardware-Back.
- Im Cockpit werden immer alle vier Kacheln gezeigt (Chat/Editor/Desktop/Vorschau) — Editor/Desktop/Vorschau als Platzhalter mit Status-Untertitel („kein Code-Projekt" / „kein Desktop"), bis ARIA ein Code-Projekt startet bzw. eine VM läuft. Vorher wirkten sie „verschwunden", weil sie erst bei Code-Projekten auftauchten.
[0.2.1.8] — 2026-07-17 — Desktop-Workspace: zoombarer Canvas, Live-Code-Editor, QEMU/VNC
Hinzugefügt
Zoom-/verschiebbarer Workspace-Canvas (App)
- Die App ist jetzt eine desktop-artige Arbeitsfläche: rausgezoomt sieht man eine Landkarte aus Kacheln (Chat, Editor, Desktop, Vorschau), die man mit 2 Fingern zoomt und verschiebt. Tippt man eine Kachel an, zoomt sie voll auf und wird echt bedienbar („Übersicht + Fokus"). „⤢ Übersicht" bzw. der Hardware-Back führen zurück zur Landkarte.
- Technisch:
react-native-gesture-handler+react-native-reanimated(60 fps auf dem UI-Thread). Zwei Ebenen — eine skalierte Thumbnail-Welt und eine Identity-Content-Ebene (Scale 1), in der die schweren Inhalte (ChatScreen + WebViews) immer gemountet sind und nur die fokussierte sichtbar ist. Dadurch bleiben Touch-Koordinaten/Keyboard korrekt und nichts remountet beim Fokuswechsel. Reiner Chat verhält sich exakt wie bisher (eine Kachel, dauerhaft fokussiert).
Live-Code-Editor für Code-Projekte (App + Bridge + Proxy)
- Wird ein Projekt zum Code-Projekt (ARIA ruft
set_project_kind('code')), erscheinen Editor- und Desktop-Kachel. Der Editor (WebView, selbstenthaltener Highlight-Editor, offline) zeigt live, was ARIA schreibt — und Stefan kann selbst editieren; Änderungen gehen zurück an ARIA. - Fluss: ARIAs
Write/Editunter/shared/projects/<projekt-id>/werden im Proxy abgefangen und alscode_fileüber die Bridge/RVS an die App gespiegelt; Stefans Edits kommen alscode_file_editpfad-sicher zurück ins selbe Verzeichnis.
QEMU für alle Architekturen + Live-Desktop per VNC (Host + Bridge + App)
- ARIA kann jetzt VMs für jede Architektur bauen/testen (x86, ARM, MIPS, PPC, RISC-V, SPARC) — Host-Helper
aria-vm(create/boot/screenshot/list/stop), installiert viahost-provisioning/qemu-setup.sh. KVM für x86-Gäste, sonst TCG. Beispiel: ein Win-3.11-System bauen und in QEMU testen. - Der VNC-Live-Desktop wird durch den RVS-Server getunnelt: die Bridge brückt rohes RFB-TCP (QEMU
127.0.0.1:5901) ↔ RVS (vnc_data/vnc_input, Base64-in-JSON), der noVNC-Client läuft in der App-WebView (window.WebSocket-Shim). Stefan bedient die VM live mit Maus/Tastatur in der Desktop-Kachel — NAT-sicher, kein offener Port am Host, kein websockify/noVNC auf dem Host nötig.
Kleineres
- Pro-Projekt-Layout: die zuletzt fokussierte Kachel wird pro Projekt gemerkt (
aria_workspace_layout). - Projekt-Modell bekommt
kind('chat'|'code'); Seed-Regel lehrt ARIA den Code-Projekt-Workflow (Arbeitsverzeichnis/shared/projects/<id>/,aria-vm, VNC landet automatisch in der App).
Deploy
git pull && docker compose up -d --build brain bridge proxy · RVS-Stack up -d --build · Host: bash host-provisioning/qemu-setup.sh (einmalig, als root) · APK neu bauen (nach npm install einmalig npm start --reset-cache + gradlew clean, wegen der neuen nativen Module).
[0.2.1.5] — 2026-07-12 — Pro-Projekt-Queue mit Rückfrage-Loop
Hinzugefügt
Nachrichten-Queue pro Projekt (App + Diagnostic)
- Eine zweite Nachricht, während ARIA am aktuellen Task arbeitet, wird jetzt angestellt statt den laufenden Task abzubrechen (vorher: Barge-In-Cancel). Sie läuft der Reihe nach, pro Projekt unabhängig (paralleles Arbeiten in mehreren Projekten bleibt). Wartende Nachrichten zeigen als ⏸-Bubble — tippen entfernt sie aus der Warteschlange.
- Rückfrage-Loop: Stellt ARIA eine echte, blockierende Rückfrage, pausiert die Queue und deine nächste Eingabe beantwortet sie — bis eine finale Antwort kommt, dann läuft der nächste Queue-Eintrag (gleiches Muster). Banner „❓ ARIA fragt nach — deine Eingabe beantwortet das". Der Stop-Button bricht den aktuellen Task ab und schaltet zum nächsten.
- ARIA signalisiert eine Rückfrage über einen unsichtbaren
[[AWAIT]]-Marker — wie speak/converse deklariert das Modell den Zustand selbst (kein „endet-mit-?"-Raten). Brain strippt ihn, gibtawaiting_replydurchchat()→ChatOut→ Bridge-Chat-Payload. Local (tool-los) und Fast-Path markieren nie.
Pro-Projekt-Textfeld-Entwürfe (App + Diagnostic)
- Der Feldinhalt bleibt beim Projektwechsel erhalten: in Projekt X tippen, zu Y wechseln (leeres Feld), zurück zu X → dein Entwurf steht wieder da. In Storage persistiert.
TTS-Abspiel-Queue (App)
- Zwei fast gleichzeitig fertige Antworten sprechen jetzt garantiert nacheinander statt sich gegenseitig abzuschneiden. Vorher war das Timing-Glück (
PcmStreamPlayer.start()ruftstopInternal()= flush/release, hätte die laufende gecuttet). Jetzt: „spielt hörbar" gilt bis zum echtenPcmPlaybackFinished(nicht nur bis Stream-Ende); eine neue hörbare Antwort, die währenddessen ankommt, wird gepuffert und danach nachgespielt (Kette für 3, 4, …). Harter Stop/Barge-In/Mund-Button verwirft die Queue.
Geändert
- Voice bricht nicht mehr ab: eine neue Sprachnachricht während ARIA arbeitet stoppt nur akustisch das TTS (sauberes Mikro) und wird über den Brain-Projekt-Lock serialisiert, statt den laufenden Task abzubrechen (passend zu „immer anstellen + Stop-Button"). Text-Senden erkennt Brain-busy als Fallback, damit auch nach einem voice-gestarteten Turn korrekt angestellt wird. Grenze: eine per Sprache gestartete Aufgabe erscheint nicht als löschbare ⏸-Bubble (Aufnahme wird live gestreamt, nicht app-seitig gepuffert).
[0.2.1.4] — 2026-07-12 — Lokales LLM: der ehrliche Rückbau
Geändert
Lokales LLM wieder tool-los (B1a) — ein 8B ist ein schlechter Tool-Caller
- B1b hatte dem lokalen Modell Werkzeuge (
run_*/web_search) gegeben — die gemeinsame Wurzel von zwei Problemen: (1) ein 8B erfindet mit Werkzeug in der Hand lieber eine plausible Antwort („der Song ist X") statt es zu rufen → Halluzination; (2) das erzwang per-Skill-Guards (skaliert nicht). Local ist jetzt wieder tool-los = reines Reden; alles mit Grundwahrheit (Fakt/Live-Zustand/Gedächtnis/Aktion) gehört an Claude oder den deterministischen Fast-Path. Kein Skill-Ergebnis mehr fälschbar - Keine Input-Wortliste im Router: eine kurz eingeführte
_LIVE_HINTS-Blacklist (Wetter/Musik/… → Claude) wieder entfernt — aus offenem Freitext die Absicht per Wortliste zu raten ist nie vollständig, jeder Miss = ein Halo (nur von per-Skill auf per-Wort verschoben). Generisch = das Modell entscheidet selbst (<<ESCALATE>>); ein stärkeres lokales Modell übernimmt die Selbst-Erkennung später, bis dahin ist local per Einstellung abschaltbar (aus, nicht raus) - Expliziter Nutzer-Wunsch „nimm Claude/Clodi" wird im Router respektiert (geht nie lokal)
Behoben
- Info-Halluzination: local nannte manchmal aktuellen Song/Restzeit/Skip-Titel ohne
run_spotifyzu rufen (mal echt, mal frei erfunden — „Midnight City von M83" nie aufgerufen). Neuer Output-Guard_claims_live_media_stateeskaliert behauptete Live-Auskünfte ohne echten Skill-Call an Claude; Local-Prompt zusätzlich gehärtet (nie Titel/Zeit/Gerät ohne Tool-Ergebnis; bei „OK: next" keinen Titel erfinden) - Leeres
<voice></voice>machte TTS stumm: Claude hängt reflexartig manchmal ein leeres Voice-Tag an →clean_text_for_ttsnahm den leeren Inhalt → gar keine Sprachausgabe (Playlist „Fliegen" gesprochen, „Prodigy" stumm — reiner Claude-Output-Zufall, nicht Skill/Playlist-Name). Leeres/whitespace-Tag wird jetzt ignoriert, der normale Anzeigetext gelesen - Datei-Anhang erschien erst nach Seitenwechsel: die Live-
chat-Payload trug keinefiles(Anhänge kamen nur als separatesfile_from_aria-Event) → an der Nachricht tauchte die Datei erst nach Reload auschat_backupauf. Bridge schickt diefilesjetzt in der chat-Payload, App hängt sie live an die Text-Bubble (wie der Reload-Pfad) und entfernt die redundante Solo-Bubble - TDZ-Zeitbombe (App):
sendTextMessagestand vor seinen Dependencies (interruptAriaIfBusy,sendPendingAttachments) im deps-Array — Temporal Dead Zone; lief nur dank Babelsconst→var-Hebung, ein strengerer Bundler hätte beim Mount weißgescreent. Deklaration hinter die Deps verschoben - QRScanner tsc-clean: toter Prop
colorForScannerFrame(existiert inreact-native-camera-kitv13 nicht) entfernt; die fehlerhaften Lib-Typen (optionale Props als required markiert) lokal + dokumentiert umgangen → Projekt komplett tsc-clean (0 Fehler)
Spotify-Skill — von ARIA live im Gespräch weiter geschärft
- Skip (
next/previous) sagt jetzt den echten neuen Titel an (holt den Track nach dem Skip via API) statt local einen erfinden zu lassen playlist_play/search_and_play/playnennen das tatsächliche Wiedergabegerät (ausGET /v1/me/player, kein Raten — verhinderte den Fehler, dass Claude ein falsch geratenes Gerät auch noch ansteuerte) und lesen konsistent vor; saubere „Sprach-Grammatik": Ansagen sprechen, Steuerbefehle (play/pause/transfer/volume) schweigenyt-dlp-download-Skill um einen MP3-Modus erweitert — ARIA hat das fehlende Werkzeug selbst gebaut, als eine deutsche Titelmelodie nicht auf Spotify lag (Web-Suche → YouTube-Download → MP3 in den Chat, in <1 min)
[0.2.1.3] — 2026-07-11
Hinzugefügt
skill_get-Tool: ARIA liest den echten Quellcode + Manifest + Readme eines Skills, bevor sie ihn ändert — kein Blind-Rewrite mehr (vorher wurde ein guter Skill durch eine schlechtere Neufassung ersetzt, weil das referenzierteskill_getgar nicht existierte)
Behoben
conversefolgt dem Skill (Fast-Path): auch ein Fast-Path-Befehl kann einen Skill auslösen, nach dem noch etwas zu sagen ist —conversekommt jetzt aus Manifest/Skill-Output statt hart aufFalse- Sprachnachricht-Bubble verschwand nach manuellem Stop: bei „ohne Ohr" aufgenommener Sprachnachricht + Stop entfernte ein leeres stream-end-Endpoint die schon gefüllte Bubble; jetzt wird nur noch der unaufgelöste Platzhalter entfernt
[0.2.1.2] — 2026-07-11 — Standort-Intelligenz + Skill steuert seine Ausgabe
Hinzugefügt
GPS → Ortsname im Standort-Präfix (keyless, keine Tokens)
- Reverse-Geocoding der Koordinaten in der Bridge (Nominatim zoom=18: Straße+Hausnr, PLZ+Ort, Bundesland; Straßen-Ref + Autobahn-km via Overpass) — damit das lokale Modell nicht „Berlin" für Oldenburg rät; Ortsname wird vor dem Präfix-Bau awaited (rechtzeitig für die erste Nachricht)
- Fahrtrichtung als Himmelsrichtung + exakte Peilung in Grad (Haversine/Bearing aus aufeinanderfolgenden Fixes,
MIN_MOVE_M-Schwelle gegen Zittern)
Skill steuert seine Ausgabe selbst — speak + converse pro Aufruf
- Ein Skill entscheidet per JSON-Output
{speak, converse}pro Operation, ob vorgelesen wird und ob danach 30 s weitergelauscht wird (Manifest-Default, Output überschreibt) — z. B. „was läuft" vorlesen aber kein Dialog, „nächstes Lied" stumm. In der Skill-Bauanleitung mit dem WARUM dokumentiert, damit die KI die Flags beim Bauen versteht (kein Hardcode im Brain)
Behoben / Geändert
- Generischer Skill-Prompt (kein Hardcode): der Router beschreibt
run_*-Skills generisch (weiß nicht mehr, welche „schwer" sind); ein Stop im 30-s-Lauschen beendet dieses jetzt wirklich (kein zweiter Gong / erneutes Öffnen) - Anti-Halluzination: behauptet local eine Steuerbefehl-Quittung („Spotify: …", „Playlist abspielen") ohne das Tool wirklich zu rufen → Eskalation an Claude statt erfundene Bestätigung durchzulassen
[0.2.1.1] — 2026-07-11
Hinzugefügt
- Skill entscheidet selbst, ob vorgelesen wird (
manifest.speak): Grundlage der späterenspeak/converse-Architektur — derspeak-Flag greift sowohl im lokalen als auch im Claude-Pfad, statt am fragilen leeren<voice></voice>-Hack zu hängen
[0.2.0.6] — 2026-07-11
Hinzugefügt
Diagnostic + App — Projekte verstecken
- Neues
hidden-Flag pro Projekt (bleibt voll nutzbar, nur aus Listen ausgeblendet — unabhängig vonstatus/archived);PATCH /projects/{id} {hidden} - Diagnostic: 👁-Auge pro Projekt-Bubble (🙈 verstecken / 👁 dauerhaft sichtbar), Header-Toggle „Versteckte anzeigen (N)" blendet sie temporär gedimmt + „versteckt"-Badge ein — zum Ansehen/Auswählen ohne permanentes Enttarnen
- App (
ProjectsBrowser): versteckte standardmäßig ausgeblendet (Mama sieht sie nicht), Auge pro Zeile + Toggle spiegeln das Diagnostic-Verhalten; geteilterhidden-Status übers Brain
Diagnostic — Token-Ersparnis durch lokales LLM
metrics.jsonlträgt jetztsource(claude | local | fast-path); lokale Calls nutzen echteusage-Tokens vom Adapter, Fast-Path = 0 Prompt-Tokens (by_source-Aggregation, rückwärts-kompatibel)- Neue Card „Lokales LLM & Claude-Ersparnis": pro Fenster (1h/5h/24h/30d) gesparte Claude-Calls (local + fast-path) + lokale Token-Last (eigene HW, kein Quota)
Spotify-Skill — von ARIA selbst geschärft
- Geräte-Transfer startet die Wiedergabe direkt mit (
play=true) statt nur zu übertragen, inkl. Verifikation (is_playing-Check + expliziter Play-Fallback), Fuzzy-Gerätenamen und sauberen Exit-Codes; neue semantische Actionsplay_on_device/search_and_play/playlist_play/queue_add
Behoben
- Spotify-Resume (App): nach einem Voice-Befehl blieb Spotify auf dem Handy pausiert. Statt des auf manchen Geräten (OnePlus) flakigen Audio-Focus-Nudge jetzt ein echter
KEYCODE_MEDIA_PLAY-KeyEvent an die aktive MediaSession — gegated: nur wenn vor dem Dialog Musik lief (isMusicActive). Deterministisch, geräteunabhängig - TTS-Zahlen: freistehende Ganzzahlen werden jetzt tag-unabhängig ausgeschrieben („23°C" → „dreiundzwanzig Grad Celsius", „100%" → „einhundert Prozent"). Regression, seit das lokale LLM (bewusst ohne
<voice>-Tag) leichte Turns übernahm; neuer vollständiger Zahl→Wort-Konverter (0…999999) am Ende vonclean_text_for_tts, lange Ziffernfolgen (IDs) bleiben Ziffern - „ARIA denkt" hängt: Indikator + Abbrechen blieben stehen, obwohl der Turn laut Diagnostic fertig war. Die App räumt den kontext-scoped Indikator jetzt beim Eintreffen der Antwort selbst; die Bridge sendet zusätzlich ein
idlefür die Request-projectId, falls der Turn umgeroutet wurde (thinking ging mit Request-, idle mit Turn-projectId) - Lokale Tool-Fehler: Action-Skills, die bei Exit 0 einen Fehlschlag nur im stdout-Text melden (Spotify: „Fehler beim Übertragen", „Gerät nicht gefunden"), eskalieren jetzt generisch an Claude statt vom lokalen LLM vorgelesen zu werden (Info-Tools wie web_search ausgenommen)
[0.2.0.4 – 0.2.0.5] — 2026-07-11 — Plan B: Lokales LLM („Gemini-Feeling")
Ein kleines, schnelles Modell (Qwen3 8B via llama.cpp/llama-swap auf der Gamebox-GPU) übernimmt einfache Turns in <1 s; alles Schwere/Technische/Werkzeug-artige reicht ein Router automatisch an Claude weiter. Ziel: schnelle Antworten ohne die Claude-Max-Subscription aufzugeben.
Hinzugefügt
Lokales LLM (Brain + Bridge + Adapter)
- Router (B1a): Heuristik +
<<ESCALATE>>-Selbstabbruch entscheidet pro Turn lokal vs. Claude; schlanker System-Prompt mit demselbenIDENTITY_ANCHORwie Claude (Rolle hält), nur letzte 8 Turns (Speed) - Lokale Tool-Fast-Lane (B1b): kuratierte Tools —
web_search(self-hosted SearXNG, local-only),memory_search,trigger_timer, Spotify; Eskalation bei Tool-Fehler statt Raten - Consumer-Kette gespiegelt zu FLUX: Brain → Bridge
/internal/local-llm→ RVS →llm-adapter→ llama.cpp;enable_thinking:false(Qwen wickelte sonst die ganze Antwort in<think>) - B0.5: llama-swap (Hot-Swap der Modelle on-demand) + Modellauswahl-Dropdown + Live-Lade-Status (loading/ready + Download-Hinweis) in Diagnostic
- SearXNG als 6. Container auf der ARIA-VM (keyless Meta-Suche, JSON-API)
Quell-Badge (local / claude / fast-path)
- Diagnostic: immer an den ARIA-Bubbles
- App: optionaler Schalter in den Einstellungen, pro Gerät gemerkt, default aus („ich will's, meine Mama nicht")
TTS — System-Flag speak (ja/nein) pro Antwort
- Die Quelle entscheidet übers Vorlesen (Fast-Path/Steuerbefehl = stumm, ARIA-Antwort = vorlesen), robust statt des fragilen leeren
<voice></voice>-Hacks der beim Skill-Rebuild verloren ging
Behoben / Geändert
- Identität (Hauptchat): Proxy nutzt jetzt
--system-prompt(voller Replace) statt--append-system-prompt— die Claude-Code-Basis-Identität leakt nicht mehr in den Hauptchat (ARIA antwortete dort als „Claude Code" bzw. deutete die Persona als Injection). DazuIDENTITY_SEED(synthetischer Grounding-Turn) + Gift-Wächter (Identity-Breaks werden nie in die History persistiert, Retry+Fallback) + Cleanup-Script gegen bereits vergiftete Turns - Datenschutz (kritisch): harte Diskretions-Regel im
IDENTITY_ANCHOR— ARIA kennt intime/private Details, gibt sie aber NIE ungefragt preis (nicht in Vorstellungen, „was weißt du über mich", Zusammenfassungen, Triggern); nur auf konkrete Nachfrage, knapp. Bereits ausgeplauderte Turns bereinigt. Lokales Tier eskaliert Personen-/Beziehungs-/Gedächtnisfragen an Claude (kennt das Gedächtnis + antwortet diskret) - Lokale Antwort nicht in
<voice>wickeln (Qwen imitierte den Tag aus dem Kontext → Anzeige war leer); generische Tool-Fehler-Eskalation statt per-Skill-Router-Hardcode (Router muss nicht wissen, welche Skills „schwer" sind)
[0.2.0.3] — 2026-07-10
Hinzugefügt
Proxy — ARIA-Persona über echten System-Prompt-Kanal
- Persona + Tool-Use-Format gehen jetzt über
--append-system-promptder Claude-CLI statt als<system>-getaggter User-Content im Prompt (openai-to-cli.js: Prompt = nur Verlauf,systemPromptseparat; neuesed-Zeile schleust--append-system-prompt,options.systemPromptinsbuildArgs-Array vonmanager.js)
Multi-Threading — echte Parallelität in der App
agent_activity-Events tragen jetzt dieprojectId(Brain → Proxyaria_project_id→ Bridge → App); der „ARIA denkt"-Indikator zeigt nur noch den fokussierten Kontext statt global zu flackern (agentActivityByCtx-Map)- Kontext-scoped Cancel: neuer Proxy-Endpoint
/cancel {projectId}killt nur die Subprozesse eines Kontexts (/cancel-allbleibt fürs NOT-AUS); Bridge-soft-Cancel + App-Abbrechen tragen die fokussierteprojectId
Diagnostic — Datei-Zuordnung
- Projekt-Dropdown pro Datei im Datei-Manager (nutzt
/api/files-set-project) — auch alt-hochgeladene Dateien nachträglich einem Projekt zuweisen
Behoben
- Identität: fester
IDENTITY_ANCHORganz oben im System-Prompt — ARIA verliert in (Pentest-)Projekten nicht mehr die Rolle bzw. deutet ihre eigene Aufgabe nicht mehr als Prompt-Injection - Barge-In kontext-scoped: eine Frage im Hauptchat blockiert/killt nicht mehr die parallele Arbeit in einem Projekt (Busy-Status kontextgenau aus
queueStatusstatt global)
[0.1.9.7 – 0.2.0.2] — 2026-07-02 … 2026-07-10 — Projekte & Multi-Threading
Der große Epos: Themen-Bündel („Projekte") im Hauptchat, echt nebenläufig verarbeitet.
Hinzugefügt
Projekte (Brain + App + Diagnostic)
- Named Themen-Bündel, im Hauptchat verankert, per Sprache adressierbar („steige in Projekt X ein", „für Frankreich: …"), CRUD via Meta-Tools + UI
- App: Focus-One-View + Drawer + Queue-Status-Dots + „← Hauptchat"-Button
- Diagnostic: Kontext-Strip + Focus-Filter + Queue-Polling
- Dateien pro Projekt getaggt (Manifest
file_projects.json, Filter im Datei-Manager)
Multi-Threading (Brain)
- Per-Request
project_idstatt globalemactive_project; per-Projekt-asyncio.Lock= Queue-Verhalten pro Kontext, verschiedene Kontexte laufen parallel - Queue-Aware-Prompting (spätere Nachricht kann laufenden Task als überholt markieren) ohne Extra-LLM-Call
Voice-Router (Bridge)
- 30s-Sticky-Kontext, Prefix-Adressierung, Meta-Command-Interception („zurück zum Hauptchat" ohne Brain-Call), Voice folgt App-Focus
Migration
- Alt-getaggte Projekt-Nachrichten (in
conversation.jsonl, aber ohne Tag imchat_backup.jsonl) werden nachträglich einsortiert — idempotent, nicht-destruktiv, reihenfolge-erhaltend
Behoben
- Leere Projekte: Drawer resettete den App-Focus beim Öffnen auf
status.active(im Multi-Threading = null); Diagnostic warfproject_idbeimchat_history-Reload weg (server.js + Renderer); untagged ARIA-Bubbles/Backup-Writes aus dem toten Gateway-Watch-Pfad - Voice → falscher Kontext: Registry-Race (
stt_stream_endpoppte die Focus-projectIdvor dem finalenstt_endpoint); App übernimmt jetzt die autoritative Server-projectIdder STT-Bubble - STT-Endpointing: akustische Stille als robustes Signal statt rein semantischer Stagnation (nicht mehr „hört nach zwei Worten auf" / „merkt Ende nicht")
- Anhänge: Bild/Datei + Frage landen im gewählten Projekt statt im Hauptchat (projectId durch die ganze Anhang-Kette)
- Bild-Bubbles im Diagnostic: ARIA-Datei-Bubbles tragen
project_id, werden nicht mehr fälschlich vom Focus-Filter ausgeblendet
[0.0.0.5] — 2026-03-13
Hinzugefügt
Diagnostic — Pipeline-Tab
- Neuer "Pipeline"-Tab im Log-Bereich — zeigt den kompletten Nachrichtenfluss wenn eine Chat-Nachricht über die Diagnostic-UI gesendet wird
- Tracking aller Schritte: Senden → Gateway ACK → Streaming Deltas → Finale Antwort (oder Fehler)
- Zeitmessung: Jeder Schritt zeigt Elapsed-Time seit Pipeline-Start
- Farbcodierung: Blau (Schritte), Grün (Erfolg), Rot (Fehler)
- 60s Timeout — markiert Pipeline als fehlgeschlagen wenn keine Antwort kommt
- Funktioniert für Gateway-direkt und RVS-Nachrichten
Behoben
OpenClaw Gateway Event-Format — ARIA antwortet jetzt
- OpenClaw sendet
event: "agent"(Streaming-Deltas inpayload.data.delta) undevent: "chat"mitpayload.state: "delta"|"final"|"error"— nichtchat:delta/chat:final/chat:errorwie angenommen - Antworttext steckt in
payload.message.content[0].text(Array von Content-Blöcken, nicht flacher String) —text.slice is not a functionFehler behoben ackReactionScopevon"group-mentions"auf"all"geändert — Agent reagierte nur auf @mentions, nicht auf direkte Nachrichten- Diagnostic Server und Bridge auf neues Event-Format umgestellt
- Legacy-Event-Namen (
chat:delta,chat:final,chat:error) als Fallback beibehalten
Geändert
OpenClaw Config — Custom Provider Format
openclaw.jsonnutztmodels.providers(Object, nicht Array) mitapi: "openai-completions"- Model-Einträge brauchen sowohl
idals auchnameFeld aria-setup.shschreibt korrekte Config mit Heredoc-Pattern ('"'"'INNEREOF'"'"')DEFAULT_MODEL=proxy/claude-sonnet-4— mit Provider-Prefix für Custom ProviderOPENAI_BASE_URLundOPENAI_API_KEYentfernt — OpenClaw ignoriert diese Env-Vars, nutzt nurmodels.providersConfig
[0.0.0.4] — 2026-03-11 / 2026-03-12
Hinzugefügt
Diagnostic Container — Selbstcheck-UI
- Neuer Container
aria-diagnosticmit Web-UI auf Port 3001 - Status-Karten: OpenClaw Gateway, RVS, Claude Proxy — jeweils mit Dot-Indicator
- Claude Proxy Test: Prüft Erreichbarkeit (
/v1/models) und sendet Test-Prompt an Claude — zeigt verfügbare Modelle als Tags +DEFAULT_MODELHinweis für docker-compose.yml - Auth-Check: "Auth prüfen" Button durchsucht alle bekannten Credential-Pfade im Proxy-Container (
/root/.config/claude/,/root/.claude/,/root/.claude/auth/) rekursiv — zeigt gefundene Dateien und deren Inhalt - Claude Login via UI: "Login starten" Button öffnet interaktives Terminal (xterm.js) in einem Modal-Overlay — führt
claude loginim Proxy-Container aus, volle TUI-Unterstützung (kein ANSI-Stripping mehr nötig) - xterm.js Terminal: Bidirektionaler Stream über Docker Exec API mit
Tty: true+ HTTP Upgrade auf Raw-TCP-Socket — echtes interaktives Terminal im Browser - UTF-8 Fix: Eingehende Daten werden als
Uint8Arrayan xterm.write() übergeben (stattatob()→ Latin-1 String, der Multi-Byte UTF-8 zerstört), ausgehende Daten überTextEncoderUTF-8-safe kodiert - Credentials manuell einfügen: "Credentials einfügen" Button — JSON von einem eingeloggten Rechner kopieren und direkt in den Container schreiben (schreibt in beide mögliche Pfade:
.config/claude/und.claude/) - Docker Exec API: Generische
dockerExec()(nicht-interaktiv, multiplexed stream) +attachTerminal()(interaktiv, Tty, raw TCP socket) für Befehle in laufenden Containern (via Docker Socket) - Chat-Test: Nachrichten direkt über Gateway oder via RVS senden
- Tabbed Logs: Separate Tabs für Alle, Gateway, RVS, Proxy, Server — mit Zähler pro Tab
- Autoscroll-Pause: Automatisch wenn hochgescrollt, "Nach unten" Button zum Fortsetzen
- TLS Fallback für RVS-Verbindung (wie Bridge und App)
Geändert
Bridge → aria-core: OpenClaw Gateway Protokoll
- Bridge nutzt jetzt das echte OpenClaw Gateway WebSocket-Protokoll (Port 18789 statt 8080)
- Vollständiger Handshake:
connect.challenge→connectRequest (mit Auth-Token) →hello-ok - Nachrichten über
chat.sendMethod mitmessageundidempotencyKey - Antworten über
chat:finalEvents (statt custom JSON) - Streaming-Support vorbereitet (
chat:deltaEvents werden empfangen) - Fehlerbehandlung für
chat:errorEvents — werden an die App weitergeleitet - Client-ID:
gateway-client/ Mode:backend(OpenClaw akzeptiert nur bestimmte Werte)
Docker-Compose Überarbeitung
- Bridge + Diagnostic nutzen
network_mode: "service:aria"— teilen Netzwerk mit aria-core, kein separates Netz nötig ANTHROPIC_API_KEY+ANTHROPIC_BASE_URLentfernt — OpenClaw rief damit die echte Anthropic API direkt an (401invalid x-api-key), statt den Proxy zu nutzen. Nur nochOPENAI_*Vars aktivDEFAULT_MODEL=openai/claude-sonnet-4-6— mitopenai/Prefix, damit OpenClaw den OpenAI-Provider und somit den Proxy nutztopenclaw.enverstellt — Volume-Mount schlug fehl weil die Datei nicht existierte (Docker erstellte stattdessen ein leeres Verzeichnis)OPENCLAW_GATEWAY_TOKENstattAUTH_TOKEN— korrekter Env-Var-NameARIA_AUTH_TOKENan Bridge und Diagnostic durchgereicht- Port 3001 auf aria-Service gemappt (für Diagnostic Web-UI)
- Proxy Claude-Config Volume
:ro→:rw— Login via Diagnostic-UI braucht Schreibzugriff
OpenClaw Config-Persistenz
- Named Docker Volume
openclaw-configfür/home/node/.openclaw— OpenClaw-Konfiguration (Model, Auth, Sessions) überlebt Container-Neustarts aria-setup.sh— Einmaliges Setup-Skript: wartet auf aria-core, setzt Model aufopenai/claude-sonnet-4-6, startet Container neu
Behoben
- Handshake fehlgeschlagen
[object Object]— Fehlermeldung wurde nicht korrekt stringifiziert client.idundclient.modeim Connect-Request — OpenClaw akzeptiert nur vordefinierte Werte (cli,gateway-client,webchatetc.)chat.sendnutztmessagestatttextals Parameter — OpenClaw Schema-Validierung- Claude Proxy bindet auf 0.0.0.0 —
claude-max-api-proxybindet hardcoded auf127.0.0.1, nicht erreichbar im Docker-Netz. Fix:standalone.jswird beim Start gepatcht, liest jetztHOSTEnv-Var (Upstream-Bug:startServer()unterstützthost, aber CLI übergibt es nicht) - Claude Proxy Crash bei Chat-Completion —
normalizeModelName()incli-to-openai.jscrasht wennmodelundefined ist (TypeError: Cannot read properties of undefined). Fix: Null-Guard-Patch mit Fallback aufclaude-sonnet-4 - OpenClaw 401
invalid x-api-key— OpenClaw rief mitANTHROPIC_BASE_URL+ANTHROPIC_API_KEY=not-neededdie echte Anthropic API an, nicht den Proxy. Fix: Anthropic-Vars entfernt, nur OpenAI-Provider aktiv (OPENAI_BASE_URL=http://proxy:3456/v1). Proxy unterstützt nur/v1/chat/completions(OpenAI-Format), nicht/v1/messages(Anthropic-Format) - App Echo-Bug — Chat-Nachrichten von RVS wurden ohne Sender-Prüfung als ARIA-Nachricht angezeigt. Bei Ghost-Clients (Doppel-Connections nach Reconnect) erschien die eigene Nachricht nochmals. Fix:
message.payload.senderwird geprüft, Nachrichten vonuserunddiagnosticwerden ignoriert
[0.0.0.3] — 2026-03-09
Geändert
RVS — Architektur-Umbau
- RVS ist jetzt reiner Relay — kennt keine Tokens, keine Expiry, leitet nur durch
TOKEN_EXPIRYundRVS_PUBLIC_HOST/RVS_PUBLIC_PORTentfernt- Rooms leben solange Clients verbunden sind (statt fester Ablaufzeit)
- Multi-Instanz: Mehrere ARIA-VMs können denselben RVS nutzen (z.B. Stefan + Papa)
Token-Erzeugung auf ARIA-VM statt RVS
generate-token.jsausrvs/entfernt- Neues
generate-token.shim Hauptverzeichnis (läuft auf ARIA-VM) - Token wird automatisch in
.envgeschrieben ./generate-token.sh showzeigt bestehendes Token als QR nochmal an
Konfiguration vereinfacht
RVS_URLersetzt durchRVS_HOST,RVS_PORT,RVS_TLS(klare Einzelfelder)- Port einmal in
.envändern → wirkt auf RVS docker-compose, Bridge und QR-Code rvs/docker-compose.ymlnutzt${RVS_PORT:-443}statt hardcoded Port
Android App — QR-Code Scanner
- Echter QR-Code Scanner statt Platzhalter-Alert (
react-native-camera-kit) - Vollbild-Kamera mit Overlay, Validierung des QR-Formats
- Kamera-Berechtigung (Android Runtime Permission)
AndroidManifest.xml—CAMERAPermission hinzugefügt
Voice Bridge — RVS-Anbindung
- Bridge verbindet sich jetzt parallel zu aria-core (lokal) UND zum RVS (öffentlich)
- Nachrichten von der App werden über RVS → Bridge → aria-core weitergeleitet
- Antworten von aria-core werden über Bridge → RVS → App zurückgeschickt
- Auto-Reconnect mit Exponential Backoff für beide WebSocket-Verbindungen
- Neue Message-Handler: chat, mode, location, file, audio
Android Build-Fixes
kotlin_version(snake_case) inbuild.gradlehinzugefügt —react-native-camera-kitbraucht beide Variantenbuild.shschreibtorg.gradle.java.homedynamisch ingradle.properties— verhindert dass Gradle kaputte JVM-Pfade findet (/usr/lib/jvm/openjdk-17ohne bin/java)minSdkVersion21 → 23 —react-native-camera-kitbraucht mindestens API 23
Android App — Credentials Persistenz
- Verbindungsdaten (Host, Port, Token) werden nach QR-Scan in AsyncStorage gespeichert
- Beim App-Start automatisch geladen und verbunden — einmal scannen, nie wieder
- Neue Dependency:
@react-native-async-storage/async-storage
Docker & Infrastruktur
- OpenClaw Image fix:
openclaw/openclaw:latest→ghcr.io/openclaw/openclaw:latest - Proxy fix: Binary heißt
claude-max-api, braucht@anthropic-ai/claude-codeals Peer-Dependency - Proxy Binary-Name fix:
claude-max-api-proxy→claude-max-api(npm-Paket heißt anders als die Binary) libportaudio2in Bridge Dockerfile hinzugefügt —sounddevicebraucht PortAudioaria-data/config/aria.env.examplehinzugefügt — Voice Bridge Konfigurationsvorlage
Wake-Word Fix (openwakeword)
WakeWordDetectorumgebaut — sucht Custom-Modell/voices/wake_aria.onnx, Fallback auf eingebauteshey_jarvis- Alter Code crashte:
wakeword_models=["aria"]erwartet Dateipfad, kein Keyword
TLS Fallback (Bridge → RVS)
- Bridge versucht zuerst
wss://(TLS), beissl.SSLErrorautomatisch Fallback aufws:// - Konfigurierbar über
RVS_TLS_FALLBACK=truein.env - Loggt deutlich wenn TLS gewollt aber nicht verfügbar ist
Audio-Rendering für App (Piper TTS via RVS)
- Bridge rendert Piper TTS → WAV → base64, sendet Text UND Audio gleichzeitig über RVS
- App spielt Audio ab und zeigt Text parallel — Modus entscheidet ob Sprache oder nur Text
- Voice Engine initialisiert IMMER (auch ohne Soundkarte in der VM)
- STT/Wake-Word nur wenn Audio-Hardware vorhanden — graceful degradation
- Neue Dependency:
react-native-fs(base64 → temp WAV → Sound abspielen)
Chat-Persistenz (Android App)
- Chat-Verlauf wird in AsyncStorage gespeichert (letzte 500 Nachrichten)
- Beim App-Start automatisch geladen — Konversation bleibt erhalten
- Linearer 1:1 Chat, keine Threads
TLS Fallback + Verbindungslog (Android App)
- App versucht zuerst
wss://, bei Fehler automatisch Fallback aufws:// network_security_config.xmlhinzugefuegt — Android 9+ blockiert sonstws://(Cleartext)- Verbindungslog im Settings-Tab — zeigt jeden Verbindungsversuch, Fehler, Fallback (scrollbar, max 200px)
- Gespeicherte Config wird beim Start in die Einstellungsfelder geladen
- Fix: TLS-Fallback erzeugte Doppel-Verbindungen (onerror + onclose beide reconnected)
RVS — Ghost-Client Fix
- Heartbeat-Intervall 30s → 15s, Cleanup 60s → 30s — tote Clients werden schneller entfernt
heartbeatals erlaubter Nachrichtentyp hinzugefuegt — App-Heartbeats halten Verbindung lebendig- App-seitiger JSON-Heartbeat zaehlt als Lebenszeichen (zusaetzlich zu WebSocket Ping/Pong)
Neues Script: get-voices.sh
- Lädt Piper Stimmen (Ramona + Thorsten) von HuggingFace herunter
- Neuer Installationsschritt in README
ARIA Persönlichkeit
AGENT.mdüberarbeitet — ARIA ist jetzt Partnerin auf Augenhöhe (Claude-Charakter)- Direkt, ehrlich, humorvoll, lösungsorientiert, kein Theater
[0.0.0.2] — 2026-03-08
Geändert
Build-Fixes
CI=trueinbuild.sh— verhindert EMFILE durch Metro File-Watcher im Release-Buildsetup.sherstellt Metro-Config-Dateien automatisch (metro.config.js, babel.config.js, .watchmanconfig)
Release-Script
release.shkomplett umgebaut — Kennwort wird interaktiv abgefragt statt Token in.env- Gitea-Upload fix:
-Fmultipart statt--data-binary - Login-Test vor Release, CHANGELOG.md-Integration für Release Notes
[0.0.0.1] — 2026-03-08
Hinzugefügt
Infrastruktur
docker-compose.yml— ARIA-VM mit Proxy, OpenClaw, Voice Bridge.env.example— Konfigurationsvorlage (ohne Secrets)release.sh— Automatisiertes Release (Build, Tag, Gitea Upload mit Kennwort-Abfrage)
RVS (Rendezvous-Server)
- WebSocket Relay Server (
rvs/server.js) — Token-Rooms, Heartbeat, Message Types - Docker Setup (
rvs/Dockerfile,rvs/docker-compose.yml)
Token & Pairing
generate-token.sh— Token-Generator mit QR-Code (läuft auf ARIA-VM, schreibt Token in.env)
Voice Bridge
- Python Voice Bridge (
bridge/aria_bridge.py) — Whisper STT, Piper TTS, Wake-Word - 5 Betriebsmodi (
bridge/modes.py) — Normal, DND, Whisper, Hangar, Gaming - Docker Setup (
bridge/Dockerfile,bridge/requirements.txt)
Android App (ARIA Cockpit)
- Chat-Screen mit Texteingabe, Voice-Button, Datei/Kamera-Upload
- Settings-Screen mit Verbindungsstatus, Token-Eingabe, Modus-Auswahl, GPS-Toggle, Log-Viewer
- WebSocket-Service mit Auto-Reconnect und Exponential Backoff
- Audio-Service (Mikrofon-Aufnahme, TTS-Wiedergabe)
- Push-to-Talk Button mit Puls-Animation
- Modus-Selektor (5 Modi)
- Build-Tooling:
setup.sh(7-Schritt Dev-Setup),build.sh(Release/Debug APK) - Metro-Config, Babel-Config, Watchman-Config
Konfiguration & Daten
aria-data/config/AGENT.md— ARIAs Persönlichkeit und Sicherheitsregelnaria-data/config/USER.md— Stefans Präferenzenaria-data/config/TOOLING.md— VM-Tooling Listearia-data/skills/README.md— Skill-Bauanleitung
Bekannte Probleme
- Android Release-Build:
EMFILE: too many open files— Fix:CI=trueinbuild.sh - JDK 21 inkompatibel mit AGP 8.1 — Fix: Automatischer Fallback auf JDK 17
react-native-screens> 3.27.0 inkompatibel mit RN 0.73.4 — Fix: Version gepinnt