#!/usr/bin/env bash # Bloquant (premier plan uniquement) : # 1) Attente illimitée jusqu'à ce que l'agent notaire et les scripts de boucle se soient arrêtés # d'eux-mêmes — pas de screen, pas de &, pas de détachement : le shell courant reste bloqué. # 2) Ensuite relance la boucle (notary-ai-loop-n-cycles.sh) au premier plan pendant 10 h : # chaque itération exécute un cycle ; l'agent n'est invoqué que dans ce script, en foreground. # # Usage (un terminal dédié — la session reste occupée jusqu'à la fin des 10 h) : # export AI_AGENT_TOKEN=... # ou MAIL_TO # cd /path/to/ia_dev && ./ai_working_help/notary-ai/notary-ai-wait-agent-then-loop-10h.sh # # Env optionnel : # NOTARY_AI_WAIT_SKIP_DAEMON_KILL=1 — ne envoie pas SIGTERM au daemon au démarrage (défaut : tuer # le daemon pour éviter deux boucles en parallèle pendant l'attente ; l'agent CLI n'est jamais killé). # NOTARY_AI_WAIT_HEARTBEAT_SEC — message tous les N secondes pendant l'attente (défaut : 20). # set -euo pipefail if [ -n "${HOME:-}" ] && [ -r "$HOME/.bashrc" ]; then set +u # shellcheck source=/dev/null source "$HOME/.bashrc" 2>/dev/null || true set -u fi [ -n "${HOME:-}" ] && [ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH" NOTARY_AI_DIR="${NOTARY_AI_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}" IA_DEV_ROOT="$(cd "${NOTARY_AI_DIR}/../.." && pwd)" cd "$IA_DEV_ROOT" if [[ -z "${MAIL_TO:-}" && -z "${AI_AGENT_TOKEN:-}" ]]; then if [[ -f "${IA_DEV_ROOT}/projects/kogus/.secrets/test/ia_token" ]]; then AI_AGENT_TOKEN="$(tr -d ' \n\r\t' < "${IA_DEV_ROOT}/projects/kogus/.secrets/test/ia_token")" export AI_AGENT_TOKEN fi fi if [[ -z "${MAIL_TO:-}" && -z "${AI_AGENT_TOKEN:-}" ]]; then echo "[notary-ai-wait-then-10h] Définir MAIL_TO ou AI_AGENT_TOKEN (ou ia_token test présent)." >&2 exit 1 fi if [[ "${NOTARY_AI_WAIT_SKIP_DAEMON_KILL:-0}" == "1" ]]; then echo "[$(date -Iseconds)] NOTARY_AI_WAIT_SKIP_DAEMON_KILL=1 — aucun SIGTERM vers notary-ai-loop-daemon." else echo "[$(date -Iseconds)] Arrêt du daemon notary-ai-loop-daemon (SIGTERM) s'il existe…" pkill -TERM -f 'notary-ai-loop-daemon\.sh' 2>/dev/null || true sleep 3 fi LOOP_SCRIPT="${IA_DEV_ROOT}/ai_working_help/notary-ai/notary-ai-loop-n-cycles.sh" SLEEP_BETWEEN="${NOTARY_AI_LOOP_DAEMON_SLEEP_SEC:-15}" DURATION_SEC=$((10 * 3600)) HEARTBEAT_SEC="${NOTARY_AI_WAIT_HEARTBEAT_SEC:-20}" # True tant qu'un composant « notary-ai » bloquant tourne encore (agent CLI, cycles, daemon). notary_ai_blocking_work_running() { if pgrep -f 'notary-ai-loop-n-cycles\.sh' >/dev/null 2>&1; then return 0 fi if pgrep -f 'notary-ai-loop-daemon\.sh' >/dev/null 2>&1; then return 0 fi # Cursor CLI : argv inclut en pratique « notary-ai » (prompt notary-ai-process). if pgrep -af 'agent' 2>/dev/null | grep -qE 'notary-ai|notary_ai'; then return 0 fi return 1 } echo "[$(date -Iseconds)] Attente bloquante sans limite de durée : arrêt naturel de l'agent / des boucles (ce shell ne rend pas la main)." last_hb="$(date +%s)" while notary_ai_blocking_work_running; do sleep 2 now="$(date +%s)" if (( now - last_hb >= HEARTBEAT_SEC )); then echo "[$(date -Iseconds)] … toujours en attente (processus notary-ai ou agent encore actif) — attente illimitée." last_hb="$now" fi done echo "[$(date -Iseconds)] Plus d'agent notaire ni de boucle notary-ai active — relance boucle 10 h au premier plan (sans background)." END_TS=$(($(date +%s) + DURATION_SEC)) echo "[$(date -Iseconds)] Fin prévue après 10 h : $(date -d "@${END_TS}" -Iseconds 2>/dev/null || date -r "${END_TS}" -Iseconds 2>/dev/null || echo "${END_TS}")" while [[ $(date +%s) -lt ${END_TS} ]]; do bash "${LOOP_SCRIPT}" 1 || true sleep "${SLEEP_BETWEEN}" done echo "[$(date -Iseconds)] 10 h écoulées — fin du script."