105 lines
2.9 KiB
Bash
105 lines
2.9 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Snapshot - Save memory state before compression
|
||
|
|
|
||
|
|
WORKSPACE="${OPENCLAW_WORKSPACE:-$HOME/.openclaw/workspace}"
|
||
|
|
MEMORY_DIR="$WORKSPACE/memory"
|
||
|
|
SNAPSHOT_DIR="$MEMORY_DIR/snapshots"
|
||
|
|
STATE_FILE="$MEMORY_DIR/.memory-manager-state.json"
|
||
|
|
|
||
|
|
# Create snapshot directory
|
||
|
|
mkdir -p "$SNAPSHOT_DIR"
|
||
|
|
|
||
|
|
# Generate snapshot filename
|
||
|
|
SNAPSHOT_FILE="$SNAPSHOT_DIR/$(date +%Y-%m-%d-%H%M).md"
|
||
|
|
|
||
|
|
echo "💾 Creating memory snapshot..."
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Create snapshot header
|
||
|
|
cat > "$SNAPSHOT_FILE" << EOF
|
||
|
|
# Memory Snapshot - $(date +"%Y-%m-%d %H:%M:%S")
|
||
|
|
|
||
|
|
**Auto-saved before compression event**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
EOF
|
||
|
|
|
||
|
|
# Capture episodic (recent events)
|
||
|
|
echo "## Recent Events (Episodic)" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
|
||
|
|
recent_episodic=$(find "$MEMORY_DIR/episodic" -name "*.md" -mtime -3 | sort -r | head -3)
|
||
|
|
if [ -n "$recent_episodic" ]; then
|
||
|
|
for file in $recent_episodic; do
|
||
|
|
echo "### $(basename "$file" .md)" >> "$SNAPSHOT_FILE"
|
||
|
|
tail -n 30 "$file" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
done
|
||
|
|
else
|
||
|
|
echo "*No recent episodic entries*" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Capture semantic (key knowledge)
|
||
|
|
echo "## Key Knowledge (Semantic)" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
|
||
|
|
semantic_files=$(find "$MEMORY_DIR/semantic" -name "*.md" | head -5)
|
||
|
|
if [ -n "$semantic_files" ]; then
|
||
|
|
for file in $semantic_files; do
|
||
|
|
echo "### $(basename "$file" .md)" >> "$SNAPSHOT_FILE"
|
||
|
|
head -n 20 "$file" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
done
|
||
|
|
else
|
||
|
|
echo "*No semantic entries*" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Capture procedural (important workflows)
|
||
|
|
echo "## Key Workflows (Procedural)" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
|
||
|
|
procedural_files=$(find "$MEMORY_DIR/procedural" -name "*.md" | head -3)
|
||
|
|
if [ -n "$procedural_files" ]; then
|
||
|
|
for file in $procedural_files; do
|
||
|
|
echo "### $(basename "$file" .md)" >> "$SNAPSHOT_FILE"
|
||
|
|
head -n 20 "$file" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
done
|
||
|
|
else
|
||
|
|
echo "*No procedural entries*" >> "$SNAPSHOT_FILE"
|
||
|
|
echo "" >> "$SNAPSHOT_FILE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Add metadata
|
||
|
|
cat >> "$SNAPSHOT_FILE" << EOF
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Snapshot metadata:**
|
||
|
|
- Created: $(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
|
|
- Trigger: Compression detection
|
||
|
|
- Coverage: Last 3 days episodic + top 5 semantic + top 3 procedural
|
||
|
|
- Purpose: Recovery checkpoint before potential memory loss
|
||
|
|
EOF
|
||
|
|
|
||
|
|
# Update state
|
||
|
|
if command -v jq >/dev/null 2>&1; then
|
||
|
|
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
|
|
jq --arg ts "$timestamp" '.last_snapshot = $ts | .warnings += 1' "$STATE_FILE" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "✅ Snapshot saved: $SNAPSHOT_FILE"
|
||
|
|
echo ""
|
||
|
|
echo "Snapshot includes:"
|
||
|
|
echo " - Last 3 days episodic entries"
|
||
|
|
echo " - Top 5 semantic knowledge files"
|
||
|
|
echo " - Top 3 procedural workflows"
|
||
|
|
echo ""
|
||
|
|
echo "Next steps:"
|
||
|
|
echo " 1. Review snapshot for completeness"
|
||
|
|
echo " 2. Run: organize.sh (reduce memory usage)"
|
||
|
|
echo " 3. Consider pruning old episodic entries"
|