#!/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_RUNTIME_HEARTBEAT_SCRIPT:-$ROOT/scripts/runtime-worker-heartbeat.mjs}" LABEL="${MEMIND_RUNTIME_HEARTBEAT_LABEL:-cn.tkmind.memind-runtime-heartbeat}" PLIST="$HOME/Library/LaunchAgents/${LABEL}.plist" LOG="$HOME/Library/Logs/memind-runtime-heartbeat.log" GUI="gui/$(id -u)" INTERVAL_MS="${MEMIND_RUNTIME_HEARTBEAT_INTERVAL_MS:-15000}" TIMEOUT_MS="${MEMIND_RUNTIME_HEARTBEAT_TIMEOUT_MS:-5000}" TTL_MS="${MEMIND_RUNTIME_HEARTBEAT_TTL_MS:-45000}" mkdir -p "$HOME/Library/LaunchAgents" "$HOME/Library/Logs" if [[ ! -x "$NODE_BIN" ]]; then NODE_BIN="$(command -v node)" fi if [[ ! -f "$SCRIPT" ]]; then echo "runtime heartbeat script not found: $SCRIPT" >&2 exit 1 fi cat > "$PLIST" < Label $LABEL ProgramArguments $NODE_BIN $SCRIPT serve WorkingDirectory $ROOT RunAtLoad KeepAlive ThrottleInterval 10 StandardOutPath $LOG StandardErrorPath $LOG EnvironmentVariables PATH /opt/homebrew/bin:/opt/homebrew/opt/node@24/bin:/usr/local/bin:/usr/bin:/bin MEMIND_RUNTIME_HEARTBEAT_INTERVAL_MS $INTERVAL_MS MEMIND_RUNTIME_HEARTBEAT_TIMEOUT_MS $TIMEOUT_MS MEMIND_RUNTIME_HEARTBEAT_TTL_MS $TTL_MS EOF plutil -lint "$PLIST" launchctl bootout "$GUI/$LABEL" 2>/dev/null || true launchctl bootstrap "$GUI" "$PLIST" launchctl enable "$GUI/$LABEL" launchctl kickstart -k "$GUI/$LABEL" echo "installed $PLIST" echo "script: $SCRIPT" echo "interval_ms: $INTERVAL_MS" echo "timeout_ms: $TIMEOUT_MS" echo "ttl_ms: $TTL_MS" echo "log: $LOG"