Some checks failed
Smoke Test / smoke (pull_request) Failing after 13s
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
94 lines
3.5 KiB
Bash
Executable File
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 "════════════════════════════════════════"
|