#!/bin/bash
# Stop-хук: короткий звук в конце ответа Claude говорит, чей следующий шаг.
# Голос слышат соседи и он раздражает, а тон несёт ровно один смысл.
#
# Сигнал не звучит по таймеру. Звучит только если Claude перед последним
# сообщением положил слово в файл-сигнал /tmp/claude_signal_<session_id>:
#   done - работа закрыта, от вас ничего не нужно (звонкий тон);
#   need - дальше нужны вы: решение, доступ, действие руками, взгляд (тон ниже).
# Нет файла или файл пуст - хук молчит.
# Непонятное слово считается need: лишний зов вы переживёте,
# а пропущенный оставит вас ждать у молчащего окна.
# Никогда не блокирует (exit 0): звук - единственное действие.

INPUT=$(cat)
SID=$(echo "$INPUT" | jq -r '.session_id // "default"' 2>/dev/null)
[ -z "$SID" ] && SID="default"

SOUND_DIR="$HOME/.claude/sounds"

# Часы тишины: с TIHO_S до TIHO_DO по времени компьютера звука нет.
TIHO_S=20
TIHO_DO=9

# 10# - десятичный разбор, иначе 08 и 09 читаются как неверное восьмеричное.
h=$((10#$(date +%H)))
# Тишина через полночь (с 22 до 8) и внутри суток (с 1 до 6) считаются по-разному.
if [ "$TIHO_S" -gt "$TIHO_DO" ]; then
    { [ "$h" -ge "$TIHO_S" ] || [ "$h" -lt "$TIHO_DO" ]; } && exit 0
else
    { [ "$h" -ge "$TIHO_S" ] && [ "$h" -lt "$TIHO_DO" ]; } && exit 0
fi

# Файл-сигнал со словом. Нет слова - молчим.
SIGNAL_FILE="/tmp/claude_signal_${SID}"
[ -f "$SIGNAL_FILE" ] || exit 0

# Слово: первое слово первой непустой строки, не длиннее 32 байт, строчными.
# Знак возврата каретки убираем, иначе слово из файла Windows не совпадёт.
# Пустой файл - не сигнал: стираем и молчим.
MARK=$(head -c 32 "$SIGNAL_FILE" | tr -d '\000\r' | tr -s ' \t\n' '\n' | grep -m 1 . | tr '[:upper:]' '[:lower:]')
if [ -z "$MARK" ]; then
    rm -f "$SIGNAL_FILE"
    exit 0
fi

case "$MARK" in
    done) FILE="$SOUND_DIR/done.wav" ;;
    *)    FILE="$SOUND_DIR/need.wav" ;;
esac

# Звука нет - слово не стираем: сигнал сыграет, как только звуки вернутся на место.
[ -f "$FILE" ] || exit 0
rm -f "$SIGNAL_FILE"

nohup afplay "$FILE" >/dev/null 2>&1 &
exit 0
