#!/usr/bin/env bash # Installiert den Voice-Agent Mac-Worker als LaunchAgent. # Idempotent — kann zum Update wiederholt laufen. # # Nutzung: # ./install-launchagent.sh # installieren / aktualisieren # ./install-launchagent.sh uninstall # entfernen # ./install-launchagent.sh status # Status + letzte Logs set -euo pipefail LABEL="com.voiceagent.worker" PLIST_DST="$HOME/Library/LaunchAgents/${LABEL}.plist" LOG_DIR="$HOME/Library/Logs" # Verzeichnis dieses Skripts → Repo-Root/mac-worker SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" WORKDIR="$(cd "$SCRIPT_DIR/.." && pwd)" TEMPLATE="$SCRIPT_DIR/com.voiceagent.worker.plist.template" cmd="${1:-install}" uninstall() { if [ -f "$PLIST_DST" ]; then echo "[*] Stoppe und entlade LaunchAgent…" launchctl unload "$PLIST_DST" 2>/dev/null || true rm -f "$PLIST_DST" echo "[✓] $PLIST_DST entfernt." else echo "[i] Kein LaunchAgent installiert ($PLIST_DST nicht vorhanden)." fi } show_status() { echo "── launchctl list | grep $LABEL ─────────────────────────" launchctl list | grep "$LABEL" || echo "(nicht geladen)" echo echo "── Health-Check ─────────────────────────────────────────" curl -fsS http://127.0.0.1:8080/health 2>/dev/null && echo || echo "(nicht erreichbar)" echo echo "── stderr.log (letzte 30 Zeilen) ────────────────────────" tail -n 30 "$LOG_DIR/voice-agent-worker.err.log" 2>/dev/null || echo "(keine Logs)" } install_agent() { # Vorbedingungen prüfen if [ ! -x "$WORKDIR/.venv/bin/uvicorn" ]; then echo "FEHLER: $WORKDIR/.venv/bin/uvicorn nicht gefunden." >&2 echo "Bitte zuerst die Python-Umgebung einrichten:" >&2 echo " cd $WORKDIR && python3.11 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt" >&2 exit 1 fi if [ ! -f "$WORKDIR/.env" ]; then echo "WARNUNG: $WORKDIR/.env fehlt — kopiere aus .env.example." cp "$WORKDIR/.env.example" "$WORKDIR/.env" fi mkdir -p "$LOG_DIR" "$HOME/Library/LaunchAgents" echo "[1/4] Generiere plist mit WORKDIR=$WORKDIR" sed \ -e "s|__WORKDIR__|$WORKDIR|g" \ -e "s|__HOME__|$HOME|g" \ "$TEMPLATE" > "$PLIST_DST" echo "[2/4] Falls bereits geladen: vorher entladen" launchctl unload "$PLIST_DST" 2>/dev/null || true echo "[3/4] Lade LaunchAgent" launchctl load -w "$PLIST_DST" echo "[4/4] Warte 2 s und prüfe Health-Endpoint" sleep 2 if curl -fsS http://127.0.0.1:8080/health >/dev/null; then echo echo "[✓] Voice-Agent Mac-Worker läuft." curl -s http://127.0.0.1:8080/health | python3 -m json.tool 2>/dev/null || true else echo echo "[!] Health-Check fehlgeschlagen. Logs:" echo " $LOG_DIR/voice-agent-worker.err.log" echo " $LOG_DIR/voice-agent-worker.out.log" tail -n 20 "$LOG_DIR/voice-agent-worker.err.log" 2>/dev/null || true exit 1 fi echo echo "── Verwaltung ───────────────────────────────────────────" echo " Stoppen / Starten: launchctl unload|load -w $PLIST_DST" echo " Status: $0 status" echo " Entfernen: $0 uninstall" echo " Logs (live): tail -f $LOG_DIR/voice-agent-worker.{out,err}.log" } case "$cmd" in install) install_agent ;; uninstall) uninstall ;; status) show_status ;; *) echo "Nutzung: $0 [install|uninstall|status]" >&2 exit 1 ;; esac