Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
对于 OpenClaw iMessage 部署,请在已登录的 macOS Messages 主机上使用
imsg。如果你的 Gateway 网关运行在 Linux 或 Windows 上,请将 channels.imessage.cliPath 指向一个 SSH 包装脚本,由它在 Mac 上运行 imsg。Gateway 网关停机后的补齐是选择启用的。 启用后(channels.imessage.catchup.enabled: true),Gateway 网关会在下次启动时重放其离线期间(崩溃、重启、Mac 睡眠)落入 chat.db 的入站消息。默认禁用 — 见在 Gateway 网关停机后补齐。关闭 openclaw#78649。imsg rpc,并通过 stdio 上的 JSON-RPC 通信(没有单独的守护进程/端口)。高级操作需要 imsg launch 和成功的私有 API 探测。
私有 API 操作
回复、tapback、效果、附件和群组管理。
配对
iMessage 私信默认使用配对模式。
远程 Mac
当 Gateway 网关未运行在 Messages Mac 上时,使用 SSH 包装脚本。
配置参考
完整的 iMessage 字段参考。
快速设置
- 本地 Mac(快速路径)
- 通过 SSH 访问远程 Mac
要求和权限(macOS)
- 运行
imsg的 Mac 必须已登录 Messages。 - 运行 OpenClaw/
imsg的进程上下文需要完整磁盘访问权限(Messages 数据库访问)。 - 通过 Messages.app 发送消息需要自动化权限。
- 对于高级操作(回应 / 编辑 / 撤回发送 / 线程回复 / 效果 / 群组操作),必须禁用系统完整性保护 — 见下方启用 imsg 私有 API。基础文本和媒体发送/接收不需要它也能工作。
启用 imsg 私有 API
imsg 提供两种运行模式:
- 基础模式(默认,无需更改 SIP):通过
send发送出站文本和媒体、入站 watch/history、聊天列表。这就是全新brew install steipete/tap/imsg加上上方标准 macOS 权限后即可获得的能力。 - 私有 API 模式:
imsg将辅助 dylib 注入Messages.app,以调用内部IMCore函数。这会解锁react、edit、unsend、reply(线程式)、sendWithEffect、renameGroup、setGroupIcon、addParticipant、removeParticipant、leaveGroup,以及输入状态指示和已读回执。
imsg README 明确说明了该要求:
辅助注入技术使用read、typing、launch、由桥接支持的富发送、消息变更和聊天管理等高级功能是选择启用的。它们要求禁用 SIP,并将辅助 dylib 注入Messages.app。当 SIP 启用时,imsg launch会拒绝注入。
imsg 自己的 dylib 来访问 Messages 私有 API。OpenClaw iMessage 路径中没有第三方服务器或 BlueBubbles 运行时。
设置
-
在运行 Messages.app 的 Mac 上安装(或升级)
imsg:imsg status --on输出会报告bridge_version、rpc_methods和每个方法的selectors,因此你可以在开始前查看当前构建支持什么。 -
禁用系统完整性保护。 这与 macOS 版本相关,因为底层 Apple 要求取决于操作系统和硬件:
- macOS 10.13–10.15(Sierra–Catalina): 通过 Terminal 禁用 Library Validation,重启到恢复模式,运行
csrutil disable,再重启。 - macOS 11+(Big Sur 及更高版本),Intel: 恢复模式(或互联网恢复),
csrutil disable,重启。 - macOS 11+,Apple Silicon: 通过电源按钮启动序列进入恢复;在较新的 macOS 版本中,点击 Continue 时按住 Left Shift 键,然后运行
csrutil disable。虚拟机设置遵循单独流程 — 先创建 VM 快照。 - macOS 26 / Tahoe: library-validation 策略和
imagent私有授权检查进一步收紧;imsg可能需要更新构建才能跟上。如果在 macOS 主版本升级后,imsg launch注入或特定selectors开始返回 false,请先检查imsg的发布说明,再假设 SIP 步骤已成功。
imsg launch前,请按照 Apple 针对你的 Mac 的恢复模式流程禁用 SIP。 - macOS 10.13–10.15(Sierra–Catalina): 通过 Terminal 禁用 Library Validation,重启到恢复模式,运行
-
注入辅助程序。 在 SIP 已禁用且 Messages.app 已登录的情况下:
当 SIP 仍启用时,
imsg launch会拒绝注入,因此这也可用来确认第 2 步已生效。 -
从 OpenClaw 验证桥接:
iMessage 条目应报告
works,且imsg status --on | jq '.selectors'应显示retractMessagePart: true,以及你的 macOS 构建暴露的任意编辑 / 输入 / 已读 selectors。actions.ts中的 OpenClaw 插件按方法门控只会公布底层 selector 为true的操作,因此你在智能体工具列表中看到的操作面反映了此主机上的桥接实际能做什么。
openclaw channels status --probe 将渠道报告为 works,但特定操作在分发时抛出 “iMessage <action> requires the imsg private API bridge”,请再次运行 imsg launch — 辅助程序可能会脱落(Messages.app 重启、操作系统更新等),而缓存的 available: true 状态会持续公布操作,直到下一次探测刷新。
当你无法禁用 SIP 时
如果禁用 SIP 对你的威胁模型不可接受:imsg会回退到基础模式 — 仅支持文本 + 媒体 + 接收。- OpenClaw 插件仍会公布文本/媒体发送和入站监控;它只是会从操作面隐藏
react、edit、unsend、reply、sendWithEffect和群组操作(根据按方法能力门控)。 - 你可以为 iMessage 工作负载运行一台单独的非 Apple-Silicon Mac(或专用机器人 Mac)并关闭 SIP,同时在你的主要设备上保持 SIP 启用。见下方专用机器人 macOS 用户(单独的 iMessage 身份)。
访问控制和路由
- 私信策略
- 群组策略 + 提及
- 会话和确定性回复
channels.imessage.dmPolicy 控制直接消息:pairing(默认)allowlistopen(要求allowFrom包含"*")disabled
channels.imessage.allowFrom。允许列表条目必须标识发送者:handle 或静态发送者访问组(accessGroup:<name>)。对 chat_id:*、chat_guid:* 或 chat_identifier:* 等聊天目标使用 channels.imessage.groupAllowFrom;对数字 chat_id 注册表键使用 channels.imessage.groups。ACP 会话绑定
旧版 iMessage 聊天也可以绑定到 ACP 会话。 快速操作流程:- 在私信或允许的群聊中运行
/acp spawn codex --bind here。 - 同一 iMessage 对话中的后续消息会路由到已生成的 ACP 会话。
/new和/reset会在原位重置同一个已绑定 ACP 会话。/acp close会关闭 ACP 会话并移除绑定。
bindings[] 条目配置持久绑定,其中包含 type: "acp" 和 match.channel: "imessage"。
match.peer.id 可以使用:
- 规范化的私信句柄,例如
+15555550123或[email protected] chat_id:<id>(推荐用于稳定的群组绑定)chat_guid:<guid>chat_identifier:<identifier>
部署模式
专用机器人 macOS 用户(独立的 iMessage 身份)
专用机器人 macOS 用户(独立的 iMessage 身份)
使用专用 Apple ID 和 macOS 用户,使机器人流量与你的个人 Messages 配置文件隔离。典型流程:
- 创建/登录专用 macOS 用户。
- 在该用户中使用机器人 Apple ID 登录 Messages。
- 在该用户中安装
imsg。 - 创建 SSH 包装器,让 OpenClaw 能够在该用户上下文中运行
imsg。 - 将
channels.imessage.accounts.<id>.cliPath和.dbPath指向该用户配置文件。
通过 Tailscale 使用远程 Mac(示例)
通过 Tailscale 使用远程 Mac(示例)
常见拓扑:使用 SSH 密钥,让 SSH 和 SCP 都无需交互。
请先确保主机密钥受信任(例如
- Gateway 网关在 Linux/VM 上运行
- iMessage +
imsg在你的 tailnet 中的一台 Mac 上运行 cliPath包装器使用 SSH 运行imsgremoteHost启用 SCP 附件获取
ssh [email protected]),以便填充 known_hosts。多账号模式
多账号模式
iMessage 支持在
channels.imessage.accounts 下进行按账号配置。每个账号都可以覆盖 cliPath、dbPath、allowFrom、groupPolicy、mediaMaxMb、历史记录设置以及附件根路径允许列表等字段。媒体、分块和投递目标
附件和媒体
附件和媒体
- 入站附件摄取默认关闭 —— 设置
channels.imessage.includeAttachments: true,即可将照片、语音备忘录、视频和其他附件转发给智能体。禁用时,仅含附件的 iMessage 会在到达智能体之前被丢弃,并且可能根本不会产生Inbound message日志行。 - 设置
remoteHost时,可以通过 SCP 获取远程附件路径 - 附件路径必须匹配允许的根路径:
channels.imessage.attachmentRoots(本地)channels.imessage.remoteAttachmentRoots(远程 SCP 模式)- 默认根路径模式:
/Users/*/Library/Messages/Attachments
- SCP 使用严格主机密钥检查(
StrictHostKeyChecking=yes) - 出站媒体大小使用
channels.imessage.mediaMaxMb(默认 16 MB)
出站分块
出站分块
- 文本分块限制:
channels.imessage.textChunkLimit(默认 4000) - 分块模式:
channels.imessage.chunkModelength(默认)newline(优先按段落拆分)
寻址格式
寻址格式
首选显式目标:
chat_id:123(推荐用于稳定路由)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...[email protected]
私有 API 操作
当imsg launch 正在运行,并且 openclaw channels status --probe 报告 privateApi.available: true 时,消息工具除了普通文本发送外,还可以使用 iMessage 原生操作。
可用操作
可用操作
- react:添加/移除 iMessage tapback(
messageId、emoji、remove)。支持的 tapback 映射到爱心、喜欢、不喜欢、大笑、强调和疑问。 - reply:向现有消息发送线程回复(
messageId、text或message,以及chatGuid、chatId、chatIdentifier或to)。 - sendWithEffect:使用 iMessage 效果发送文本(
text或message,effect或effectId)。 - edit:在支持的 macOS/私有 API 版本上编辑已发送消息(
messageId、text或newText)。 - unsend:在支持的 macOS/私有 API 版本上撤回已发送消息(
messageId)。 - upload-file:发送媒体/文件(
buffer为 base64,或已注水的media/path/filePath、filename,可选asVoice)。旧版别名:sendAttachment。 - renameGroup、setGroupIcon、addParticipant、removeParticipant、leaveGroup:当当前目标是群组对话时,管理群聊。
消息 ID
消息 ID
入站 iMessage 上下文会在可用时同时包含短
MessageSid 值和完整消息 GUID。短 ID 的作用域限定在最近的内存回复缓存中,并会在使用前根据当前聊天进行检查。如果短 ID 已过期或属于另一个聊天,请使用完整的 MessageSidFull 重试。能力检测
能力检测
只有当缓存的探测状态显示桥接不可用时,OpenClaw 才会隐藏私有 API 操作。如果状态未知,操作会保持可见,并在调度时惰性探测,因此首次操作可以在
imsg launch 之后成功,而无需单独手动刷新状态。已读回执和正在输入
已读回执和正在输入
当私有 API 桥接启动时,已接受的入站聊天会在调度前标记为已读,并在智能体生成期间向发送者显示正在输入气泡。使用以下配置禁用已读标记:早于按方法能力列表的旧版
imsg 构建会静默关闭正在输入/已读门控;OpenClaw 会在每次重启时记录一次性警告,以便归因缺失的回执。入站 tapback
入站 tapback
OpenClaw 订阅 iMessage tapback,并将已接受的反应作为系统事件路由,而不是作为普通消息文本,因此用户 tapback 不会触发普通回复循环。通知模式由
channels.imessage.reactionNotifications 控制:"own"(默认):仅当用户对机器人撰写的消息作出反应时通知。"all":通知来自已授权发送者的所有入站 tapback。"off":忽略入站 tapback。
channels.imessage.accounts.<id>.reactionNotifications。配置写入
iMessage 默认允许由频道发起的配置写入(用于commands.config: true 时的 /config set|unset)。
禁用:
合并拆分发送的私信(同一次输入中的命令 + URL)
当用户同时输入命令和 URL 时 —— 例如Dump https://example.com/article —— Apple 的 Messages 应用会将发送拆分成两条独立的 chat.db 行:
- 一条文本消息(
"Dump")。 - 一个 URL 预览气泡(
"https://..."),并带有 OG 预览图片作为附件。
imsg 引入的。
channels.imessage.coalesceSameSenderDms 会让一个私信选择把连续的同发送者行合并成一个智能体轮次。群组聊天会继续按消息分发,以保留多用户轮次结构。
- 何时启用
- 启用
- 权衡
在以下情况启用:
- 你发布的技能期望在一条消息中收到
command + payload(dump、paste、save、queue 等)。 - 你的用户会把 URL、图片或长内容与命令一起粘贴。
- 你可以接受增加的私信轮次延迟(见下文)。
- 你需要单词私信触发器具备最低命令延迟。
- 你的所有流程都是没有后续载荷的一次性命令。
场景以及智能体看到的内容
| 用户编写 | chat.db 产生 | 关闭标志(默认) | 开启标志 + 2500 ms 窗口 |
|---|---|---|---|
Dump https://example.com(一次发送) | 2 行,相隔约 1 秒 | 两个智能体轮次:“Dump” 单独一轮,然后是 URL | 一个轮次:合并文本 Dump https://example.com |
Save this 📎image.jpg caption(附件 + 文本) | 2 行 | 两个轮次(附件在合并时丢弃) | 一个轮次:保留文本 + 图片 |
/status(独立命令) | 1 行 | 即时分发 | 最多等待一个窗口,然后分发 |
| 单独粘贴 URL | 1 行 | 即时分发 | 即时分发(桶中只有一个条目) |
| 文本 + URL 作为两条有意分开的消息发送,相隔数分钟 | 窗口外 2 行 | 两个轮次 | 两个轮次(两者之间窗口已过期) |
| 快速大量发送(窗口内 >10 条小私信) | N 行 | N 个轮次 | 一个轮次,输出有上限(应用第一条 + 最新条、文本/附件上限) |
| 两个人在群组聊天中输入 | 来自 M 个发送者的 N 行 | M+ 个轮次(每个发送者桶一个) | M+ 个轮次,群组聊天不会被合并 |
Gateway 网关停机后的追赶
当 Gateway 网关离线(崩溃、重启、Mac 休眠、机器关机)时,imsg watch 会在 Gateway 网关恢复后从当前 chat.db 状态继续;默认情况下,间隔期间到达的任何内容都不会被看到。追赶会在下一次启动时重放这些消息,确保智能体不会静默错过入站流量。
追赶功能默认禁用。按渠道启用:
运行方式
每次monitorIMessageProvider 启动执行一轮,顺序为 imsg launch 就绪 → watch.subscribe → performIMessageCatchup → 实时分发循环。追赶本身使用 chats.list + 每个聊天的 messages.history,并通过与 imsg watch 相同的 JSON-RPC 客户端调用。追赶期间到达的任何内容都会照常流经实时分发;现有入站去重缓存会吸收与重放行之间的任何重叠。
每条重放行都会走实时分发路径(evaluateIMessageInbound + dispatchInboundMessage),因此允许列表、群组策略、防抖器、回声缓存和已读回执在重放消息与实时消息上的行为完全一致。
游标和重试语义
追赶会在<openclawStateDir>/imessage/catchup/<account>__<hash>.on 保存按账号划分的游标(OpenClaw 状态目录默认是 ~/.openclaw,可用 OPENCLAW_STATE_DIR 覆盖):
- 每次成功分发后,游标都会前进;当某行的分发抛出异常时,游标会保持不变,下一次启动会从保持的游标重试同一行。
- 当同一个
guid连续抛出异常达到maxFailureRetries次后,追赶会记录一条warn,并强制将游标推进到卡住的消息之后,确保后续启动可以继续前进。 - 已经放弃的 guid 在后续运行中一看到就跳过(不会尝试分发),并计入运行摘要中的
skippedGivenUp。
操作者可见信号
WARN ... capped to perRunLimit 行表示单次启动没有清空全部积压。如果你的间隔经常超过默认的 50 行处理量,请提高 perRunLimit(最大 500)。
何时保持关闭
- Gateway 网关持续运行,并有看门狗自动重启,间隔始终小于几秒,此时默认关闭即可。
- 私信量很低,错过消息也不会改变智能体行为;
firstRunLookbackMinutes初始窗口可能会在首次启用时分发令人意外的旧上下文。
firstRunLookbackMinutes(默认 30 分钟),而不是完整的 maxAgeMinutes 窗口;这样可避免重放启用前的长历史消息。
故障排除
找不到 imsg 或 RPC 不受支持
找不到 imsg 或 RPC 不受支持
验证二进制文件和 RPC 支持:如果探测报告 RPC 不受支持,请更新
imsg。如果私有 API 操作不可用,请在已登录的 macOS 用户会话中运行 imsg launch,然后再次探测。如果 Gateway 网关未在 macOS 上运行,请使用上面的通过 SSH 连接远程 Mac 设置,而不是默认的本地 imsg 路径。Gateway 网关未在 macOS 上运行
Gateway 网关未在 macOS 上运行
默认的 然后运行:
cliPath: "imsg" 必须在已登录 Messages 的 Mac 上运行。在 Linux 或 Windows 上,将 channels.imessage.cliPath 设置为一个包装脚本,用 SSH 连接到那台 Mac 并运行 imsg "$@"。私信被忽略
私信被忽略
检查:
channels.imessage.dmPolicychannels.imessage.allowFrom- 配对审批(
openclaw pairing list imessage)
群组消息被忽略
群组消息被忽略
检查:
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groups允许列表行为- 提及模式配置(
agents.list[].groupChat.mentionPatterns)
远程附件失败
远程附件失败
检查:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- 来自 Gateway 网关主机的 SSH/SCP 密钥认证
- 主机密钥存在于 Gateway 网关主机上的
~/.ssh/known_hosts - 运行 Messages 的 Mac 上远程路径可读
错过了 macOS 权限提示
错过了 macOS 权限提示
在同一用户/会话上下文中的交互式 GUI 终端中重新运行,并批准提示:确认运行 OpenClaw/
imsg 的进程上下文已获得 Full Disk Access + Automation 权限。配置参考指针
相关
- 渠道概览 — 所有支持的渠道
- BlueBubbles removal and the imsg iMessage path — 公告和迁移摘要
- Coming from BlueBubbles — 配置转换表和逐步切换流程
- 配对 — 私信认证和配对流程
- 群组 — 群组聊天行为和提及门控
- 频道路由 — 消息的会话路由
- 安全性 — 访问模型和加固