#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" LABEL="ai.openclaw.local.model-budget-guard" PLIST_PATH="$HOME/Library/LaunchAgents/$LABEL.plist" STAGE_DIR="${MODEL_GUARD_STAGE_DIR:-$HOME/Library/Application Support/openclaw-local-model-guard}" STAGE_SCRIPTS_DIR="$STAGE_DIR/scripts" STAGE_CONFIG="$STAGE_DIR/model-budget-guard.config.json" MODEL_GUARD_CONFIG="${MODEL_GUARD_CONFIG:-$STAGE_CONFIG}" INTERVAL_SECONDS="${INTERVAL_SECONDS:-120}" mkdir -p "$STAGE_SCRIPTS_DIR" cp "$ROOT_DIR/scripts/model_budget_guard.sh" "$STAGE_SCRIPTS_DIR/model_budget_guard.sh" jq \ --arg state "$STAGE_DIR/model-budget-guard-state.json" \ '.stateFile=$state' \ "$ROOT_DIR/config/model-budget-guard.config.json" > "$STAGE_DIR/model-budget-guard.config.json" chmod +x "$STAGE_SCRIPTS_DIR/model_budget_guard.sh" cat > "$PLIST_PATH" < Label $LABEL ProgramArguments /bin/bash $STAGE_SCRIPTS_DIR/model_budget_guard.sh EnvironmentVariables PATH /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin MODEL_GUARD_CONFIG $MODEL_GUARD_CONFIG RunAtLoad StartInterval $INTERVAL_SECONDS StandardOutPath /tmp/openclaw-model-budget-guard.log StandardErrorPath /tmp/openclaw-model-budget-guard.err.log PLIST launchctl bootout "gui/$(id -u)/$LABEL" 2>/dev/null || true launchctl bootstrap "gui/$(id -u)" "$PLIST_PATH" launchctl kickstart -k "gui/$(id -u)/$LABEL" cat <