文件预览

stats.sh

查看 Memory Manager 技能包中的文件内容。

文件内容

stats.sh

#!/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