diff --git a/scripts/reset-sindra-stores.sh b/scripts/reset-sindra-stores.sh new file mode 100755 index 0000000..e399892 --- /dev/null +++ b/scripts/reset-sindra-stores.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# reset-sindra-stores.sh — wipe ratatoskr's Bifrost provider stores (memory + +# affect/persona for the single-tenant Tier-3 agent, sindra) and restart the +# combined :8392 provider empty. +# +# Usage: +# scripts/reset-sindra-stores.sh # wipe, keep ONE rolling backup (default) +# scripts/reset-sindra-stores.sh --hard # wipe with NO backup (zero-trace) +# +# The rolling backup (db-reset-backup/, gitignored via *.db*) is overwritten +# every run — it never accumulates; it's a one-level undo, nothing more. +# +# Why stop the provider first: the combined provider holds the SQLite files open +# (WAL) and caches state in memory, so an out-of-band file move without a restart +# would be shadowed. Stop -> move -> restart lets it recreate empty schema +# (CREATE TABLE IF NOT EXISTS on open). + +PORT=8392 +BACKUP_DIR="db-reset-backup" + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" || { echo "reset: cannot cd to repo root $ROOT" >&2; exit 1; } +# shellcheck disable=SC1091 +source ./env.sh >/dev/null 2>&1 || { echo "reset: failed to source env.sh" >&2; exit 1; } + +AFFECT_DB="${RATATOSKR_AFFECT_DB:-affect.db}" +MEMORY_DB="${RATATOSKR_MEMORY_DB:-memory.db}" +HARD=0; [ "${1:-}" = "--hard" ] && HARD=1 + +echo "== ratatoskr provider-store reset (memory + persona) ==" +echo " affect: $AFFECT_DB" +echo " memory: $MEMORY_DB" + +# 1. stop the combined provider holding the DBs +PID="$(ss -ltnp 2>/dev/null | grep ":$PORT" | grep -oE 'pid=[0-9]+' | head -1 | cut -d= -f2)" +if [ -n "${PID:-}" ]; then + kill -9 "$PID" 2>/dev/null && echo "-- stopped provider :$PORT (pid $PID)" +else + echo "-- no provider on :$PORT (already down)" +fi + +# 2. wipe (optional rolling backup) +files=("$AFFECT_DB" "$AFFECT_DB-wal" "$AFFECT_DB-shm" "$MEMORY_DB" "$MEMORY_DB-wal" "$MEMORY_DB-shm") +if [ "$HARD" -eq 1 ]; then + for f in "${files[@]}"; do [ -e "$f" ] && rm -f "$f" && echo "-- removed $f"; done + echo "-- HARD wipe (no backup)" +else + rm -rf "$BACKUP_DIR"; mkdir -p "$BACKUP_DIR" + for f in "${files[@]}"; do [ -e "$f" ] && mv "$f" "$BACKUP_DIR"/ && echo "-- $f -> $BACKUP_DIR/"; done + echo "-- rolling backup: $BACKUP_DIR/ (overwritten each run)" +fi + +# 3. restart the combined provider (recreates empty schema on open) +nohup "$ROOT/.venv/bin/ratatoskr-combined-provider" >/tmp/ratatoskr-combined.log 2>&1 & disown +echo "-- restarted combined provider (pid $!)" + +# 4. verify bound + empty +curl -s -o /dev/null -w "-- :$PORT -> HTTP %{http_code}\n" --retry 25 --retry-connrefused --retry-delay 1 "http://127.0.0.1:$PORT/" +echo "-- affect_snapshots (persona): $(sqlite3 "$AFFECT_DB" 'SELECT COUNT(*) FROM affect_snapshots' 2>&1)" +echo "-- memory_chunks (memory): $(sqlite3 "$MEMORY_DB" 'SELECT COUNT(*) FROM memory_chunks' 2>&1)" +echo "== done — sindra memory + persona reset =="