#!/usr/bin/env bash # Post-Update-Check nach einem Hermes-Agent-Update: läuft unser geteiltes „Gehirn" # (Mem0 + die mc2-memory-Integration) noch? Exit 0 = alles ok, sonst 1 → der Job wird # im UI rot, damit ein kaputtes Gehirn sofort auffällt. set -uo pipefail MC_URL="${MC_URL:-http://127.0.0.1:9001}" MEM0_URL="${MEM0_SERVICE_URL:-http://127.0.0.1:8765}" HERMES="${HERMES_HOME:-$HOME/.hermes}" fail=0 echo "=== Hermes Post-Update: Gehirn-Check ===" if curl -sf -m 5 "$MEM0_URL/health" >/dev/null 2>&1; then echo "PASS · Mem0-Sidecar erreichbar" else echo "FAIL · Mem0-Sidecar NICHT erreichbar"; fail=1 fi if curl -sf -m 8 "$MC_URL/api/memory" >/dev/null 2>&1; then echo "PASS · /api/memory antwortet" else echo "FAIL · /api/memory antwortet nicht"; fail=1 fi if grep -qE "^[[:space:]]*provider:[[:space:]]*'?mc2-memory'?" "$HERMES/config.yaml" 2>/dev/null \ && grep -qE "memory_enabled:[[:space:]]*true" "$HERMES/config.yaml" 2>/dev/null; then echo "PASS · memory.provider=mc2-memory aktiv" else echo "FAIL · memory.provider nicht mehr gesetzt (Config vom Update überschrieben?)"; fail=1 fi if ( cd "$HERMES/hermes-agent" && HERMES_HOME="$HERMES" ./venv/bin/python -c \ "import sys; sys.path.insert(0,'.'); from plugins.memory import load_memory_provider; p=load_memory_provider('mc2-memory'); assert p and p.name()=='mc2-memory'" \ >/dev/null 2>&1 ); then echo "PASS · mc2-memory-Plugin lädt unter dem neuen Hermes" else echo "FAIL · mc2-memory-Plugin lädt nicht (MemoryProvider-ABC geändert?)"; fail=1 fi # --- Config-Drift-Wächter (Lehre aus v0.18, 02.07.2026): Hermes fällt bei unbekannten --- # --- Config-Werten STILL auf Defaults zurück (approvals.mode 'auto' -> manual -> alle --- # --- Tools hingen in pending_approval). Solche Warnungen müssen den Job ROT machen. --- if journalctl --user -u hermes-gateway --since "-3 minutes" --no-pager -o cat 2>/dev/null \ | grep -iE "Unknown [a-z._]+ '|deprecated .*(setting|option|config)|defaulting to|invalid config" \ | grep -v "check_fn" | head -5 | tee /tmp/hermes-config-warnings.txt | grep -q .; then echo "FAIL · Config-Warnungen nach Update (siehe oben) — Config an neue Version anpassen!"; fail=1 else echo "PASS · keine Config-Drift-Warnungen im Gateway-Log" fi # --- Tool-Smoke: ein harmloser terminal-Befehl durch den echten Agenten. Fängt kaputte --- # --- Approval-/Tool-Ketten (Antwort muss kommen und darf nicht in pending_approval hängen). --- API_KEY="$(grep -E '^API_SERVER_KEY=' "$HERMES/.env" 2>/dev/null | cut -d= -f2- | tr -d '"' | tr -d "'")" if [ -n "$API_KEY" ]; then TOOL_RESP=$(curl -sf -m 90 -X POST "http://127.0.0.1:8642/v1/chat/completions" \ -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \ -H "X-Hermes-Session-Id: postcheck-tool-smoke" \ -d '{"model":"hermes","stream":false,"messages":[{"role":"user","content":"Führe im Terminal exakt den Befehl echo postcheck-ok aus und gib mir nur dessen Ausgabe zurück."}]}' 2>/dev/null) if echo "$TOOL_RESP" | grep -qi "postcheck-ok"; then echo "PASS · Tool-Smoke (terminal via Agent) liefert Ergebnis" elif echo "$TOOL_RESP" | grep -qi "pending_approval"; then echo "FAIL · Tool-Smoke hängt in pending_approval (approvals.mode prüfen!)"; fail=1 else echo "FAIL · Tool-Smoke ohne verwertbares Ergebnis: $(echo "$TOOL_RESP" | head -c 200)"; fail=1 fi else echo "SKIP · Tool-Smoke (kein API_SERVER_KEY in $HERMES/.env gefunden)" fi # --- Voice-Smoke: Lucys Sprech-Pfad streamt. Mit Retry: direkt nach dem Gateway-Neustart --- # --- zahlt der erste Turn den Session-Kaltstart (Prefill) — ein Versuch wäre ein Fehlalarm. --- voice_ok=0 for try in 1 2 3; do if curl -sf -m 45 -N -X POST "$MC_URL/api/voice/chat" -H "Content-Type: application/json" \ -d '{"text":"Sag nur ok.","session_id":"postcheck-voice-smoke"}' 2>/dev/null | head -c 50 | grep -q "data:"; then voice_ok=1; break fi sleep 8 done if [ "$voice_ok" -eq 1 ]; then echo "PASS · Voice-Smoke (Lucys /api/voice/chat streamt, Versuch $try)" else echo "FAIL · Voice-Smoke: /api/voice/chat streamt nicht (3 Versuche)"; fail=1 fi if [ "$fail" -eq 0 ]; then echo "=== GEHIRN OK ✓ ===" else echo "=== GEHIRN-CHECK FEHLGESCHLAGEN — bitte prüfen ===" fi exit "$fail"