110 lines
3.3 KiB
Bash
110 lines
3.3 KiB
Bash
#!/bin/bash
|
|
# Memory Stats - Professional memory architecture statistics
|
|
|
|
WORKSPACE="${OPENCLAW_WORKSPACE:-$HOME/.openclaw/workspace}"
|
|
MEMORY_DIR="$WORKSPACE/memory"
|
|
STATE_FILE="$MEMORY_DIR/.memory-manager-state.json"
|
|
|
|
echo "📊 Memory Manager - Statistics"
|
|
echo ""
|
|
|
|
# Count files and sizes by type
|
|
count_stats() {
|
|
local dir="$1"
|
|
local count=$(ls "$dir"/*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
local size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
|
echo "$count|$size"
|
|
}
|
|
|
|
episodic_stats=$(count_stats "$MEMORY_DIR/episodic")
|
|
semantic_stats=$(count_stats "$MEMORY_DIR/semantic")
|
|
procedural_stats=$(count_stats "$MEMORY_DIR/procedural")
|
|
snapshots_stats=$(count_stats "$MEMORY_DIR/snapshots")
|
|
|
|
episodic_count=$(echo "$episodic_stats" | cut -d'|' -f1)
|
|
episodic_size=$(echo "$episodic_stats" | cut -d'|' -f2)
|
|
|
|
semantic_count=$(echo "$semantic_stats" | cut -d'|' -f1)
|
|
semantic_size=$(echo "$semantic_stats" | cut -d'|' -f2)
|
|
|
|
procedural_count=$(echo "$procedural_stats" | cut -d'|' -f1)
|
|
procedural_size=$(echo "$procedural_stats" | cut -d'|' -f2)
|
|
|
|
snapshots_count=$(echo "$snapshots_stats" | cut -d'|' -f1)
|
|
snapshots_size=$(echo "$snapshots_stats" | cut -d'|' -f2)
|
|
|
|
# Display breakdown
|
|
echo "## Memory Architecture Breakdown"
|
|
echo ""
|
|
echo "📅 Episodic Memory (What Happened):"
|
|
echo " Files: $episodic_count"
|
|
echo " Size: ${episodic_size:-0B}"
|
|
echo ""
|
|
echo "🧠 Semantic Memory (What You Know):"
|
|
echo " Files: $semantic_count"
|
|
echo " Size: ${semantic_size:-0B}"
|
|
echo ""
|
|
echo "⚙️ Procedural Memory (How To):"
|
|
echo " Files: $procedural_count"
|
|
echo " Size: ${procedural_size:-0B}"
|
|
echo ""
|
|
echo "💾 Snapshots (Backups):"
|
|
echo " Files: $snapshots_count"
|
|
echo " Size: ${snapshots_size:-0B}"
|
|
echo ""
|
|
|
|
# Total
|
|
total_files=$((episodic_count + semantic_count + procedural_count))
|
|
total_size=$(du -sh "$MEMORY_DIR" 2>/dev/null | cut -f1)
|
|
|
|
echo "📦 Total:"
|
|
echo " Files: $total_files"
|
|
echo " Size: ${total_size:-0B}"
|
|
echo ""
|
|
|
|
# Compression events
|
|
if [ -f "$STATE_FILE" ] && command -v jq >/dev/null 2>&1; then
|
|
warnings=$(jq -r '.warnings // 0' "$STATE_FILE")
|
|
last_check=$(jq -r '.last_check // "never"' "$STATE_FILE")
|
|
last_snapshot=$(jq -r '.last_snapshot // "never"' "$STATE_FILE")
|
|
last_organize=$(jq -r '.last_organize // "never"' "$STATE_FILE")
|
|
|
|
echo "## Activity"
|
|
echo ""
|
|
echo "Compression events: $warnings"
|
|
echo "Last check: $last_check"
|
|
echo "Last snapshot: $last_snapshot"
|
|
echo "Last organize: $last_organize"
|
|
echo ""
|
|
fi
|
|
|
|
# Growth rate (episodic entries in last 7 days)
|
|
recent_episodic=$(find "$MEMORY_DIR/episodic" -name "*.md" -mtime -7 2>/dev/null | wc -l | tr -d ' ')
|
|
echo "## Growth"
|
|
echo ""
|
|
echo "Episodic entries (last 7 days): $recent_episodic"
|
|
echo "Average: $((recent_episodic / 7)) entries/day"
|
|
echo ""
|
|
|
|
# Health check
|
|
total_chars=0
|
|
for dir in episodic semantic procedural; do
|
|
chars=$(find "$MEMORY_DIR/$dir" -name "*.md" -exec wc -c {} + 2>/dev/null | tail -1 | awk '{print $1}' || echo 0)
|
|
total_chars=$((total_chars + chars))
|
|
done
|
|
|
|
usage_pct=$((total_chars * 100 / 800000))
|
|
|
|
echo "## Memory Health"
|
|
echo ""
|
|
if [ "$usage_pct" -ge 85 ]; then
|
|
echo "Status: 🚨 CRITICAL (${usage_pct}%)"
|
|
echo "Action: Run organize.sh and snapshot.sh NOW"
|
|
elif [ "$usage_pct" -ge 70 ]; then
|
|
echo "Status: ⚠️ WARNING (${usage_pct}%)"
|
|
echo "Action: Consider running organize.sh"
|
|
else
|
|
echo "Status: ✅ Healthy (${usage_pct}%)"
|
|
echo "Action: None needed"
|
|
fi
|