Files
timmy-home/scripts/emacs-fleet-poll.sh
Timmy (AI Agent) 9b5ec4b68e
Some checks failed
Smoke Test / smoke (pull_request) Failing after 13s
feat(fleet): Emacs Sovereign Control Plane (#590)
Implement tooling for the shared Emacs daemon control plane on Bezalel.
Agents can now poll dispatch.org for tasks, claim work, and report
results programmatically.

Files:
- scripts/emacs-fleet-bridge.py — Python client with 6 commands:
  poll (find PENDING tasks), claim (PENDING→IN_PROGRESS), done (mark
  complete), append (status messages), status (health check), eval
  (arbitrary Elisp). SSH-based communication with Bezalel Emacs daemon.
- scripts/emacs-fleet-poll.sh — Shell poll script for crontab integration.
  Shows connectivity, task counts, my pending/active tasks, recent activity.
- skills/autonomous-ai-agents/emacs-control-plane/SKILL.md — Full skill
  docs covering infrastructure, API, agent loop integration, state machine,
  and pitfalls.

Infrastructure:
- Host: Bezalel (159.203.146.185)
- Socket: /root/.emacs.d/server/bezalel
- Dispatch: /srv/fleet/workspace/dispatch.org
- Configurable via BEZALEL_HOST, BEZALEL_SSH_KEY, EMACS_SOCKET env vars

Closes #590
2026-04-13 20:18:29 -04:00

94 lines
3.5 KiB
Bash
Executable File

#!/bin/bash
# ══════════════════════════════════════════════
# Emacs Fleet Poll — Check dispatch.org for tasks
# Designed for crontab or agent loop integration.
# ══════════════════════════════════════════════
set -euo pipefail
BEZALEL_HOST="${BEZALEL_HOST:-159.203.146.185}"
BEZALEL_USER="${BEZALEL_USER:-root}"
EMACS_SOCKET="${EMACS_SOCKET:-/root/.emacs.d/server/bezalel}"
DISPATCH_FILE="${DISPATCH_FILE:-/srv/fleet/workspace/dispatch.org}"
AGENT="${1:-timmy}"
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10"
if [ -n "${BEZALEL_SSH_KEY:-}" ]; then
SSH_OPTS="$SSH_OPTS -i $BEZALEL_SSH_KEY"
fi
echo "════════════════════════════════════════"
echo " FLEET DISPATCH POLL — Agent: $AGENT"
echo " $(date -u '+%Y-%m-%d %H:%M UTC')"
echo "════════════════════════════════════════"
# 1. Connectivity check
echo ""
echo "--- Connectivity ---"
EMACS_VER=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"emacsclient -s $EMACS_SOCKET -e '(emacs-version)' 2>&1" 2>/dev/null || echo "UNREACHABLE")
if echo "$EMACS_VER" | grep -qi "UNREACHABLE\|refused\|error"; then
echo " STATUS: DOWN — Cannot reach Emacs daemon on $BEZALEL_HOST"
echo " Agent should fall back to Gitea-only coordination."
exit 1
fi
echo " STATUS: UP — $EMACS_VER"
# 2. Task counts
echo ""
echo "--- Task Overview ---"
PENDING=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"grep -c 'TODO PENDING' $DISPATCH_FILE 2>/dev/null || echo 0" 2>/dev/null || echo "?")
IN_PROGRESS=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"grep -c 'TODO IN_PROGRESS' $DISPATCH_FILE 2>/dev/null || echo 0" 2>/dev/null || echo "?")
DONE=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"grep -c 'TODO DONE' $DISPATCH_FILE 2>/dev/null || echo 0" 2>/dev/null || echo "?")
echo " PENDING: $PENDING"
echo " IN_PROGRESS: $IN_PROGRESS"
echo " DONE: $DONE"
# 3. My pending tasks
echo ""
echo "--- Tasks for $AGENT ---"
MY_TASKS=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"grep 'PENDING.*:${AGENT}:' $DISPATCH_FILE 2>/dev/null || echo '(none)'" 2>/dev/null || echo "(unreachable)")
if [ -z "$MY_TASKS" ] || [ "$MY_TASKS" = "(none)" ]; then
echo " No pending tasks assigned to $AGENT"
else
echo "$MY_TASKS" | while IFS= read -r line; do
echo "$line"
done
fi
# 4. My in-progress tasks
MY_ACTIVE=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"grep 'IN_PROGRESS.*:${AGENT}:' $DISPATCH_FILE 2>/dev/null || echo ''" 2>/dev/null || echo "")
if [ -n "$MY_ACTIVE" ]; then
echo ""
echo "--- Active work for $AGENT ---"
echo "$MY_ACTIVE" | while IFS= read -r line; do
echo "$line"
done
fi
# 5. Recent activity
echo ""
echo "--- Recent Activity (last 5) ---"
RECENT=$(ssh $SSH_OPTS ${BEZALEL_USER}@${BEZALEL_HOST} \
"tail -20 $DISPATCH_FILE 2>/dev/null | grep -E '\[DONE\]|\[IN_PROGRESS\]' | tail -5" 2>/dev/null || echo "(none)")
if [ -z "$RECENT" ]; then
echo " No recent activity"
else
echo "$RECENT" | while IFS= read -r line; do
echo " $line"
done
fi
echo ""
echo "════════════════════════════════════════"