#!/usr/bin/env bash
# Envoltorio: el whisper-server de Newelle, pero el nuestro compilado con CUDA.
# Newelle lo invoca por flatpak-spawn --host esperando 'whisper-server' en el
# PATH; aqui se fija el entorno de CUDA (que el binario necesita para ver las
# libs) y se pasa a nuestra version con GPU. Los argumentos (-m, --port, -l...)
# los pone Newelle y se reenvian tal cual.
#
# Copia versionada: ~/COFRE/CODERS/JARVIS/config/whisper-server-envoltorio.sh
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:-}

BINARIO="$HOME/COFRE/CODERS/JARVIS/voz/whisper-cuda/whisper.cpp/build/bin/whisper-server"
REGISTRO="$HOME/COFRE/CODERS/JARVIS/voz/whisper-arranques.log"

# Cuanta VRAM libre exigimos para arrancar en GPU. El modelo small ocupa 757 MiB
# en reposo pero llega a 839 en el pico de una transcripcion: pedir solo lo que
# ocupa al cargar es justo el error que hacia que cargase bien y muriese al
# hablarle, con un "Error recognizing file with server" que no explicaba nada.
# 950 deja holgura para el pico y para el contexto de CUDA.
MINIMO_MIB=${JARVIS_WHISPER_MIN_VRAM:-950}

# Barrer el servidor anterior antes de levantar el nuestro.
#
# Newelle lo lanza por flatpak-spawn --host, asi que el proceso vive FUERA del
# sandbox y no se entera de que la app se cerro: cada vez que se reinicia
# JARVIS queda un whisper-server huerfano agarrado a 757 MiB de la tarjeta.
# Dos o tres reinicios y ya no cabe el modelo del asistente, con el sintoma
# repartido —a veces va, a veces no— segun cuantos hubiera quedado sueltos.
#
# Se comparan PIDs y no patrones: un `pkill -f whisper-server` desde aqui se
# mataria a si mismo, que este script tiene ese nombre.
for otro in $(pgrep -x whisper-server 2>/dev/null); do
  [ "$otro" = "$$" ] && continue
  kill "$otro" 2>/dev/null
done

libre=$(nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits 2>/dev/null | head -1)

if [ -n "$libre" ] && [ "$libre" -lt "$MINIMO_MIB" ] 2>/dev/null; then
  # Sin sitio: mejor transcribir en procesador que abortar. Es mas lento, pero
  # responde; abortar deja la app muda y sin decir por que.
  echo "$(date '+%F %T') GPU con solo ${libre} MiB libres (<${MINIMO_MIB}): al procesador" >> "$REGISTRO"
  exec "$BINARIO" --no-gpu "$@"
fi

echo "$(date '+%F %T') GPU con ${libre:-?} MiB libres: en tarjeta" >> "$REGISTRO"
exec "$BINARIO" "$@"
