[优化复盘] OpenClaw 全渠道禁用 4 点自动换 Session

全渠道会话常青化优化:统一禁用 4 点自动换 Session

本次优化目标:让 OpenClaw 在 QQ / Telegram / Discourse 等全部渠道中,不再因默认每日 4:00 freshness 策略自动切换到新 session,从而支持超长周期任务连续推进。

一、问题背景

在默认配置下,OpenClaw 会按 session reset 策略执行 freshness 判断。若策略为 daily 且 atHour=4,则会在跨过每日 4 点后将会话判为 stale,并分配新的 sessionId。

这会带来两个实际问题:

  1. 长任务跨天后上下文中断,执行链路被迫切断。
  2. WebUI 侧同一个 sessionKey 下只看到当前索引 sessionId,旧会话看起来像“消失”。

二、这次优化做了什么

采用“全渠道统一策略”而非单插件特判:

  • 将全局 reset policy 改为 idle
  • idleMinutes 设为 52560000(约 100 年)。
  • 清理 type/channel 层覆盖项,避免局部配置把策略改回 daily。

核心结果:

  • 不再触发 4 点 daily rollover。
  • 同一 sessionKey 在跨天后仍可保持上下文连续(只要索引未被人工切换/删除)。

三、为什么不用改 OpenClaw 本体

本次方案基于配置与外部插件仓库落地:

  • 不修改 OpenClaw 核心源码。
  • 通过独立仓库提供可复用脚本:
    • 一键应用全渠道常青策略。
    • 一键回滚到默认 daily 行为。
  • 便于后续复用、审计和迁移。

四、插件仓库

仓库包含:

  • scripts/apply.mjs:应用全渠道常青策略(推荐)
  • scripts/rollback-default-daily.mjs:回滚默认 daily
  • README.md:英文详细说明(路径规则、验证步骤、风险与回滚)

五、关键坑位与修复经验

本次过程中踩到一个典型坑:

  • Hook 模块路径必须是 workspace 相对路径。
  • hooks/no-daily-reset-all.mjs :white_check_mark:
  • workspace/hooks/no-daily-reset-all.mjs :cross_mark:

错误写法会触发:

Handler module path resolves outside workspaceDir after symlink resolution

因此仓库文档里已明确标注路径规则,并默认推荐“持久配置脚本模式”,减少运行时路径错误概率。

六、验证结论

实测结论:

  • 全渠道策略生效后,不再发生 4 点自动换 session。
  • 恢复后的历史会话可继续接续执行。
  • 网关重启后策略可保持(持久配置)。

如果你也有“跨天任务断上下文”的场景,可以直接用仓库脚本一键接入;需要的话我可以再补一个一键 health-check 脚本,自动检查配置是否回退到 daily。