#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" NODE_BIN="${NODE_BIN:-/opt/homebrew/opt/node@24/bin/node}" SCRIPT="${MEMIND_AGENT_RUN_GUARD_SCRIPT:-$ROOT/scripts/agent-run-guard.mjs}" LABEL="${MEMIND_AGENT_RUN_GUARD_LABEL:-cn.tkmind.memind-agent-run-guard}" PLIST="$HOME/Library/LaunchAgents/${LABEL}.plist" LOG="${MEMIND_AGENT_RUN_GUARD_LOG:-$HOME/Library/Logs/memind-agent-run-guard.log}" GUI="gui/$(id -u)" INTERVAL="${MEMIND_AGENT_RUN_GUARD_INTERVAL_SECONDS:-60}" START="${MEMIND_AGENT_RUN_GUARD_START:-1}" mkdir -p "$HOME/Library/LaunchAgents" "$(dirname "$LOG")" if [[ ! -x "$NODE_BIN" ]]; then NODE_BIN="$(command -v node)" fi if [[ ! -f "$SCRIPT" ]]; then echo "agent run guard script not found: $SCRIPT" >&2 exit 1 fi cat > "$PLIST" < Label $LABEL ProgramArguments $NODE_BIN $SCRIPT --apply WorkingDirectory $ROOT StartInterval $INTERVAL RunAtLoad StandardOutPath $LOG StandardErrorPath $LOG EnvironmentVariables PATH /opt/homebrew/bin:/opt/homebrew/opt/node@24/bin:/usr/local/bin:/usr/bin:/bin MEMIND_AGENT_RUN_GUARD_ENABLED ${MEMIND_AGENT_RUN_GUARD_ENABLED:-1} MEMIND_AGENT_RUN_GUARD_FAILED_WINDOW_MS ${MEMIND_AGENT_RUN_GUARD_FAILED_WINDOW_MS:-600000} MEMIND_AGENT_RUN_GUARD_MAX_RECENT_FAILURES ${MEMIND_AGENT_RUN_GUARD_MAX_RECENT_FAILURES:-3} MEMIND_AGENT_RUN_GUARD_MAX_PENDING_AGE_MS ${MEMIND_AGENT_RUN_GUARD_MAX_PENDING_AGE_MS:-300000} MEMIND_AGENT_RUN_GUARD_MAX_PENDING_COUNT ${MEMIND_AGENT_RUN_GUARD_MAX_PENDING_COUNT:-10} MEMIND_AGENT_RUN_GUARD_MAX_RUNNING_AGE_MS ${MEMIND_AGENT_RUN_GUARD_MAX_RUNNING_AGE_MS:-900000} EOF plutil -lint "$PLIST" launchctl bootout "$GUI/$LABEL" 2>/dev/null || true launchctl bootstrap "$GUI" "$PLIST" if [[ "$START" == "1" || "$START" == "true" || "$START" == "yes" ]]; then launchctl enable "$GUI/$LABEL" launchctl kickstart -k "$GUI/$LABEL" state="started" else launchctl disable "$GUI/$LABEL" 2>/dev/null || true state="installed-disabled" fi echo "installed $PLIST" echo "state: $state" echo "script: $SCRIPT" echo "interval_seconds: $INTERVAL" echo "log: $LOG" echo "manual stop: launchctl bootout $GUI/$LABEL"