消息行为
OpenClaw 在智能体看到入站 iMessage 之前会对它们做什么。
合并拆分发送的私信(一条消息中包含命令和 URL)¶
Apple 可能将一条命令及其 URL 预览存储为 chat.db 中不同的物理行。imsg 0.13.1 及更高版本会在 watch、history 或 search 返回消息之前合并这些行,因此 OpenClaw 会收到一条逻辑入站消息,而不会增加特定于渠道的私信延迟。
无需配置 iMessage 合并设置。已弃用的 channels.imessage.coalesceSameSenderDms 键会被 openclaw doctor --fix 移除。当你确实希望跨渠道批量处理快速文本消息时,通用的 messages.inbound 防抖仍然可用。
如果命令加 URL 的发送作为独立的智能体轮次到达,请在 Messages Mac 上更新 imsg:
桥接或网关重启后的入站恢复¶
iMessage 会恢复网关停机期间错过的消息,同时抑制 Apple 在 Push 恢复后可能冲刷的过期“积压炸弹”。默认行为始终开启,基于持久入站和年龄围栏构建。
- 持久重放保护。 在推进恢复游标之前,OpenClaw 会将每个原始行以 Apple GUID 作为事件 ID 记录到共享 SQLite 入站队列中。已完成行会留下约 4 小时的墓碑,最多 10,000 条,因此即使重启后,具有相同 GUID 的重放也会被丢弃。待定行在 dispatch 采用之前保持可恢复。
- 停机恢复。 启动时,监控器会记住最后持久接受的
chat.dbrowid(一个按账户持久化的游标),并将其作为since_rowid传递给imsg watch.subscribe,因此 imsg 会重放尚未记录的行,然后实时跟踪。崩溃前已记录的行会从 SQLite 恢复。重放限制在最近 500 行和最多约 2 小时前的消息内,GUID 墓碑会丢弃任何已处理的内容。 - 过期积压年龄围栏。 位于启动边界之上的行是真正实时的;如果其发送时间比到达时间早约 15 分钟以上,则属于 Push 冲刷积压,会被抑制。重放行(位于边界或边界以下)改用更宽的恢复窗口,因此最近错过的消息会被投递,而古老历史则不会。
恢复在本地和远程 cliPath 设置中均可工作,因为 since_rowid 重放在同一个 imsg RPC 连接上运行。区别在于窗口:当网关可以读取 chat.db(本地)时,它会锚定启动 rowid 边界,限制重放跨度,并投递最多约两小时前的错过消息。通过远程 SSH cliPath 时,它无法读取数据库,因此重放不受限制,并且每一行都使用实时年龄围栏——它仍然会恢复最近错过的消息,并仍然抑制旧积压,只是使用更窄的实时窗口。要在 Messages Mac 上运行网关以获得更宽的恢复窗口。
操作员可见信号¶
被抑制的积压会在默认级别记录,绝不会静默丢弃(recovery 标志显示应用了哪个窗口):
imessage: suppressed stale inbound backlog account=<id> sent=<iso> recovery=<bool> (<N> suppressed since start)
迁移¶
channels.imessage.catchup.* 已弃用——停机恢复是自动的,新设置无需配置。现有配置中的 catchup.enabled: true 仍作为恢复重放窗口的兼容性配置保留。已禁用的 catchup 块(enabled: false 或没有 enabled: true)已退役;openclaw doctor --fix 会移除它们。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw