#!/usr/bin/env bash # s/b: one-shot ollie query via s/ namespace. # # Usage: job [flags] [prompt...] # echo "prompt" | job [flags] set -euo pipefail MOUNT=${OLLIE:-$HOME/mnt/ollie} cmd=${0##*/} die() { printf '%s: %s\n' "$cmd" "$*" >&2; exit 1; } usage() { cat < "$MOUNT/s/new" || die "failed to create session" # Poll until the session directory is visible (FUSE entry cache may lag). local deadline=$(( $(date +%s) + 5 )) until [ -d "$B" ] || [ "$(date +%s)" -ge "$deadline" ]; do sleep 0.05; done [ -d "$B" ] || die "timeout waiting for session $id" printf '%s\n' "$prompt" > "$B/prompt" || die "failed to submit prompt" if [ "$bg" -eq 1 ]; then printf '%s\n' "$B" return 0 fi # Wait until idle. while true; do state=$(cat "$B/statewait" 2>/dev/null | tr -d '[:space:]') || break [ "$state" = "idle" ] && break done local rc=0 case "$state" in failed*|error*) rc=1 ;; esac # Print result: chat content from offset onward. local offset offset=$(cat "$B/offset" 2>/dev/null || echo 0) tail -c +$((offset + 1)) "$B/chat" 2>/dev/null printf '\n' [ "$keep" -eq 0 ] && rm -r "$B" 2>/dev/null || true return $rc } rc=0 if [ "$parallel" -gt 1 ]; then abort=$(mktemp) trap 'rm -f "$abort"' EXIT pids=() for i in $(seq 1 "$parallel"); do id="${base}-${i}" ( [ -s "$abort" ] && exit 1 fn_run_one "$id" || { if [ "$failfast" -eq 1 ]; then echo 1 > "$abort" for j in $(seq 1 "$parallel"); do jid="${base}-${j}" [ "$jid" != "$id" ] && rm -r "$MOUNT/s/$jid" 2>/dev/null || true done fi exit 1 } ) & pids+=($!) done for pid in "${pids[@]}"; do wait "$pid" || rc=1; done else fn_run_one "$base" || rc=1 fi exit $rc