Install
openclaw skills install @lisong2003-lgtm/memory-orchestrator长对话记忆编排技能。负责会话开始时的记忆检索、自动监测每个对话框的对话轮数,即将达到阈值(提前 1 轮)或上下文变模糊时提醒开新对话;负责恢复包生成、checkpoint、历史压缩(ctxcompress)、会话结束归档。触发词:“总结/压缩/恢复/交接/开新对话/checkpoint”。
openclaw skills install @lisong2003-lgtm/memory-orchestrator长对话记忆管理的中枢。目标是:上下文不失控、新对话 5 行内接续、关键决定不丢失。
$CODEX_HOME/memory/state.json$CODEX_HOME/skills/memory-orchestrator/scripts/state.py set active_project=<项目名>
$CODEX_HOME/skills/memory-orchestrator/scripts/state.py bump active_project=<项目名> # 每轮+1
$CODEX_HOME/skills/memory-orchestrator/scripts/state.py get
turn_count >= 8(用户已确认 12 轮太长);turn_count >= 7 时输出一次“再 1 轮将达到阈值,请准备开新对话”(本提醒只出现一次,不重复刷屏);turn_count >= 8 时触发强制提醒:先生成恢复包,再引导开新对话;turn_count 核对,缺省按本规则执行。last_checkpoint 和 last_action 写回 state.json。memory_recall(query=项目名或主题, intent=resume, limit=5);也可 memory_search(query=..., limit=5) / memory_probe(entity=<项目名>)。memory_add(entity=<项目名>, property=next_step|decision|checkpoint, value=一句话, tags="checkpoint|archive", content=长文本可选)。memory_decision_add(title, context, decision, rationale)。memory_task_set(task_name=...);完成:memory_task_done(result=...)。memory_restore_context(prompt=最近问题, max_chars=...)。memory_health() / memory_stats()。entity 一律用项目名;tags 带项目名,避免串记。cp-memory-mcp(v1.30.0)tools/list 实测结果。scripts/monitor_dialogs.py;纯 stdlib(Python 3.9+ / Windows 兼容),要求 Python 能 read 会话目录。$CODEX_HOME/$OPENAI_CODEX_HOME 生效,否则 $CODEX_HOME(macOS/Linux)或 %USERPROFILE%\.codex(Windows,Path.home() 自动处理)。<Codex Home>/sessions;可用 --sessions-dir 覆盖(如 Windows 安装到其他位置时显式传入)。<Codex Home>/sqlite/codex-dev.db;可用 --catalog-db 覆盖。数据库不可用时降级为仅报告 rollout 文件名/目录。rollout-*.jsonl 中 event_msg/item_completed 且 item.type == "UserMessage"(按 turn_id 去重)。Windows/Linux CLI 如无该类型事件,则退化为统计文件内 role=user 的消息。>=8 超限;提前提醒线 >=7;可 --threshold / --warn-at 覆盖;--days 只扫描最近 N 天。--write-state 会把扫描快照写入 state.json 的 index(兼容原有 active_project/turn_count)。python3 <skill>/scripts/monitor_dialogs.py --days 14 --write-state,仅在状态变化时汇报(本机已有同名自动化)。schtasks /create /tn "MemoryOrchestratorMonitor" /sc daily /st 09:30 /tr "python <skill路径>\scripts\monitor_dialogs.py --days 14 --write-state"),系统用户登录即开始。crontab -e 加 30 9 * * * python3 <skill-path>/scripts/monitor_dialogs.py --days 30 --write-state。导出可压缩源(仅当前项目/会话,禁止默认扫全部日志):先用 state.py get 确认 active_project,再用 scripts/export_ctx.py 指定该项目 rollout 文件转成 messages 数组;压缩前向用户说明将读取的范围与用途。
export ACT="<项目标识>" # 必须先经 state.py get 与用户确认
export OUT="${TMPDIR:-/tmp}/memorch-$$/chat.json" # 私有临时目录
mkdir -p "$(dirname "$OUT")"
python3 $CODEX_HOME/skills/memory-orchestrator/scripts/export_ctx.py --project "$ACT" -i "$HOME/.codex/sessions/**/rollout-*$ACT*.jsonl" -o "$OUT"
ctxcompress --input "$OUT" --stats-only
仅当前 active_project;export_ctx.py 默认拒绝全目录通配,必须显式 --project;临时文件用完即删,原始对话不落入长期记忆。
无法获得对话转储时,按规则手写压缩摘要(5-8 行,见 references/templates.md)。
把 checkpoint 通过 memory_add(...tags="checkpoint") 写入 cp-memory,并同步更新 hot.md 与 state.json。
ctxcompress 是 CLI,只能经 shell 调用,绝不注册为 MCP 工具。
命令形态:
export ACT="<项目标识>" # 与 state.py 的 active_project 一致,先征得用户同意
python3 $CODEX_HOME/skills/memory-orchestrator/scripts/export_ctx.py --project "$ACT" -i "<当前项目 rollout 路径/glob>" -o "$OUT"
ctxcompress --input "$OUT" --ratio 0.3 --format compact --output "$(dirname "$OUT")/compact.txt"
常用参数:--stats-only 看占比;--ratio 0.3-0.5 保守压缩;--no-summarize 只去重。
工具不可用或异常时,降级为 5-8 行手动摘要(同样限定 active_project),降级原因写进交接包,不静默假装压缩。
临时压缩产物用完即删(rm -f "$OUT" "$(dirname "$OUT")/compact.txt"),原始对话不写入长期记忆。
恢复包-<项目名>-<YYYYMMDD>.md。python3 $CODEX_HOME/skills/memory-orchestrator/scripts/recovery.py --add <项目名> <恢复包路径>
$CODEX_HOME/memory/recovery-index.md,新对话先读它定位最近恢复包。references/templates.md;字段:会话信息、目标与已完成、关键决策与依据、下一步、未决/风险、交接对象与验证方式。memory_add(entity=项目名, tags="archive") 或 memory_decision_add)。$CODEX_HOME/memory/hot.md 顶部(只保留最近 1 个项目的最新状态;切换项目前先把旧项目状态写入 cp-memory 防覆盖丢失)。recovery-index.md。turn_count、last_checkpoint 写回 state.json。entity+tags 隔离;hot.md 只做“最近一个任务”的最低保底。$CODEX_HOME/memory/hot.md。