summaryrefslogtreecommitdiff
path: root/poll_and_notify.sh
blob: b32a273e16293d3f2cd20adfc0f226432400d046 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
# 极简 poller:唤醒闲置的 Claude session
# 从 .sessions 文件读取 session 列表(不再硬编码)
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ -f "$SCRIPT_DIR/.env" ]; then
    set -a; source "$SCRIPT_DIR/.env"; set +a
fi
export BROKER_URL API_SECRET

SESSIONS_FILE="$SCRIPT_DIR/.sessions"
[ -f "$SESSIONS_FILE" ] || exit 0

while IFS=$'\t' read -r SESSION PROJECT_DIR; do
    [ -z "$SESSION" ] && continue
    tmux has-session -t "$SESSION" 2>/dev/null || continue

    # 发心跳(每次 poll 都发,不依赖 Claude 活跃)
    curl -sf -X POST -H "Authorization: Bearer $API_SECRET" -H "Content-Type: application/json" \
        -d "{\"session\": \"$SESSION\", \"host\": \"$(hostname)\"}" \
        "$BROKER_URL/heartbeat" >/dev/null 2>&1 || true

    COUNT=$(curl -sf -H "Authorization: Bearer $API_SECRET" \
        "$BROKER_URL/tasks/pending?target=$SESSION" 2>/dev/null \
        | python3 -c "import sys,json; print(len(json.load(sys.stdin).get('tasks',[])))" 2>/dev/null \
        || echo "0")

    if [ "$COUNT" -gt 0 ]; then
        tmux send-keys -t "$SESSION" "请检查新任务" Enter
        echo "$(date): poked $SESSION ($COUNT pending)"
    fi
done < "$SESSIONS_FILE"