From 45e51680a52113ed18709760e7e761a486416a57 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Fri, 10 Apr 2026 00:10:31 +0200 Subject: [PATCH] chore(notary-ai): clarify infinite wait then 10h foreground loop Heartbeat during wait; optional skip daemon SIGTERM; detect loop-daemon and cycles. --- .../notary-ai-wait-agent-then-loop-10h.sh | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 ai_working_help/notary-ai/notary-ai-wait-agent-then-loop-10h.sh diff --git a/ai_working_help/notary-ai/notary-ai-wait-agent-then-loop-10h.sh b/ai_working_help/notary-ai/notary-ai-wait-agent-then-loop-10h.sh new file mode 100755 index 0000000..5e17339 --- /dev/null +++ b/ai_working_help/notary-ai/notary-ai-wait-agent-then-loop-10h.sh @@ -0,0 +1,89 @@ +#!/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 : 60). +# +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/lecoffreio/.secrets/test/ia_token" ]]; then + AI_AGENT_TOKEN="$(tr -d ' \n\r\t' < "${IA_DEV_ROOT}/projects/lecoffreio/.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:-60}" + +# 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."