🎉 init: 小龙的工作空间
This commit is contained in:
Executable
+196
@@ -0,0 +1,196 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user