diff --git a/aria-data/config/AGENT.md b/aria-data/brain-import/AGENT.md similarity index 100% rename from aria-data/config/AGENT.md rename to aria-data/brain-import/AGENT.md diff --git a/aria-data/config/BOOTSTRAP.md b/aria-data/brain-import/BOOTSTRAP.md similarity index 100% rename from aria-data/config/BOOTSTRAP.md rename to aria-data/brain-import/BOOTSTRAP.md diff --git a/aria-data/config/TOOLING.md.example b/aria-data/brain-import/TOOLING.md.example similarity index 100% rename from aria-data/config/TOOLING.md.example rename to aria-data/brain-import/TOOLING.md.example diff --git a/aria-data/config/USER.md.example b/aria-data/brain-import/USER.md.example similarity index 100% rename from aria-data/config/USER.md.example rename to aria-data/brain-import/USER.md.example diff --git a/aria-data/config/aria.env.example b/aria-data/config/aria.env.example deleted file mode 100644 index 04c0a2e..0000000 --- a/aria-data/config/aria.env.example +++ /dev/null @@ -1,14 +0,0 @@ -# Bridge → aria-core (OpenClaw Gateway) -# Bridge teilt Netzwerk mit aria-core (network_mode: service:aria) -# → localhost ist aria-core -ARIA_CORE_WS=ws://127.0.0.1:18789 - -# Wake-Word -WAKE_WORD=aria - -# Whisper STT — wird zur Laufzeit in der Diagnostic (Sektion "Whisper") umgeschaltet -# und in /shared/config/voice_config.json gespeichert. Der Wert hier ist nur der -# Initial-Default beim ersten Start. -# Optionen: tiny | base | small | medium | large-v3 -WHISPER_MODEL=medium -WHISPER_LANGUAGE=de diff --git a/aria-data/config/openclaw-auth.json b/aria-data/config/openclaw-auth.json deleted file mode 100644 index 24110a6..0000000 --- a/aria-data/config/openclaw-auth.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 1, - "profiles": { - "openai-proxy": { - "provider": "openai", - "default": true, - "apiKey": "not-needed", - "baseUrl": "http://proxy:3456/v1" - } - } -} diff --git a/aria-data/config/openclaw.env b/aria-data/config/openclaw.env deleted file mode 100644 index d3b37ab..0000000 --- a/aria-data/config/openclaw.env +++ /dev/null @@ -1,6 +0,0 @@ -# OpenClaw (aria-core) Konfiguration -# Diese Datei wird als /workspace/.env in den Container gemountet -# -# WICHTIG: ANTHROPIC_API_KEY und ANTHROPIC_BASE_URL absichtlich NICHT gesetzt! -# OpenClaw wuerde sonst die echte Anthropic API direkt anrufen (401 weil kein API Key). -# Stattdessen nur den OpenAI-kompatiblen Proxy nutzen. diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index 611faee..7f0cd1f 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -48,7 +48,6 @@ logger = logging.getLogger("aria-bridge") # ── Konfiguration ─────────────────────────────────────────── -CONFIG_PATH = Path("/config/aria.env") VOICES_DIR = Path("/voices") CORE_WS_URL = os.getenv("ARIA_CORE_WS", "ws://127.0.0.1:18789") CORE_AUTH_TOKEN = os.getenv("ARIA_AUTH_TOKEN", "") # OpenClaw Gateway Token @@ -68,38 +67,22 @@ BLOCK_SIZE = 1280 # 80ms bei 16kHz — gut fuer Wake-Word-Erkennung RECORD_SECONDS = 8 # Max. Aufnahmedauer nach Wake-Word def load_config() -> dict[str, str]: - """Laedt Konfiguration. - - Reihenfolge (hoechste Prioritaet zuletzt): - 1. /config/aria.env (bind-mount) - 2. /shared/config/runtime.json (zentral gepflegt ueber Diagnostic UI) - - Werte aus runtime.json ueberschreiben die env-Datei. + """Laedt Konfiguration ausschliesslich aus /shared/config/runtime.json + (zentral gepflegt ueber Diagnostic UI). Tokens + RVS-Settings kommen + via ENV (siehe docker-compose). """ config: dict[str, str] = {} - if CONFIG_PATH.exists(): - for line in CONFIG_PATH.read_text().splitlines(): - line = line.strip() - if not line or line.startswith("#"): - continue - if "=" in line: - key, _, value = line.partition("=") - config[key.strip()] = value.strip() - logger.info("Konfiguration geladen aus %s", CONFIG_PATH) - else: - logger.warning("Keine Konfiguration gefunden: %s", CONFIG_PATH) - - # Runtime-Overrides aus zentralem Shared-Volume (Diagnostic UI) runtime_path = Path("/shared/config/runtime.json") if runtime_path.exists(): try: runtime = json.loads(runtime_path.read_text()) - overrides = {k: str(v) for k, v in runtime.items() if v not in (None, "")} - if overrides: - config.update(overrides) - logger.info("Runtime-Overrides geladen: %s", sorted(overrides.keys())) + config = {k: str(v) for k, v in runtime.items() if v not in (None, "")} + if config: + logger.info("Runtime-Config geladen: %s", sorted(config.keys())) except Exception as e: logger.warning("runtime.json konnte nicht gelesen werden: %s", e) + else: + logger.info("Keine runtime.json — Diagnostic schreibt sie beim ersten Konfigurieren") return config @@ -554,7 +537,13 @@ class ARIABridge: # COMPACT_AFTER erreicht → Sessions reset + Container restart. # Counter ueberlebt Bridge-Restart nicht (frischer Zaehler beim Start ok). self._user_message_count: int = 0 - self._compact_after = int(os.getenv("COMPACT_AFTER_MESSAGES", "140")) + # Aus runtime.json gelesen (Diagnostic → Einstellungen → Compact-Schwelle) + # Default 140, 0 = deaktiviert + try: + rt = json.loads(Path("/shared/config/runtime.json").read_text()) if Path("/shared/config/runtime.json").exists() else {} + self._compact_after = int(rt.get("compactAfterMessages", 140)) + except Exception: + self._compact_after = 140 # Pending Files: wenn die App ein Bild + Text gleichzeitig schickt, kommen # zwei separate RVS-Events ('file' und 'chat') — wir buffern die Files # kurz und mergen sie mit dem nachfolgenden Chat-Text zu einer einzigen @@ -598,7 +587,7 @@ class ARIABridge: logger.info("RVS: %s (Token: %s...)", self.rvs_url, self.rvs_token[:8]) else: logger.warning("RVS nicht konfiguriert — App-Verbindung deaktiviert") - logger.warning(" Setze RVS_HOST, RVS_PORT, RVS_TOKEN in /config/aria.env") + logger.warning(" Setze RVS_HOST, RVS_PORT, RVS_TOKEN in der .env auf der VM") logger.info("Modus: %s %s", self.current_mode.config.emoji, self.current_mode.config.name) # ── aria-core Verbindung (OpenClaw Gateway Protokoll) ─── diff --git a/diagnostic/index.html b/diagnostic/index.html index e663927..32196f0 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -628,6 +628,10 @@ +
+ + +
@@ -1939,6 +1943,7 @@ document.getElementById('rc-rvs-tls').value = String(cfg.RVS_TLS) === 'false' ? 'false' : 'true'; document.getElementById('rc-rvs-token').value = cfg.RVS_TOKEN || ''; document.getElementById('rc-auth-token').value = cfg.ARIA_AUTH_TOKEN || ''; + document.getElementById('rc-compact-after').value = cfg.compactAfterMessages != null ? cfg.compactAfterMessages : 140; statusEl.textContent = 'Geladen.'; statusEl.style.color = '#34C759'; loadOnboardingQR(); // QR bei Config-Wechsel neu generieren @@ -1951,12 +1956,14 @@ async function saveRuntimeConfig() { const statusEl = document.getElementById('rc-status'); statusEl.textContent = 'Speichere...'; + const compactRaw = document.getElementById('rc-compact-after').value.trim(); const patch = { RVS_HOST: document.getElementById('rc-rvs-host').value.trim(), RVS_PORT: document.getElementById('rc-rvs-port').value.trim(), RVS_TLS: document.getElementById('rc-rvs-tls').value, RVS_TOKEN: document.getElementById('rc-rvs-token').value.trim(), ARIA_AUTH_TOKEN: document.getElementById('rc-auth-token').value.trim(), + compactAfterMessages: compactRaw === '' ? 140 : Math.max(0, parseInt(compactRaw, 10) || 0), }; try { const resp = await fetch('/api/runtime-config', { diff --git a/docker-compose.yml b/docker-compose.yml index a612513..8f5d4f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,19 +47,16 @@ services: - RATE_LIMIT_PER_USER=30 - DISPLAY=:0 volumes: - - openclaw-config:/home/node/.openclaw # OpenClaw Config (persistiert Model + Auth) - - ./aria-data/brain:/home/node/.openclaw/workspace/memory - - ./aria-data/skills:/home/node/.openclaw/workspace/skills - - ./aria-data/config/AGENT.md:/home/node/.openclaw/workspace/AGENT.md - - ./aria-data/config/USER.md:/home/node/.openclaw/workspace/USER.md - - ./aria-data/config/BOOTSTRAP.md:/home/node/.openclaw/workspace/BOOTSTRAP.md - - ./aria-data/config/BOOTSTRAP.md:/home/node/.openclaw/workspace/CLAUDE.md - - ./aria-data/config/openclaw.env:/home/node/.openclaw/workspace/.env - - claude-config:/home/node/.claude # Claude Code Settings (Permissions) - - ./aria-data/ssh:/home/node/.ssh # SSH Keys fuer VM-Zugriff + # PHASE A — OpenClaw laeuft noch, aber System-Prompt-Files sind nach + # aria-data/brain-import/ gewandert und werden vom OpenClaw nicht mehr + # gelesen. ARIA antwortet bis zum Abriss ohne ihre Persoenlichkeit — + # einfach "raw Claude" durch den Proxy. + - openclaw-config:/home/node/.openclaw # bleibt — enthaelt Memory + Sessions fuer den Import-Schritt + - claude-config:/home/node/.claude + - ./aria-data/ssh:/home/node/.ssh - /tmp/.X11-unix:/tmp/.X11-unix - - /var/run/docker.sock:/var/run/docker.sock # VM von innen verwalten - - aria-shared:/shared # Shared Volume fuer Datei-Austausch (Bridge <> Core) + - /var/run/docker.sock:/var/run/docker.sock + - aria-shared:/shared restart: unless-stopped networks: - aria-net @@ -72,7 +69,6 @@ services: - aria network_mode: "service:aria" # Teilt Netzwerk mit aria-core → localhost:18789 volumes: - - ./aria-data/config/aria.env:/config/aria.env - aria-shared:/shared # Shared Volume fuer Datei-Austausch (Bridge <> Core) # Audio-Zugriff - /run/user/1000/pulse:/run/user/1000/pulse @@ -87,7 +83,6 @@ services: - RVS_TLS=${RVS_TLS:-true} - RVS_TLS_FALLBACK=${RVS_TLS_FALLBACK:-true} - RVS_TOKEN=${RVS_TOKEN:-} - - COMPACT_AFTER_MESSAGES=${COMPACT_AFTER_MESSAGES:-140} restart: unless-stopped # ─── Diagnostic (Selbstcheck-UI und Einstellungen) ──── diff --git a/init.sh b/init.sh index 56e87e6..713701e 100755 --- a/init.sh +++ b/init.sh @@ -2,42 +2,25 @@ # ════════════════════════════════════════════════════════════ # ARIA — Setup-Script # -# Materialisiert Config-Dateien aus *.example-Vorlagen wenn -# das Original fehlt. Wird einmalig nach git clone und nach -# jedem git pull empfohlen — schadet auch sonst nichts (idempotent, -# ueberschreibt nichts Bestehendes). +# Aktuell nur noch der .env-Bootstrap (Tokens + RVS). Alle weiteren +# Settings landen ueber die Diagnostic in /shared/config/runtime.json +# (persistent in der "Datenbank"). # -# Beispiele: -# aria-data/config/USER.md.example → USER.md (wenn nicht vorhanden) -# aria-data/config/aria.env.example → aria.env (wenn nicht vorhanden) -# -# Diese Files sind via .gitignore vom Repo ausgeschlossen — die -# Vorlagen liegen aber im Repo damit ein frisches Setup ohne lange -# Anleitung lauffaehig ist. +# Im Phase-A-Cleanup-Status: System-Prompt-Files liegen unter +# aria-data/brain-import/ und werden vom neuen Agent-Framework +# spaeter importiert. OpenClaw laeuft noch ohne Persoenlichkeit. # ════════════════════════════════════════════════════════════ set -e cd "$(dirname "$0")" -created=0 -skipped=0 - -for example in aria-data/config/*.example; do - [ -f "$example" ] || continue - target="${example%.example}" - if [ -e "$target" ]; then - skipped=$((skipped + 1)) +if [ ! -f .env ]; then + if [ -f .env.example ]; then + cp .env.example .env + echo "✓ .env erstellt aus .env.example — Tokens jetzt eintragen!" else - cp "$example" "$target" - echo "✓ $target erstellt aus $(basename "$example")" - created=$((created + 1)) + echo "⚠ Keine .env.example gefunden — manuell anlegen." fi -done - -if [ $created -eq 0 ]; then - echo "Alle Config-Dateien vorhanden ($skipped uebersprungen)." else - echo "" - echo "$created Datei(en) angelegt, $skipped uebersprungen." - echo "Falls noetig anpassen: aria-data/config/" + echo ".env existiert bereits — uebersprungen." fi