Add read_file skill, session persistence, and update script
- New read_file skill: paginated file reading with line ranges, path restricted to /workspace, binary detection, directory listing - Session persistence via SQLite + FTS5: conversation history survives agent restarts, last N messages restored into deque on boot, auto-prune to 1000 messages - Update truncation hint to reference read_file instead of run_command - New scripts/update.sh for patching rootfs + rebuilding snapshot Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
81
scripts/update.sh
Executable file
81
scripts/update.sh
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/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 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."
|
||||
Reference in New Issue
Block a user