Files
2026-06-06 10:40:48 +08:00

197 lines
6.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# memory-auto.sh — 记忆自动触发器(Phase 4)
#
# 让记忆系统"自己动起来":
# 1. 会话开始时自动加载 Core Memory
# 2. 对话中自动判断是否需要记忆操作
# 3. 会话结束时自动 flush
# 4. 定期自动维护
#
# 用法:
# bash scripts/memory-auto.sh on-start # 会话开始时调用
# bash scripts/memory-auto.sh on-message # 收到消息时调用(传入消息)
# bash scripts/memory-auto.sh on-end # 会话结束时调用
# bash scripts/memory-auto.sh on-idle # 空闲时调用(维护)
# bash scripts/memory-auto.sh status # 查看自动触发状态
set -euo pipefail
WORKSPACE="$(cd "$(dirname "$0")/.." && pwd)"
MEMORY_DIR="$WORKSPACE/memory"
CORE_DIR="$MEMORY_DIR/core"
LOG="$MEMORY_DIR/.memory-auto.log"
# 加载 API Key
if [ -z "${DEEPSEEK_API_KEY:-}" ] && [ -f ~/.zshrc ]; then
eval "$(grep '^export DEEPSEEK_API_KEY=' ~/.zshrc 2>/dev/null || true)"
fi
export DEEPSEEK_API_KEY
log() {
echo "$(date '+%Y-%m-%d %H:%M') | $1" >> "$LOG"
}
# ── 1. 会话开始 ──────────────────────────────────────
on_start() {
echo "🚀 记忆系统: 会话开始"
echo ""
# 加载 Core Memory
echo "🧠 加载 Core Memory Blocks:"
for f in "$CORE_DIR"/*.md; do
[ -f "$f" ] || continue
local name=$(basename "$f" .md)
local size=$(wc -c < "$f" | tr -d ' ')
echo "$name ($size bytes)"
done
echo ""
# 检查今天是否已有 daily
local today="$MEMORY_DIR/daily/$(date +%Y-%m-%d).md"
if [ ! -f "$today" ]; then
echo "📅 创建今天的 daily: $(date +%Y-%m-%d)"
echo "# $(date +%Y-%m-%d)" > "$today"
echo "" >> "$today"
fi
# 检查 open-loops
if [ -f "$MEMORY_DIR/registers/open-loops.md" ]; then
open=$(grep -c '^\- \[ \]' "$MEMORY_DIR/registers/open-loops.md" 2>/dev/null || true)
open=${open:-0}
[ "$open" -gt 0 ] && echo "📋 有 $open 个未完成的待办"
fi
log "session_start"
echo ""
echo "✅ 记忆系统就绪"
}
# ── 2. 消息处理 ──────────────────────────────────────
on_message() {
local message="${1:-}"
[ -z "$message" ] && return
# 快速判断:这条消息是否值得记忆操作
local should_process=false
# 长消息可能包含重要信息
[ ${#message} -gt 50 ] && should_process=true
# 包含关键词
if echo "$message" | grep -qE '(记住|忘掉|偏好|纠正|决定|配置|部署|修复)'; then
should_process=true
fi
# 包含问句(可能需要搜索)
if echo "$message" | grep -qE '(记得|之前|上次|以前|什么|哪个|怎么|为什么)'; then
should_process=true
fi
$should_process || return
# 静默调用 Write Gate(后台)
if [ -f "$WORKSPACE/scripts/memory-write-gate.sh" ]; then
echo "$message" | bash "$WORKSPACE/scripts/memory-write-gate.sh" > /dev/null 2>&1 &
fi
log "message_processed: ${message:0:50}"
}
# ── 3. 会话结束 ──────────────────────────────────────
on_end() {
echo "💾 记忆系统: 会话结束"
echo ""
# 触发 session-compact pre-compact
if [ -f "$WORKSPACE/scripts/session-compact.sh" ]; then
echo "📦 执行会话压缩..."
bash "$WORKSPACE/scripts/session-compact.sh" pre-compact 2>&1 | sed 's/^/ /'
fi
# 检查是否有未保存的记忆
local today="$MEMORY_DIR/daily/$(date +%Y-%m-%d).md"
if [ -f "$today" ]; then
local today_size=$(wc -c < "$today" | tr -d ' ')
echo " 今天的 daily: $today_size bytes"
fi
log "session_end"
echo ""
echo "✅ 会话记忆已保存"
}
# ── 4. 空闲维护 ──────────────────────────────────────
on_idle() {
echo "🔧 记忆系统: 空闲维护"
echo ""
# 1. 实体提取
if [ -f "$WORKSPACE/scripts/memory-entity.sh" ]; then
echo "🧬 实体提取..."
bash "$WORKSPACE/scripts/memory-entity.sh" extract 2>&1 | sed 's/^/ /'
fi
# 2. 健康检查
if [ -f "$WORKSPACE/scripts/memory-health.sh" ]; then
echo ""
echo "🏥 健康检查..."
bash "$WORKSPACE/scripts/memory-health.sh" score 2>&1 | tail -5 | sed 's/^/ /'
fi
log "idle_maintenance"
echo ""
echo "✅ 维护完成"
}
# ── 5. 状态查看 ──────────────────────────────────────
status() {
echo "📊 记忆自动触发状态"
echo ""
# Core Memory 状态
echo "🧠 Core Memory:"
for f in "$CORE_DIR"/*.md; do
[ -f "$f" ] || continue
local name=$(basename "$f" .md)
local mtime=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$f" 2>/dev/null || echo "unknown")
local size=$(wc -c < "$f" | tr -d ' ')
echo " $name: $size bytes ($mtime)"
done
echo ""
echo "📋 日志 (最近 5 条):"
[ -f "$LOG" ] && tail -5 "$LOG" || echo " (无)"
echo ""
echo "🔧 可用脚本:"
for script in write-gate recall entity compressor llm-router behavior health search; do
local path="$WORKSPACE/scripts/memory-${script}.sh"
[ -f "$path" ] && echo " ✅ memory-${script}.sh" || echo " ❌ memory-${script}.sh"
done
}
# ── 入口 ─────────────────────────────────────────────
case "${1:-help}" in
on-start) on_start ;;
on-message) on_message "${2:-}" ;;
on-end) on_end ;;
on-idle) on_idle ;;
status) status ;;
help|*)
echo "用法: bash scripts/memory-auto.sh <命令>"
echo ""
echo "命令:"
echo " on-start 会话开始时调用(加载 Core Memory"
echo " on-message 收到消息时调用(传入消息内容)"
echo " on-end 会话结束时调用(flush + 压缩)"
echo " on-idle 空闲时调用(维护)"
echo " status 查看状态"
;;
esac