ops-warden/scripts/worker-tick.sh

43 lines
1.7 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Scheduled tick for the ops-warden conservative worker (WARDEN-WP-0020 T4).
#
# Triages NEW State Hub coordination requests into $WARDEN_STATE_DIR/worker-digest.md
# (drafted replies you approve) and posts ONE progress note. Conservative tier: it NEVER
# sends to other agents and never marks messages read. Safe to schedule.
#
# DISABLED by default. Enable with a cron entry (every 15 min), e.g.:
# */15 * * * * /home/worsch/ops-warden/scripts/worker-tick.sh >> ~/.local/state/warden/worker-tick.log 2>&1
# Brain: WORKER_BRAIN=llm (default; needs llm-connect) or rule (offline, deterministic).
# To use llm without an in-cluster run, set LLM_CONNECT_URL; otherwise the tick opens a
# short-lived kubectl port-forward to activity-core/llm-connect and tears it down.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
STATE="${WARDEN_STATE_DIR:-$HOME/.local/state/warden}"
mkdir -p "$STATE"
# Concurrency guard — never let two ticks overlap.
exec 9>"$STATE/worker-tick.lock"
flock -n 9 || { echo "$(date -Is) tick: another run holds the lock; skip"; exit 0; }
BRAIN="${WORKER_BRAIN:-llm}"
LLM_URL="${LLM_CONNECT_URL:-}"
PF_PID=""
cleanup() { [[ -n "$PF_PID" ]] && kill "$PF_PID" 2>/dev/null || true; }
trap cleanup EXIT
if [[ "$BRAIN" == "llm" && -z "$LLM_URL" ]]; then
if command -v kubectl >/dev/null 2>&1; then
kubectl -n activity-core port-forward deploy/llm-connect 18080:8080 >/dev/null 2>&1 &
PF_PID=$!
sleep 4
LLM_URL="http://127.0.0.1:18080"
else
echo "$(date -Is) tick: kubectl unavailable; falling back to rule brain"
BRAIN="rule"
fi
fi
echo "$(date -Is) tick: brain=$BRAIN"
LLM_CONNECT_URL="$LLM_URL" uv run --directory "$ROOT" warden worker run --execute --brain "$BRAIN"