agent-orchestrator/scripts/claude-session-status

88 lines
3.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Usage: ~/claude-session-status [session-pattern]
# Shows status of Claude sessions: working, idle, or blocked
PATTERN="${1:-integrator-}"
echo "Session Status Report - $(date '+%H:%M:%S')"
echo "==========================================="
echo ""
working=()
idle=()
blocked=()
not_running=()
for session in $(tmux list-sessions -F "#{session_name}" 2>/dev/null | grep "^$PATTERN" | sort -V); do
# Capture last 15 lines of the pane
output=$(tmux capture-pane -t "$session" -p -S -15 2>/dev/null)
if [[ -z "$output" ]]; then
not_running+=("$session")
continue
fi
# Check for active processing indicators
if echo "$output" | grep -qE "Thinking|Roosting|Garnishing|Levitating|Baking|Whirring|⏺|esc to interrupt"; then
# Get what it's doing (last status line)
status=$(echo "$output" | grep -oE "(Thinking|Roosting|Garnishing|Levitating|Baking|Whirring|Reading|Writing|Editing|Running).*" | tail -1 | cut -c1-50)
working+=("$session|${status:-processing...}")
# Check for prompt (idle/waiting for input)
elif echo "$output" | grep -qE "^\s*$|^$"; then
# Get last assistant message snippet
last_msg=$(echo "$output" | grep -v "^" | grep -v "^─" | grep -v "^$" | tail -1 | cut -c1-60)
idle+=("$session|${last_msg:-ready}")
# Check for error/blocked states
elif echo "$output" | grep -qiE "error|failed|permission denied|blocked|quota|rate limit"; then
error=$(echo "$output" | grep -iE "error|failed|permission denied|blocked|quota|rate limit" | tail -1 | cut -c1-60)
blocked+=("$session|${error:-unknown error}")
# Check for yes/no prompts or questions
elif echo "$output" | grep -qE "\[y/N\]|\[Y/n\]|Continue\?|Proceed\?"; then
blocked+=("$session|waiting for confirmation")
else
# Unknown state - probably idle
last_line=$(echo "$output" | grep -v "^$" | tail -1 | cut -c1-60)
idle+=("$session|${last_line:-unknown}")
fi
done
# Print results
if [[ ${#working[@]} -gt 0 ]]; then
echo "🔄 WORKING (${#working[@]})"
for item in "${working[@]}"; do
session="${item%%|*}"
status="${item#*|}"
printf " %-20s %s\n" "$session" "$status"
done
echo ""
fi
if [[ ${#idle[@]} -gt 0 ]]; then
echo "✅ IDLE/DONE (${#idle[@]})"
for item in "${idle[@]}"; do
session="${item%%|*}"
status="${item#*|}"
printf " %-20s %s\n" "$session" "$status"
done
echo ""
fi
if [[ ${#blocked[@]} -gt 0 ]]; then
echo "⚠️ BLOCKED/ERROR (${#blocked[@]})"
for item in "${blocked[@]}"; do
session="${item%%|*}"
status="${item#*|}"
printf " %-20s %s\n" "$session" "$status"
done
echo ""
fi
if [[ ${#not_running[@]} -gt 0 ]]; then
echo "💤 NOT RUNNING (${#not_running[@]})"
printf " %s\n" "${not_running[@]}"
echo ""
fi
echo "==========================================="
echo "Total: $((${#working[@]} + ${#idle[@]} + ${#blocked[@]})) active sessions"