#!/bin/bash # Update fireclaw agent code and skills in the rootfs. # Stops the overseer, patches the rootfs, rebuilds snapshot, restarts. # # Usage: ./scripts/update.sh set -euo pipefail log() { echo -e "\033[1;34m[fireclaw]\033[0m $*"; } step() { echo -e "\n\033[1;32m━━━ $* ━━━\033[0m"; } ok() { echo -e " \033[0;32m✓\033[0m $*"; } err() { echo -e "\033[1;31m[error]\033[0m $*" >&2; exit 1; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" FIRECLAW_DIR="$HOME/.fireclaw" ROOTFS="$FIRECLAW_DIR/agent-rootfs.ext4" MNT="/tmp/fireclaw-update-mnt" [[ ! -f "$ROOTFS" ]] && err "No rootfs found at $ROOTFS — run install.sh first." # ─── Stop overseer ────────────────────────────────────────────────── step "Stop overseer" if systemctl is-active --quiet fireclaw-overseer 2>/dev/null; then sudo systemctl stop fireclaw-overseer ok "Overseer stopped" else ok "Overseer not running" fi # Wait for any firecracker processes to exit sleep 1 # ─── Build TypeScript ─────────────────────────────────────────────── step "Build TypeScript" cd "$SCRIPT_DIR" npm run build ok "TypeScript compiled" # ─── Patch rootfs ─────────────────────────────────────────────────── step "Patch rootfs" sudo mkdir -p "$MNT" sudo mount "$ROOTFS" "$MNT" || err "Failed to mount rootfs" trap 'sudo umount "$MNT" 2>/dev/null; sudo rmdir "$MNT" 2>/dev/null' EXIT sudo mkdir -p "$MNT/opt/agent" "$MNT/opt/skills" sudo cp "$SCRIPT_DIR/agent/"*.py "$MNT/opt/agent/" sudo chmod +x "$MNT/opt/agent/agent.py" sudo rm -rf "$MNT/opt/skills/"* sudo cp -r "$SCRIPT_DIR/skills/"* "$MNT/opt/skills/" sudo chmod +x "$MNT/opt/skills/"*/run.* sudo umount "$MNT" sudo rmdir "$MNT" trap - EXIT ok "Agent + skills updated in rootfs" # ─── Rebuild snapshot ─────────────────────────────────────────────── step "Rebuild snapshot" rm -f "$FIRECLAW_DIR/snapshot.state" \ "$FIRECLAW_DIR/snapshot.mem" \ "$FIRECLAW_DIR/snapshot-rootfs.ext4" fireclaw snapshot create ok "Snapshot rebuilt" # ─── Restart overseer ────────────────────────────────────────────── step "Restart overseer" sudo systemctl start fireclaw-overseer ok "Overseer started" echo "" log "Update complete. Use IRC to test."