chore(phase-a): aria.env + OpenClaw-specific configs raus, Brain-Backup angelegt

Vorbereitung fuer Bridge-als-Agent (OpenClaw raus). Phase-A-Cleanup:

- aria-data/brain-import/ angelegt — System-Prompt-Files BOOTSTRAP.md
  + AGENT.md + USER.md.example + TOOLING.md.example dort archiviert.
  Werden vom neuen Agent-Framework spaeter importiert.
- aria-data/config/aria.env + .example geloescht (alle Eintraege waren
  tot oder via runtime.json/Hardcode-Default abgedeckt)
- aria-data/config/openclaw.env + openclaw-auth.json geloescht
  (Provider-Config landet im Bridge-Code)
- docker-compose: AGENT/BOOTSTRAP/USER/openclaw.env-Mounts aus aria-core
  raus; aria.env-Mount aus bridge raus; COMPACT_AFTER_MESSAGES env raus
  (kommt jetzt aus runtime.json)
- bridge: CONFIG_PATH-Lesen aus /config/aria.env entfernt, load_config
  nutzt nur noch runtime.json; _compact_after liest compactAfterMessages
  aus runtime.json (Default 140)
- diagnostic: Eingabefeld "Compact nach Messages" in Runtime-Config-UI;
  load/save schreiben/lesen compactAfterMessages
- init.sh: nur noch .env-Bootstrap (Rest landet eh in runtime.json/DB)

ARIA antwortet im Phase-A-Status ohne ihre Persoenlichkeit
(System-Prompt nicht mehr gemountet, "raw Claude" durch Proxy) —
das ist Absicht und Uebergang bis das neue Gehirn live ist.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 20:13:54 +02:00
parent 8be34e7284
commit 0b58feee1e
11 changed files with 44 additions and 101 deletions
-14
View File
@@ -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
-11
View File
@@ -1,11 +0,0 @@
{
"version": 1,
"profiles": {
"openai-proxy": {
"provider": "openai",
"default": true,
"apiKey": "not-needed",
"baseUrl": "http://proxy:3456/v1"
}
}
}
-6
View File
@@ -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.
+16 -27
View File
@@ -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) ───
+7
View File
@@ -628,6 +628,10 @@
<button type="button" class="btn secondary" onclick="toggleSecret('rc-auth-token', this)" style="padding:4px 10px;flex-shrink:0;" title="Anzeigen/Verbergen">&#128065;</button>
</div>
</div>
<div style="margin-top:12px;display:grid;grid-template-columns:auto 1fr;gap:6px 12px;align-items:center;">
<label style="color:#8888AA;" title="Bridge zaehlt User-Nachrichten. Bei Erreichen: Sessions leeren + aria-core neu (verhindert E2BIG-Crash bei zu langer Konversation). 0 = deaktiviert.">Compact nach Messages:</label>
<input type="number" id="rc-compact-after" min="0" max="1000" step="10" placeholder="140" style="background:#1E1E2E;border:1px solid #2A2A3E;border-radius:4px;padding:6px;color:#fff;">
</div>
<div style="display:flex;gap:8px;margin-top:12px;">
<button class="btn" onclick="saveRuntimeConfig()" style="flex:1;">Speichern</button>
<button class="btn secondary" onclick="loadRuntimeConfig()" style="flex:1;">Neu laden</button>
@@ -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', {
+9 -14
View File
@@ -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) ────
+12 -29
View File
@@ -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