#!/usr/bin/env bash # pmo-loop.sh [pmo|work] — keep a crush session alive inside its screen. ROLE="${1:-pmo}" case "$ROLE" in pmo) FRESH="$HOME/.coordinate/RELAUNCH-FRESH"; PIN="$HOME/.coordinate/PMO-SESSION-ID" ;; work) FRESH="$HOME/.coordinate/RELAUNCH-FRESH-WORK"; PIN="$HOME/.coordinate/WORK-SESSION-ID" ;; *) echo "usage: $0 [pmo|work]" >&2; exit 1 ;; esac LOG="$HOME/.coordinate/logs/${ROLE}-relaunch.log" LEDGER=/home/_crossfeed/metrics/launches.jsonl ledger() { printf '%s\n' "$1" >> "$LEDGER" 2>/dev/null || true; } cd "$HOME" export TERM="${TERM:-xterm-256color}" export PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH" while true; do started=$(date +%s) mode=continue if [ -f "$FRESH" ]; then rm -f "$FRESH" mode=fresh echo "$(date -Is) relaunch FRESH" >> "$LOG" crush --yolo elif [ -s "$PIN" ]; then sid=$(cat "$PIN") mode=pinned:$sid echo "$(date -Is) relaunch PINNED $sid" >> "$LOG" crush --yolo --session "$sid" else echo "$(date -Is) relaunch CONTINUE" >> "$LOG" crush --yolo --continue fi rc=$? rt=$(( $(date +%s) - started )) ledger "{\"ts\":\"$(date -Is)\",\"user\":\"$USER\",\"role\":\"$ROLE\",\"mode\":\"$mode\",\"rc\":$rc,\"runtime_s\":$rt}" if [ "$rt" -lt 60 ]; then echo "$(date -Is) short run (${rt}s rc=$rc) - backoff 60s" >> "$LOG" sleep 60 else sleep 2 fi done