Files
ARIA-AGENT/android
duffyduck 31aa86a2a9 feat(brain+ui+app): Triggers — passive Aufweck-Quellen fuer ARIA
ARIA hatte bisher nur ein "User fragt → Brain antwortet"-Modell. Neu:
Trigger laufen passiv im Hintergrund (kein LLM-Call) und wecken ARIA
nur dann auf wenn ein Event tatsaechlich passiert.

Drei Typen, zwei aktuell implementiert:
  timer   — einmalig zu festem ISO-Timestamp ("erinner mich in 10min")
  watcher — Polling alle N Sek einer Condition, feuert bei True mit Throttle
            (z.B. "disk_free_gb < 5", max 1x/h)
  cron    — Platzhalter fuer spaeter

aria-brain/triggers.py
  CRUD auf /data/triggers/<name>.json + /data/triggers/logs/<name>.jsonl.
  create_timer, create_watcher, mark_fired, list_logs, etc.

aria-brain/watcher.py
  Built-in Condition-Variablen: disk_free_gb, disk_free_pct, uptime_sec,
  hour_of_day, day_of_week, rvs_connected, memory_count.
  Sicherer Condition-Parser via ast — Whitelist auf Vergleich + BoolOp +
  Name + Const. Kein eval, kein exec, keine Builtins.

aria-brain/background.py
  Async Loop laeuft alle 30s, sammelt einmalig Variables, geht durch
  Trigger-Liste, _should_fire-Check (Timer: fires_at vergangen / Watcher:
  check_interval + throttle respektiert + condition true). Fire ruft
  agent.chat(prompt, source="trigger") — ARIA bekommt das wie eine
  Push-Nachricht und antwortet via Bridge → RVS → App.

aria-brain/main.py
  /triggers/list, /{name}, /{name}/logs, /timer, /watcher, PATCH, DELETE,
  /triggers/conditions (Variablen + aktuelle Werte). Lifespan-Handler
  startet den Background-Loop beim Container-Start, stoppt beim Shutdown.

aria-brain/agent.py
  Meta-Tools fuer ARIA: trigger_timer, trigger_watcher, trigger_cancel,
  trigger_list. ARIA legt Trigger via Tool-Call selbst an wenn Stefan das
  wuenscht. Side-Channel-Event 'trigger_created' wird in chat-Response
  mitgeschickt damit App + Diagnostic eine Bubble zeigen.

aria-brain/prompts.py
  Neue System-Prompt-Section: Liste aktiver Triggers + verfuegbare
  Condition-Variablen mit aktuellen Werten + Operatoren-Erklaerung.
  ARIA weiss damit immer was es schon gibt und welche Vars sie nutzen kann.

bridge/aria_bridge.py + rvs/server.js
  trigger_created als neuer RVS-Message-Type, Bridge forwarded das aus
  data.events analog zu skill_created.

diagnostic/index.html
  Neuer Top-Tab "Trigger". Liste mit Type-Badges (⏱ TIMER / 👁 WATCHER),
  Status, Fire-Count, last_fired. Aktivieren/Deaktivieren + Löschen pro
  Trigger. "+ Neu"-Modal mit Type-Dropdown, Timer-Minuten oder
  Watcher-Condition + Vars-Anzeige + Throttle. Info-Modal-Eintrag mit
  Erklaerung. Live-Bubble im Chat wenn ARIA selbst einen anlegt.

android/src/screens/ChatScreen.tsx
  trigger_created RVS-Handler → eigene Bubble (gelber Border, " ARIA
  hat einen Trigger angelegt", Type/Detail/Message/Zeit). ChatMessage
  bekam triggerCreated-Feld. Lokal-only-Schutz beim Server-Sync analog
  zu skill_created.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 00:38:58 +02:00
..
2026-05-11 23:57:16 +02:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00
2026-05-11 23:57:16 +02:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00
2026-03-08 23:31:46 +01:00

ARIA Cockpit — Android App

Stefans primäre Schnittstelle zu ARIA. Gebaut mit React Native + TypeScript.


Schnellstart

# 1. Abhängigkeiten installieren (einmalig)
./setup.sh

# 2. Release-APK bauen (standalone, kein Dev-Server nötig)
./build.sh

# 3. APK aufs Handy kopieren und installieren
adb install ARIA-Cockpit-release.apk

Fertig. APK liegt als ARIA-Cockpit-release.apk im Verzeichnis.


Debug vs Release — was ist der Unterschied?

Debug Release
JS-Bundle Wird von Metro Dev-Server geladen (localhost:8081) In die APK eingebaut — läuft standalone
Verwendung Entwicklung am PC mit Hot-Reload Installation aufs Handy
Dev-Server nötig? Ja — npx react-native start muss laufen Nein — App startet sofort
Größe Kleiner (Code wird live geladen) Größer (alles eingebaut)

Für aufs Handy installieren immer Release bauen:

./build.sh release    # oder einfach: ./build.sh

Debug nur zum Entwickeln am PC:

# Terminal 1: Metro Dev-Server starten
npx react-native start

# Terminal 2: Debug-APK bauen und auf verbundenes Gerät/Emulator deployen
./build.sh debug

Wenn du eine Debug-APK aufs Handy kopierst ohne Metro-Server, siehst du den roten "Could not connect to development server" Fehler. Das ist normal — Debug braucht den Server.


Scripts

setup.sh — Entwicklungsumgebung einrichten

Installiert automatisch alles was zum Bauen nötig ist:

Was Version Details
Basis-Tools curl, unzip, git
Node.js >= 18 Via NodeSource (falls nicht vorhanden)
JDK 17 (vollständig) OpenJDK mit jlink (nicht nur JRE!)
Android SDK API 34 Command Line Tools + Build Tools + Platform Tools
Metro-Config metro.config.js, babel.config.js, .watchmanconfig (falls fehlend)
Node Packages Räumt alte node_modules auf + npm install
Natives Android-Projekt React Native Gradle-Projekt generieren
Gradle Config compileSdk-Warning unterdrücken, Build-Cache aufräumen

Das Script erkennt automatisch dein OS (Debian, Fedora, Arch, macOS) und benutzt den passenden Paketmanager.

ANDROID_HOME wird automatisch gesetzt und in dein Shell-Profil (.bashrc/.zshrc) eingetragen.

JDK-Hinweis: React Native 0.73 + Android Gradle Plugin 8.1 braucht exakt JDK 17 — nicht 21 oder neuer. Falls du JDK 21 als Standard hast, ist das kein Problem: build.sh setzt JAVA_HOME automatisch auf JDK 17 (wenn installiert).

./setup.sh

Nach dem Setup einmalig Shell neu starten oder source ~/.bashrc ausführen.

build.sh — APK bauen

Baut die Android APK in einem Schritt:

./build.sh              # Release-APK (Standard) — fürs Handy
./build.sh release      # Release-APK (explizit)
./build.sh debug        # Debug-APK (nur mit Metro Dev-Server)

Was das Script macht:

  1. Prüft ob Node, npm, Java vorhanden sind (sonst Fehler mit Hinweis auf setup.sh)
  2. Erkennt automatisch JDK 21 und wechselt auf JDK 17 (inkl. jlink-Prüfung)
  3. Sucht automatisch nach dem Android SDK (typische Pfade)
  4. Prüft ob das native Android-Projekt existiert (sonst Hinweis auf setup.sh)
  5. Installiert/updated Node Dependencies falls nötig
  6. Baut die APK via Gradle
  7. Kopiert die fertige APK als ARIA-Cockpit-<modus>.apk ins Hauptverzeichnis

Ausgabe-Dateien:

  • ARIA-Cockpit-release.apk — fertige APK (Hauptverzeichnis)
  • android/app/build/outputs/apk/release/app-release.apk — Original-Pfad

Auf dem Handy installieren

# Via ADB (USB-Kabel oder WiFi)
adb install ARIA-Cockpit-release.apk

# Oder: APK aufs Handy kopieren und dort öffnen
# Oder: Via Gitea Release herunterladen (siehe release.sh im Root)

Erstverbindung (Pairing)

  1. App starten
  2. Tab Einstellungen öffnen
  3. QR-Code scannen (vom RVS generiert) oder Token manuell eingeben
  4. Verbindungsstatus prüfen (grüner Punkt = verbunden)

Der QR-Code enthält alles was die App braucht:

{
  "host": "rvs.hackersoft.de",
  "port": 443,
  "token": "a3f8b2c9d1e4..."
}

Einmal scannen, nie wieder manuell tippen.


Projektstruktur

android/
├── setup.sh                    ← Dev-Umgebung einrichten (einmalig)
├── build.sh                    ← APK bauen
├── index.js                    ← React Native Entry Point
├── app.json                    ← App-Name Konfiguration
├── App.tsx                     ← Haupt-Komponente, Navigation
├── package.json                ← Dependencies
├── tsconfig.json               ← TypeScript Config
├── metro.config.js             ← Metro Bundler Config
├── babel.config.js             ← Babel Transpiler Config
├── .watchmanconfig             ← Watchman Config
│
├── src/
│   ├── services/
│   │   ├── rvs.ts              ← WebSocket-Verbindung zum Rendezvous Server
│   │   └── audio.ts            ← Mikrofon-Aufnahme und TTS-Wiedergabe
│   │
│   ├── screens/
│   │   ├── ChatScreen.tsx      ← Hauptchat mit ARIA
│   │   └── SettingsScreen.tsx  ← Verbindung, Modus, Logs
│   │
│   └── components/
│       ├── VoiceButton.tsx     ← Push-to-Talk Button
│       ├── ModeSelector.tsx    ← Betriebsmodus-Auswahl
│       ├── FileUpload.tsx      ← Datei-Versand
│       └── CameraUpload.tsx    ← Foto-Aufnahme / Galerie
│
└── android/                    ← Generiertes Gradle-Projekt (nach setup)
    ├── gradlew                 ← Gradle Wrapper
    ├── gradle.properties       ← Gradle Config (compileSdk etc.)
    └── app/build.gradle        ← App Build Config

Fehlerbehebung

Problem Lösung
"Could not connect to development server" Das ist eine Debug-APK. Für standalone: ./build.sh release
ANDROID_HOME nicht gesetzt ./setup.sh ausführen, Shell neu starten
gradlew: Permission denied chmod +x android/gradlew
SDK not found ./setup.sh — installiert Android SDK automatisch
JDK nicht gefunden ./setup.sh — installiert OpenJDK 17
jlink does not exist Nur JRE installiert, nicht voller JDK: sudo apt install openjdk-17-jdk
JdkImageTransform Fehler JDK 21 aktiv, aber JDK 17 nötig — build.sh löst das automatisch
BaseReactPackage Fehler react-native-screens Version zu neu — auf 3.27.0 pinnen
react-native-camera Flavor-Fehler Paket entfernt (deprecated), wird nicht gebraucht
EMFILE: too many open files build.sh setzt CI=true automatisch — Metro startet keinen File-Watcher
No Metro config found ./setup.sh erstellt metro.config.js, babel.config.js, .watchmanconfig automatisch
Build hängt bei assembleRelease Signing Config prüfen (siehe React Native Docs)
node_modules Probleme ./setup.sh — räumt alles auf und installiert frisch