14 KiB
ARIA — Changelog
Alle Änderungen am Projekt. Format: Keep a Changelog
[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