imsg на одном и том же хосте macOS с выполненным входом в Messages. Если Gateway работает в другом месте, укажите в channels.imessage.cliPath прозрачную SSH-обертку, которая запускает imsg на Mac.Восстановление входящих сообщений выполняется автоматически. После перезапуска моста или Gateway iMessage повторно воспроизводит сообщения, пропущенные во время простоя, и подавляет устаревший «взрыв очереди», который Apple может выдать после восстановления Push, устраняя дубликаты, чтобы ничего не отправлялось дважды. Включать это в конфигурации не требуется — см. Восстановление входящих сообщений после перезапуска моста или Gateway.imsg rpc и обменивается данными по JSON-RPC через stdio — отдельный демон или порт не требуется. Для полноценного канала iMessage настоятельно рекомендуется режим Private API; ответы, реакции tapback, эффекты, опросы, ответы на вложения и групповые действия требуют imsg launch и успешной проверки Private API.
При распространенной локальной настройке мастер OpenClaw может предложить подтверждаемую пользователем установку или обновление imsg через Homebrew на Mac с выполненным входом в Messages. Ручная настройка и топологии с SSH-оберткой остаются под управлением оператора: устанавливайте или обновляйте imsg в том же пользовательском контексте, в котором будет работать Gateway или обертка.
Действия Private API
Сопряжение
Удаленный Mac
Справочник по конфигурации
Быстрая настройка
- Локальный Mac (быстрый способ)
- Удаленный Mac через SSH
Установка и проверка imsg
imsg по умолчанию, он может предложить установить steipete/tap/imsg через Homebrew. Если обнаружен управляемый Homebrew экземпляр imsg, мастер может предложить переустановить или обновить его. Пользовательские обертки cliPath не изменяются.Настройка OpenClaw
Запуск Gateway
Подтверждение сопряжения для первого личного сообщения (dmPolicy по умолчанию)
Требования и разрешения (macOS)
- На Mac, где работает
imsg, должен быть выполнен вход в Messages. - Для контекста процесса, в котором работает OpenClaw/
imsg, требуется полный доступ к диску (для доступа к базе данных Messages). - Для отправки сообщений через Messages.app требуется разрешение на автоматизацию.
- Для расширенных действий (реакция / редактирование / отмена отправки / ответ в ветке / эффекты / опросы / групповые операции) необходимо отключить System Integrity Protection — см. Включение Private API imsg. Базовая отправка и получение текста и медиафайлов работают без этого.
Отправка через SSH-обертку завершается ошибкой AppleEvents -1743
Отправка через SSH-обертку завершается ошибкой AppleEvents -1743
channels status --probe и обрабатывать входящие сообщения, но отправка исходящих сообщений все равно может завершаться ошибкой авторизации AppleEvents:/usr/libexec/sshd-keygen-wrapper, а не для imsg или процесса локальной оболочки, macOS может не отображать пригодный переключатель Messages для этого серверного клиента SSH:tccutil reset AppleEvents или повторный запуск imsg send через ту же SSH-обертку могут по-прежнему завершаться ошибкой, поскольку разрешение на автоматизацию Messages требуется контексту процесса SSH-обертки, а не приложению, которому интерфейс может предоставить доступ.Вместо этого используйте один из поддерживаемых контекстов процесса imsg:- Запускайте Gateway или хотя бы мост
imsgв локальном сеансе пользователя, вошедшего в Messages. - Запускайте Gateway через LaunchAgent этого пользователя после предоставления полного доступа к диску и разрешения на автоматизацию из того же сеанса.
- Если сохраняется SSH-топология с двумя пользователями, перед включением канала убедитесь, что фактическая исходящая отправка
imsg sendуспешно выполняется через точную используемую обертку. Если ей невозможно предоставить разрешение на автоматизацию, вместо использования SSH-обертки для отправки перенастройте систему на однопользовательскую конфигурациюimsg.
Включение Private API imsg
imsg поставляется с двумя режимами работы. Для OpenClaw рекомендуется режим Private API, поскольку он предоставляет каналу нативные действия iMessage, ожидаемые пользователями. Базовый режим по-прежнему подходит для установок с низким риском, первоначальной проверки или хостов, где SIP невозможно отключить.
- Базовый режим (по умолчанию, изменения SIP не требуются): исходящие текстовые и мультимедийные сообщения через
send, наблюдение за входящими сообщениями и история, список чатов. Это доступно сразу после новой установкиbrew install steipete/tap/imsgи предоставления стандартных разрешений macOS, перечисленных выше. - Режим Private API:
imsgвнедряет вспомогательную библиотеку dylib вMessages.app, чтобы вызывать внутренние функцииIMCore. Это открывает доступ кreact,edit,unsend,reply(в ветке),sendWithEffect,pollиpoll-vote(нативные опросы Messages),renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, а также индикаторам набора текста и уведомлениям о прочтении.
imsg это требование указано явно:
Расширенные функции, такие какМетод внедрения вспомогательного компонента использует собственную библиотеку dylibread,typing,launch, расширенная отправка через мост, изменение сообщений и управление чатами, включаются отдельно. Для них необходимо отключить SIP и внедрить вспомогательную библиотеку dylib вMessages.app.imsg launchотказывается выполнять внедрение, если SIP включен.
imsg для доступа к закрытым API Messages. В пути iMessage OpenClaw отсутствует сторонний сервер или среда выполнения BlueBubbles.
Настройка
-
Установите (или обновите)
imsgна Mac, где работает Messages.app:Выводimsg status --jsonсодержитbridge_version,rpc_methodsиselectorsдля каждого метода, чтобы перед началом работы можно было узнать, что поддерживает текущая сборка. -
Отключите защиту целостности системы (System Integrity Protection), а в современных версиях macOS — также проверку библиотек (Library Validation). Для внедрения вспомогательной библиотеки dylib не от Apple в подписанный Apple процесс
Messages.appнеобходимо отключить SIP и ослабить проверку библиотек. Порядок отключения SIP в режиме восстановления зависит от версии macOS:- macOS 10.13–10.15 (Sierra–Catalina): отключите Library Validation через Terminal, перезагрузитесь в режим восстановления, выполните
csrutil disable, перезапустите систему. - macOS 11+ (Big Sur и новее), Intel: перейдите в режим восстановления (или восстановления через интернет), выполните
csrutil disable, перезапустите систему. - macOS 11+, Apple Silicon: для перехода в режим восстановления используйте последовательность запуска с кнопкой питания; в последних версиях macOS удерживайте клавишу Left Shift, когда нажимаете Continue, затем выполните
csrutil disable. Для виртуальных машин используется отдельная процедура, поэтому сначала создайте снимок виртуальной машины.
csrutil disableобычно недостаточно. Apple по-прежнему применяет проверку библиотек кMessages.appкак к платформенному исполняемому файлу, поэтому вспомогательный компонент с подписью ad hoc отклоняется (Library Validation failed: ... platform binary, but mapped file is not) даже при отключённом SIP. После отключения SIP также отключите проверку библиотек и перезагрузите систему:macOS 26 (Tahoe), проверено на версии 26.5.1: для внедрения вспомогательного компонента во всех версиях от 26.0 до 26.5.x достаточно отключённого SIP вместе с приведённой выше командойDisableLibraryValidation. Параметры boot-args не требуются. Решающее значение имеет файл plist; отсутствие этого шага — наиболее частая причина сбоя внедрения в Tahoe:- С файлом plist:
imsg launchвыполняет внедрение, аimsg statusсообщаетadvanced_features: true. - Без файла plist (даже при отключённом SIP):
imsg launchзавершается ошибкойFailed to launch: Timeout waiting for Messages.app to initialize. AMFI отклоняет вспомогательный компонент с подписью ad hoc при загрузке, поэтому мост не переходит в состояние готовности, а запуск завершается по тайм-ауту. Именно с таким тайм-аутом чаще всего сталкиваются в Tahoe; решение — приведённый выше файл plist, а не более радикальные меры.
imsg launchили отдельные операцииselectorsначинают возвращать false, обычной причиной является эта проверка. Прежде чем считать, что не сработало само отключение SIP, проверьте состояние SIP и проверки библиотек. Если эти параметры настроены правильно, но мост по-прежнему не может выполнить внедрение, соберитеimsg status --jsonвместе с выводомimsg launchи сообщите об этом проектуimsg, не ослабляя дополнительные общесистемные средства защиты. - macOS 10.13–10.15 (Sierra–Catalina): отключите Library Validation через Terminal, перезагрузитесь в режим восстановления, выполните
-
Внедрите вспомогательный компонент. При отключённом SIP и выполненном входе в Messages.app:
imsg launchотказывается выполнять внедрение, если SIP всё ещё включён, поэтому эта команда также подтверждает успешное выполнение шага 2. -
Проверьте мост из OpenClaw:
Запись iMessage должна сообщать
works, аimsg status --json | jq '{rpc_methods, selectors}'— показывать возможности, доступные в вашей сборке macOS. Для создания опросов требуетсяselectors.pollPayloadMessage; для голосования требуются иselectors.pollVoteMessage, и метод RPCpoll.vote. Плагин OpenClaw объявляет только действия, поддерживаемые кэшированной проверкой, но при пустом кэше исходит из оптимистичных предположений и выполняет проверку при первой отправке.
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 можно использовать отдельный Mac без Apple Silicon или выделенный Mac для бота с отключённым SIP, сохранив SIP включённым на основных устройствах. См. ниже раздел Выделенный пользователь macOS для бота (отдельная учётная запись iMessage).
Управление доступом и маршрутизация
- Политика личных сообщений
- Политика групп и упоминания
- Сеансы и детерминированные ответы
channels.imessage.dmPolicy управляет личными сообщениями:pairing(по умолчанию)allowlist(требуется хотя бы одна записьallowFrom)open(требуется, чтобыallowFromсодержал"*")disabled
channels.imessage.allowFrom.Записи списка разрешений должны идентифицировать отправителей: дескрипторы или статические группы доступа отправителей (accessGroup:<name>). Используйте channels.imessage.groupAllowFrom для целей чата, например chat_id:*, chat_guid:* или chat_identifier:*; для числовых ключей реестра 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илиuser@example.com chat_id:<id>(рекомендуется для стабильных групповых привязок)chat_guid:<guid>chat_identifier:<identifier>
Схемы развёртывания
Выделенный пользователь macOS для бота (отдельная учётная запись iMessage)
Выделенный пользователь macOS для бота (отдельная учётная запись iMessage)
- Создайте отдельного пользователя macOS или войдите в его учётную запись.
- Войдите в Messages с Apple ID бота в учётной записи этого пользователя.
- Установите
imsgв учётной записи этого пользователя. - Создайте обёртку SSH, чтобы OpenClaw мог запускать
imsgв контексте этого пользователя. - Настройте
channels.imessage.accounts.<id>.cliPathи.dbPathна использование профиля этого пользователя.
Удалённый Mac через Tailscale (пример)
Удалённый Mac через Tailscale (пример)
- Gateway работает на Linux/виртуальной машине
- iMessage и
imsgработают на Mac в вашей сети tailnet - обёртка
cliPathиспользует SSH для запускаimsg remoteHostпозволяет получать вложения по SCP
ssh bot@mac-mini.tailnet-1234.ts.net), чтобы заполнить known_hosts.Схема с несколькими учётными записями
Схема с несколькими учётными записями
channels.imessage.accounts.Для каждой учётной записи можно переопределить такие поля, как cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, настройки истории и списки разрешённых корневых каталогов вложений.История личных сообщений
История личных сообщений
channels.imessage.dmHistoryLimit, чтобы при создании сеансов личных сообщений добавлять в них недавнюю декодированную историю imsg соответствующей беседы. Используйте channels.imessage.dms["<sender>"].historyLimit для переопределений по отправителям, включая 0, чтобы отключить историю для определённого отправителя.История личных сообщений iMessage извлекается из imsg по запросу. Если dmHistoryLimit не задан, глобальное добавление истории личных сообщений отключено, однако положительное значение channels.imessage.dms["<sender>"].historyLimit для отдельного отправителя по-прежнему включает добавление истории для него.Медиафайлы, разбиение на части и адресаты доставки
Вложения и медиафайлы
Вложения и медиафайлы
- приём входящих вложений по умолчанию отключён — задайте
channels.imessage.includeAttachments: true, чтобы передавать агенту фотографии, голосовые заметки, видео и другие вложения. Если эта возможность отключена, сообщения iMessage, содержащие только вложения, отбрасываются до передачи агенту и могут вообще не создавать строку журналаInbound message. - пути к удалённым вложениям можно получать по SCP, если задан
remoteHost - пути к вложениям должны соответствовать разрешённым корневым каталогам:
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.streaming.chunkModelength(по умолчанию)newline(сначала разделение по абзацам)
- выделение полужирным, курсивом, подчёркиванием и зачёркиванием в исходящем Markdown преобразуется во встроенное форматирование текста (получатели на macOS 15+ видят форматирование, а на более старых версиях — обычный текст без маркеров); таблицы Markdown преобразуются в соответствии с режимом таблиц Markdown канала
channels.imessage.sendTransport(по умолчаниюauto, такжеbridge,applescript) определяет, какimsgвыполняет отправку
Форматы адресации
Форматы адресации
chat_id:123(рекомендуется для стабильной маршрутизации)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Действия приватного API
Когдаimsg launch работает, а openclaw channels status --probe сообщает privateApi.available: true, инструмент сообщений может использовать встроенные действия iMessage в дополнение к обычной отправке текста.
Все действия включены по умолчанию; используйте channels.imessage.actions, чтобы отключить отдельные действия:
Доступные действия
Доступные действия
- react: добавить или удалить реакцию iMessage (
messageId,emoji,remove). Поддерживаемые реакции соответствуют вариантам «любовь», «нравится», «не нравится», «смех», «акцент» и «вопрос». Удаление без указания эмодзи сбрасывает любую установленную реакцию. - reply: отправить ответ в ветке на существующее сообщение (
messageId,textилиmessage, а такжеchatGuid,chatId,chatIdentifierилиto). Для ответа с вложением дополнительно требуется сборкаimsg, в которойsend-richподдерживает--file. - sendWithEffect: отправить текст с эффектом iMessage (
textилиmessage,effectилиeffectId). Краткие имена: slam, loud, gentle, invisibleink, confetti, lasers, fireworks, balloon, heart, echo, happybirthday, shootingstar, sparkles, spotlight. - edit: изменить отправленное сообщение в поддерживаемых версиях macOS и приватного API (
messageId,textилиnewText). Изменять можно только сообщения, отправленные самим Gateway. - unsend: отозвать отправленное сообщение в поддерживаемых версиях macOS и приватного API (
messageId). Отзывать можно только сообщения, отправленные самим Gateway. - upload-file: отправить медиафайлы или другие файлы (
bufferв формате base64 либо подготовленныйmedia/path/filePath,filename, необязательныйasVoice). Устаревший псевдоним:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: управлять групповыми чатами, когда текущим адресатом является групповая беседа. Эти действия изменяют идентификатор Messages на хосте, поэтому для них требуется отправитель-владелец или клиент Gateway
operator.admin. - poll: создать встроенный опрос Apple Messages (
pollQuestion,pollOption, повторённый от 2 до 12 раз, а такжеchatGuid,chatId,chatIdentifierилиto). Получатели на iOS/iPadOS/macOS 26+ видят опрос и голосуют во встроенном интерфейсе; на более старых версиях ОС отображается резервный текст «Sent a poll». Требуетсяselectors.pollPayloadMessage. - poll-vote: проголосовать в существующем опросе (
pollIdилиmessageId, а также ровно один из параметровpollOptionIndex,pollOptionIdилиpollOptionText). Требуютсяselectors.pollVoteMessageи метод RPCpoll.vote.
poll-vote.Идентификаторы сообщений
Идентификаторы сообщений
MessageSid, так и полные GUID сообщений (MessageSidFull), когда они доступны. Короткие идентификаторы действуют только в пределах недавнего кэша ответов на основе SQLite и перед использованием проверяются на соответствие текущему чату. Если срок действия короткого идентификатора истёк, повторите попытку с его MessageSidFull, указав в качестве адресата беседу, из которой он был получен. Полные идентификаторы не обходят привязку к беседе или учётной записи, поэтому идентификатор из другого чата следует заменить идентификатором текущего адресата. Удалённо делегированные вызовы могут отклонять устаревшие полные идентификаторы, если отсутствуют подтверждающие данные о текущей беседе.Определение возможностей
Определение возможностей
imsg launch без отдельного ручного обновления состояния.Уведомления о прочтении и индикатор набора текста
Уведомления о прочтении и индикатор набора текста
imsg, выпущенные до появления списка возможностей по отдельным методам, без уведомления отключают набор текста и отметки о прочтении; OpenClaw регистрирует однократное предупреждение при каждом перезапуске, чтобы можно было определить причину отсутствия уведомления.Входящие реакции
Входящие реакции
channels.imessage.reactionNotifications:"own"(по умолчанию): уведомлять только о реакциях пользователей на сообщения, созданные ботом."all": уведомлять обо всех входящих реакциях от авторизованных отправителей."off": игнорировать входящие реакции.
channels.imessage.accounts.<id>.reactionNotifications.Реакции для подтверждения (👍 / 👎)
Реакции для подтверждения (👍 / 👎)
approvals.exec.enabled или approvals.plugin.enabled имеет значение true и запрос направляется в iMessage, Gateway отправляет запрос на подтверждение во встроенном формате и принимает реакцию для его обработки:👍(реакция «Нравится») →allow-once👎(реакция «Не нравится») →denyallow-alwaysостаётся ручным резервным вариантом: отправьте/approve <id> allow-alwaysкак обычный ответ.
channels.imessage.allowFrom (или channels.imessage.accounts.<id>.allowFrom); добавьте номер телефона пользователя в формате E.164 или адрес электронной почты его Apple ID (адресаты чатов, такие как chat_id:*, не являются допустимыми записями подтверждающих лиц). Запись с подстановочным знаком "*" учитывается, но позволяет подтвердить запрос любому отправителю; пустой список подтверждающих лиц полностью отключает сокращённое подтверждение реакцией. Сокращённое подтверждение реакцией намеренно обходит reactionNotifications, dmPolicy и groupAllowFrom, поскольку единственным значимым условием для обработки подтверждения является явный список разрешённых подтверждающих лиц.Авторизация текстовой команды /approve использует тот же список: когда channels.imessage.allowFrom не пуст, /approve <id> <decision> авторизуется по этому списку подтверждающих лиц, а не по более широкому списку разрешённых личных сообщений, и отправители, разрешённые списком личных сообщений, но отсутствующие в allowFrom, получают явный отказ. Когда allowFrom пуст, продолжает действовать резервный вариант для того же чата, а /approve авторизует любого пользователя, разрешённого списком личных сообщений. Добавьте каждого оператора, которому разрешено подтверждать запросы — через /approve или с помощью реакций, — в allowFrom.Примечания для операторов:- Привязка реакции хранится как в памяти, так и в постоянном хранилище Gateway с ключевым доступом (TTL соответствует сроку действия подтверждения); кроме того, Gateway опрашивает ожидающие запросы на наличие реакций tapback, поэтому реакция tapback, поступившая вскоре после перезапуска Gateway, всё равно обрабатывает подтверждение.
- Собственная реакция tapback оператора
is_from_me=true(например, с сопряжённого устройства Apple) обрабатывает подтверждение, если этот идентификатор явно указан среди подтверждающих лиц. - Запросы на подтверждение направляются в групповой разговор только при явно настроенных подтверждающих лицах; иначе подтвердить запрос мог бы любой участник группы.
- Устаревшие текстовые реакции tapback (
Liked "…"в виде обычного текста от очень старых клиентов Apple) не могут обрабатывать подтверждения, поскольку не содержат GUID сообщения; для обработки реакции необходимы структурированные метаданные tapback, передаваемые современными клиентами macOS / iOS.
Запись конфигурации
По умолчанию iMessage разрешает запись конфигурации, инициированную каналом (для/config set|unset, когда commands.config: true).
Отключение:
Объединение разделённых личных сообщений (команда + URL в одном составленном сообщении)
Когда пользователь вводит вместе команду и URL — например,Dump https://example.com/article — приложение Apple Messages разделяет отправку на две отдельные строки chat.db:
- Текстовое сообщение (
"Dump"). - Пузырь предпросмотра URL (
"https://...") с изображениями предпросмотра OG в виде вложений.
imsg.
channels.imessage.coalesceSameSenderDms включает для личных сообщений буферизацию последовательных строк от одного отправителя. Когда imsg предоставляет структурный маркер предпросмотра URL balloon_bundle_id: "com.apple.messages.URLBalloonProvider" в одной из исходных строк, OpenClaw объединяет только эту фактическую разделённую отправку, а остальные буферизованные строки сохраняет как отдельные ходы. В старых сборках imsg, которые вообще не передают метаданные пузыря, OpenClaw не может отличить разделённую отправку от отдельных сообщений, поэтому в качестве резервного поведения объединяет весь набор. Это сохраняет поведение до появления метаданных, не превращая снова разделённые отправки Dump <url> в два хода. Групповые чаты по-прежнему обрабатывают каждое сообщение отдельно, чтобы сохранить структуру ходов нескольких пользователей.
- Когда включать
- Включение
- Компромиссы
- Вы поставляете Skills, ожидающие
command + payloadв одном сообщении (дамп, вставка, сохранение, постановка в очередь и т. д.). - Ваши пользователи вставляют URL вместе с командами.
- Для вас приемлема дополнительная задержка хода в личных сообщениях (см. ниже).
- Вам нужна минимальная задержка выполнения команд для однословных триггеров в личных сообщениях.
- Все ваши процессы состоят из однократных команд без последующей передачи полезной нагрузки.
Сценарии и данные, видимые агенту
Столбец «Флаг включён» показывает поведение сборкиimsg, передающей balloon_bundle_id. В старых сборках imsg, которые вообще не передают метаданные пузыря, строки, помеченные ниже как «Два хода» / «N ходов», вместо этого объединяются по устаревшему механизму (один ход): OpenClaw не может структурно отличить разделённую отправку от отдельных сообщений, поэтому сохраняет объединение, применявшееся до появления метаданных. Точное разделение активируется, когда сборка начинает передавать метаданные пузыря.
Восстановление входящих сообщений после перезапуска моста или Gateway
iMessage восстанавливает сообщения, пропущенные во время остановки Gateway, одновременно подавляя устаревшую «бомбу из накопившихся сообщений», которую Apple может отправить после восстановления Push. Это поведение всегда включено по умолчанию и основано на устранении дубликатов входящих сообщений.- Устранение дубликатов при повторном воспроизведении. Каждое обработанное входящее сообщение записывается по своему GUID Apple в постоянное состояние плагина (
imessage.inbound-dedupe): резервируется при приёме и фиксируется после обработки (при временном сбое резервирование снимается, чтобы попытку можно было повторить). Уже обработанные сообщения отбрасываются, а не обрабатываются повторно. Благодаря этому восстановление может интенсивно воспроизводить сообщения без отдельного учёта каждого из них. - Восстановление после простоя. При запуске монитор получает последний обработанный rowid строки
chat.db(сохранённый курсор для каждой учётной записи) и передаёт его вimsg watch.subscribeкакsince_rowid, поэтому imsg сначала воспроизводит строки, поступившие во время остановки Gateway, а затем отслеживает новые. Повторное воспроизведение ограничено последними 500 строками и сообщениями возрастом до ~2 часов, а механизм устранения дубликатов отбрасывает всё уже обработанное. - Возрастной барьер устаревшей очереди. Строки выше границы запуска действительно являются новыми; если дата отправки такой строки более чем на ~15 минут предшествует времени её поступления, она относится к очереди, сброшенной Push, и подавляется. Для повторно воспроизводимых строк (на границе или ниже неё) вместо этого используется более широкое окно восстановления, поэтому недавно пропущенное сообщение доставляется, а давняя история — нет.
cliPath, поскольку повторное воспроизведение since_rowid выполняется через то же RPC-соединение imsg. Отличается только окно: когда Gateway может читать chat.db (локально), он привязывается к границе rowid при запуске, ограничивает диапазон повторного воспроизведения и доставляет пропущенные сообщения возрастом до пары часов. При удалённом подключении cliPath по SSH он не может читать базу данных, поэтому повторное воспроизведение не ограничивается, а для каждой строки применяется возрастной барьер новых сообщений — недавно пропущенные сообщения всё равно восстанавливаются, а старая очередь подавляется, но используется более узкое окно новых сообщений. Для более широкого окна восстановления запускайте Gateway на Mac, где работает Messages.
Сигнал, видимый оператору
Подавление накопившихся сообщений регистрируется на стандартном уровне, а не выполняется без уведомления (флагrecovery показывает, какое окно было применено):
Миграция
channels.imessage.catchup.* устарел — восстановление после простоя выполняется автоматически и не требует конфигурации для новых установок. Существующие конфигурации с catchup.enabled: true продолжают поддерживаться как профиль совместимости для окна повторного воспроизведения при восстановлении. Отключённые блоки наверстывания (enabled: false или без enabled: true) выведены из эксплуатации; openclaw doctor --fix удаляет их.
Устранение неполадок
imsg не найден или RPC не поддерживается
imsg не найден или RPC не поддерживается
imsg. Если действия через закрытый API недоступны, запустите imsg launch в сеансе вошедшего в систему пользователя macOS и повторите проверку. Если Gateway работает не на macOS, вместо стандартного локального пути imsg используйте описанную выше конфигурацию удалённого Mac через SSH.Сообщения отправляются, но входящие сообщения iMessage не поступают
Сообщения отправляются, но входящие сообщения iMessage не поступают
chat.db не изменяется, OpenClaw не сможет получить сообщение, даже если imsg status --json сообщает об исправном состоянии моста.chat.db или событие imsg watch. Не запускайте это как периодический цикл перезапуска моста: повторные imsg launch вместе с перезапусками Gateway во время активной работы могут прерывать доставку и оставлять выполняющиеся запуски канала в зависшем состоянии.Gateway не запущен в macOS
Gateway не запущен в macOS
cliPath: "imsg" должен выполняться на Mac, где выполнен вход в Messages. В Linux или Windows задайте для channels.imessage.cliPath скрипт-обёртку, который подключается к этому Mac по SSH и запускает 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- аутентификацию по ключу SSH/SCP с хоста Gateway
- наличие ключа хоста в
~/.ssh/known_hostsна хосте Gateway - доступность удалённого пути для чтения на Mac, где работает Messages
Запросы разрешений macOS были пропущены
Запросы разрешений macOS были пропущены
imsg.Ссылки на справочник по конфигурации
Связанные материалы
- Обзор каналов — все поддерживаемые каналы
- Удаление BlueBubbles и переход на путь iMessage через imsg — объявление и краткое описание миграции
- Переход с BlueBubbles — таблица преобразования конфигурации и пошаговый переход
- Сопряжение — аутентификация в личных сообщениях и процесс сопряжения
- Группы — поведение групповых чатов и фильтрация по упоминаниям
- Маршрутизация каналов — маршрутизация сеансов для сообщений
- Безопасность — модель доступа и усиление защиты