全渠道会话常青化优化:统一禁用 4 点自动换 Session
本次优化目标:让 OpenClaw 在 QQ / Telegram / Discourse 等全部渠道中,不再因默认每日 4:00 freshness 策略自动切换到新 session,从而支持超长周期任务连续推进。
一、问题背景
在默认配置下,OpenClaw 会按 session reset 策略执行 freshness 判断。若策略为 daily 且 atHour=4,则会在跨过每日 4 点后将会话判为 stale,并分配新的 sessionId。
这会带来两个实际问题:
- 长任务跨天后上下文中断,执行链路被迫切断。
- 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:回滚默认 dailyREADME.md:英文详细说明(路径规则、验证步骤、风险与回滚)
五、关键坑位与修复经验
本次过程中踩到一个典型坑:
- Hook 模块路径必须是 workspace 相对路径。
hooks/no-daily-reset-all.mjs
workspace/hooks/no-daily-reset-all.mjs
错误写法会触发:
Handler module path resolves outside workspaceDir after symlink resolution
因此仓库文档里已明确标注路径规则,并默认推荐“持久配置脚本模式”,减少运行时路径错误概率。
六、验证结论
实测结论:
- 全渠道策略生效后,不再发生 4 点自动换 session。
- 恢复后的历史会话可继续接续执行。
- 网关重启后策略可保持(持久配置)。
如果你也有“跨天任务断上下文”的场景,可以直接用仓库脚本一键接入;需要的话我可以再补一个一键 health-check 脚本,自动检查配置是否回退到 daily。