#!/usr/bin/env bash # Run an IdleSpectator agent harness scenario (or raw JSONL commands). # Usage: # ./scripts/harness-run.sh smoke # ./scripts/harness-run.sh tip_match # ./scripts/harness-run.sh --cmd '{"id":"1","action":"snapshot"}' set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" MOD="${IDLE_SPECTATOR_MOD:-$ROOT/IdleSpectator}" HARNESS="$MOD/.harness" LOG="${WORLDBOX_LOG:-$HOME/.config/unity3d/mkarpenko/WorldBox/Player.log}" TIMEOUT_SEC="${HARNESS_TIMEOUT:-90}" mkdir -p "$HARNESS" scenario="" raw_cmd="" while [[ $# -gt 0 ]]; do case "$1" in --cmd) raw_cmd="$2" shift 2 ;; --timeout) TIMEOUT_SEC="$2" shift 2 ;; -*) echo "Unknown flag: $1" >&2 exit 2 ;; *) scenario="$1" shift ;; esac done if [[ -z "$scenario" && -z "$raw_cmd" ]]; then scenario="smoke" fi rm -f "$HARNESS/last-result.json" : > "$HARNESS/results.jsonl" # While this file exists, harness auto-closes Welcome Back / blocking UI. touch "$HARNESS/auto-dismiss" { echo '{"id":"batch","action":"reset_counters"}' echo '{"id":"dismiss","action":"dismiss_windows"}' if [[ -n "$raw_cmd" ]]; then echo "$raw_cmd" else echo "{\"id\":\"run\",\"action\":\"scenario\",\"value\":\"$scenario\"}" fi } > "$HARNESS/commands.jsonl" echo "Harness queued: ${scenario:-raw} (mod=$MOD)" echo "Waiting up to ${TIMEOUT_SEC}s for last-result.json ..." deadline=$((SECONDS + TIMEOUT_SEC)) while (( SECONDS < deadline )); do if [[ -f "$HARNESS/last-result.json" ]]; then # NOTE: do not name this `status` - zsh treats that as read-only. result_status="$(python3 -c "import json;print(json.load(open('$HARNESS/last-result.json')).get('status',''))" 2>/dev/null || true)" if [[ "$result_status" == "PASS" || "$result_status" == "FAIL" || "$result_status" == "error" ]]; then echo "===== last-result.json =====" cat "$HARNESS/last-result.json" echo "===== recent harness log =====" if [[ -f "$LOG" ]]; then rg -n "\[IdleSpectator\]\[(HARNESS|ASSERT|SNAP)\]|dismissed window" "$LOG" | tail -n 40 || true fi if [[ "$result_status" == "PASS" ]]; then exit 0 fi exit 1 fi fi sleep 0.5 done echo "Timed out after ${TIMEOUT_SEC}s" >&2 if [[ -f "$HARNESS/last-result.json" ]]; then cat "$HARNESS/last-result.json" >&2 || true fi if [[ -f "$LOG" ]]; then rg -n "IdleSpectator|error CS|Exception" "$LOG" | tail -n 50 >&2 || true fi exit 1