Skill: hasakyi/session-memory-flush (version 1.0.0)

--- name: session-memory-flush description: 在 OpenClaw session 即将因 idle/reset 释放前，扫描 `openclaw sessions --json` 可见会话，读取 transcript，提炼高价值上下文并写入 workspace memory 文件，降低新 session 的失忆感。用于 main、native subagent、cron、dreaming 等会话的 idle 前摘要回收；当需要安装、验证、调试、交付这个 skill，或需要解释它与 builtin memory / per-agent SQLite index / workspace 共享范围的关系时使用。 --- # session-memory-flush ## 目标 在 OpenClaw session 因 idle 自动释放前，读取当前 session transcript，优先调用 `openclaw.json` 中 `agents.defaults.model.primary` 对应提供者做 LLM 摘要，并把值得后续继续工作的上下文写入短期记忆文件。 默认写入 `~/.openclaw/workspace/memory/YYYY-MM-DD.md`；也可用 `SESSION_MEMORY_OUTPUT_DIR` 或 `openclaw.json > sessionMemoryFlush.outputDir` 覆盖输出目录。 ## 能保证什么，不能保证什么 ### 这个 skill 能保证的 - 扫描 `openclaw sessions --json` 当前可见的 session - 在 transcript 可定位时，回收 main / native subagent / cron / dreaming 等 session 的摘要 - 当前版本会按 `session.agentId` 感知 transcript 与模型配置，不再把所有 session 偷偷当成 `main` - 摘要写入 memory markdown，供**共享同一 workspace / 同一记忆文件加载链路**的新 session 继续读取 ### 这个 skill 不能单独保证的 - **不能保证不同 agentId 天然共享 builtin memory** - OpenClaw builtin memory index 是 **per-agent SQLite database**，路径类似 `~/.openclaw/memory/<agentId>.sqlite` - 所以“其他 agent 也一样”是否成立，取决于它们是否共享： - 同一 workspace - 同一 `memory/*.md` 读取链路 - 同一 memory search / index 配置范围 - 如果是完全独立的 agentId / workspace，这个 skill 只能保证“成功 flush 到某个 memory 文件”，不能替 OpenClaw 保证“所有 agent 后续都会天然读到同一份记忆” ## 当前环境如何判断 如果 `openclaw sessions --json` 里看到的 session 都是同一个 `agentId`（比如全是 `main`），那你的实际运行效果通常可以近似理解为： - main session：可以受益 - native subagent：通常也可以受益 - dreaming / cron：只要 transcript 可见，也可以被回收 但这依然是因为它们**实际落在同一个 agent scope**，不是因为这个 skill 神奇地跨 agent 统一了 builtin memory。 ## 不处理的场景 - `/new` - `/reset` - 用户明确要求清空上下文 这些场景视为用户主动重置，不做旧会话回收。 ## 处理的场景 - 私聊超过 idle 阈值前 - 群聊超过 idle 阈值前 - 运维手动指定 sessionId 强制 flush ## 摘要输出格式 ```markdown ## YYYY-MM-DD HH:mm 会话摘要 来源：agent=<agentId> / channel / type / sessionId=xxx - 本轮目标： - 已完成事项： - 重要决策： - 用户偏好： - 待办事项： - 风险和未完成上下文： ``` ## 摘要规则 - 不保留完整聊天原文 - 不写临时寒暄 - 只保留后续任务真正需要的信息 - 单个 session 摘要控制在 300-800 字 - 敏感信息按公司安全规则脱敏 - 去重键按 `agentId:sessionId` 记录，避免不同 agent 误判为同一条 session - LLM 调用失败时，允许降级为本地规则摘要，保证任务不中断 ## 运行方式 定时运行： ```bash bash install.sh ``` 默认行为不再写死在 skill 里，而是按下面顺序取值： 1. 环境变量（最高优先级） 2. `openclaw.json > sessionMemoryFlush` 3. OpenClaw 自身的 `openclaw.json > session.reset/session.resetByType` 4. 最后才回退到保底值 其中： - 私聊 idle 优先复用 `session.resetByType.direct.idleMinutes` - 群聊 idle 优先复用 `session.resetByType.group.idleMinutes` - 轮询频率优先读 `sessionMemoryFlush.timerMinutes` - scan window 优先读 `sessionMemoryFlush.scanWindowMinutes` 推荐在 `openclaw.json` 里显式加一段： ```json { "sessionMemoryFlush": { "timerMinutes": 1, "idleMinutes": { "direct": 5, "group": 30 }, "scanWindowMinutes": { "direct": 1, "group": 5 }, "outputDir": "$HOME/.openclaw/workspace/memory" } } ``` 仍可通过环境变量覆盖： ```bash SESSION_MEMORY_TIMER_MINUTES=1 \ SESSION_MEMORY_DM_IDLE_MINUTES=5 \ SESSION_MEMORY_GROUP_IDLE_MINUTES=30 \ SESSION_MEMORY_SCAN_WINDOW_DM=1 \ SESSION_MEMORY_SCAN_WINDOW_GROUP=5 \ SESSION_MEMORY_OUTPUT_DIR="$HOME/.openclaw/workspace/memory" \ bash install.sh ``` 如果什么都不传，`install.sh` 会直接读 `~/.openclaw/openclaw.json` 生成 timer/service。 手动试跑： ```bash python3 watcher.py --once --dry-run ``` 强制处理指定 session： ```bash python3 watcher.py --once --force-session <sessionId> ``` ## 交付建议 ## 安全与隐私边界 - 发布前应保持 `state/flushed_sessions.json` 为空状态：`{"flushed_sessions": {}}`。 - 不要随 skill 一起发布真实的 `openclaw.json`、session `jsonl`、memory markdown、SQLite 数据库、日志、缓存目录或任何本地运行产物。 - 该 skill 会读取本机 OpenClaw session transcript，并优先使用当前用户 `openclaw.json` 中配置的模型提供商生成摘要；这意味着 transcript 可能会发送给用户自己配置的 LLM provider。 - `watcher.py` 只在运行时读取本机 `openclaw.json` 或环境变量中的 API key 用于请求模型，不会把 API key 写入 `state`、memory markdown 或日志。 - 如果部署环境不允许 transcript 出网，应通过内网模型、专用 `SESSION_MEMORY_LLM_*` 配置，或依赖本地规则摘要兜底。 如果要做成更稳的标准交付，建议把外部描述统一写成下面这句： > 该 skill 会在 session 即将 idle/reset 释放前，把 transcript 摘要写入 memory 文件，降低后续新 session 的失忆感；它对当前 `openclaw sessions --json` 可见的 session 普遍适用，但不同 `agentId` 是否能共享后续记忆效果，仍取决于 workspace、memory 文件加载链路以及 builtin memory 的 per-agent 索引边界。


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