imessage, который управляет steipete/imsg по JSON-RPC и предоставляет доступ к тому же набору закрытых API, что и BlueBubbles (react, edit, unsend, reply, sendWithEffect, нативные опросы, управление группами, вложения). Один исполняемый файл CLI заменяет сервер BlueBubbles, клиентское приложение и инфраструктуру вебхуков: без конечной точки REST и без аутентификации вебхуков.
В этом руководстве описан перенос старых конфигураций channels.bluebubbles в channels.imessage. Других поддерживаемых путей миграции нет. В текущей версии OpenClaw оставшийся блок channels.bluebubbles неактивен — ни один компонент среды выполнения его не читает.
Краткое объявление и сводку для операторов см. в разделе Удаление BlueBubbles и путь iMessage через imsg.
Контрольный список миграции
Кратчайший безопасный путь, если вы уже знакомы со своей старой конфигурацией BlueBubbles:- Проверьте
imsgнепосредственно на Mac, где работает Messages.app (imsg chats,imsg history,imsg send,imsg rpc --help). - Скопируйте ключи поведения из
channels.bluebubblesвchannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDmsиactions. - Удалите больше не существующие ключи транспорта:
serverUrl,password, URL-адреса вебхуков и настройки сервера BlueBubbles. - Если Gateway работает не на том Mac, где запущен Messages, задайте для
channels.imessage.cliPathSSH-обёртку и настройтеremoteHostдля удалённого получения вложений. - Включите
channels.imessage, перезапустите Gateway, затем выполнитеopenclaw channels status --probe --channel imessage. - Проверьте одно личное сообщение, одну разрешённую группу, вложения, если они включены, и каждое действие закрытого API, которое должен использовать агент.
- Удалите сервер BlueBubbles и старую конфигурацию
channels.bluebubblesпосле проверки пути iMessage.
Что делает imsg
imsg — локальный CLI для Messages в macOS. OpenClaw запускает imsg rpc как дочерний процесс и обменивается с ним данными по JSON-RPC через stdin/stdout. Нет ни HTTP-сервера, ни URL-адреса вебхука, ни фонового демона, ни агента запуска, ни порта, который нужно открывать.
- Чтение выполняется из
~/Library/Messages/chat.dbс помощью дескриптора SQLite, открытого только для чтения. - Входящие сообщения в реальном времени поступают из
imsg watch/watch.subscribe, который отслеживает события файловой системыchat.db, используя опрос в качестве резервного механизма. - Обычные текстовые сообщения и файлы отправляются посредством автоматизации Messages.app.
- Для расширенных действий используется
imsg launch, который внедряет вспомогательный модульimsgв Messages.app. Именно это обеспечивает уведомления о прочтении, индикаторы набора текста, форматированную отправку, редактирование, отмену отправки, ответы в ветках, реакции, опросы и управление группами. - Сборки Linux могут исследовать скопированный
chat.db, но не могут отправлять сообщения, следить за активной базой данных Mac или управлять Messages.app. Для работы OpenClaw с iMessage запускайтеimsgна Mac с выполненным входом в систему или через SSH-обёртку для этого Mac.
Перед началом
-
Установите
imsgна Mac, где работает Messages.app:При обычной локальной настройке мастер настройки OpenClaw может предложить подтверждаемую пользователем установку или обновлениеimsgчерез Homebrew на Mac с выполненным входом в Messages. Ручная настройка и топологии с SSH-обёрткой остаются под управлением оператора: повторите обновление Homebrew в том же локальном или удалённом пользовательском контексте, в котором будет запускатьсяimsg. Еслиimsg chatsзавершается с ошибкойunable to open database file, пустым выводом илиauthorization denied, предоставьте полный доступ к диску терминалу, редактору, процессу Node, службе Gateway или родительскому процессу SSH, который запускаетimsg, а затем перезапустите этот родительский процесс. -
Перед изменением конфигурации OpenClaw проверьте интерфейсы чтения, отслеживания, отправки и RPC:
Замените
42реальным идентификатором чата изimsg chats. Для отправки требуется разрешение на автоматизацию Messages.app. Если OpenClaw будет работать через SSH, выполняйте эти команды через ту же SSH-обёртку или в том же пользовательском контексте, который будет использовать OpenClaw. Если чтение работает, но отправка завершается ошибкой AppleEvents-1743, проверьте, предоставлено ли разрешение на автоматизацию для/usr/libexec/sshd-keygen-wrapper; см. Сбой отправки через SSH-обёртку с ошибкой AppleEvents -1743. -
Включите мост закрытого API. Настоятельно рекомендуется сделать это для iMessage в OpenClaw, поскольку от него зависят ответы, реакции, эффекты, опросы, ответы на вложения и действия с группами:
Для
imsg launchтребуется отключить SIP (а в современных версиях macOS также ослабить проверку библиотек — см. Включение закрытого API imsg). Базовая отправка, история и отслеживание работают безimsg launch, но полный набор действий OpenClaw для iMessage — нет. -
После включения
channels.imessageи запуска Gateway проверьте мост через OpenClaw:Учётная запись iMessage должна сообщатьworks; при наличии--jsonполезная нагрузка проверки содержитprivateApi.available: true. Если она сообщаетfalse, сначала устраните эту проблему — см. Определение возможностей. Для проверки требуется доступный Gateway (иначе CLI возвращает только вывод на основе конфигурации); проверяются только настроенные и включённые учётные записи. -
Создайте резервную копию конфигурации:
Перенос конфигурации
iMessage и BlueBubbles используют большинство одинаковых ключей поведения на уровне канала. Различаются транспорт (REST-сервер или локальный CLI) и формат ключей реестра групп.
Конфигурации с несколькими учётными записями (
channels.bluebubbles.accounts.*) однозначно преобразуются в channels.imessage.accounts.*.
Ловушка реестра групп
Встроенный плагин iMessage последовательно применяет два фильтра групп. Чтобы групповое сообщение дошло до агента, оно должно пройти оба:- Список разрешённых отправителей / целевых чатов (
channels.imessage.groupAllowFrom) — сопоставляет адрес отправителя или целевой чат (записиchat_id:,chat_guid:,chat_identifier:). ЕслиgroupAllowFromне задан, этот фильтр используетallowFrom; явное значениеgroupAllowFrom: []отключает такой резервный вариант и отбрасывает все групповые сообщения приgroupPolicy: "allowlist". - Реестр групп (
channels.imessage.groups) — использует в качестве ключа числовойchat_idiMessage:- Блок
groupsотсутствует (или пуст): группы проходят этот фильтр, если в фильтре 1 действует непустой список разрешённых отправителей; доступ регулируется фильтрацией отправителей, а предупреждение при запуске об отбрасывании всех сообщений не выводится. groupsсодержит записи, но не"*": проходят только перечисленные ключиchat_id. Добавление любой группы превращает реестр в список разрешённых даже приgroupPolicy: "open".groups: { "*": { ... } }: этот фильтр пропускает все группы.
- Блок
groups ключи GUID чата / идентификаторы чата, а реестр iMessage использует числовой chat_id. Если дословно скопировать записи отдельных групп, получится непустой реестр с ключами, которые никогда не совпадут, поэтому все групповые сообщения будут отбрасываться фильтром 2. Скопируйте запись с подстановочным знаком "*" без изменений; замените ключи отдельных групп значениями chat_id из imsg chats.
Оба пути отбрасывания видны при стандартном уровне журналирования в строках warn:
- Один раз для каждой учётной записи при запуске, когда задано
groupPolicy: "allowlist", а действующий список разрешённых отправителей групп пуст:imessage: groupPolicy="allowlist" for account "<id>" but no group sender allowlist is configured .... ЗадайтеgroupAllowFrom(илиallowFrom), чтобы разрешить отправителей; одного добавленияgroupsнедостаточно для прохождения фильтра отправителей. - Один раз для каждого
chat_idво время работы, когда реестр отбрасывает группу:imessage: dropping group message from chat_id=<id> ... not in channels.imessage.groups allowlistс указанием точного ключа, который нужно добавить.
groupPolicy: "allowlist":
groups, чтобы ограничить разрешённые чаты или задать параметры отдельных чатов, например requireMention; скопируйте запись BlueBubbles "*" без изменений, но замените ключи отдельных записей числовыми значениями chat_id iMessage.
Пошаговая инструкция
-
Преобразуйте конфигурацию. Во время редактирования оставьте новый блок отключённым; старый блок
channels.bluebubblesигнорируется текущей версией OpenClaw и может оставаться рядом для справки: -
Выполните переход и проверку. Задайте
channels.imessage.enabled: true, перезапустите Gateway и убедитесь, что канал сообщает об исправном состоянии:Для проверки требуется доступный Gateway; проверяются только настроенные и включённые учётные записи. Чтобы проверить сам Mac, используйте прямые командыimsgиз раздела Перед началом работы. - Проверьте личные сообщения. Отправьте агенту личное сообщение и убедитесь, что ответ доставлен.
-
Проверьте группы отдельно. Личные сообщения и группы обрабатываются разными путями кода — успешная работа личных сообщений не подтверждает маршрутизацию групповых. Отправьте сообщение в разрешённый групповой чат и убедитесь, что ответ доставлен. Если группа перестала отвечать (нет ни ответа агента, ни ошибки), найдите в журнале Gateway две строки
warnиз раздела «Опасная особенность реестра групп» выше. Предупреждение при запуске означает, что фактический список разрешённых отправителей пуст; предупреждение для конкретногоchat_idозначает, что заполненный реестрgroupsне содержит этот чат. -
Проверьте доступные действия. В сопряжённом личном чате попросите агента добавить реакцию, отредактировать и отменить отправку сообщения, ответить, отправить фотографию, а также (в группе) переименовать группу или добавить/удалить участника. Каждое действие должно выполняться нативно в Messages.app. Если какое-либо действие выдаёт
iMessage <action> requires the imsg private API bridge, снова выполнитеimsg launchи обновите с помощьюopenclaw channels status --probe. -
Удалите сервер BlueBubbles и блок
channels.bluebubbles, когда проверите личные сообщения, группы и действия iMessage. OpenClaw не читаетchannels.bluebubbles.
Краткое сравнение доступных действий
iMessage восстанавливает сообщения, пропущенные во время простоя Gateway: при запуске он повторно воспроизводит сообщения начиная с последнего отправленного rowid через
imsg watch.subscribe since_rowid, устраняет дубликаты по GUID, а ограничение по возрасту устаревшей очереди предотвращает «взрыв очереди» при сбросе Push. Это выполняется через RPC-соединение imsg, поэтому работает и в удалённых конфигурациях cliPath через SSH; локальные конфигурации получают более широкое окно восстановления, поскольку могут читать chat.db. См. Восстановление входящих сообщений после перезапуска моста или Gateway.
Сопряжение, сеансы и привязки ACP
- Списки разрешений переносятся по идентификатору.
channels.imessage.allowFromраспознаёт те же строки+15555550123/user@example.com, которые использовал BlueBubbles, — скопируйте их дословно. - Одобрения из хранилища сопряжений не переносятся. Хранилище сопряжений создаётся отдельно для каждого канала, и старое хранилище BlueBubbles не мигрирует. Отправители, одобренные только через сопряжение, должны ещё раз выполнить сопряжение в iMessage, либо вы можете добавить их идентификаторы в
allowFrom. - Сеансы по-прежнему ограничены конкретным агентом и чатом. При стандартном
session.dmScope=mainличные сообщения объединяются в основном сеансе агента; групповые сеансы остаются изолированными поchat_id(agent:<agentId>:imessage:group:<chat_id>). Старая история переписки, сохранённая под ключами сеансов BlueBubbles, не переносится в сеансы iMessage. - В привязках ACP, ссылающихся на
match.channel: "bluebubbles", необходимо заменить значение на"imessage". Форматыmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, идентификатор без дополнительных элементов) остаются прежними.
Канал для отката отсутствует
Поддерживаемой среды выполнения BlueBubbles, на которую можно вернуться, нет. Если проверка iMessage завершается неудачно, задайтеchannels.imessage.enabled: false, перезапустите Gateway, устраните препятствие imsg и повторите переход.
Кеш ответов хранится в состоянии плагина SQLite. openclaw doctor --fix импортирует и архивирует старый вспомогательный файл imessage/reply-cache.jsonl, если он существует.
Связанные материалы
- Удаление BlueBubbles и переход на путь iMessage через imsg — краткое объявление и сводка для оператора.
- iMessage — полный справочник по каналу iMessage, включая настройку
imsg launchи определение возможностей. /channels/bluebubbles— устаревший URL, перенаправляющий на это руководство по миграции.- Сопряжение — аутентификация личных сообщений и процесс сопряжения.
- Маршрутизация каналов — как Gateway выбирает канал для исходящих ответов.