imsg auf einem bei macOS Messages angemeldeten Host. Wenn Ihr Gateway unter Linux oder Windows läuft, setzen Sie channels.imessage.cliPath auf einen SSH-Wrapper, der imsg auf dem Mac ausführt.Eingehende Wiederherstellung erfolgt automatisch. Nach einem Neustart der Bridge oder des Gateways spielt iMessage die Nachrichten erneut ab, die während des Ausfalls verpasst wurden, und unterdrückt die veraltete „Backlog-Bombe“, die Apple nach einer Push-Wiederherstellung ausspülen kann. Dabei wird dedupliziert, sodass nichts zweimal weitergeleitet wird. Es gibt keine Konfiguration zum Aktivieren — siehe Eingehende Wiederherstellung nach einem Neustart der Bridge oder des Gateways.imsg rpc und kommuniziert über JSON-RPC auf stdio (kein separater Daemon/Port). Erweiterte Aktionen erfordern imsg launch und eine erfolgreiche Prüfung der privaten API.
Aktionen der privaten API
Kopplung
Entfernter Mac
Konfigurationsreferenz
Schnelle Einrichtung
- Lokaler Mac (schneller Weg)
- Entfernter Mac über SSH
Anforderungen und Berechtigungen (macOS)
- Messages muss auf dem Mac angemeldet sein, auf dem
imsgläuft. - Vollständiger Festplattenzugriff ist für den Prozesskontext erforderlich, der OpenClaw/
imsgausführt (Zugriff auf die Messages-Datenbank). - Die Automatisierungsberechtigung ist erforderlich, um Nachrichten über Messages.app zu senden.
- Für erweiterte Aktionen (Reagieren / Bearbeiten / Zurückrufen / Thread-Antwort / Effekte / Umfragen / Gruppenoperationen) muss System Integrity Protection deaktiviert sein — siehe unten Die private imsg-API aktivieren. Einfaches Senden/Empfangen von Text und Medien funktioniert ohne diese Änderung.
SSH-Wrapper-Sendevorgänge schlagen mit AppleEvents -1743 fehl
SSH-Wrapper-Sendevorgänge schlagen mit AppleEvents -1743 fehl
channels status --probe bestehen und eingehende Nachrichten verarbeiten, während ausgehende Sendevorgänge weiterhin mit einem AppleEvents-Autorisierungsfehler fehlschlagen:/usr/libexec/sshd-keygen-wrapper statt für imsg oder den lokalen Shell-Prozess aufgezeichnet wird, zeigt macOS für diesen serverseitigen SSH-Client möglicherweise keinen verwendbaren Messages-Schalter an:tccutil reset AppleEvents oder erneute Ausführen von imsg send über denselben SSH-Wrapper weiter fehlschlagen, weil der Prozesskontext, der Messages-Automation benötigt, der SSH-Wrapper ist und nicht eine App, der die UI die Berechtigung gewähren kann.Verwenden Sie stattdessen einen der unterstützten imsg-Prozesskontexte:- Führen Sie das Gateway oder zumindest die
imsg-Bridge in der lokalen Sitzung des angemeldeten Messages-Benutzers aus. - Starten Sie das Gateway mit einem LaunchAgent für diesen Benutzer, nachdem Sie vollständigen Festplattenzugriff und Automation aus derselben Sitzung gewährt haben.
- Wenn Sie die Zwei-Benutzer-SSH-Topologie beibehalten, verifizieren Sie, dass ein echter ausgehender
imsg sendüber den exakten Wrapper erfolgreich ist, bevor Sie den Kanal aktivieren. Wenn dafür keine Automation gewährt werden kann, konfigurieren Sie stattdessen eine Ein-Benutzer-imsg-Einrichtung, statt sich für Sendevorgänge auf den SSH-Wrapper zu verlassen.
Die private imsg-API aktivieren
imsg wird in zwei Betriebsmodi ausgeliefert:
- Basismodus (Standard, keine SIP-Änderungen erforderlich): ausgehender Text und Medien über
send, eingehendes Watch/History, Chatliste. Das erhalten Sie direkt nach einem frischenbrew install steipete/tap/imsgplus den oben genannten Standardberechtigungen von macOS. - Modus mit privater API:
imsginjiziert eine Hilfs-dylib inMessages.app, um interneIMCore-Funktionen aufzurufen. Dadurch werdenreact,edit,unsend,reply(Thread-Antwort),sendWithEffect,pollundpoll-vote(native Messages-Umfragen),renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroupsowie Tippindikatoren und Lesebestätigungen freigeschaltet.
imsg-README beschreibt die Anforderung ausdrücklich:
Erweiterte Funktionen wieDie Hilfs-Injektionstechnik verwendet die eigene dylib vonread,typing,launch, Bridge-gestütztes Rich Send, Nachrichtenmutation und Chatverwaltung sind optional. Sie erfordern, dass SIP deaktiviert ist und eine Hilfs-dylib inMessages.appinjiziert wird.imsg launchverweigert die Injektion, wenn SIP aktiviert ist.
imsg, um private Messages-APIs zu erreichen. Im OpenClaw-iMessage-Pfad gibt es keinen Drittanbieter-Server und keine BlueBubbles-Runtime.
Einrichtung
-
Installieren (oder aktualisieren) Sie
imsgauf dem Mac, auf dem Messages.app läuft:Die Ausgabe vonimsg status --jsonmeldetbridge_version,rpc_methodsund pro Methodeselectors, sodass Sie sehen können, was der aktuelle Build unterstützt, bevor Sie beginnen. -
Deaktivieren Sie System Integrity Protection und (auf modernem macOS) Library Validation. Das Injizieren einer nicht von Apple stammenden Hilfs-dylib in die von Apple signierte
Messages.apperfordert deaktiviertes SIP und gelockerte Library Validation. Der SIP-Schritt im Wiederherstellungsmodus ist macOS-versionsspezifisch:- macOS 10.13-10.15 (Sierra-Catalina): Deaktivieren Sie Library Validation über Terminal, starten Sie in den Wiederherstellungsmodus, führen Sie
csrutil disableaus, starten Sie neu. - macOS 11+ (Big Sur und neuer), Intel: Wiederherstellungsmodus (oder Internet Recovery),
csrutil disable, Neustart. - macOS 11+, Apple Silicon: Startsequenz über die Einschalttaste, um Recovery aufzurufen; halten Sie auf neueren macOS-Versionen die linke Umschalttaste gedrückt, wenn Sie auf Fortfahren klicken, dann
csrutil disable. Setups mit virtuellen Maschinen folgen einem separaten Ablauf, erstellen Sie daher zuerst einen VM-Snapshot.
csrutil disableallein normalerweise nicht aus. Apple erzwingt Library Validation weiterhin gegenMessages.appals Platform Binary, sodass eine ad-hoc-signierte Hilfsbibliothek abgelehnt wird (Library Validation failed: ... platform binary, but mapped file is not), selbst wenn SIP deaktiviert ist. Deaktivieren Sie nach dem Deaktivieren von SIP auch Library Validation und starten Sie neu:macOS 26 (Tahoe), verifiziert auf 26.5.1: Deaktiviertes SIP plus der oben genannteDisableLibraryValidation-Befehl reicht aus, um die Hilfsbibliothek über 26.0 bis 26.5.x hinweg zu injizieren. Es sind keine boot-args erforderlich. Die plist ist der entscheidende Faktor und der häufigste fehlende Schritt, wenn die Injektion auf Tahoe fehlschlägt:- Mit der plist:
imsg launchinjiziert, undimsg statusmeldetadvanced_features: true. - Ohne die plist (auch bei deaktiviertem SIP):
imsg launchschlägt mitFailed to launch: Timeout waiting for Messages.app to initializefehl. AMFI lehnt den ad-hoc-Helper beim Laden ab, daher wird die Bridge nie bereit und der Start läuft in einen Timeout. Dieser Timeout ist das Symptom, auf das die meisten unter Tahoe stoßen, und die Lösung ist die obige plist, nicht etwas Drastischeres.
Messages.appgemappt und die Bridge startet; entfernen Sie die plist und starten Sie neu, dann erzeugtimsg launchden oben genannten Timeout-Fehler, wobei die dylib nicht gemappt ist. Wenn dieimsg launch-Injektion oder bestimmteselectorsnach einem macOS-Upgradefalsezurückgeben, ist diese Prüfung meist die Ursache. Prüfen Sie Ihren SIP- und Library-Validation-Status, bevor Sie annehmen, dass der SIP-Schritt selbst fehlgeschlagen ist. Wenn diese Einstellungen korrekt sind und die Bridge weiterhin nicht injizieren kann, erfassen Sieimsg status --jsonsowie die Ausgabe vonimsg launchund melden Sie dies demimsg-Projekt, statt zusätzliche systemweite Sicherheitskontrollen abzuschwächen. Folgen Sie Apples Recovery-Mode-Ablauf für Ihren Mac, um SIP zu deaktivieren, bevor Sieimsg launchausführen. - macOS 10.13-10.15 (Sierra-Catalina): Deaktivieren Sie Library Validation über Terminal, starten Sie in den Wiederherstellungsmodus, führen Sie
-
Injizieren Sie den Helper. Mit deaktiviertem SIP und angemeldeter Messages.app:
imsg launchverweigert die Injektion, wenn SIP noch aktiviert ist, sodass dies zugleich bestätigt, dass Schritt 2 wirksam war. -
Überprüfen Sie die Bridge aus OpenClaw:
Der iMessage-Eintrag sollte
worksmelden, undimsg status --json | jq '{rpc_methods, selectors}'sollte die von Ihrem macOS-Build bereitgestellten Funktionen anzeigen. Die Erstellung von Umfragen erfordertselectors.pollPayloadMessage; Abstimmungen erfordern sowohlselectors.pollVoteMessageals auch die RPC-Methodepoll.vote. Das OpenClaw Plugin bewirbt nur Aktionen, die vom zwischengespeicherten Probe unterstützt werden, während ein leerer Cache optimistisch bleibt und beim ersten Dispatch prüft.
openclaw channels status --probe den Kanal als works meldet, bestimmte Aktionen aber zur Dispatch-Zeit “iMessage <action> requires the imsg private API bridge” auslösen, führen Sie imsg launch erneut aus — der Helper kann herausfallen (Neustart von Messages.app, OS-Update usw.), und der zwischengespeicherte Status available: true bewirbt weiterhin Aktionen, bis der nächste Probe ihn aktualisiert.
Wenn Sie SIP nicht deaktivieren können
Wenn deaktiviertes SIP für Ihr Bedrohungsmodell nicht akzeptabel ist:imsgfällt auf den Basismodus zurück — nur Text + Medien + Empfang.- Das OpenClaw Plugin bewirbt weiterhin Text-/Medienversand und eingehende Überwachung; es blendet lediglich
react,edit,unsend,reply,sendWithEffectund Gruppenoperationen aus der Aktionsoberfläche aus (gemäß der funktionsbezogenen Capability-Prüfung). - Sie können einen separaten Mac ohne Apple Silicon (oder einen dedizierten Bot-Mac) mit deaktiviertem SIP für die iMessage-Workload betreiben, während SIP auf Ihren primären Geräten aktiviert bleibt. Siehe Dedizierter macOS-Bot-Benutzer (separate iMessage-Identität) unten.
Zugriffskontrolle und Routing
- DM policy
- Group policy + mentions
- Sessions and deterministic replies
channels.imessage.dmPolicy steuert Direktnachrichten:pairing(Standard)allowlistopen(erfordert, dassallowFrom"*"enthält)disabled
channels.imessage.allowFrom.Allowlist-Einträge müssen Absender identifizieren: Handles oder statische Absender-Zugriffsgruppen (accessGroup:<name>). Verwenden Sie channels.imessage.groupAllowFrom für Chat-Ziele wie chat_id:*, chat_guid:* oder chat_identifier:*; verwenden Sie channels.imessage.groups für numerische chat_id-Registryschlüssel.ACP-Konversationsbindungen
Legacy-iMessage-Chats können auch an ACP-Sessions gebunden werden. Schneller Operator-Ablauf:- Führen Sie
/acp spawn codex --bind hereinnerhalb der DM oder des erlaubten Gruppenchats aus. - Zukünftige Nachrichten in derselben iMessage-Konversation werden zur erzeugten ACP-Session geroutet.
/newund/resetsetzen dieselbe gebundene ACP-Session an Ort und Stelle zurück./acp closeschließt die ACP-Session und entfernt die Bindung.
bindings[]-Einträge mit type: "acp" und match.channel: "imessage" unterstützt.
match.peer.id kann Folgendes verwenden:
- normalisierten DM-Handle wie
+15555550123oderuser@example.com chat_id:<id>(empfohlen für stabile Gruppenbindungen)chat_guid:<guid>chat_identifier:<identifier>
Bereitstellungsmuster
Dedicated bot macOS user (separate iMessage identity)
Dedicated bot macOS user (separate iMessage identity)
- Erstellen Sie einen dedizierten macOS-Benutzer oder melden Sie sich damit an.
- Melden Sie sich in diesem Benutzer in Messages mit der Bot-Apple-ID an.
- Installieren Sie
imsgin diesem Benutzer. - Erstellen Sie einen SSH-Wrapper, damit OpenClaw
imsgim Kontext dieses Benutzers ausführen kann. - Verweisen Sie
channels.imessage.accounts.<id>.cliPathund.dbPathauf dieses Benutzerprofil.
Remote Mac over Tailscale (example)
Remote Mac over Tailscale (example)
- Gateway läuft auf Linux/VM
- iMessage +
imsgläuft auf einem Mac in Ihrem Tailnet cliPath-Wrapper verwendet SSH, umimsgauszuführenremoteHostaktiviert SCP-Abrufe von Anhängen
ssh bot@mac-mini.tailnet-1234.ts.net), damit known_hosts befüllt ist.Multi-account pattern
Multi-account pattern
channels.imessage.accounts.Jedes Konto kann Felder wie cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, Verlaufseinstellungen und Allowlists für Anhang-Root-Verzeichnisse überschreiben.Direct-message history
Direct-message history
channels.imessage.dmHistoryLimit, um neue Direktnachrichtensessions mit dem aktuellen dekodierten imsg-Verlauf für diese Konversation zu initialisieren. Verwenden Sie channels.imessage.dms["<sender>"].historyLimit für absenderspezifische Überschreibungen, einschließlich 0, um den Verlauf für einen Absender zu deaktivieren.iMessage-DM-Verlauf wird bei Bedarf von imsg abgerufen. Wenn dmHistoryLimit nicht gesetzt ist, wird die globale DM-Verlaufsinitialisierung deaktiviert, aber ein positiver absenderspezifischer Wert channels.imessage.dms["<sender>"].historyLimit aktiviert die Initialisierung für diesen Absender weiterhin.Medien, Chunking und Zustellziele
Anhänge und Medien
Anhänge und Medien
- Die Verarbeitung eingehender Anhänge ist standardmäßig deaktiviert — setzen Sie
channels.imessage.includeAttachments: true, um Fotos, Sprachmemos, Videos und andere Anhänge an den Agent weiterzuleiten. Ist dies deaktiviert, werden iMessages, die nur Anhänge enthalten, verworfen, bevor sie den Agent erreichen, und erzeugen möglicherweise überhaupt keineInbound message-Protokollzeile. - Remote-Anhangspfade können per SCP abgerufen werden, wenn
remoteHostgesetzt ist. - Anhangspfade müssen zulässigen Wurzeln entsprechen:
channels.imessage.attachmentRoots(lokal)channels.imessage.remoteAttachmentRoots(Remote-SCP-Modus)- Standard-Wurzelmuster:
/Users/*/Library/Messages/Attachments
- SCP verwendet strikte Host-Key-Prüfung (
StrictHostKeyChecking=yes) - Die Größe ausgehender Medien verwendet
channels.imessage.mediaMaxMb(Standard: 16 MB)
Ausgehendes Chunking
Ausgehendes Chunking
- Text-Chunk-Limit:
channels.imessage.textChunkLimit(Standard: 4000) - Chunk-Modus:
channels.imessage.chunkModelength(Standard)newline(Absatz-zuerst-Aufteilung)
Adressierungsformate
Adressierungsformate
chat_id:123(für stabiles Routing empfohlen)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Private-API-Aktionen
Wennimsg launch ausgeführt wird und openclaw channels status --probe privateApi.available: true meldet, kann das Nachrichtentool zusätzlich zum normalen Textversand iMessage-native Aktionen verwenden.
Verfügbare Aktionen
Verfügbare Aktionen
- react: iMessage-Tapbacks hinzufügen/entfernen (
messageId,emoji,remove). Unterstützte Tapbacks werden love, like, dislike, laugh, emphasize und question zugeordnet. - reply: Eine Thread-Antwort auf eine vorhandene Nachricht senden (
messageId,textodermessagepluschatGuid,chatId,chatIdentifieroderto). - sendWithEffect: Text mit einem iMessage-Effekt senden (
textodermessage,effectodereffectId). - edit: Eine gesendete Nachricht auf unterstützten macOS-/Private-API-Versionen bearbeiten (
messageId,textodernewText). - unsend: Eine gesendete Nachricht auf unterstützten macOS-/Private-API-Versionen zurückziehen (
messageId). - upload-file: Medien/Dateien senden (
bufferals base64 oder ein hydratisiertesmedia/path/filePath,filename, optionalasVoice). Legacy-Alias:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Gruppenchats verwalten, wenn das aktuelle Ziel eine Gruppenunterhaltung ist.
- poll: Eine native Apple-Messages-Umfrage erstellen (
pollQuestion,pollOption2- bis 12-mal wiederholt, pluschatGuid,chatId,chatIdentifieroderto). Empfänger unter iOS/iPadOS/macOS 26+ sehen sie nativ und können nativ abstimmen; ältere Betriebssystemversionen erhalten als Fallback den Text „Sent a poll“. Erfordertselectors.pollPayloadMessage. - poll-vote: Über eine vorhandene Umfrage abstimmen (
pollIdodermessageIdplus genau eines vonpollOptionIndex,pollOptionIdoderpollOptionText). Erfordertselectors.pollVoteMessageund die RPC-Methodepoll.vote.
poll-vote benötigten Umfragenachrichten-ID gerendert.Nachrichten-IDs
Nachrichten-IDs
MessageSid-Werte als auch vollständige Nachrichten-GUIDs, wenn verfügbar. Kurze IDs sind auf den aktuellen SQLite-gestützten Antwortcache beschränkt und werden vor der Verwendung gegen den aktuellen Chat geprüft. Wenn eine kurze ID abgelaufen ist oder zu einem anderen Chat gehört, versuchen Sie es erneut mit der vollständigen MessageSidFull.Funktionserkennung
Funktionserkennung
imsg launch ohne separate manuelle Statusaktualisierung erfolgreich sein kann.Lesebestätigungen und Tippen
Lesebestätigungen und Tippen
imsg-Builds, die vor der funktionsspezifischen Methodenliste entstanden sind, sperren Tippen/Lesen stillschweigend; OpenClaw protokolliert pro Neustart eine einmalige Warnung, damit die fehlende Bestätigung zuordenbar ist.Eingehende Tapbacks
Eingehende Tapbacks
channels.imessage.reactionNotifications gesteuert:"own"(Standard): nur benachrichtigen, wenn Benutzer auf vom Bot verfasste Nachrichten reagieren."all": für alle eingehenden Tapbacks von autorisierten Absendern benachrichtigen."off": eingehende Tapbacks ignorieren.
channels.imessage.accounts.<id>.reactionNotifications.Genehmigungsreaktionen (👍 / 👎)
Genehmigungsreaktionen (👍 / 👎)
approvals.exec.enabled oder approvals.plugin.enabled wahr ist und die Anfrage an iMessage geroutet wird, liefert der Gateway eine Genehmigungsaufforderung nativ aus und akzeptiert einen Tapback, um sie aufzulösen:👍(Like-Tapback) →allow-once👎(Dislike-Tapback) →denyallow-alwaysbleibt ein manueller Fallback: Senden Sie/approve <id> allow-alwaysals reguläre Antwort.
channels.imessage.allowFrom (oder channels.imessage.accounts.<id>.allowFrom) gelesen; fügen Sie die Telefonnummer des Benutzers im E.164-Format oder seine Apple-ID-E-Mail hinzu. Der Wildcard-Eintrag "*" wird beachtet, erlaubt aber jedem Absender die Genehmigung. Die Reaktionsverknüpfung umgeht absichtlich reactionNotifications, dmPolicy und groupAllowFrom, weil die explizite Genehmiger-Allowlist das einzige Gate ist, das für die Genehmigungsauflösung zählt.Verhaltensänderung mit diesem Release: Wenn channels.imessage.allowFrom nicht leer ist, wird der Textbefehl /approve <id> <decision> jetzt gegen diese Genehmigerliste autorisiert (nicht gegen die breitere DM-Allowlist). Absender, die in der DM-Allowlist erlaubt sind, aber nicht in allowFrom, erhalten eine explizite Ablehnung. Fügen Sie jeden Operator, der per /approve (und per Reaktionen) genehmigen können soll, zu allowFrom hinzu, um das bisherige Verhalten beizubehalten. Wenn allowFrom leer ist, bleibt der Legacy-„same-chat fallback“ wirksam, und /approve autorisiert weiterhin jeden, den die DM-Allowlist erlaubt.Operatorhinweise:- Die Reaktionsbindung wird sowohl im Speicher (mit einer TTL, die dem Ablauf der Genehmigung entspricht) als auch im persistenten Keyed Store des Gateways gespeichert, sodass ein Tapback, der kurz nach einem Gateway-Neustart eingeht, die Genehmigung trotzdem auflöst.
- Geräteübergreifende
is_from_me=true-Tapbacks (die eigene Reaktion des Operators auf einem gekoppelten Apple-Gerät) werden absichtlich ignoriert, damit der Bot sich nicht selbst genehmigen kann. - Legacy-Tapbacks im Textstil (
Liked "…"als Klartext von sehr alten Apple-Clients) können Genehmigungen nicht auflösen, weil sie keine Nachrichten-GUID enthalten; die Reaktionsauflösung erfordert die strukturierten Tapback-Metadaten, die aktuelle macOS-/iOS-Clients ausgeben.
Konfigurationsschreibvorgänge
iMessage erlaubt standardmäßig kanalinitiierte Konfigurationsschreibvorgänge (für/config set|unset, wenn commands.config: true gilt).
Deaktivieren:
Zusammenführen von Split-Send-DMs (Befehl + URL in einer Komposition)
Wenn ein Benutzer einen Befehl und eine URL zusammen eingibt — z. B.Dump https://example.com/article — teilt Apples Nachrichten-App den Versand in zwei separate chat.db-Zeilen auf:
- Eine Textnachricht (
"Dump"). - Eine URL-Vorschau-Sprechblase (
"https://...") mit OG-Vorschaubildern als Anhänge.
imsg einführt.
channels.imessage.coalesceSameSenderDms aktiviert für eine DM die Pufferung aufeinanderfolgender Zeilen desselben Absenders. Wenn imsg den strukturellen URL-Vorschau-Marker balloon_bundle_id: "com.apple.messages.URLBalloonProvider" in einer der Quellzeilen bereitstellt, führt OpenClaw nur diesen echten Split-Send zusammen und behält alle anderen gepufferten Zeilen als separate Durchläufe bei. Bei älteren imsg-Builds, die keinerlei Sprechblasenmetadaten ausgeben, kann OpenClaw einen Split-Send nicht von separaten Sendevorgängen unterscheiden und fällt daher auf das Zusammenführen des Buckets zurück. Das bewahrt das Verhalten vor den Metadaten, statt Dump <url>-Split-Sends in zwei Durchläufe zurückfallen zu lassen. Gruppenchats werden weiterhin pro Nachricht ausgeliefert, damit die Mehrbenutzer-Turn-Struktur erhalten bleibt.
- Wann aktivieren
- Aktivierung
- Kompromisse
- Sie Skills ausliefern, die
command + payloadin einer Nachricht erwarten (dump, paste, save, queue usw.). - Ihre Benutzer URLs zusammen mit Befehlen einfügen.
- Sie die zusätzliche DM-Turn-Latenz akzeptieren können (siehe unten).
- Sie minimale Befehlslatenz für Einwort-DM-Trigger benötigen.
- Alle Ihre Abläufe einmalige Befehle ohne Payload-Follow-ups sind.
Szenarien und was der Agent sieht
Die Spalte „Flag aktiviert“ zeigt das Verhalten auf einemimsg-Build, der balloon_bundle_id ausgibt. Bei älteren imsg-Builds, die überhaupt keine Balloon-Metadaten ausgeben, fallen die unten als „Zwei Turns“ / „N Turns“ markierten Zeilen stattdessen auf eine Legacy-Zusammenführung zurück (ein Turn): OpenClaw kann einen Split-Send strukturell nicht von separaten Sends unterscheiden und bewahrt daher die Zusammenführung vor den Metadaten. Präzise Trennung wird aktiviert, sobald der Build Balloon-Metadaten ausgibt.
| Benutzer verfasst | chat.db erzeugt | Flag deaktiviert (Standard) | Flag aktiviert + Fenster (imsg gibt Balloon-Metadaten aus) |
|---|---|---|---|
Dump https://example.com (ein Send) | 2 Zeilen im Abstand von ~1 s | Zwei Agent-Turns: nur „Dump“, dann URL | Ein Turn: zusammengeführter Text Dump https://example.com |
Save this 📎image.jpg caption (Anhang + Text) | 2 Zeilen ohne URL-Balloon-Metadaten | Zwei Turns | Zwei Turns, nachdem Metadaten beobachtet wurden; ein zusammengeführter Turn bei alten/pre-latch Sitzungen ohne Metadaten |
/status (eigenständiger Befehl) | 1 Zeile | Sofortiger Dispatch | Bis zum Fenster warten, dann dispatchen |
| URL allein eingefügt | 1 Zeile | Sofortiger Dispatch | Bis zum Fenster warten, dann dispatchen |
| Text + URL als zwei bewusst separate Nachrichten, Minuten auseinander | 2 Zeilen außerhalb des Fensters | Zwei Turns | Zwei Turns (Fenster läuft dazwischen ab) |
| Schnelle Flut (>10 kleine DMs innerhalb des Fensters) | N Zeilen ohne URL-Balloon-Metadaten | N Turns | N Turns, nachdem Metadaten beobachtet wurden; ein begrenzter zusammengeführter Turn bei alten/pre-latch Sitzungen ohne Metadaten |
| Zwei Personen tippen in einem Gruppenchat | N Zeilen von M Sendern | M+ Turns (einer pro Sender-Bucket) | M+ Turns — Gruppenchats werden nicht zusammengeführt |
Eingehende Wiederherstellung nach einem Neustart von Bridge oder Gateway
iMessage stellt Nachrichten wieder her, die verpasst wurden, während das Gateway ausgefallen war, und unterdrückt gleichzeitig die veraltete „Backlog-Bombe“, die Apple nach einer Push-Wiederherstellung ausgeben kann. Das Standardverhalten ist immer aktiv und baut auf der eingehenden Deduplizierung auf.- Replay-Deduplizierung. Jede zugestellte eingehende Nachricht wird anhand ihrer Apple-GUID im persistenten Plugin-Zustand (
imessage.inbound-dedupe) erfasst, bei der Aufnahme beansprucht und nach der Verarbeitung committet (bei einem vorübergehenden Fehler freigegeben, damit sie erneut versucht werden kann). Alles, was bereits verarbeitet wurde, wird verworfen, statt zweimal zugestellt zu werden. Dadurch kann Recovery aggressiv wiederholen, ohne Buchhaltung pro Nachricht. - Downtime-Recovery. Beim Start merkt sich der Monitor die zuletzt zugestellte
chat.db-rowid (ein persistenter Cursor pro Konto) und übergibt sie alssince_rowidanimsg watch.subscribe, sodass imsg die Zeilen wiederholt, die eingegangen sind, während das Gateway ausgefallen war, und danach live weiterläuft. Replay ist auf die neuesten Zeilen und auf Nachrichten bis zu ~2 Stunden Alter begrenzt, und die Deduplizierung verwirft alles, was bereits verarbeitet wurde. - Altersgrenze für veralteten Backlog. Zeilen oberhalb der Startgrenze sind tatsächlich live; eine Zeile, deren Sendedatum mehr als ~15 Minuten älter ist als ihre Ankunft, ist der Push-Flush-Backlog und wird unterdrückt. Wiederholte Zeilen (an oder unterhalb der Grenze) verwenden stattdessen das breitere Recovery-Fenster, sodass eine kürzlich verpasste Nachricht zugestellt wird, während uralte Historie nicht zugestellt wird.
cliPath-Setups, weil since_rowid-Replay über dieselbe imsg-RPC-Verbindung läuft. Der Unterschied ist das Fenster: Wenn das Gateway chat.db lesen kann (lokal), verankert es die rowid-Startgrenze, begrenzt die Replay-Spanne und stellt verpasste Nachrichten zu, die bis zu ein paar Stunden alt sind. Über ein Remote-SSH-cliPath kann es die Datenbank nicht lesen, daher ist das Replay unbegrenzt und jede Zeile verwendet die Live-Altersgrenze — es stellt weiterhin kürzlich verpasste Nachrichten wieder her und unterdrückt weiterhin alten Backlog, nur mit dem engeren Live-Fenster. Führen Sie das Gateway auf dem Messages-Mac aus, um das breitere Recovery-Fenster zu erhalten.
Für Operator sichtbares Signal
Unterdrückter Backlog wird auf der Standardebene geloggt und nie stillschweigend verworfen (das Flagrecovery zeigt, welches Fenster angewendet wurde):
Migration
channels.imessage.catchup.* ist veraltet — Downtime-Recovery ist jetzt automatisch und benötigt für neue Setups keine Konfiguration. Vorhandene Konfigurationen mit catchup.enabled: true werden weiterhin als Kompatibilitätsprofil für das Recovery-Replay-Fenster berücksichtigt. Deaktivierte Catchup-Blöcke (enabled: false oder kein enabled: true) sind eingestellt; openclaw doctor --fix entfernt sie.
Fehlerbehebung
imsg nicht gefunden oder RPC nicht unterstützt
imsg nicht gefunden oder RPC nicht unterstützt
imsg. Wenn private API-Aktionen nicht verfügbar sind, führen Sie imsg launch in der angemeldeten macOS-Benutzersitzung aus und führen Sie den Probe erneut aus. Wenn das Gateway nicht auf macOS läuft, verwenden Sie statt des lokalen Standard-imsg-Pfads das oben beschriebene Setup „Remote Mac über SSH“.Messages werden gesendet, aber eingehende iMessages kommen nicht an
Messages werden gesendet, aber eingehende iMessages kommen nicht an
chat.db nicht ändert, kann OpenClaw die Nachricht nicht empfangen, selbst wenn imsg status --json eine fehlerfreie Bridge meldet.chat.db-Zeile oder ein imsg watch-Ereignis, bevor Sie OpenClaw-Sitzungen debuggen. Führen Sie dies nicht als periodische Bridge-Relaunch-Schleife aus; wiederholtes imsg launch plus Gateway-Neustarts während aktiver Arbeit können Zustellungen unterbrechen und laufende Kanal-Runs stranden lassen.Gateway läuft nicht auf macOS
Gateway läuft nicht auf macOS
cliPath: "imsg" muss auf dem Mac laufen, der bei Messages angemeldet ist. Setzen Sie unter Linux oder Windows channels.imessage.cliPath auf ein Wrapper-Skript, das per SSH auf diesen Mac zugreift und imsg "$@" ausführt.DMs werden ignoriert
DMs werden ignoriert
channels.imessage.dmPolicychannels.imessage.allowFrom- Pairing-Genehmigungen (
openclaw pairing list imessage)
Gruppennachrichten werden ignoriert
Gruppennachrichten werden ignoriert
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- Allowlist-Verhalten von
channels.imessage.groups - Konfiguration des Erwähnungsmusters (
agents.list[].groupChat.mentionPatterns)
Remote-Anhänge schlagen fehl
Remote-Anhänge schlagen fehl
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- SSH/SCP-Schlüsselauthentifizierung vom Gateway-Host
- Hostschlüssel existiert in
~/.ssh/known_hostsauf dem Gateway-Host - Lesbarkeit des Remote-Pfads auf dem Mac, auf dem Messages läuft
macOS-Berechtigungsaufforderungen wurden verpasst
macOS-Berechtigungsaufforderungen wurden verpasst
imsg ausführt.Verweise zur Konfigurationsreferenz
Verwandt
- Kanalübersicht — alle unterstützten Kanäle
- Entfernung von BlueBubbles und der imsg-iMessage-Pfad — Ankündigung und Migrationszusammenfassung
- Von BlueBubbles kommend — Konfigurationsübersetzungstabelle und schrittweise Umstellung
- Pairing — DM-Authentifizierung und Pairing-Ablauf
- Gruppen — Gruppenchat-Verhalten und Erwähnungs-Gating
- Kanal-Routing — Sitzungs-Routing für Nachrichten
- Sicherheit — Zugriffsmodell und Härtung