31fde2a68e
Hermes' browser_navigate starb still als "Failed to open <url>": das Hermes-Update 15.07. 23:53 (npm ci --workspace) bog ~/.local/bin/agent-browser per postinstall auf node_modules/ um und loeschte das Paket im selben Lauf wieder -> toter Symlink. Kein fehlender MCP/Skill. Neu, damit die Box das OHNE Zuruf erkennt und heilt: - self-smoke.sh Check 6: agent-browser --version; bei totem Link auf das npm-global-Binary (~/.local/lib/node_modules/...) zurueckbiegen und hermes-gateway/hermes-builtin-ui try-restarten (browser_tool cached "nicht installiert" pro Prozess). Selbstheilung wird als Info gemeldet (neuer HEALED-Kanal), nicht als Alarm; unfixbar -> Rot wie gehabt. - hermes-postcheck.sh: gleicher Check direkt nach jedem Hermes-Update, denn genau dort entsteht der Bruch. Heil-Logik isoliert auf der Box getestet (Fake-HOME + systemctl-Stub): toter Link -> geheilt+Restart; danach PASS ohne Restart; Binary weg -> FAIL. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
114 lines
5.7 KiB
Bash
114 lines
5.7 KiB
Bash
#!/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. ---
|
|
# WICHTIG: Subshell OHNE pipefail — `head -c 50` schließt die Pipe früh, curl endet mit 23
|
|
# (SIGPIPE) und pipefail würde den bestandenen Check als FAIL werten (live diagnostiziert).
|
|
voice_ok=0
|
|
for try in 1 2 3; do
|
|
if ( set +o pipefail; 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
|
|
|
|
# --- Browser-Tool: agent-browser überlebt das Update? (Vorfall 15./16.07.2026: das ---
|
|
# --- npm ci des Updates bog ~/.local/bin/agent-browser per postinstall auf ---
|
|
# --- node_modules/ um und löschte das Paket im selben Lauf → toter Link, jedes ---
|
|
# --- „Website öffnen" starb still als „Failed to open".) Heilung direkt hier, denn ---
|
|
# --- genau NACH einem Update entsteht der Bruch; try-restart räumt den ---
|
|
# --- „nicht installiert"-Cache, den browser_tool pro Prozess hält. ---
|
|
export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
|
|
AB_LINK="$HOME/.local/bin/agent-browser"
|
|
AB_GOOD="$HOME/.local/lib/node_modules/agent-browser/bin/agent-browser-linux-x64"
|
|
if "$AB_LINK" --version >/dev/null 2>&1; then
|
|
echo "PASS · Browser-Tool (agent-browser erreichbar)"
|
|
elif [ -x "$AB_GOOD" ] && "$AB_GOOD" --version >/dev/null 2>&1 \
|
|
&& ln -sfn "$AB_GOOD" "$AB_LINK" && "$AB_LINK" --version >/dev/null 2>&1; then
|
|
systemctl --user try-restart hermes-gateway hermes-builtin-ui >/dev/null 2>&1 || true
|
|
echo "GEHEILT · Browser-Tool: toter agent-browser-Link nach Update neu gesetzt (Dienste neu gestartet)"
|
|
else
|
|
echo "FAIL · Browser-Tool: agent-browser nicht lauffähig (npm install -g agent-browser && agent-browser install --with-deps)"; fail=1
|
|
fi
|
|
|
|
if [ "$fail" -eq 0 ]; then
|
|
echo "=== GEHIRN OK ✓ ==="
|
|
else
|
|
echo "=== GEHIRN-CHECK FEHLGESCHLAGEN — bitte prüfen ==="
|
|
fi
|
|
exit "$fail"
|