Skill: nic-yuan/apollo-autophagy (version 2.0.0)

--- name: apollo-autophagy description: > 彻底删除不需要的东西，释放空间。 version: 2.0.0 read_when: - 用户提到清理、删除、重置、清空、销毁 - Token > 90%（绝对硬阈值） - 上下文严重损坏时 metadata: openclaw: emoji: "🔥" requires: bins: [] env: [] triggers: - 清理 - 删除 - 重置 - 清空 - 销毁 - 彻底删除 - 上下文崩溃 - 自噬 suite: apollo --- # Apollo Autophagy — 破坏性清理系统 ## 核心准则 **AI的清理应该是细胞自噬：不是整理，而是彻底销毁。是排毒，不是减肥。** apollo-dream = 睡觉做梦（整理+强化+关联）→ 保守，有选择性保留 apollo-renal = 肾脏过滤（选择性保留+实时过滤）→ 中间态 apollo-autophagy = 自噬（溶酶体降解）→ 激进，彻底删除，不保留结构 使用场景： - 上下文已严重损坏（矛盾、混乱、无法恢复） - 用户主动要求彻底清理 - Token > 90%且apollo-renal无法有效过滤 - 系统需要"重启"而不是"整理" ## 三个清理层级 ### 层级1：小自噬（可恢复） **清理对象：** - 临时文件：`*.tmp`, `*.log`, `__pycache__/`, `*.pyc` - 过时缓存：心跳日志超过30天的条目 - 中间产物：编译产物、备份文件 **触发条件：** 用户确认后即可执行 **可逆性：** 高（文件可从备份恢复） ### 层级2：中度自噬（部分可逆） **清理对象：** - 损坏文件：检测到内容损坏的文件 - 错误记忆：MEMORY.md中标记为"过时"的条目 - 失效临时状态：过期的任务提醒文件 **触发条件：** 明确用户确认 **可逆性：** 中（记忆内容可能无法恢复） ### 层级3：大自噬（不可逆） **清理对象：** - 整个对话上下文 - 当前会话的所有上下文状态 **触发条件：** 双重确认 + Token > 95%自动预警 **可逆性：** 零（除非有外部备份） ## 清理决策流程 ``` 收到清理请求 → 1. 自噬类型判断： - 用户说"清理缓存/临时文件" → 小自噬 - 用户说"删除记忆/清理错误" → 中度自噬 - 用户说"重置/清空上下文" → 大自噬 - Token > 90% → 自动触发中度自噬预警 - Token > 95% → 自动触发大自噬预警 2. 对象识别（扫描）： - 列出可清理对象 - 确认保留对象（核心记忆/进行中任务） 3. 风险评估： - 小自噬：🟢 低风险 - 中度自噬：🟡 中风险（需确认清单） - 大自噬：🔴 高风险（需双重确认） 4. 执行清理： - 写入预清理快照（万一需要回滚） - 执行删除 - 验证删除结果 - 写入清理日志 5. 清理后： - 通知主AI：上下文已重置 - 报告：清理了什么，保留了什么 ``` ## 保留清单（任何层级都必须保留） ``` ✅ 任何情况下都不删除： - MEMORY.md（长期记忆） - 进行中任务的状态（.dream/task-state.json） - 用户偏好记录 - 技能/Skill相关文档 - 未完成且无法重建的工作成果 ``` ## 清理前快照机制 ``` 大自噬执行前必须： 1. 写入快照文件：/tmp/autophagy-snapshot-[timestamp].json 内容：当前所有上下文的关键摘要 2. 快照保留期限：7天 3. 通知用户：快照保存位置和保留期限 4. 用户确认后才执行删除 ``` ## 输出格式 ``` 🔥 [apollo-autophagy] 自噬清理报告 清理类型：🗑️小自噬 / 🧹中度清理 / 💥大自噬 风险等级：🟢低 / 🟡中 / 🔴高 清理对象： - 损坏/冗余文件：X个 - 过时缓存：X个 - 错误记忆：X条 - 会话上下文：X条 保留内容： - 核心记忆：[保留项摘要] - 进行中任务：[任务名列表] - 用户偏好：[偏好摘要] 清理时间：YYYY-MM-DD HH:MM 快照文件：[文件名，7天后自动删除] ⚠️ 大自噬不可逆，中度自噬部分内容无法恢复 ``` ## 与apollo-renal/apollo-dream的协作边界 | 场景 | 先跑 | 后跑 | |------|------|------| | 上下文略长，需要清理 | apollo-renal | — | | 上下文很长，需要深度整理 | apollo-renal | apollo-dream | | 上下文已损坏，必须删除 | apollo-autophagy | — | | Token > 90%，renal无效 | apollo-autophagy | — | | 用户主动要求重置 | apollo-autophagy | — | **优先级：autophagy > renal > dream** - 如果需要删除，先跑autophagy - 如果需要整理，先跑renal - 如果需要巩固，先跑dream ## 清理日志 所有清理操作必须记录到 `/root/.openclaw/workspace/.autophagy/cleanup-log.md`： ``` ## [YYYY-MM-DD HH:MM] 清理记录 类型：🗑️小 / 🧹中 / 💥大 清理了什么：[清单] 保留了什么：[清单] 触发原因：[用户要求/自动/硬阈值] 快照文件：[文件名] 操作者：[系统/用户确认] ``` ## 验收标准 - [ ] 任何清理前都有用户确认（或硬阈值自动触发） - [ ] 大自噬有双重确认机制 - [ ] 核心记忆和进行中任务在任何情况下都不被删除 - [ ] 清理后有完整日志记录 - [ ] 大自噬前有快照保留机制 - [ ] 快照7天后自动清理 ## 待决策事项 ## 待决策事项（已全部确认 ✅） > ✅ 2026-04-06 袁文同确认 - **Q12 大自噬触发**：只有用户主动要求才触发（不自动触发） - **Q13 错误记忆**：用户预先标记 + AI判断（两者结合） - **Q14 快照期限**：7天 - **Q15 权限**：主Agent和子Agent都可以触发小自噬 ## 实施文件 | 文件 | 作用 | |------|------| | scripts/autophagy/autophagy.sh | 清理脚本（small/medium/large/status） | | .autophagy/cleanup-log.md | 清理日志 | | .autophagy/snapshots/ | 快照目录（7天后自动清理） | | skills/apollo-autophagy/SKILL.md | 本文档 | ## v1 实施规格 ### 清理脚本 ```bash # 查看可清理对象 bash scripts/autophagy/autophagy.sh status # 小自噬（清理临时文件） bash scripts/autophagy/autophagy.sh small # 中自噬（清理错误记忆，需用户确认） bash scripts/autophagy/autophagy.sh medium # 大自噬（清空上下文，需双重确认） bash scripts/autophagy/autophagy.sh large ``` ### 三层清理定义 | 层级 | 触发条件 | 需确认 | 可逆性 | |------|---------|--------|--------| | 小自噬 | 用户说"清理缓存/临时文件" | 否 | 高 | | 中自噬 | 用户指定错误记忆 | 是 | 中 | | 大自噬 | 用户双重确认"确认大自噬" | 双重 | 无 | ### 已确认规则 - **Q12 大自噬触发**：只有用户主动要求，不自动触发 ✅ - **Q13 错误记忆**：用户预先标记 + AI判断 ✅ - **Q14 快照期限**：7天 ✅ - **Q15 权限**：主Agent和子Agent都可以触发小自噬 ✅ ### v1 验收标准 - [x] 小自噬可执行（临时文件清理） - [x] 状态查看可执行 - [ ] 中自噬需要用户确认哪些是错误记忆 - [ ] 大自噬需要双重确认机制 - [ ] 快照7天后自动清理 - [ ] 清理日志记录完整

path: scripts/autophagy/autophagy-check.sh
content: #!/bin/bash
# autophagy-check.sh - 自噬清理检测
# 检查需要清理的内容，提出清理建议

WORKSPACE="/root/.openclaw/workspace"
AUTOPHAGY_STATE="/root/.openclaw/workspace/.autophagy/state.json"
mkdir -p "$(dirname "$AUTOPHAGY_STATE")"

# 检查临时文件
check_temp_files() {
    local temp_dirs="/tmp/openclaw /tmp/.dream /tmp/.heartbeat"
    local total_size=0
    local file_count=0
    
    for dir in $temp_dirs; do
        if [ -d "$dir" ]; then
            local size=$(du -sb "$dir" 2>/dev/null | cut -f1)
            local count=$(find "$dir" -type f 2>/dev/null | wc -l)
            total_size=$((total_size + size))
            file_count=$((file_count + count))
        fi
    done
    
    echo "$file_count|$total_size"
}

# 检查旧日志
check_old_logs() {
    local log_dir="$WORKSPACE/logs"
    local old_count=0
    
    if [ -d "$log_dir" ]; then
        # 找出7天前的日志
        find "$log_dir" -name "*.log" -mtime +7 2>/dev/null | wc -l
    else
        echo 0
    fi
}

# 检查memory文件大小
check_memory_size() {
    local total=0
    if [ -d "$WORKSPACE/memory" ]; then
        total=$(du -sb "$WORKSPACE/memory" 2>/dev/null | cut -f1)
    fi
    echo $total
}

# 检查workflow状态文件
check_workflow_files() {
    local wf_dir="$WORKSPACE/.workflow"
    local stale=0
    
    if [ -d "$wf_dir" ]; then
        # 找出3天前的gate文件
        find "$wf_dir/gate" -name "*.json" -mtime +3 2>/dev/null | wc -l
    else
        echo 0
    fi
}

# 检查trash
check_trash() {
    local trash_dir="$WORKSPACE/.trash"
    if [ -d "$trash_dir" ]; then
        find "$trash_dir" -type f 2>/dev/null | wc -l
    else
        echo 0
    fi
}

# 判断是否需要自噬
should_autophagy() {
    local temp_count=$1
    local memory_size=$2
    local old_logs=$3
    local trash=$4
    
    local score=0
    [ $temp_count -gt 10 ] && ((score++))
    [ $memory_size -gt 10485760 ] && ((score++))  # >10MB
    [ $old_logs -gt 0 ] && ((score++))
    [ $trash -gt 5 ] && ((score++))
    
    echo $score
}

# 获取清理建议
get_cleanup_suggestion() {
    local temp_count=$1
    local memory_size=$2
    local old_logs=$3
    local trash=$4
    
    local suggestions=()
    
    [ $temp_count -gt 10 ] && suggestions+=("清理临时文件($temp_count个)")
    [ $memory_size -gt 10485760 ] && suggestions+=("压缩memory文件")
    [ $old_logs -gt 0 ] && suggestions+=("删除旧日志($old_logs个)")
    [ $trash -gt 5 ] && suggestions+=("清空回收站($trash个)")
    
    if [ ${#suggestions[@]} -eq 0 ]; then
        echo "无需清理"
    else
        IFS='|' && echo "${suggestions[*]}"
    fi
}

# 格式化大小
format_size() {
    local bytes=$1
    if [ $bytes -lt 1024 ]; then
        echo "${bytes}B"
    elif [ $bytes -lt 1048576 ]; then
        echo "$((bytes/1024))KB"
    elif [ $bytes -lt 1073741824 ]; then
        echo "$((bytes/1048576))MB"
    else
        echo "$((bytes/1073741824))GB"
    fi
}

# 主函数
main() {
    local temp_info=$(check_temp_files)
    local temp_count=$(echo "$temp_info" | cut -d'|' -f1)
    local temp_size=$(echo "$temp_info" | cut -d'|' -f2)
    local memory_size=$(check_memory_size)
    local old_logs=$(check_old_logs)
    local trash=$(check_trash)
    local score=$(should_autophagy $temp_count $memory_size $old_logs $trash)
    local suggestions=$(get_cleanup_suggestion $temp_count $memory_size $old_logs $trash)
    
    echo "🔄 [apollo-autophagy] 自噬清理报告"
    echo ""
    echo "当前状态："
    echo "  - 临时文件：${temp_count}个 ($(format_size $temp_size))"
    echo "  - Memory目录：$(format_size $memory_size)"
    echo "  - 旧日志(>7天)：${old_logs}个"
    echo "  - 回收站：${trash}个"
    echo ""
    
    if [ $score -eq 0 ]; then
        echo "🟢 系统状态正常"
        echo "无需自噬清理"
    elif [ $score -le 2 ]; then
        echo "🟡 建议轻量清理"
        echo "清理建议：$suggestions"
    else
        echo "🔴 需要深度清理"
        echo "清理建议：$suggestions"
    fi
    
    # 保存状态
    cat > "$AUTOPHAGY_STATE" << EOF
{
    "temp_count": $temp_count,
    "temp_size": $temp_size,
    "memory_size": $memory_size,
    "old_logs": $old_logs,
    "trash": $trash,
    "score": $score,
    "needs_cleanup": $([ $score -ge 2 ] && echo "true" || echo "false"),
    "suggestions": "$suggestions",
    "checked_at": "$(date -Iseconds)"
}
EOF
}

main


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)