Neuer eigenstaendiger Container satellite/ (RVS-Client, network_mode host), den man in einem beliebigen Netz (Buero etc.) deployt. Gibt ARIA Zugriff auf dieses Netz ohne Haupt-Stack davor. - satellite/satellite.py: RVS-Client + Discovery (mDNS/Zeroconf, SSDP/UPnP+DIAL, ARP) + Steuerung (dial.launch fuer YouTube-auf-FireTV, wol, http) mit Guards (CONTROL_ENABLED + Allowlist + Logging, token-gated, keine offenen Ports). Periodisches Re-Announce (sat_hello im Heartbeat) fuer spaet joinende Bridge. - satellite/: Dockerfile, requirements, docker-compose (host-net), .env.example (SATELLITE_LOCATION als Adresse), README. - rvs: sat_hello/discover/devices/command/result whitelisted. - bridge: Satelliten-Registry (sat_hello) + Future-Relay (_satellite_request) + /internal/satellite + /internal/satellite-list (Muster wie flux). - brain: Tools satellite_list/devices/command + _dispatch_satellite + Seed-Regel. Alle py_compile + node -c gruen. Kein APK-Rebuild noetig. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 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.3.0] — 2026-07-19 — Satelliten: ARIAs Augen & Hände in fremden Netzen 🛰️
Hinzugefügt
Neuer eigenständiger Container satellite/ — ein Außenposten, den du in einem beliebigen Netz (Büro, Werkstatt …) deployst. Er verbindet sich als RVS-Client in deinen Raum und gibt ARIA Zugriff auf genau dieses Netz, ohne dass der Haupt-Stack dort steht.
- Entdeckung (Info): mDNS/Zeroconf (Chromecast, AirPlay, Sonos, Drucker, NAS …), SSDP/UPnP + DIAL (Smart-TVs, Fire TV), ARP-Tabelle (rohe Hosts) → Live-Inventar.
- Steuerung (mit Guards): DIAL-App-Launch (z.B. „ARIA, spiel YouTube-Video X auf dem Büro-Stick" → Fire TV), Wake-on-LAN, generisches HTTP. Nur wenn
CONTROL_ENABLED=true, nur Aktionen aus derCONTROL_ALLOWLIST, alles geloggt, read-only per.envabschaltbar. Reagiert nur auf den eigenen RVS-Raum (Token). Keine offenen Ports. - Adressierung über
SATELLITE_LOCATION(z.B. „Büro") — mehrere Satelliten im selben Raum, jeder mit eigenem Namen.
End-to-end verdrahtet:
satellite/: eigener Stack (docker composemitnetwork_mode: host),.env.example, README.- RVS: neue Message-Typen
sat_hello / sat_discover / sat_devices / sat_command / sat_result. - Bridge: Satelliten-Registry (
sat_hello) + Future-Relay (/internal/satellite,/internal/satellite-list) analog zum flux-Muster. - Brain: Tools
satellite_list,satellite_devices,satellite_command+ Seed-Regel, die ARIA den Ablauf beibringt (erst list, dann devices, dann command).
Deploy
Satellit im Ziel-Netz: cd satellite && cp .env.example .env && docker compose up -d --build. Haupt-Stack: git pull && docker compose up -d --build brain bridge + RVS-Stack up -d --build. Kein APK-Rebuild.
[0.2.2.3] — 2026-07-17 — ARIA liest andere Projekt-Chats wirklich (volle Historie)
Behoben
project_summaryfand fast nie Inhalte. Es las nur ARIAs rollendes Kontextfenster (~50 Turns über ALLE Projekte) — ältere/andere Projekt-Chats sind da längst rausdistilliert. „Hol dir die Infos aus Projekt X" lieferte deshalb leere Ergebnisse, und ARIA wusste nicht, wie sie an die Historie kommt. Jetzt liest das Tool die echte, volle Historie auschat_backup.jsonl(im Brain gemountet) — die letzten ~20 Turns des Zielprojekts, unabhängig davon wie lange man da nicht war. Standort-Hints in User-Turns werden rausgefiltert. Fallback aufs Fenster, falls das Backup fehlt. Tool-Beschreibung geschärft, damit ARIA es direkt aufruft.- Nebenbei bereinigt:
mac_os_update_fehlerwar durch den altenset_project_kind-Bug (0.2.2.1) fälschlichkind=code— aufchatzurückgesetzt.
Deploy
git pull && docker compose up -d --build brain (kein APK-Rebuild nötig).
[0.2.2.2] — 2026-07-17 — Voice-Projektwechsel zurück — aber gerätelokal
Hinzugefügt
- „ARIA, geh in Projekt X" per Sprache wechselt wieder das Projekt — aber nur auf dem Gerät, das den Befehl gab. Andere App-Instanzen und das Diagnostic bleiben in ihrem Projekt.
- Umsetzung: Jedes Gerät merkt sich die IDs seiner eigenen Anfragen (Text-
clientMsgId+ Voice-audioRequestId). Der Brain/Voice-Router hängt an jedesproject_changed-Event die auslösendeclientMsgIdan; die App folgt dem Wechsel nur, wenn die ID eine eigene ist. Deckt beide Voice-Pfade ab (ARIAsproject_enter/exitviasend_to_coreund den Bridge-Voice-Router „für Projekt X: …" / „zurück zum Hauptchat"). - Manuelles Umschalten bleibt wie gehabt gerätelokal über den Drawer.
Deploy
git pull && docker compose up -d --build bridge + APK 0.2.2.2 (kein Brain-Rebuild nötig).
[0.2.2.1] — 2026-07-17 — Projekt-Fokus wirklich pro Gerät unabhängig
Behoben
set_project_kindmarkierte das falsche Projekt. Es nutzte den globalenactive_project(geräteübergreifend) statt des Projekts, in dem der aktuelle Request läuft. Folge: Obwohl auf der App „Basic os" aktiv war, bekam das global-aktive „Mac OS Update Fehler"kind=code. Jetzt wirkt das Tool auf die pro Request mitgesendeteproject_id(in_dispatch_tooldurchgereicht) — jede App-/Diagnostic-Instanz markiert ihr eigenes Projekt.- App wurde von fremden
project_changed-Broadcasts ins andere Projekt gezogen. Ein Projektwechsel/‑anlegen durch ARIA, das Diagnostic oder eine andere App-Instanz erzwang auf allen Geräten einen Fokuswechsel. Der Projekt-Fokus ist jetzt rein gerätelokal: Broadcasts aktualisieren nur Namen + Typ, wechseln aber nicht mehr das Projekt. Umschalten geht ausschließlich lokal über den Projekt-Drawer. So arbeitet jedes Gerät unabhängig in seinem eigenen Projekt (auch mehrere App-Instanzen). - Hinweis: „ARIA, geh in Projekt X" per Sprache wechselt das App-Projekt dadurch nicht mehr automatisch — bewusst, damit Geräte unabhängig bleiben. Wechseln über den Drawer.
Deploy
git pull && docker compose up -d --build brain + APK 0.2.2.1 neu bauen.
[0.2.2.0] — 2026-07-17 — Workbench: Taskleisten-Dock statt Zoom-Landkarte + bedienbare VNC-Konsole
Geändert
Cockpit-Navigation neu gedacht — Dock statt Pinch-Canvas
- Die Zoom-Landkarte (mit 2 Fingern rauszoomen, Kachel finden, reintippen) fühlte sich auf 5 Zoll fummelig an. Ersetzt durch eine Taskleiste unten im Daumenbereich (Chat · Code · Desktop): ein Tap wechselt sofort das Panel, ein animierter Indikator gleitet unter das aktive Icon. Desktop-Umfang, Handy-Ergonomie.
- Jedes Panel ist bildschirmfüllend und Handy-optimiert; alle bleiben gemountet (nur das aktive ist sichtbar) → kein Remount, Chat behält RVS/Audio/Queue, WebViews ihren Zustand.
- Das Dock blendet bei offener Tastatur aus (mehr Platz zum Tippen) und respektiert die Gesten-Navigationsleiste (Safe-Area).
- Aktivitäts-Punkte am Dock: Code blau, sobald Dateien da sind; Desktop grün, wenn die VM verbunden ist.
- Entfällt: Pinch/Pan-Canvas, Übersichts-Button im Header, die „Landkarten"-Thumbnails.
noVNC-Konsole endlich bedienbar
- Steuerungs-Leiste im Desktop-Panel: ⌨ Tastatur (blendet die Handy-Tastatur ein, tippt direkt in die VM — inkl. Enter/Backspace/Pfeiltasten), Strg+Alt+Entf, und ⤢ Fit ↔ 1:1. Tippen/Ziehen steuert weiterhin die Maus.
Deploy
Nur App neu bauen (kein Backend). APK 0.2.2.0.
[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