#!/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_WORKER_SCRIPT:-$ROOT/scripts/agent-run-worker.mjs}" LABEL="${MEMIND_AGENT_RUN_WORKER_LABEL:-cn.tkmind.memind-agent-run-worker}" PLIST="$HOME/Library/LaunchAgents/${LABEL}.plist" LOG="${MEMIND_AGENT_RUN_WORKER_LOG:-$HOME/Library/Logs/memind-agent-run-worker.log}" GUI="gui/$(id -u)" POLL_MS="${MEMIND_AGENT_RUN_WORKER_POLL_MS:-3000}" BATCH_SIZE="${MEMIND_AGENT_RUN_WORKER_BATCH_SIZE:-1}" CONCURRENCY="${MEMIND_AGENT_RUN_QUEUE_CONCURRENCY:-1}" RUN_TIMEOUT_MS="${MEMIND_AGENT_RUN_TIMEOUT_MS:-900000}" TOOL_GATEWAY_ENABLED="${MEMIND_TOOL_GATEWAY_ENABLED:-0}" TOOL_GATEWAY_DRY_RUN="${MEMIND_TOOL_GATEWAY_DRY_RUN:-0}" WORKDIR_OVERRIDE="${MEMIND_AGENT_RUN_WORKDIR_OVERRIDE:-}" WORKDIR_OVERRIDE_USER_ID="${MEMIND_AGENT_RUN_WORKDIR_USER_ID:-}" START="${MEMIND_AGENT_RUN_WORKER_START:-0}" 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 worker script not found: $SCRIPT" >&2 exit 1 fi cat > "$PLIST" < Label $LABEL ProgramArguments $NODE_BIN $SCRIPT --poll-ms $POLL_MS --limit $BATCH_SIZE 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_AGENT_RUN_AUTODISPATCH 0 MEMIND_AGENT_RUN_WORKER_POLL_MS $POLL_MS MEMIND_AGENT_RUN_WORKER_BATCH_SIZE $BATCH_SIZE MEMIND_AGENT_RUN_QUEUE_CONCURRENCY $CONCURRENCY MEMIND_AGENT_RUN_TIMEOUT_MS $RUN_TIMEOUT_MS MEMIND_TOOL_GATEWAY_ENABLED $TOOL_GATEWAY_ENABLED MEMIND_TOOL_GATEWAY_DRY_RUN $TOOL_GATEWAY_DRY_RUN MEMIND_AGENT_RUN_WORKDIR_OVERRIDE $WORKDIR_OVERRIDE MEMIND_AGENT_RUN_WORKDIR_USER_ID $WORKDIR_OVERRIDE_USER_ID 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 "poll_ms: $POLL_MS" echo "batch_size: $BATCH_SIZE" echo "concurrency: $CONCURRENCY" echo "tool_gateway_enabled: $TOOL_GATEWAY_ENABLED" echo "tool_gateway_dry_run: $TOOL_GATEWAY_DRY_RUN" echo "workdir_override: $WORKDIR_OVERRIDE" echo "workdir_override_user_id: $WORKDIR_OVERRIDE_USER_ID" echo "log: $LOG" echo "manual start: launchctl enable $GUI/$LABEL && launchctl kickstart -k $GUI/$LABEL" echo "manual stop: launchctl bootout $GUI/$LABEL"