117 lines
3.3 KiB
Bash
Executable File
117 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# wm-collect: Harvest results from completed wm-port agent sessions.
|
|
#
|
|
# Scans all wm-port-* sessions. For each idle session, reads the result,
|
|
# updates done.txt, saves the log, and kills the session.
|
|
#
|
|
# Usage:
|
|
# wm-collect # collect all finished sessions
|
|
# wm-collect --dry-run # show what would be collected, don't act
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
TOOLS="$ROOT/tools/wm-port"
|
|
MOUNT="${OLLIE:-$HOME/mnt/ollie}"
|
|
DONE_FILE="$TOOLS/done.txt"
|
|
LOG_DIR="$TOOLS/logs"
|
|
|
|
source "$TOOLS/task-map.sh"
|
|
mkdir -p "$LOG_DIR"
|
|
touch "$DONE_FILE"
|
|
|
|
dry_run=0
|
|
[ "${1:-}" = "--dry-run" ] && dry_run=1
|
|
[ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ] && {
|
|
sed -n '2,/^$/{ s/^# //; s/^#//; p; }' "$0"; exit 0
|
|
}
|
|
|
|
collected=0
|
|
skipped=0
|
|
|
|
while IFS=$'\t' read -r sid state cwd backend model; do
|
|
[[ "$sid" == wm-port-* ]] || continue
|
|
tid="${sid#wm-port-}"
|
|
session_path="$MOUNT/s/$sid"
|
|
|
|
# Skip sessions still running
|
|
if [ "$state" != "idle" ]; then
|
|
(( ++skipped ))
|
|
continue
|
|
fi
|
|
|
|
# Skip already-collected tasks
|
|
task_is_done "$tid" "$DONE_FILE" 2>/dev/null && {
|
|
if [ "$dry_run" -eq 0 ]; then
|
|
echo kill > "$session_path/ctl" 2>/dev/null || true
|
|
fi
|
|
continue
|
|
}
|
|
|
|
# Read the result
|
|
local_offset=$(cat "$session_path/offset" 2>/dev/null || echo 0)
|
|
result=$(tail -c +$((local_offset + 1)) "$session_path/chat" 2>/dev/null || true)
|
|
|
|
# Determine status
|
|
status="UNKNOWN"
|
|
if [ -z "$result" ] || echo "$result" | head -1 | grep -q '^user:'; then
|
|
status="FAIL"
|
|
elif echo "$result" | grep -qiE '\*\*DONE\*\*|^DONE:|^DONE\b|Status:.*DONE|DONE: task completed|DONE: verified'; then
|
|
status="DONE"
|
|
elif echo "$result" | grep -qiE '\*\*STOP\*\*|^STOP:|^STOP\b|Status:.*STOP|STOP: blocked'; then
|
|
status="STOP"
|
|
elif echo "$result" | grep -qiE '\*\*FAIL\*\*|^FAIL:|^FAIL\b|Status:.*FAIL|FAIL: could not'; then
|
|
status="FAIL"
|
|
elif echo "$result" | grep -qiE 'compiles clean|no action needed'; then
|
|
status="DONE"
|
|
fi
|
|
|
|
# Report
|
|
case "$status" in
|
|
DONE)
|
|
printf '\033[1;32m\u2713 %s: %s\033[0m\n' "$tid" "$status"
|
|
;;
|
|
STOP)
|
|
printf '\033[1;33m\u26a0 %s: %s\033[0m\n' "$tid" "$status"
|
|
;;
|
|
FAIL)
|
|
printf '\033[1;31m\u2717 %s: %s\033[0m\n' "$tid" "$status"
|
|
;;
|
|
*)
|
|
printf '\033[1;35m? %s: %s\033[0m\n' "$tid" "$status"
|
|
;;
|
|
esac
|
|
|
|
if [ "$dry_run" -eq 1 ]; then
|
|
(( ++collected ))
|
|
continue
|
|
fi
|
|
|
|
# Save log
|
|
printf '%s\n' "$result" > "$LOG_DIR/${tid}.log"
|
|
|
|
# Update done.txt for successful tasks
|
|
case "$status" in
|
|
DONE)
|
|
echo "$tid" >> "$DONE_FILE"
|
|
echo kill > "$session_path/ctl" 2>/dev/null || true
|
|
;;
|
|
*)
|
|
# Keep session alive for inspection
|
|
printf ' Session: %s\n' "$session_path"
|
|
;;
|
|
esac
|
|
|
|
(( ++collected ))
|
|
done < <(cat "$MOUNT/s/idx" 2>/dev/null)
|
|
|
|
if [ "$collected" -eq 0 ] && [ "$skipped" -eq 0 ]; then
|
|
echo "No wm-port sessions found."
|
|
elif [ "$collected" -eq 0 ]; then
|
|
printf '%d session(s) still running.\n' "$skipped"
|
|
else
|
|
printf '\nCollected %d result(s)' "$collected"
|
|
[ "$skipped" -gt 0 ] && printf ', %d still running' "$skipped"
|
|
printf '.\n'
|
|
fi
|