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:
@@ -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
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"profiles": {
|
||||
"openai-proxy": {
|
||||
"provider": "openai",
|
||||
"default": true,
|
||||
"apiKey": "not-needed",
|
||||
"baseUrl": "http://proxy:3456/v1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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) ───
|
||||
|
||||
@@ -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">👁</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
@@ -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) ────
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user