Skip to main content
Для обычного развертывания OpenClaw с iMessage запускайте Gateway и imsg на одном и том же хосте macOS с выполненным входом в Messages. Если Gateway работает в другом месте, укажите в channels.imessage.cliPath прозрачную SSH-обертку, которая запускает imsg на Mac.Восстановление входящих сообщений выполняется автоматически. После перезапуска моста или Gateway iMessage повторно воспроизводит сообщения, пропущенные во время простоя, и подавляет устаревший «взрыв очереди», который Apple может выдать после восстановления Push, устраняя дубликаты, чтобы ничего не отправлялось дважды. Включать это в конфигурации не требуется — см. Восстановление входящих сообщений после перезапуска моста или Gateway.
Поддержка BlueBubbles удалена. Перенесите конфигурации channels.bluebubbles на channels.imessage; OpenClaw поддерживает iMessage только через imsg. Начните с Удаление BlueBubbles и путь iMessage через imsg, чтобы прочитать краткое объявление, или с Переход с BlueBubbles, чтобы ознакомиться с полной таблицей миграции.
Статус: нативная интеграция с внешним CLI. Gateway запускает imsg rpc и обменивается данными по JSON-RPC через stdio — отдельный демон или порт не требуется. Для полноценного канала iMessage настоятельно рекомендуется режим Private API; ответы, реакции tapback, эффекты, опросы, ответы на вложения и групповые действия требуют imsg launch и успешной проверки Private API. При распространенной локальной настройке мастер OpenClaw может предложить подтверждаемую пользователем установку или обновление imsg через Homebrew на Mac с выполненным входом в Messages. Ручная настройка и топологии с SSH-оберткой остаются под управлением оператора: устанавливайте или обновляйте imsg в том же пользовательском контексте, в котором будет работать Gateway или обертка.

Действия Private API

Ответы, реакции tapback, эффекты, опросы, вложения и управление группами.

Сопряжение

По умолчанию личные сообщения iMessage используют режим сопряжения.

Удаленный Mac

Используйте SSH-обертку, если Gateway работает не на Mac с Messages.

Справочник по конфигурации

Полный справочник по полям iMessage.

Быстрая настройка

1

Установка и проверка imsg

Когда локальный мастер настройки обнаруживает отсутствие команды imsg по умолчанию, он может предложить установить steipete/tap/imsg через Homebrew. Если обнаружен управляемый Homebrew экземпляр imsg, мастер может предложить переустановить или обновить его. Пользовательские обертки cliPath не изменяются.
2

Настройка OpenClaw

3

Запуск Gateway

4

Подтверждение сопряжения для первого личного сообщения (dmPolicy по умолчанию)

Срок действия запросов на сопряжение истекает через 1 час.

Требования и разрешения (macOS)

  • На Mac, где работает imsg, должен быть выполнен вход в Messages.
  • Для контекста процесса, в котором работает OpenClaw/imsg, требуется полный доступ к диску (для доступа к базе данных Messages).
  • Для отправки сообщений через Messages.app требуется разрешение на автоматизацию.
  • Для расширенных действий (реакция / редактирование / отмена отправки / ответ в ветке / эффекты / опросы / групповые операции) необходимо отключить System Integrity Protection — см. Включение Private API imsg. Базовая отправка и получение текста и медиафайлов работают без этого.
Разрешения предоставляются отдельно для каждого контекста процесса. Если Gateway работает без графического сеанса (LaunchAgent/SSH), один раз выполните интерактивную команду в том же контексте, чтобы вызвать запросы разрешений:
При настройке через удаленный SSH можно читать чаты, проходить channels status --probe и обрабатывать входящие сообщения, но отправка исходящих сообщений все равно может завершаться ошибкой авторизации AppleEvents:
Проверьте базу данных TCC пользователя удаленного Mac с выполненным входом или раздел System Settings > Privacy & Security > Automation. Если запись Automation зарегистрирована для /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, а также индикаторам набора текста и уведомлениям о прочтении.
Для рекомендуемого на этой странице набора действий требуется режим Private API. В README imsg это требование указано явно:
Расширенные функции, такие как read, typing, launch, расширенная отправка через мост, изменение сообщений и управление чатами, включаются отдельно. Для них необходимо отключить SIP и внедрить вспомогательную библиотеку dylib в Messages.app. imsg launch отказывается выполнять внедрение, если SIP включен.
Метод внедрения вспомогательного компонента использует собственную библиотеку dylib imsg для доступа к закрытым API Messages. В пути iMessage OpenClaw отсутствует сторонний сервер или среда выполнения BlueBubbles.
Отключение SIP — это реальный компромисс в области безопасности. SIP является одним из основных механизмов защиты macOS от выполнения измененного системного кода; его отключение во всей системе расширяет поверхность атаки и может вызвать побочные эффекты. В частности, отключение SIP на Mac с Apple Silicon также лишает возможности устанавливать и запускать приложения iOS на Mac.Рассматривайте это как осознанное эксплуатационное решение, особенно на основном личном Mac. Для качественного производственного развертывания OpenClaw с iMessage предпочтительно использовать выделенный Mac или отдельного пользователя-бота macOS, для которого приемлемо включение моста. Если ваша модель угроз не допускает отключения SIP ни на одном устройстве, встроенный iMessage ограничивается базовым режимом — только отправкой и получением текста и медиафайлов, без реакций / редактирования / отмены отправки / эффектов / групповых операций.

Настройка

  1. Установите (или обновите) imsg на Mac, где работает Messages.app:
    Вывод imsg status --json содержит bridge_version, rpc_methods и selectors для каждого метода, чтобы перед началом работы можно было узнать, что поддерживает текущая сборка.
  2. Отключите защиту целостности системы (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. Для виртуальных машин используется отдельная процедура, поэтому сначала создайте снимок виртуальной машины.
    В macOS 11 и новее одного 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, а не более радикальные меры.
    Если после обновления macOS внедрение imsg launch или отдельные операции selectors начинают возвращать false, обычной причиной является эта проверка. Прежде чем считать, что не сработало само отключение SIP, проверьте состояние SIP и проверки библиотек. Если эти параметры настроены правильно, но мост по-прежнему не может выполнить внедрение, соберите imsg status --json вместе с выводом imsg launch и сообщите об этом проекту imsg, не ослабляя дополнительные общесистемные средства защиты.
  3. Внедрите вспомогательный компонент. При отключённом SIP и выполненном входе в Messages.app:
    imsg launch отказывается выполнять внедрение, если SIP всё ещё включён, поэтому эта команда также подтверждает успешное выполнение шага 2.
  4. Проверьте мост из OpenClaw:
    Запись iMessage должна сообщать works, а imsg status --json | jq '{rpc_methods, selectors}' — показывать возможности, доступные в вашей сборке macOS. Для создания опросов требуется selectors.pollPayloadMessage; для голосования требуются и selectors.pollVoteMessage, и метод RPC poll.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>
Пример:
Общее поведение привязок ACP описано в разделе Агенты ACP.

Схемы развёртывания

Используйте отдельный Apple ID и пользователя macOS, чтобы трафик бота был изолирован от личного профиля Messages.Типичная процедура:
  1. Создайте отдельного пользователя macOS или войдите в его учётную запись.
  2. Войдите в Messages с Apple ID бота в учётной записи этого пользователя.
  3. Установите imsg в учётной записи этого пользователя.
  4. Создайте обёртку SSH, чтобы OpenClaw мог запускать imsg в контексте этого пользователя.
  5. Настройте channels.imessage.accounts.<id>.cliPath и .dbPath на использование профиля этого пользователя.
При первом запуске могут потребоваться разрешения в графическом интерфейсе (Automation + Full Disk Access) в сеансе пользователя бота.
Типовая топология:
  • Gateway работает на Linux/виртуальной машине
  • iMessage и imsg работают на Mac в вашей сети tailnet
  • обёртка cliPath использует SSH для запуска imsg
  • remoteHost позволяет получать вложения по SCP
Пример:
Используйте ключи SSH, чтобы подключения по SSH и SCP не требовали взаимодействия. Сначала убедитесь, что ключ хоста является доверенным (например, ssh bot@mac-mini.tailnet-1234.ts.net), чтобы заполнить known_hosts.
iMessage поддерживает настройку отдельных учётных записей в 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.chunkMode
    • length (по умолчанию)
    • 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 и метод RPC poll.vote.
Принятые входящие опросы отображаются агенту с вопросом, пронумерованными подписями вариантов, количеством голосов и идентификатором сообщения опроса, необходимым для poll-vote.
Контекст входящего сообщения iMessage содержит как короткие значения MessageSid, так и полные GUID сообщений (MessageSidFull), когда они доступны. Короткие идентификаторы действуют только в пределах недавнего кэша ответов на основе SQLite и перед использованием проверяются на соответствие текущему чату. Если срок действия короткого идентификатора истёк, повторите попытку с его MessageSidFull, указав в качестве адресата беседу, из которой он был получен. Полные идентификаторы не обходят привязку к беседе или учётной записи, поэтому идентификатор из другого чата следует заменить идентификатором текущего адресата. Удалённо делегированные вызовы могут отклонять устаревшие полные идентификаторы, если отсутствуют подтверждающие данные о текущей беседе.
OpenClaw скрывает действия приватного API, только когда кэшированный результат проверки указывает, что мост недоступен. Если состояние неизвестно, действия остаются видимыми, а при их выполнении проверка запускается отложенно, поэтому первое действие может успешно выполниться после imsg launch без отдельного ручного обновления состояния.
Когда мост приватного API работает, принятые входящие чаты помечаются как прочитанные, а в личных чатах индикатор набора текста появляется сразу после принятия запроса, пока агент подготавливает контекст и генерирует ответ. Чтобы отключить отметку о прочтении, используйте:
Более старые сборки imsg, выпущенные до появления списка возможностей по отдельным методам, без уведомления отключают набор текста и отметки о прочтении; OpenClaw регистрирует однократное предупреждение при каждом перезапуске, чтобы можно было определить причину отсутствия уведомления.
OpenClaw подписывается на реакции iMessage и маршрутизирует принятые реакции как системные события вместо обычного текста сообщения, поэтому реакция пользователя не запускает обычный цикл ответа.Режим уведомлений управляется параметром channels.imessage.reactionNotifications:
  • "own" (по умолчанию): уведомлять только о реакциях пользователей на сообщения, созданные ботом.
  • "all": уведомлять обо всех входящих реакциях от авторизованных отправителей.
  • "off": игнорировать входящие реакции.
Переопределения для отдельных учётных записей задаются через channels.imessage.accounts.<id>.reactionNotifications.
Когда approvals.exec.enabled или approvals.plugin.enabled имеет значение true и запрос направляется в iMessage, Gateway отправляет запрос на подтверждение во встроенном формате и принимает реакцию для его обработки:
  • 👍 (реакция «Нравится») → allow-once
  • 👎 (реакция «Не нравится») → deny
  • allow-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:
  1. Текстовое сообщение ("Dump").
  2. Пузырь предпросмотра URL ("https://...") с изображениями предпросмотра OG в виде вложений.
В большинстве конфигураций эти две строки поступают в OpenClaw с интервалом около 0.8-2.0 с. Без объединения агент получает на ходе 1 только команду (и часто отвечает «пришлите мне URL») до поступления URL на ходе 2. Это особенность конвейера отправки Apple, а не поведение, добавленное OpenClaw или 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 удаляет их.

Устранение неполадок

Проверьте исполняемый файл и поддержку RPC:
Если проверка сообщает, что RPC не поддерживается, обновите imsg. Если действия через закрытый API недоступны, запустите imsg launch в сеансе вошедшего в систему пользователя macOS и повторите проверку. Если Gateway работает не на macOS, вместо стандартного локального пути imsg используйте описанную выше конфигурацию удалённого Mac через SSH.
Сначала убедитесь, что сообщение достигло локального Mac. Если chat.db не изменяется, OpenClaw не сможет получить сообщение, даже если imsg status --json сообщает об исправном состоянии моста.
Если сообщения, отправленные с телефона, не создают новых строк, восстановите работу Messages и Apple Push в macOS, прежде чем изменять конфигурацию OpenClaw. Часто достаточно однократного перезапуска службы:
Отправьте с телефона новое сообщение iMessage и, прежде чем отлаживать сеансы OpenClaw, убедитесь, что появилась новая строка chat.db или событие imsg watch. Не запускайте это как периодический цикл перезапуска моста: повторные imsg launch вместе с перезапусками Gateway во время активной работы могут прерывать доставку и оставлять выполняющиеся запуски канала в зависшем состоянии.
Стандартный cliPath: "imsg" должен выполняться на Mac, где выполнен вход в Messages. В Linux или Windows задайте для channels.imessage.cliPath скрипт-обёртку, который подключается к этому Mac по SSH и запускает imsg "$@".
Затем выполните:
Проверьте:
  • channels.imessage.dmPolicy
  • channels.imessage.allowFrom
  • подтверждения сопряжения (openclaw pairing list imessage)
Проверьте:
  • channels.imessage.groupPolicy
  • channels.imessage.groupAllowFrom
  • channels.imessage.groups поведение списка разрешений
  • настройку шаблона упоминаний (agents.list[].groupChat.mentionPatterns)
Проверьте:
  • channels.imessage.remoteHost
  • channels.imessage.remoteAttachmentRoots
  • аутентификацию по ключу SSH/SCP с хоста Gateway
  • наличие ключа хоста в ~/.ssh/known_hosts на хосте Gateway
  • доступность удалённого пути для чтения на Mac, где работает Messages
Повторно выполните команды в интерактивном терминале с графическим интерфейсом в контексте того же пользователя и сеанса и подтвердите запросы:
Убедитесь, что полный доступ к диску и разрешение на автоматизацию предоставлены контексту процесса, в котором работает OpenClaw/imsg.

Ссылки на справочник по конфигурации

Связанные материалы