feat(infra): auto-commit con 8 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,25 @@
|
||||
set -euo pipefail
|
||||
IFS=$' \t\n'
|
||||
|
||||
# Predicado (puro respecto a tmux): dada una window — su nombre y el texto de sus
|
||||
# panes en formato "<pane_pid> <pane_current_command>" (una linea por pane) —
|
||||
# decide si esa window ALOJA la TUI fleetview o es la window 'console' del perfil.
|
||||
# Si es asi, cerrar la window entera con kill-window se llevaria la TUI por
|
||||
# delante; el caller debe cerrar solo el pane del target con kill-pane.
|
||||
# - Nombre de window 'console' = la window del panel FleetView por convencion
|
||||
# del launcher (y a donde el focus-swap ancla la TUI, ver fleetview v0.4.3).
|
||||
# - Algun pane corre el binario 'fleetview' (pane_current_command) = la TUI
|
||||
# vive ahi aunque la window se haya renombrado.
|
||||
# Devuelve 0 si aloja la TUI/console, 1 si no.
|
||||
_fleet_window_hosts_tui() {
|
||||
local window_name="${1:-}" panes_text="${2:-}"
|
||||
[[ "$window_name" == "console" ]] && return 0
|
||||
if printf '%s\n' "$panes_text" | awk '{print $2}' | grep -qx 'fleetview'; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
kill_fleet_agent() {
|
||||
local target="" socket="" dry=0
|
||||
|
||||
@@ -155,27 +174,65 @@ USAGE
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# Resolver la window tmux del PID en el socket (pane_pid == claude por el
|
||||
# `exec claude` de spawn_fleet_agent). Best-effort: vacio si no hay socket.
|
||||
# Resolver la window tmux Y el pane del PID en el socket (pane_pid == claude
|
||||
# por el `exec claude` de spawn_fleet_agent). Capturamos window_id, pane_id y
|
||||
# window_name juntos. Best-effort: vacio si no hay socket.
|
||||
# -----------------------------------------------------------------------
|
||||
local window=""
|
||||
local window="" pane="" wname=""
|
||||
if command -v tmux >/dev/null 2>&1; then
|
||||
window="$(tmux -L "$socket" list-panes -a -F '#{pane_pid} #{window_id}' 2>/dev/null \
|
||||
| awk -v p="$pid" '$1==p {print $2; exit}' || true)"
|
||||
local line
|
||||
line="$(tmux -L "$socket" list-panes -a -F '#{pane_pid} #{window_id} #{pane_id} #{window_name}' 2>/dev/null \
|
||||
| awk -v p="$pid" '$1==p {print $2, $3, $4; exit}' || true)"
|
||||
if [[ -n "$line" ]]; then
|
||||
window="$(awk '{print $1}' <<<"$line")"
|
||||
pane="$(awk '{print $2}' <<<"$line")"
|
||||
wname="$(awk '{print $3}' <<<"$line")"
|
||||
fi
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# Guard 3 — anti-TUI/console: si la window del target aloja la TUI fleetview
|
||||
# o es la window 'console' del perfil, NO cerramos la window entera (eso se
|
||||
# llevaria la TUI), sino solo el pane del target con kill-pane. El layout
|
||||
# FleetView mete la TUI y un Claude en la misma window 'console', y los
|
||||
# focus-swaps (join-pane) pueden meter al ejecutor target en esa window.
|
||||
# -----------------------------------------------------------------------
|
||||
local hosts_tui=0
|
||||
if [[ -n "$window" ]] && command -v tmux >/dev/null 2>&1; then
|
||||
local panes_text
|
||||
panes_text="$(tmux -L "$socket" list-panes -t "$window" -F '#{pane_pid} #{pane_current_command}' 2>/dev/null || true)"
|
||||
if _fleet_window_hosts_tui "$wname" "$panes_text"; then
|
||||
hosts_tui=1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Accion sobre la window/pane segun lo resuelto y el Guard 3.
|
||||
local action
|
||||
if [[ -z "$window" ]]; then
|
||||
action="solo SIGTERM (window no resuelta)"
|
||||
elif [[ "$hosts_tui" -eq 1 ]]; then
|
||||
if [[ -n "$pane" ]]; then
|
||||
action="kill-pane $pane (window '${wname:-$window}' aloja la TUI/console; se preserva la TUI)"
|
||||
else
|
||||
action="solo SIGTERM (window '${wname:-$window}' aloja la TUI y no se resolvio el pane; window preservada)"
|
||||
fi
|
||||
else
|
||||
action="kill-window $window"
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# Plan (se imprime siempre).
|
||||
# -----------------------------------------------------------------------
|
||||
echo "kill_fleet_agent — target: $target PID: $pid sessionId: ${sid:-?} role: ${role:-executor} socket: $socket window: ${window:-(no resuelta)}"
|
||||
echo "kill_fleet_agent — target: $target PID: $pid sessionId: ${sid:-?} role: ${role:-executor} socket: $socket window: ${window:-(no resuelta)} pane: ${pane:-?} accion: $action"
|
||||
|
||||
if [[ "$dry" -eq 1 ]]; then
|
||||
echo "DRY-RUN: no se ha matado el proceso ni cerrado la window."
|
||||
echo "DRY-RUN: no se ha matado el proceso ni cerrado nada."
|
||||
return 0
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# Ejecutar: SIGTERM al claude (cierre limpio) + kill-window (idempotente).
|
||||
# Ejecutar: SIGTERM al claude (cierre limpio) + cierre de pane/window segun
|
||||
# el Guard 3 (idempotente).
|
||||
# -----------------------------------------------------------------------
|
||||
if kill -0 "$pid" 2>/dev/null; then
|
||||
kill "$pid" 2>/dev/null || true
|
||||
@@ -185,8 +242,17 @@ USAGE
|
||||
fi
|
||||
|
||||
if [[ -n "$window" ]] && command -v tmux >/dev/null 2>&1; then
|
||||
tmux -L "$socket" kill-window -t "$window" 2>/dev/null || true
|
||||
echo "kill_fleet_agent: window $window cerrada en el socket $socket."
|
||||
if [[ "$hosts_tui" -eq 1 ]]; then
|
||||
if [[ -n "$pane" ]]; then
|
||||
tmux -L "$socket" kill-pane -t "$pane" 2>/dev/null || true
|
||||
echo "kill_fleet_agent: pane $pane cerrado (window '${wname:-$window}' aloja la TUI; window preservada)."
|
||||
else
|
||||
echo "kill_fleet_agent: window '${wname:-$window}' aloja la TUI pero no se resolvio el pane; solo SIGTERM (window preservada)."
|
||||
fi
|
||||
else
|
||||
tmux -L "$socket" kill-window -t "$window" 2>/dev/null || true
|
||||
echo "kill_fleet_agent: window $window cerrada en el socket $socket."
|
||||
fi
|
||||
fi
|
||||
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user