Documentation Index
Fetch the complete documentation index at: https://docs2.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 指向會在 Mac 上執行 imsg 的 SSH 包裝器。Gateway 停機補接為選擇啟用。 啟用後(channels.imessage.catchup.enabled: true),gateway 會在下次啟動時重播它離線期間(當機、重新啟動、Mac 睡眠)落入 chat.db 的傳入訊息。預設為停用 — 請參閱在 gateway 停機後補接。關閉 openclaw#78649。imsg rpc,並透過 stdio 上的 JSON-RPC 通訊(沒有獨立 daemon/port)。進階動作需要 imsg launch 和成功的私有 API 探測。
私有 API 動作
回覆、tapback、效果、附件與群組管理。
配對
iMessage 私訊預設使用配對模式。
遠端 Mac
當 Gateway 不是在 Messages Mac 上執行時,請使用 SSH 包裝器。
設定參考
完整 iMessage 欄位參考。
快速設定
- 本機 Mac(快速路徑)
- 透過 SSH 使用遠端 Mac
需求與權限(macOS)
- Messages 必須已在執行
imsg的 Mac 上登入。 - 執行 OpenClaw/
imsg的處理程序內容需要完整磁碟存取權(Messages 資料庫存取)。 - 需要自動化權限才能透過 Messages.app 傳送訊息。
- 對於進階動作(react / edit / unsend / 串接回覆 / 效果 / 群組操作),必須停用 System Integrity Protection — 請參閱下方啟用 imsg 私有 API。基本文字與媒體傳送/接收不需要停用。
啟用 imsg 私有 API
imsg 以兩種操作模式提供:
- 基本模式(預設,不需要變更 SIP):透過
send傳出文字與媒體、傳入監看/歷史記錄、聊天清單。這是全新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 --json輸出會報告bridge_version、rpc_methods和每個方法的selectors,因此你可以在開始前查看目前建置支援哪些項目。 -
停用 System Integrity Protection。 這會因 macOS 版本而異,因為底層 Apple 需求取決於作業系統與硬體:
- macOS 10.13–10.15(Sierra–Catalina): 透過 Terminal 停用 Library Validation、重新啟動到 Recovery Mode、執行
csrutil disable、重新啟動。 - macOS 11+(Big Sur 及更新版本),Intel: Recovery Mode(或 Internet Recovery)、
csrutil disable、重新啟動。 - macOS 11+,Apple Silicon: 使用電源按鈕啟動序列進入 Recovery;在近期 macOS 版本中,點選 Continue 時按住 Left Shift 鍵,然後執行
csrutil disable。虛擬機器設定有另一套流程 — 請先建立 VM 快照。 - macOS 26 / Tahoe: library-validation 政策與
imagent私有權利檢查已進一步收緊;imsg可能需要更新的建置才能跟上。如果 macOS 主要版本升級後,imsg launch注入或特定selectors開始回傳 false,請先查看imsg的發行說明,再假設 SIP 步驟已成功。
imsg launch前,請依照 Apple 的 Recovery-mode 流程為你的 Mac 停用 SIP。 - macOS 10.13–10.15(Sierra–Catalina): 透過 Terminal 停用 Library Validation、重新啟動到 Recovery Mode、執行
-
注入輔助程式。 在 SIP 已停用且 Messages.app 已登入時:
當 SIP 仍啟用時,
imsg launch會拒絕注入,因此這也可作為步驟 2 生效的確認。 -
從 OpenClaw 驗證橋接:
iMessage 項目應報告
works,且imsg status --json | jq '.selectors'應顯示retractMessagePart: true,以及你的 macOS 建置公開的任何 edit / typing / read selector。actions.ts中的 OpenClaw Plugin 每方法閘控只會宣告底層 selector 為true的動作,因此你在代理工具清單中看到的動作介面,會反映此主機上的橋接實際能做什麼。
openclaw channels status --probe 報告頻道為 works,但特定動作在派送時拋出「iMessage <action> requires the imsg private API bridge」,請再次執行 imsg launch — 輔助程式可能會脫離(Messages.app 重新啟動、OS 更新等),而快取的 available: true 狀態會持續宣告動作,直到下一次探測刷新。
當你無法停用 SIP 時
如果你的威脅模型無法接受停用 SIP:imsg會退回基本模式 — 僅文字 + 媒體 + 接收。- OpenClaw Plugin 仍會宣告文字/媒體傳送與傳入監控;它只是會從動作介面隱藏
react、edit、unsend、reply、sendWithEffect和群組操作(依每方法能力閘控)。 - 你可以為 iMessage 工作負載執行一台獨立的非 Apple-Silicon Mac(或專用 bot Mac)並關閉 SIP,同時在主要裝置上保持 SIP 啟用。請參閱下方專用 bot 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 工作階段。 快速操作流程:- 在 DM 或允許的群組聊天中執行
/acp spawn codex --bind here。 - 同一個 iMessage 對話中的後續訊息會路由到產生的 ACP 工作階段。
/new和/reset會就地重設同一個已繫結的 ACP 工作階段。/acp close會關閉 ACP 工作階段並移除繫結。
bindings[] 項目支援已設定的持久繫結,其中包含 type: "acp" 和 match.channel: "imessage"。
match.peer.id 可以使用:
- 正規化的 DM handle,例如
+15555550123或user@example.com chat_id:<id>(建議用於穩定的群組繫結)chat_guid:<guid>chat_identifier:<identifier>
部署模式
專用 bot macOS 使用者(獨立的 iMessage 身分)
專用 bot macOS 使用者(獨立的 iMessage 身分)
使用專用 Apple ID 和 macOS 使用者,讓 bot 流量與你的個人 Messages 設定檔隔離。典型流程:
- 建立/登入專用 macOS 使用者。
- 在該使用者中以 bot Apple ID 登入 Messages。
- 在該使用者中安裝
imsg。 - 建立 SSH wrapper,讓 OpenClaw 可以在該使用者情境中執行
imsg。 - 將
channels.imessage.accounts.<id>.cliPath和.dbPath指向該使用者設定檔。
透過 Tailscale 連線的遠端 Mac(範例)
透過 Tailscale 連線的遠端 Mac(範例)
常見拓撲:使用 SSH 金鑰,讓 SSH 和 SCP 都可非互動式執行。
請先確認主機金鑰已受信任(例如
- Gateway 在 Linux/VM 上執行
- iMessage +
imsg在 tailnet 中的 Mac 上執行 cliPathwrapper 使用 SSH 執行imsgremoteHost啟用 SCP 附件擷取
ssh bot@mac-mini.tailnet-1234.ts.net),讓 known_hosts 已填入。多帳戶模式
多帳戶模式
iMessage 支援
channels.imessage.accounts 下的每帳戶設定。每個帳戶都可以覆寫 cliPath、dbPath、allowFrom、groupPolicy、mediaMaxMb、歷史記錄設定,以及附件根目錄 allowlist 等欄位。媒體、分塊與傳送目標
附件與媒體
附件與媒體
- 傳入附件擷取預設關閉——設定
channels.imessage.includeAttachments: true,即可將照片、語音備忘錄、影片和其他附件轉送給 agent。停用時,只有附件的 iMessage 會在抵達 agent 前被丟棄,而且可能完全不產生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...user@example.com
私有 API 動作
當imsg launch 正在執行,且 openclaw channels status --probe 回報 privateApi.available: true 時,message tool 除了一般文字傳送外,也可以使用 iMessage 原生動作。
可用動作
可用動作
- react:新增/移除 iMessage tapback(
messageId、emoji、remove)。支援的 tapback 對應到 love、like、dislike、laugh、emphasize 和 question。 - 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:傳送媒體/檔案(base64 格式的
buffer,或已水合的media/path/filePath、filename,選用asVoice)。舊版別名:sendAttachment。 - renameGroup、setGroupIcon、addParticipant、removeParticipant、leaveGroup:在目前目標是群組對話時管理群組聊天。
訊息 ID
訊息 ID
傳入 iMessage 情境會在可用時同時包含短
MessageSid 值與完整訊息 GUID。短 ID 只限於近期的記憶體內回覆快取範圍,並且使用前會檢查是否屬於目前聊天。如果短 ID 已過期或屬於另一個聊天,請以完整 MessageSidFull 重試。能力偵測
能力偵測
OpenClaw 只有在快取的探測狀態表示橋接器不可用時,才會隱藏私有 API 動作。如果狀態未知,動作會維持可見並延遲觸發 dispatch probe,讓第一個動作可以在
imsg launch 後成功,而不需要另外手動重新整理狀態。已讀回條與輸入中狀態
已讀回條與輸入中狀態
私有 API 橋接器啟動時,接受的傳入聊天會在 dispatch 前標記為已讀,並在 agent 產生內容時向寄件者顯示輸入中泡泡。使用以下設定停用已讀標記:早於每方法能力清單的舊版
imsg 建置會靜默關閉輸入中/已讀閘控;OpenClaw 會在每次重新啟動時記錄一次性警告,讓缺少回條的原因可追溯。傳入 tapback
傳入 tapback
OpenClaw 會訂閱 iMessage tapback,並將接受的反應路由為系統事件,而不是一般訊息文字,因此使用者的 tapback 不會觸發普通回覆迴圈。通知模式由
channels.imessage.reactionNotifications 控制:"own"(預設):只有在使用者對 bot 撰寫的訊息做出反應時通知。"all":針對來自已授權寄件者的所有傳入 tapback 發出通知。"off":忽略傳入 tapback。
channels.imessage.accounts.<id>.reactionNotifications。設定寫入
iMessage 預設允許由 channel 發起的設定寫入(當commands.config: true 時供 /config set|unset 使用)。
停用:
合併分割傳送的 DM(同一次撰寫中的命令 + URL)
當使用者同時輸入命令與 URL,例如Dump https://example.com/article,Apple 的 Messages app 會將傳送拆成兩筆獨立的 chat.db 列:
- 文字訊息(
"Dump")。 - 帶有 OG 預覽圖片作為附件的 URL 預覽泡泡(
"https://...")。
imsg 引入的行為。
channels.imessage.coalesceSameSenderDms 會讓 DM 選擇加入,把連續的同一寄件者列合併成單一代理回合。群組聊天會繼續逐訊息分派,以保留多使用者回合結構。
- 何時啟用
- 啟用
- 取捨
在下列情況啟用:
- 你提供的 Skills 預期
command + payload會在同一則訊息中(dump、paste、save、queue 等)。 - 你的使用者會把 URL、圖片或長內容與命令一起貼上。
- 你可以接受增加的 DM 回合延遲(見下方)。
- 你需要單字 DM 觸發器的最低命令延遲。
- 你的所有流程都是沒有承載後續內容的一次性命令。
情境與代理看到的內容
| 使用者撰寫內容 | 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 列 | 即時分派 | 即時分派(bucket 中只有一個項目) |
| 文字 + URL 分成兩則刻意獨立的訊息傳送,相隔數分鐘 | 2 列,超出視窗 | 兩個回合 | 兩個回合(視窗在其間到期) |
| 快速大量傳送(視窗內 >10 則小型 DM) | N 列 | N 個回合 | 一個回合,有界限的輸出(第一筆 + 最新幾筆,套用文字/附件上限) |
| 兩個人在群組聊天中輸入 | 來自 M 位寄件者的 N 列 | M+ 個回合(每個寄件者 bucket 一個) | M+ 個回合 — 群組聊天不會被合併 |
Gateway 停機後補抓
當 Gateway 離線(當機、重新啟動、Mac 睡眠、機器關機)時,imsg watch 會在 Gateway 恢復後,從目前的 chat.db 狀態繼續;預設情況下,間隔期間抵達的任何內容都不會被看見。補抓會在下次啟動時重播這些訊息,讓代理不會默默錯過傳入流量。
補抓預設為停用。請依 channel 啟用:
執行方式
每次monitorIMessageProvider 啟動時執行一次,順序為 imsg launch 就緒 → watch.subscribe → performIMessageCatchup → 即時分派迴圈。補抓本身會透過 imsg watch 使用的同一個 JSON-RPC 用戶端,對 chats.list + 每個聊天的 messages.history 執行操作。補抓過程中抵達的任何內容都會照常經由即時分派流程;既有的傳入去重複快取會吸收與重播列的任何重疊。
每個重播列都會送入即時分派路徑(evaluateIMessageInbound + dispatchInboundMessage),因此 allowlist、群組政策、防抖器、echo 快取與讀取回條,在重播與即時訊息上的行為完全相同。
游標與重試語意
補抓會在<openclawStateDir>/imessage/catchup/<account>__<hash>.json 保留每個帳號的游標(OpenClaw 狀態目錄預設為 ~/.openclaw,可用 OPENCLAW_STATE_DIR 覆寫):
- 游標會在每次成功分派時前進;當某列的分派拋出錯誤時會保持不動,下一次啟動會從保留的游標重試同一列。
- 對同一個
guid連續拋出maxFailureRetries次後,補抓會記錄warn,並強制把游標前進到卡住的訊息之後,讓後續啟動能繼續進行。 - 已放棄的 guid 在後續執行時一看到就會跳過(不嘗試分派),並在執行摘要中計入
skippedGivenUp。
操作者可見訊號
WARN ... capped to perRunLimit 行代表單次啟動沒有清空完整積壓。如果你的中斷經常超過預設的 50 列處理量,請提高 perRunLimit(最高 500)。
何時保持關閉
- Gateway 持續執行,並有 watchdog 自動重新啟動,且間隔永遠小於幾秒;維持預設關閉即可。
- DM 流量很低,而且漏掉訊息不會改變代理行為;第一次啟用時,
firstRunLookbackMinutes初始視窗可能會分派令人意外的舊情境。
firstRunLookbackMinutes(預設 30 分鐘),而不是完整的 maxAgeMinutes 視窗;這可避免重播一長串啟用前的訊息歷史。
疑難排解
找不到 imsg 或不支援 RPC
找不到 imsg 或不支援 RPC
驗證二進位檔與 RPC 支援:如果 probe 回報不支援 RPC,請更新
imsg。如果私有 API 動作不可用,請在已登入的 macOS 使用者工作階段中執行 imsg launch,然後再次 probe。如果 Gateway 不是在 macOS 上執行,請使用上方的透過 SSH 使用遠端 Mac 設定,而不是預設的本機 imsg 路徑。Gateway 未在 macOS 上執行
Gateway 未在 macOS 上執行
預設的 然後執行:
cliPath: "imsg" 必須在登入 Messages 的 Mac 上執行。在 Linux 或 Windows 上,請將 channels.imessage.cliPath 設為包裝指令碼,讓它 SSH 到該 Mac 並執行 imsg "$@"。DM 被忽略
DM 被忽略
檢查:
channels.imessage.dmPolicychannels.imessage.allowFrom- 配對核准(
openclaw pairing list imessage)
群組訊息被忽略
群組訊息被忽略
檢查:
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groupsallowlist 行為- 提及模式設定(
agents.list[].groupChat.mentionPatterns)
遠端附件失敗
遠端附件失敗
檢查:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- 來自 Gateway 主機的 SSH/SCP 金鑰驗證
- Gateway 主機上的
~/.ssh/known_hosts中存在主機金鑰 - 執行 Messages 的 Mac 上遠端路徑可讀取
錯過 macOS 權限提示
錯過 macOS 權限提示
在相同使用者/工作階段情境中的互動式 GUI 終端機重新執行並核准提示:確認執行 OpenClaw/
imsg 的程序情境已授予完整磁碟存取權 + 自動化權限。設定參考指標
相關
- Channels 概觀 — 所有支援的 channel
- BlueBubbles 移除與 imsg iMessage 路徑 — 公告與遷移摘要
- 從 BlueBubbles 轉移 — 設定轉換表與逐步切換
- 配對 — DM 驗證與配對流程
- 群組 — 群組聊天行為與提及閘控
- Channel Routing — 訊息的工作階段路由
- 安全性 — 存取模型與強化