Das gebündelteDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
imessage-Plugin erreicht jetzt dieselbe private API-Oberfläche wie BlueBubbles (react, edit, unsend, reply, sendWithEffect, Gruppenverwaltung, Anhänge), indem es steipete/imsg über JSON-RPC ansteuert. Wenn Sie bereits einen Mac mit installiertem imsg betreiben, können Sie den BlueBubbles-Server entfernen und das Plugin direkt mit Messages.app sprechen lassen.
Die Unterstützung für BlueBubbles wurde entfernt. OpenClaw unterstützt iMessage nur über imsg. Diese Anleitung dient der Migration alter channels.bluebubbles-Konfigurationen zu channels.imessage; es gibt keinen anderen unterstützten Migrationspfad.
Wann diese Migration sinnvoll ist
- Sie betreiben
imsgbereits auf demselben Mac (oder auf einem per SSH erreichbaren Mac), auf dem Messages.app angemeldet ist. - Sie möchten eine Komponente weniger betreiben: keinen separaten BlueBubbles-Server, keinen zu authentifizierenden REST-Endpunkt, keine Webhook-Verkabelung. Eine einzelne CLI-Binärdatei statt Server + Client-App + Hilfsprogramm.
- Sie verwenden eine unterstützte macOS- /
imsg-Version, bei der die private API-Prüfungavailable: truemeldet.
Was imsg macht
imsg ist eine lokale macOS-CLI für Messages. OpenClaw startet imsg rpc als Kindprozess und kommuniziert per JSON-RPC über stdin/stdout. Es gibt keinen HTTP-Server, keine Webhook-URL, keinen Hintergrund-Daemon, keinen Launch Agent und keinen freizugebenden Port.
- Lesezugriffe erfolgen aus
~/Library/Messages/chat.dbüber ein schreibgeschütztes SQLite-Handle. - Live eingehende Nachrichten kommen aus
imsg watch/watch.subscribe, das Dateisystemereignissen vonchat.dbfolgt, mit Polling als Fallback. - Sendungen verwenden die Automatisierung von Messages.app für normale Text- und Dateisendungen.
- Erweiterte Aktionen verwenden
imsg launch, um denimsg-Helper in Messages.app zu injizieren. Dadurch werden Lesebestätigungen, Tippindikatoren, umfangreiche Sendungen, Bearbeiten, Zurückrufen, Thread-Antworten, Tapbacks und Gruppenverwaltung freigeschaltet. - Linux-Builds können eine kopierte
chat.dbuntersuchen, aber nicht senden, die Live-Mac-Datenbank überwachen oder Messages.app ansteuern. Führen Sie für OpenClaw iMessageimsgauf dem angemeldeten Mac aus oder über einen SSH-Wrapper zu diesem Mac.
Bevor Sie beginnen
-
Installieren Sie
imsgauf dem Mac, auf dem Messages.app läuft:Wennimsg chatsmitunable to open database file, leerer Ausgabe oderauthorization deniedfehlschlägt, erteilen Sie dem Terminal, Editor, Node-Prozess, Gateway-Dienst oder SSH-Elternprozess, derimsgstartet, vollständigen Festplattenzugriff und öffnen Sie diesen Elternprozess anschließend erneut. -
Prüfen Sie die Lese-, Watch-, Sende- und RPC-Oberflächen, bevor Sie die OpenClaw-Konfiguration ändern:
Ersetzen Sie
42durch eine echte Chat-ID ausimsg chats. Das Senden erfordert die Automatisierungsberechtigung für Messages.app. Wenn OpenClaw über SSH ausgeführt wird, führen Sie diese Befehle über denselben SSH-Wrapper oder Benutzerkontext aus, den OpenClaw verwenden wird. -
Aktivieren Sie die private API-Bridge, wenn Sie erweiterte Aktionen benötigen:
imsg launcherfordert, dass SIP deaktiviert ist. Einfaches Senden, Verlauf und Watch funktionieren ohneimsg launch; erweiterte Aktionen nicht. -
Prüfen Sie die Bridge über OpenClaw:
Sie möchten
imessage.privateApi.available: true. Wennfalsegemeldet wird, beheben Sie das zuerst, siehe Capability-Erkennung. -
Sichern Sie Ihre Konfiguration:
Konfigurationsübersetzung
iMessage und BlueBubbles teilen sich viele Einstellungen auf Channel-Ebene. Die Schlüssel, die sich ändern, betreffen hauptsächlich den Transport (REST-Server statt lokaler CLI). Verhaltensschlüssel (dmPolicy, groupPolicy, allowFrom usw.) behalten dieselbe Bedeutung.
| BlueBubbles | gebündeltes iMessage | Hinweise |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Gleiche Semantik. |
channels.bluebubbles.serverUrl | (entfernt) | Kein REST-Server — das Plugin startet imsg rpc über stdio. |
channels.bluebubbles.password | (entfernt) | Keine Webhook-Authentifizierung erforderlich. |
| (implizit) | channels.imessage.cliPath | Pfad zu imsg (Standardwert imsg); verwenden Sie für SSH ein Wrapper-Skript. |
| (implizit) | channels.imessage.dbPath | Optionale Messages.app-chat.db-Überschreibung; wird automatisch erkannt, wenn ausgelassen. |
| (implizit) | channels.imessage.remoteHost | host oder user@host — nur erforderlich, wenn cliPath ein SSH-Wrapper ist und Sie SCP-Anhangsabrufe wünschen. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Gleiche Werte (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Kopplungsgenehmigungen werden per Handle übernommen, nicht per Token. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Gleiche Werte (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Gleich. |
channels.bluebubbles.groups | channels.imessage.groups | Kopieren Sie dies unverändert, einschließlich eines etwaigen groups: { "*": { ... } }-Wildcard-Eintrags. Pro Gruppe werden requireMention, tools, toolsBySender übernommen. Mit groupPolicy: "allowlist" verwirft ein leerer oder fehlender groups-Block stillschweigend jede Gruppennachricht — siehe unten „Stolperfalle Gruppenregistrierung“. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Standardwert true. Beim gebündelten Plugin wird dies nur ausgelöst, wenn die private API-Prüfung aktiv ist. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Gleiche Form, ebenfalls standardmäßig deaktiviert. Wenn bei Ihnen Anhänge über BlueBubbles liefen, müssen Sie dies im iMessage-Block explizit erneut setzen — es wird nicht implizit übernommen, und eingehende Fotos/Medien werden stillschweigend verworfen, ohne Inbound message-Protokollzeile, bis Sie dies tun. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Lokale Root-Pfade; gleiche Wildcard-Regeln. |
| (N/Z) | channels.imessage.remoteAttachmentRoots | Wird nur verwendet, wenn remoteHost für SCP-Abrufe gesetzt ist. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Standardwert 16 MB bei iMessage (BlueBubbles-Standardwert war 8 MB). Setzen Sie dies explizit, wenn Sie die niedrigere Grenze beibehalten möchten. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Standardwert 4000 bei beiden. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | Gleiches Opt-in. Nur für DMs — Gruppenchats behalten auf beiden Channels die sofortige Zustellung pro Nachricht. Erweitert den standardmäßigen eingehenden Debounce auf 2500 ms, wenn ohne explizites messages.inbound.byChannel.imessage aktiviert. Siehe iMessage-Dokumentation § Zusammenführen aufgeteilter Sende-DMs. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (N/Z) | iMessage liest Anzeigenamen von Absendern bereits aus chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Aktionsspezifische Schalter: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) lassen sich eins zu eins nach channels.imessage.accounts.* übertragen.
Stolperfalle Gruppenregistrierung
Das gebündelte iMessage-Plugin führt zwei separate Gruppen-Allowlist-Prüfungen direkt hintereinander aus. Beide müssen bestehen, damit eine Gruppennachricht den Agenten erreicht:- Absender-/Chat-Ziel-Allowlist (
channels.imessage.groupAllowFrom) — wird vonisAllowedIMessageSendergeprüft. Gleicht eingehende Nachrichten anhand von Absender-Handle,chat_guid,chat_identifieroderchat_idab. Gleiche Form wie BlueBubbles. - Gruppenregistrierung (
channels.imessage.groups) — wird vonresolveChannelGroupPolicyausinbound-processing.ts:199geprüft. MitgroupPolicy: "allowlist"erfordert diese Prüfung entweder:- einen
groups: { "*": { ... } }-Wildcard-Eintrag (setztallowAll = true), oder - einen expliziten Eintrag pro
chat_iduntergroups.
- einen
warn-Ebene aus, sodass dies bei der Standard-Protokollebene nicht mehr stillschweigend geschieht:
- Ein einmaliges
warnpro Account beim Start, wenngroupPolicy: "allowlist"gesetzt ist, aberchannels.imessage.groupsleer ist (kein"*"-Wildcard, keine Einträge prochat_id) — wird ausgelöst, bevor Nachrichten eintreffen. - Ein einmaliges
warnprochat_id, wenn eine bestimmte Gruppe zur Laufzeit erstmals verworfen wird, mit Nennung der chat_id und des exakten Schlüssels, der zugroupshinzugefügt werden muss, um sie zuzulassen.
groupAllowFrom und groupPolicy, überspringen aber den groups-Block, weil BlueBubbles’ groups: { "*": { "requireMention": true } } wie eine unabhängige Erwähnungseinstellung aussieht. Tatsächlich ist er für die Registrierungsprüfung tragend.
Die minimale Konfiguration, damit Gruppennachrichten nach groupPolicy: "allowlist" weiter fließen:
requireMention: true unter * ist unproblematisch, wenn keine Erwähnungsmuster konfiguriert sind: Die Runtime setzt canDetectMention = false und bricht das Verwerfen wegen fehlender Erwähnung bei inbound-processing.ts:512 frühzeitig ab. Wenn Erwähnungsmuster konfiguriert sind (agents.list[].groupChat.mentionPatterns), funktioniert es wie erwartet.
Wenn die Gateway-Logs imessage: dropping group message from chat_id=<id> oder die Startzeile imessage: groupPolicy="allowlist" but channels.imessage.groups is empty anzeigen, verwirft Gate 2 die Nachricht — fügen Sie den groups-Block hinzu.
Schritt für Schritt
-
Fügen Sie neben dem vorhandenen BlueBubbles-Block einen iMessage-Block hinzu. Behalten Sie den alten Block nur als Kopiervorlage, bis der neue Pfad verifiziert ist:
-
Probelauf — starten Sie den Gateway und bestätigen Sie, dass iMessage als fehlerfrei gemeldet wird:
Da
imessage.enabledweiterhinfalseist, wird noch kein eingehender iMessage-Datenverkehr geroutet — aber--probetestet die Bridge, sodass Sie Berechtigungs- oder Installationsprobleme vor der Umstellung erkennen. -
Stellen Sie um. Entfernen Sie die BlueBubbles-Konfiguration und aktivieren Sie iMessage in einer einzigen Konfigurationsänderung:
Starten Sie den Gateway neu. Eingehender iMessage-Datenverkehr läuft nun über das gebündelte Plugin.
- Verifizieren Sie DMs. Senden Sie dem Agent eine Direktnachricht und bestätigen Sie, dass die Antwort ankommt.
-
Verifizieren Sie Gruppen separat. DMs und Gruppen verwenden unterschiedliche Codepfade — ein erfolgreicher DM-Test beweist nicht, dass Gruppen geroutet werden. Senden Sie dem Agent eine Nachricht in einem gekoppelten Gruppenchat und bestätigen Sie, dass die Antwort ankommt. Wenn die Gruppe stumm bleibt (keine Agent-Antwort, kein Fehler), prüfen Sie das Gateway-Log auf
imessage: dropping group message from chat_id=<id>oder die Startzeileimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— beide erscheinen auf dem standardmäßigen Log-Level. Wenn eine davon angezeigt wird, fehlt Ihrgroups-Block oder er ist leer — siehe oben „Group registry footgun“. -
Verifizieren Sie die Aktionsoberfläche — bitten Sie den Agent aus einer gekoppelten DM heraus, zu reagieren, zu bearbeiten, zurückzuziehen, zu antworten, ein Foto zu senden und (in einer Gruppe) die Gruppe umzubenennen bzw. einen Teilnehmer hinzuzufügen oder zu entfernen. Jede Aktion sollte nativ in Messages.app ankommen. Wenn bei einer Aktion „iMessage
<action>requires the imsg private API bridge“ ausgelöst wird, führen Sieimsg launcherneut aus und aktualisieren Siechannels status --probe. -
Entfernen Sie den BlueBubbles-Server und die Konfiguration, sobald iMessage-DMs, Gruppen und Aktionen verifiziert sind. OpenClaw verwendet
channels.bluebubblesnicht.
Aktionsparität auf einen Blick
| Aktion | bisheriges BlueBubbles | gebündeltes iMessage |
|---|---|---|
| Text senden / SMS-Fallback | ✅ | ✅ |
| Medien senden (Foto, Video, Datei, Sprache) | ✅ | ✅ |
Thread-Antwort (reply_to_guid) | ✅ | ✅ (schließt #51892) |
Tapback (react) | ✅ | ✅ |
| Bearbeiten / zurückziehen (Empfänger mit macOS 13+) | ✅ | ✅ |
| Mit Bildschirmeffekt senden | ✅ | ✅ (schließt einen Teil von #9394) |
| Rich Text fett / kursiv / unterstrichen / durchgestrichen | ✅ | ✅ (Typed-Run-Formatierung über attributedBody) |
| Gruppe umbenennen / Gruppensymbol festlegen | ✅ | ✅ |
| Teilnehmer hinzufügen / entfernen, Gruppe verlassen | ✅ | ✅ |
| Lesebestätigungen und Tippindikator | ✅ | ✅ (durch privaten API-Probe geschützt) |
| Zusammenfassen von DMs desselben Absenders | ✅ | ✅ (nur DM; Opt-in über channels.imessage.coalesceSameSenderDms) |
| Nachholen eingehender Nachrichten, die während Gateway-Ausfall empfangen wurden | ✅ (Webhook-Replay + History-Fetch) | ✅ (Opt-in über channels.imessage.catchup.enabled; schließt #78649) |
channels.imessage.catchup.enabled true ist, einen chats.list-Durchlauf plus pro Chat einen messages.history-Durchlauf gegen denselben JSON-RPC-Client aus, den imsg watch verwendet, spielt jede verpasste eingehende Zeile über den Live-Dispatch-Pfad erneut ein (Allowlists, Gruppenrichtlinie, Debouncer, Echo-Cache) und persistiert pro Account einen Cursor, damit spätere Starts dort fortfahren, wo sie aufgehört haben. Siehe Nachholen nach Gateway-Ausfallzeit für die Feinabstimmung.
Pairing, Sitzungen und ACP-Bindings
- Pairing-Genehmigungen werden anhand des Handles übernommen. Sie müssen bekannte Absender nicht erneut genehmigen —
channels.imessage.allowFromerkennt dieselben+15555550123- /user@example.com-Strings, die BlueBubbles verwendet hat. - Sitzungen bleiben pro Agent + Chat abgegrenzt. DMs werden unter dem Standard
session.dmScope=mainin der Hauptsitzung des Agent zusammengeführt; Gruppensitzungen bleiben prochat_idisoliert. Die Sitzungsschlüssel unterscheiden sich (agent:<id>:imessage:group:<chat_id>gegenüber dem BlueBubbles-Äquivalent) — alter Gesprächsverlauf unter BlueBubbles-Sitzungsschlüsseln wird nicht in iMessage-Sitzungen übernommen. - ACP-Bindings mit Verweis auf
match.channel: "bluebubbles"müssen auf"imessage"aktualisiert werden. Die Formen vonmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, reines Handle) sind identisch.
Kein Rollback-Kanal
Es gibt keine unterstützte BlueBubbles-Runtime, zu der Sie zurückwechseln können. Wenn die iMessage-Verifizierung fehlschlägt, setzen Siechannels.imessage.enabled: false, starten Sie den Gateway neu, beheben Sie den imsg-Blocker und wiederholen Sie die Umstellung.
Der Antwort-Cache liegt unter ~/.openclaw/state/imessage/reply-cache.jsonl (Modus 0600, übergeordnetes Verzeichnis 0700). Sie können ihn sicher löschen, wenn Sie einen sauberen Neustart möchten.
Verwandte Themen
- iMessage — vollständige Referenz zum iMessage-Kanal, einschließlich
imsg launch-Einrichtung und Fähigkeitserkennung. /channels/bluebubbles— alte URL, die zu diesem Migrationsleitfaden weiterleitet.- Pairing — DM-Authentifizierung und Pairing-Ablauf.
- Channel-Routing — wie der Gateway einen Kanal für ausgehende Antworten auswählt.