imsg na zalogowanym hoście macOS Messages. Jeśli Gateway działa w systemie Linux lub Windows, ustaw channels.imessage.cliPath na wrapper SSH, który uruchamia imsg na Macu.Odzyskiwanie ruchu przychodzącego jest automatyczne. Po restarcie mostu lub Gateway iMessage odtwarza wiadomości pominięte w czasie niedostępności i tłumi przestarzałą „bombę zaległości”, którą Apple może opróżnić po odzyskaniu Push, deduplikując je tak, aby nic nie zostało wysłane dwukrotnie. Nie ma konfiguracji do włączenia — zobacz Odzyskiwanie ruchu przychodzącego po restarcie mostu lub Gateway.imsg rpc i komunikuje się przez JSON-RPC na stdio (bez osobnego demona/portu). Zaawansowane akcje wymagają imsg launch i pomyślnej sondy prywatnego API.
Akcje prywatnego API
Parowanie
Zdalny Mac
Dokumentacja konfiguracji
Szybka konfiguracja
- Lokalny Mac (szybka ścieżka)
- Zdalny Mac przez SSH
Wymagania i uprawnienia (macOS)
- Messages musi być zalogowane na Macu uruchamiającym
imsg. - Full Disk Access jest wymagany dla kontekstu procesu uruchamiającego OpenClaw/
imsg(dostęp do bazy danych Messages). - Uprawnienie Automation jest wymagane do wysyłania wiadomości przez Messages.app.
- Dla zaawansowanych akcji (reakcja / edycja / cofnięcie wysłania / odpowiedź w wątku / efekty / ankiety / operacje na grupach) System Integrity Protection musi być wyłączone — zobacz Włączanie prywatnego API imsg poniżej. Podstawowe wysyłanie/odbieranie tekstu i multimediów działa bez tego.
Wysyłanie przez wrapper SSH kończy się niepowodzeniem z AppleEvents -1743
Wysyłanie przez wrapper SSH kończy się niepowodzeniem z AppleEvents -1743
channels status --probe i przetwarzać wiadomości przychodzące, podczas gdy wysyłka wychodząca nadal kończy się błędem autoryzacji AppleEvents:/usr/libexec/sshd-keygen-wrapper zamiast procesu imsg lub lokalnej powłoki, macOS może nie pokazać użytecznego przełącznika Messages dla tego klienta po stronie serwera SSH:tccutil reset AppleEvents lub ponowne uruchamianie imsg send przez ten sam wrapper SSH może nadal kończyć się niepowodzeniem, ponieważ kontekstem procesu wymagającym Automation dla Messages jest wrapper SSH, a nie aplikacja, której interfejs może nadać uprawnienia.Zamiast tego użyj jednego z obsługiwanych kontekstów procesu imsg:- Uruchom Gateway albo przynajmniej most
imsgw lokalnej sesji zalogowanego użytkownika Messages. - Uruchom Gateway przez LaunchAgent tego użytkownika po przyznaniu Full Disk Access i Automation z tej samej sesji.
- Jeśli zachowujesz topologię SSH z dwoma użytkownikami, sprawdź, czy prawdziwe wychodzące
imsg senddziała przez dokładnie ten wrapper, zanim włączysz kanał. Jeśli nie można przyznać Automation, skonfiguruj zamiast tego jednoużytkownikowe środowiskoimsg, nie polegając na wrapperze SSH do wysyłania.
Włączanie prywatnego API imsg
imsg działa w dwóch trybach operacyjnych:
- Tryb podstawowy (domyślny, bez potrzeby zmian SIP): tekst i multimedia wychodzące przez
send, obserwacja/historia przychodząca, lista czatów. To otrzymujesz od razu po świeżymbrew install steipete/tap/imsgoraz standardowych uprawnieniach macOS opisanych wyżej. - Tryb prywatnego API:
imsgwstrzykuje pomocniczą dylib doMessages.app, aby wywoływać wewnętrzne funkcjeIMCore. To odblokowujereact,edit,unsend,reply(w wątku),sendWithEffect,pollipoll-vote(natywne ankiety Messages),renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, a także wskaźniki pisania i potwierdzenia odczytu.
imsg jednoznacznie określa wymaganie:
Zaawansowane funkcje, takie jakTechnika wstrzykiwania pomocnika używa własnej dylibread,typing,launch, bogate wysyłanie wspierane przez most, modyfikacja wiadomości i zarządzanie czatem, są opcjonalne. Wymagają wyłączenia SIP i wstrzyknięcia pomocniczej dylib doMessages.app.imsg launchodmawia wstrzyknięcia, gdy SIP jest włączone.
imsg, aby uzyskać dostęp do prywatnych API Messages. W ścieżce OpenClaw iMessage nie ma serwera zewnętrznego ani środowiska uruchomieniowego BlueBubbles.
Konfiguracja
-
Zainstaluj (lub zaktualizuj)
imsgna Macu, na którym działa Messages.app:Dane wyjścioweimsg status --jsonraportująbridge_version,rpc_methodsiselectorsdla poszczególnych metod, aby przed rozpoczęciem można było zobaczyć, co obsługuje bieżąca kompilacja. -
Wyłącz System Integrity Protection oraz (na nowoczesnym macOS) Library Validation. Wstrzyknięcie niepochodzącej od Apple pomocniczej dylib do podpisanej przez Apple aplikacji
Messages.appwymaga wyłączenia SIP oraz poluzowania walidacji bibliotek. Krok SIP w trybie Recovery zależy od wersji macOS:- macOS 10.13-10.15 (Sierra-Catalina): wyłącz Library Validation przez Terminal, uruchom ponownie w Recovery Mode, wykonaj
csrutil disable, uruchom ponownie. - macOS 11+ (Big Sur i nowsze), Intel: Recovery Mode (albo Internet Recovery),
csrutil disable, uruchom ponownie. - macOS 11+, Apple Silicon: sekwencja startu przyciskiem zasilania, aby wejść do Recovery; w nowszych wersjach macOS przytrzymaj klawisz Left Shift podczas kliknięcia Continue, a następnie
csrutil disable. Konfiguracje maszyn wirtualnych używają osobnego procesu, więc najpierw zrób migawkę VM.
csrutil disablezwykle nie wystarcza. Apple nadal wymusza walidację bibliotek wobecMessages.appjako pliku binarnego platformy, więc pomocnik podpisany adhoc jest odrzucany (Library Validation failed: ... platform binary, but mapped file is not) nawet przy wyłączonym SIP. Po wyłączeniu SIP wyłącz także walidację bibliotek i uruchom ponownie:macOS 26 (Tahoe), zweryfikowane na 26.5.1: wyłączone SIP plus powyższe polecenieDisableLibraryValidationwystarczają do wstrzyknięcia pomocnika w wersjach od 26.0 do 26.5.x. Nie są wymagane żadne boot-args. Plist jest czynnikiem decydującym i najczęściej pomijanym krokiem, gdy wstrzyknięcie na Tahoe kończy się niepowodzeniem:- Z plist:
imsg launchwstrzykuje, aimsg statusraportujeadvanced_features: true. - Bez plist (nawet z wyłączonym SIP):
imsg launchkończy się niepowodzeniem zFailed to launch: Timeout waiting for Messages.app to initialize. AMFI odrzuca pomocnik adhoc podczas ładowania, więc most nigdy nie staje się gotowy, a uruchomienie przekracza limit czasu. Ten timeout jest objawem, na który większość osób trafia na Tahoe, a poprawką jest powyższy plist, nie nic bardziej radykalnego.
Messages.app, a most się uruchamia; po usunięciu plist i restarcieimsg launchgeneruje powyższy błąd timeout, a dylib nie jest zmapowana. Jeśli wstrzykiwanieimsg launchalbo konkretneselectorszaczynają zwracać fałsz po uaktualnieniu macOS, ta blokada jest zwykle przyczyną. Sprawdź stan SIP i walidacji bibliotek, zanim uznasz, że nie powiódł się sam krok SIP. Jeśli te ustawienia są poprawne, a most nadal nie może wykonać wstrzyknięcia, zbierzimsg status --jsonoraz wynikimsg launchi zgłoś to do projektuimsgzamiast osłabiać dodatkowe systemowe mechanizmy bezpieczeństwa. Wykonaj procedurę Apple w trybie odzyskiwania dla swojego Maca, aby wyłączyć SIP przed uruchomieniemimsg launch. - macOS 10.13-10.15 (Sierra-Catalina): wyłącz Library Validation przez Terminal, uruchom ponownie w Recovery Mode, wykonaj
-
Wstrzyknij pomocnika. Przy wyłączonym SIP i zalogowanej aplikacji Messages.app:
imsg launchodmawia wstrzyknięcia, gdy SIP jest nadal włączony, więc służy to także jako potwierdzenie, że krok 2 zadziałał. -
Zweryfikuj most z OpenClaw:
Wpis iMessage powinien zgłaszać
works, aimsg status --json | jq '{rpc_methods, selectors}'powinno pokazać możliwości udostępniane przez Twoją wersję macOS. Tworzenie ankiet wymagaselectors.pollPayloadMessage; głosowanie wymaga zarównoselectors.pollVoteMessage, jak i metody RPCpoll.vote. Plugin OpenClaw ogłasza tylko akcje obsługiwane przez zbuforowaną sondę, natomiast pusta pamięć podręczna pozostaje optymistyczna i sonduje przy pierwszym wysłaniu.
openclaw channels status --probe zgłasza kanał jako works, ale konkretne akcje podczas wysyłania zgłaszają błąd „iMessage <action> wymaga mostu prywatnego API imsg”, uruchom ponownie imsg launch — pomocnik może wypaść (restart Messages.app, aktualizacja OS itp.), a zbuforowany status available: true będzie nadal ogłaszał akcje do czasu odświeżenia przez kolejną sondę.
Gdy nie możesz wyłączyć SIP
Jeśli wyłączenie SIP jest nieakceptowalne dla Twojego modelu zagrożeń:imsgwraca do trybu podstawowego — tylko tekst + media + odbieranie.- Plugin OpenClaw nadal ogłasza wysyłanie tekstu/mediów i monitorowanie przychodzące; ukrywa tylko
react,edit,unsend,reply,sendWithEffectoraz operacje grupowe z powierzchni akcji (zgodnie z bramką możliwości dla poszczególnych metod). - Możesz uruchomić osobnego Maca bez Apple Silicon (albo dedykowanego Maca bota) z wyłączonym SIP dla obciążenia iMessage, pozostawiając SIP włączony na swoich głównych urządzeniach. Zobacz Dedykowany użytkownik bota macOS (osobna tożsamość iMessage) poniżej.
Kontrola dostępu i routing
- Zasady DM
- Zasady grup + wzmianki
- Sesje i deterministyczne odpowiedzi
channels.imessage.dmPolicy steruje wiadomościami bezpośrednimi:pairing(domyślne)allowlistopen(wymaga, abyallowFromzawierało"*")disabled
channels.imessage.allowFrom.Wpisy listy dozwolonych muszą identyfikować nadawców: uchwyty albo statyczne grupy dostępu nadawców (accessGroup:<name>). Użyj channels.imessage.groupAllowFrom dla celów czatu, takich jak chat_id:*, chat_guid:* albo chat_identifier:*; użyj channels.imessage.groups dla numerycznych kluczy rejestru chat_id.Powiązania rozmów ACP
Starsze czaty iMessage można także wiązać z sesjami ACP. Szybki przepływ operatora:- Uruchom
/acp spawn codex --bind herewewnątrz DM albo dozwolonego czatu grupowego. - Przyszłe wiadomości w tej samej rozmowie iMessage będą kierowane do utworzonej sesji ACP.
/newi/resetresetują tę samą powiązaną sesję ACP w miejscu./acp closezamyka sesję ACP i usuwa powiązanie.
bindings[] z type: "acp" i match.channel: "imessage".
match.peer.id może używać:
- znormalizowanego uchwytu DM, takiego jak
+15555550123albouser@example.com chat_id:<id>(zalecane dla stabilnych powiązań grup)chat_guid:<guid>chat_identifier:<identifier>
Wzorce wdrożenia
Dedykowany użytkownik bota macOS (osobna tożsamość iMessage)
Dedykowany użytkownik bota macOS (osobna tożsamość iMessage)
- Utwórz dedykowanego użytkownika macOS / zaloguj się jako taki użytkownik.
- Zaloguj się w Messages przy użyciu Apple ID bota w tym użytkowniku.
- Zainstaluj
imsgw tym użytkowniku. - Utwórz wrapper SSH, aby OpenClaw mógł uruchamiać
imsgw kontekście tego użytkownika. - Skieruj
channels.imessage.accounts.<id>.cliPathi.dbPathdo profilu tego użytkownika.
Zdalny Mac przez Tailscale (przykład)
Zdalny Mac przez Tailscale (przykład)
- gateway działa na Linux/VM
- iMessage +
imsgdziała na Macu w Twoim tailnecie - wrapper
cliPathużywa SSH do uruchamianiaimsg remoteHostwłącza pobieranie załączników przez SCP
ssh bot@mac-mini.tailnet-1234.ts.net), aby known_hosts zostało wypełnione.Wzorzec wielu kont
Wzorzec wielu kont
channels.imessage.accounts.Każde konto może nadpisywać pola takie jak cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, ustawienia historii oraz listy dozwolonych katalogów głównych załączników.Historia wiadomości bezpośrednich
Historia wiadomości bezpośrednich
channels.imessage.dmHistoryLimit, aby zasilić nowe sesje wiadomości bezpośrednich najnowszą zdekodowaną historią imsg dla tej rozmowy. Użyj channels.imessage.dms["<sender>"].historyLimit dla nadpisań per nadawca, w tym 0, aby wyłączyć historię dla nadawcy.Historia DM iMessage jest pobierana na żądanie z imsg. Pozostawienie dmHistoryLimit bez ustawienia wyłącza globalne zasilanie historią DM, ale dodatnia wartość channels.imessage.dms["<sender>"].historyLimit dla nadawcy nadal włącza zasilanie dla tego nadawcy.Media, dzielenie na części i cele dostarczania
Załączniki i multimedia
Załączniki i multimedia
- pobieranie załączników przychodzących jest domyślnie wyłączone — ustaw
channels.imessage.includeAttachments: true, aby przekazywać zdjęcia, notatki głosowe, wideo i inne załączniki do agenta. Gdy ta opcja jest wyłączona, iMessages zawierające tylko załączniki są odrzucane przed dotarciem do agenta i mogą w ogóle nie wygenerować wiersza dziennikaInbound message. - zdalne ścieżki załączników można pobierać przez SCP, gdy ustawiono
remoteHost - ścieżki załączników muszą pasować do dozwolonych katalogów głównych:
channels.imessage.attachmentRoots(lokalne)channels.imessage.remoteAttachmentRoots(zdalny tryb SCP)- domyślny wzorzec katalogu głównego:
/Users/*/Library/Messages/Attachments
- SCP używa ścisłego sprawdzania klucza hosta (
StrictHostKeyChecking=yes) - rozmiar multimediów wychodzących używa
channels.imessage.mediaMaxMb(domyślnie 16 MB)
Dzielenie wiadomości wychodzących
Dzielenie wiadomości wychodzących
- limit fragmentu tekstu:
channels.imessage.textChunkLimit(domyślnie 4000) - tryb dzielenia:
channels.imessage.chunkModelength(domyślnie)newline(dzielenie najpierw po akapitach)
Formaty adresowania
Formaty adresowania
chat_id:123(zalecane dla stabilnego routingu)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Akcje prywatnego API
Gdyimsg launch działa, a openclaw channels status --probe zgłasza privateApi.available: true, narzędzie wiadomości może używać natywnych akcji iMessage oprócz zwykłego wysyłania tekstu.
Dostępne akcje
Dostępne akcje
- react: Dodaj/usuń tapbacki iMessage (
messageId,emoji,remove). Obsługiwane tapbacki mapują się na love, like, dislike, laugh, emphasize i question. - reply: Wyślij odpowiedź w wątku do istniejącej wiadomości (
messageId,textlubmessage, pluschatGuid,chatId,chatIdentifieralboto). - sendWithEffect: Wyślij tekst z efektem iMessage (
textlubmessage,effectalboeffectId). - edit: Edytuj wysłaną wiadomość w obsługiwanych wersjach macOS/prywatnego API (
messageId,textlubnewText). - unsend: Wycofaj wysłaną wiadomość w obsługiwanych wersjach macOS/prywatnego API (
messageId). - upload-file: Wyślij multimedia/pliki (
bufferjako base64 lub uzupełnionemedia/path/filePath,filename, opcjonalnieasVoice). Starszy alias:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Zarządzaj czatami grupowymi, gdy bieżący cel jest rozmową grupową.
- poll: Utwórz natywną ankietę Apple Messages (
pollQuestion,pollOptionpowtórzone od 2 do 12 razy, pluschatGuid,chatId,chatIdentifieralboto). Odbiorcy na iOS/iPadOS/macOS 26+ widzą ją i głosują natywnie; starsze wersje OS otrzymują tekstowy fallback “Sent a poll”. Wymagaselectors.pollPayloadMessage. - poll-vote: Zagłosuj w istniejącej ankiecie (
pollIdlubmessageId, plus dokładnie jedno zpollOptionIndex,pollOptionIdalbopollOptionText). Wymagaselectors.pollVoteMessagei metody RPCpoll.vote.
poll-vote.Identyfikatory wiadomości
Identyfikatory wiadomości
MessageSid, jak i pełne identyfikatory GUID wiadomości, gdy są dostępne. Krótkie identyfikatory są ograniczone do ostatniej pamięci podręcznej odpowiedzi opartej na SQLite i przed użyciem są sprawdzane względem bieżącego czatu. Jeśli krótki identyfikator wygasł lub należy do innego czatu, ponów próbę z pełnym MessageSidFull.Wykrywanie możliwości
Wykrywanie możliwości
imsg launch bez osobnego ręcznego odświeżania statusu.Potwierdzenia odczytu i pisanie
Potwierdzenia odczytu i pisanie
imsg, które poprzedzają listę możliwości per metoda, po cichu wyłączą pisanie/odczyt; OpenClaw zapisuje jednorazowe ostrzeżenie po każdym restarcie, aby brak potwierdzenia był możliwy do przypisania.Przychodzące tapbacki
Przychodzące tapbacki
channels.imessage.reactionNotifications:"own"(domyślnie): powiadamiaj tylko wtedy, gdy użytkownicy reagują na wiadomości utworzone przez bota."all": powiadamiaj o wszystkich przychodzących tapbackach od autoryzowanych nadawców."off": ignoruj przychodzące tapbacki.
channels.imessage.accounts.<id>.reactionNotifications.Reakcje zatwierdzania (👍 / 👎)
Reakcje zatwierdzania (👍 / 👎)
approvals.exec.enabled lub approvals.plugin.enabled ma wartość true, a żądanie jest kierowane do iMessage, Gateway dostarcza natywny monit o zatwierdzenie i akceptuje tapback, aby go rozstrzygnąć:👍(tapback Like) →allow-once👎(tapback Dislike) →denyallow-alwayspozostaje ręcznym fallbackiem: wyślij/approve <id> allow-alwaysjako zwykłą odpowiedź.
channels.imessage.allowFrom (lub channels.imessage.accounts.<id>.allowFrom); dodaj numer telefonu użytkownika w formacie E.164 albo jego adres e-mail Apple ID. Wpis wieloznaczny "*" jest honorowany, ale pozwala zatwierdzać dowolnemu nadawcy. Skrót reakcji celowo omija reactionNotifications, dmPolicy i groupAllowFrom, ponieważ jawna lista dozwolonych zatwierdzających jest jedyną bramką, która ma znaczenie dla rozstrzygania zatwierdzeń.Zmiana zachowania w tym wydaniu: Gdy channels.imessage.allowFrom nie jest puste, polecenie tekstowe /approve <id> <decision> jest teraz autoryzowane względem tej listy zatwierdzających (a nie szerszej listy dozwolonych DM). Nadawcy dozwoleni na liście DM, ale nieobecni w allowFrom, otrzymają jawne odrzucenie. Dodaj każdego operatora, który powinien móc zatwierdzać przez /approve (i przez reakcje), do allowFrom, aby zachować poprzednie zachowanie. Gdy allowFrom jest puste, starszy “same-chat fallback” pozostaje w mocy, a /approve nadal autoryzuje każdego, na kogo pozwala lista dozwolonych DM.Uwagi dla operatorów:- Powiązanie reakcji jest przechowywane zarówno w pamięci (z TTL dopasowanym do wygaśnięcia zatwierdzenia), jak i w trwałym magazynie kluczowanym Gateway, więc tapback, który dotrze krótko po restarcie Gateway, nadal rozstrzyga zatwierdzenie.
- Tapbacki między urządzeniami z
is_from_me=true(własna reakcja operatora na sparowanym urządzeniu Apple) są celowo ignorowane, aby bot nie mógł zatwierdzić sam siebie. - Starsze tapbacki w stylu tekstowym (
Liked "…"jako zwykły tekst od bardzo starych klientów Apple) nie mogą rozstrzygać zatwierdzeń, ponieważ nie przenoszą GUID wiadomości; rozstrzyganie reakcji wymaga ustrukturyzowanych metadanych tapbacka emitowanych przez obecnych klientów macOS / iOS.
Zapisy konfiguracji
iMessage domyślnie zezwala na zapisy konfiguracji inicjowane przez kanał (dla/config set|unset, gdy commands.config: true).
Wyłącz:
Scalanie dzielonych wysyłek DM (polecenie + URL w jednej kompozycji)
Gdy użytkownik wpisze razem polecenie i URL — np.Dump https://example.com/article — aplikacja Wiadomości Apple dzieli wysyłkę na dwa osobne wiersze chat.db:
- Wiadomość tekstową (
"Dump"). - Dymek podglądu URL (
"https://...") z obrazami podglądu OG jako załącznikami.
imsg.
channels.imessage.coalesceSameSenderDms włącza dla DM buforowanie kolejnych wierszy od tego samego nadawcy. Gdy imsg ujawnia strukturalny znacznik podglądu URL balloon_bundle_id: "com.apple.messages.URLBalloonProvider" w jednym z wierszy źródłowych, OpenClaw scala tylko tę rzeczywistą dzieloną wysyłkę i zachowuje pozostałe zbuforowane wiersze jako osobne tury. W starszych kompilacjach imsg, które w ogóle nie emitują metadanych dymka, OpenClaw nie potrafi odróżnić dzielonej wysyłki od osobnych wysyłek, więc fallback polega na scaleniu koszyka. Zachowuje to zachowanie sprzed metadanych zamiast regresji dzielonych wysyłek Dump <url> do dwóch tur. Czaty grupowe nadal wysyłają per wiadomość, aby zachować strukturę tur wielu użytkowników.
- Kiedy włączyć
- Włączanie
- Kompromisy
- Dostarczasz Skills, które oczekują
command + payloadw jednej wiadomości (dump, paste, save, queue itd.). - Twoi użytkownicy wklejają URL-e obok poleceń.
- Możesz zaakceptować dodane opóźnienie tury DM (zobacz poniżej).
- Potrzebujesz minimalnego opóźnienia poleceń dla jednowyrazowych wyzwalaczy DM.
- Wszystkie Twoje przepływy to jednorazowe polecenia bez kolejnych ładunków.
Scenariusze i co widzi agent
Kolumna „Flaga włączona” pokazuje zachowanie w kompilacjiimsg, która emituje balloon_bundle_id. W starszych kompilacjach imsg, które w ogóle nie emitują metadanych dymku, wiersze oznaczone poniżej jako „Dwie tury” / „N tur” zamiast tego wracają do starszego scalania (jedna tura): OpenClaw nie może strukturalnie odróżnić wysyłki podzielonej od osobnych wysyłek, więc zachowuje scalanie sprzed metadanych. Precyzyjne rozdzielanie aktywuje się, gdy kompilacja zacznie emitować metadane dymku.
| Użytkownik tworzy wiadomość | chat.db tworzy | Flaga wyłączona (domyślnie) | Flaga włączona + okno (imsg emituje metadane dymku) |
|---|---|---|---|
Dump https://example.com (jedna wysyłka) | 2 wiersze w odstępie ~1 s | Dwie tury agenta: samo „Dump”, potem URL | Jedna tura: scalony tekst Dump https://example.com |
Save this 📎image.jpg caption (załącznik + tekst) | 2 wiersze bez metadanych dymku URL | Dwie tury | Dwie tury po zaobserwowaniu metadanych; jedna scalona tura w starych sesjach bez metadanych/przed zatrzaśnięciem |
/status (samodzielne polecenie) | 1 wiersz | Natychmiastowa wysyłka | Czekaj maksymalnie przez okno, potem wyślij |
| URL wklejony samodzielnie | 1 wiersz | Natychmiastowa wysyłka | Czekaj maksymalnie przez okno, potem wyślij |
| Tekst + URL wysłane jako dwie celowo osobne wiadomości, minuty później | 2 wiersze poza oknem | Dwie tury | Dwie tury (okno wygasa między nimi) |
| Szybki zalew (>10 małych DM w oknie) | N wierszy bez metadanych dymku URL | N tur | N tur po zaobserwowaniu metadanych; jedna ograniczona scalona tura w starych sesjach bez metadanych/przed zatrzaśnięciem |
| Dwie osoby piszące w czacie grupowym | N wierszy od M nadawców | M+ tur (jedna na kubeł nadawcy) | M+ tur — czaty grupowe nie są scalane |
Odzyskiwanie przychodzących wiadomości po restarcie mostka lub Gateway
iMessage odzyskuje wiadomości pominięte, gdy Gateway był wyłączony, a jednocześnie tłumi przestarzałą „bombę zaległości”, którą Apple może opróżnić po odzyskiwaniu Push. Domyślne zachowanie jest zawsze włączone i opiera się na deduplikacji przychodzącej.- Deduplikacja odtworzeń. Każda wysłana przychodząca wiadomość jest rejestrowana według swojego Apple GUID w trwałym stanie Plugin (
imessage.inbound-dedupe), zajmowana podczas ingestii i zatwierdzana po obsłużeniu (zwalniana przy błędzie przejściowym, aby można było ponowić próbę). Wszystko, co już obsłużono, jest odrzucane zamiast wysyłane drugi raz. To pozwala odzyskiwaniu agresywnie odtwarzać bez księgowania każdej wiadomości osobno. - Odzyskiwanie po przestoju. Przy starcie monitor zapamiętuje ostatni wysłany
chat.dbrowid (utrwalony kursor per konto) i przekazuje go doimsg watch.subscribejakosince_rowid, więc imsg odtwarza wiersze, które trafiły podczas niedostępności Gateway, a potem śledzi na żywo. Odtwarzanie jest ograniczone do najnowszych wierszy i do wiadomości mających maksymalnie ~2 godziny, a deduplikacja odrzuca wszystko, co już obsłużono. - Bariera wieku przestarzałych zaległości. Wiersze powyżej granicy startowej są rzeczywiście na żywo; taki, którego data wysłania jest o ponad ~15 minut starsza niż czas przybycia, jest zaległością opróżnioną przez Push i jest tłumiony. Odtworzone wiersze (na granicy lub poniżej) używają zamiast tego szerszego okna odzyskiwania, więc niedawno pominięta wiadomość zostanie dostarczona, a dawna historia nie.
cliPath, ponieważ odtwarzanie since_rowid działa przez to samo połączenie RPC imsg. Różnicą jest okno: gdy Gateway może odczytać chat.db (lokalnie), zakotwicza granicę rowid startu, ogranicza zakres odtwarzania i dostarcza pominięte wiadomości mające maksymalnie kilka godzin. Przez zdalne SSH cliPath nie może odczytać bazy danych, więc odtwarzanie nie ma ograniczenia, a każdy wiersz używa bariery wieku dla trybu na żywo — nadal odzyskuje niedawno pominięte wiadomości i nadal tłumi stare zaległości, tylko z węższym oknem na żywo. Uruchom Gateway na Macu z Messages, aby uzyskać szersze okno odzyskiwania.
Sygnał widoczny dla operatora
Tłumione zaległości są logowane na domyślnym poziomie, nigdy nie są po cichu odrzucane (flagarecovery pokazuje, które okno zastosowano):
Migracja
channels.imessage.catchup.* jest przestarzałe — odzyskiwanie po przestoju jest teraz automatyczne i nie wymaga konfiguracji w nowych instalacjach. Istniejące konfiguracje z catchup.enabled: true pozostają honorowane jako profil zgodności dla okna odtwarzania odzyskiwania. Wyłączone bloki catchup (enabled: false albo brak enabled: true) są wycofane; openclaw doctor --fix je usuwa.
Rozwiązywanie problemów
Nie znaleziono imsg lub RPC nie jest obsługiwane
Nie znaleziono imsg lub RPC nie jest obsługiwane
imsg. Jeśli akcje prywatnego API są niedostępne, uruchom imsg launch w sesji zalogowanego użytkownika macOS i ponów probe. Jeśli Gateway nie działa na macOS, użyj powyższej konfiguracji zdalnego Maca przez SSH zamiast domyślnej lokalnej ścieżki imsg.Wiadomości są wysyłane, ale przychodzące iMessage nie docierają
Wiadomości są wysyłane, ale przychodzące iMessage nie docierają
chat.db się nie zmienia, OpenClaw nie może odebrać wiadomości, nawet gdy imsg status --json zgłasza zdrowy mostek.chat.db albo zdarzenie imsg watch przed debugowaniem sesji OpenClaw. Nie uruchamiaj tego jako okresowej pętli ponownego uruchamiania mostka; powtarzane imsg launch plus restarty Gateway podczas aktywnej pracy mogą przerywać dostawy i pozostawiać uruchomienia kanału w toku.Gateway nie działa na macOS
Gateway nie działa na macOS
cliPath: "imsg" musi działać na Macu zalogowanym do Messages. Na Linuksie lub Windows ustaw channels.imessage.cliPath na skrypt opakowujący, który łączy się przez SSH z tym Makiem i uruchamia imsg "$@".DM są ignorowane
DM są ignorowane
channels.imessage.dmPolicychannels.imessage.allowFrom- zatwierdzenia parowania (
openclaw pairing list imessage)
Wiadomości grupowe są ignorowane
Wiadomości grupowe są ignorowane
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- zachowanie listy dozwolonych
channels.imessage.groups - konfigurację wzorców wzmianek (
agents.list[].groupChat.mentionPatterns)
Zdalne załączniki zawodzą
Zdalne załączniki zawodzą
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- uwierzytelnianie kluczem SSH/SCP z hosta Gateway
- czy klucz hosta istnieje w
~/.ssh/known_hostsna hoście Gateway - czy ścieżka zdalna jest czytelna na Macu uruchamiającym Messages
Przeoczono monity uprawnień macOS
Przeoczono monity uprawnień macOS
imsg.Wskaźniki odniesienia konfiguracji
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Usunięcie BlueBubbles i ścieżka imsg iMessage — ogłoszenie i podsumowanie migracji
- Przejście z BlueBubbles — tabela tłumaczenia konfiguracji i przełączenie krok po kroku
- Parowanie — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatu grupowego i bramkowanie wzmianek
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie