Mainstream messaging
Переход с BlueBubbles
Поддержка BlueBubbles удалена. OpenClaw поддерживает iMessage только через встроенный плагин imessage, который управляет steipete/imsg по JSON-RPC и предоставляет доступ к тому же набору закрытых API, что и BlueBubbles (react, edit, unsend, reply, sendWithEffect, нативные опросы, управление группами, вложения). Один исполняемый файл CLI заменяет сервер BlueBubbles, клиентское приложение и инфраструктуру вебхуков: без конечной точки REST и без аутентификации вебхуков.
В этом руководстве описан перенос старых конфигураций channels.bluebubbles в channels.imessage. Других поддерживаемых путей миграции нет. В текущей версии OpenClaw оставшийся блок channels.bluebubbles неактивен — ни один компонент среды выполнения его не читает.
Контрольный список миграции
Кратчайший безопасный путь, если вы уже знакомы со своей старой конфигурацией 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:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg chats --limit 3При обычной локальной настройке мастер настройки OpenClaw может предложить подтверждаемую пользователем установку или обновление
imsgчерез Homebrew на Mac с выполненным входом в Messages. Ручная настройка и топологии с SSH-обёрткой остаются под управлением оператора: повторите обновление Homebrew в том же локальном или удалённом пользовательском контексте, в котором будет запускатьсяimsg. Еслиimsg chatsзавершается с ошибкойunable to open database file, пустым выводом илиauthorization denied, предоставьте полный доступ к диску терминалу, редактору, процессу Node, службе Gateway или родительскому процессу SSH, который запускаетimsg, а затем перезапустите этот родительский процесс. -
Перед изменением конфигурации OpenClaw проверьте интерфейсы чтения, отслеживания, отправки и RPC:
bash imsg chats --limit 10 --json | jq -simsg history --chat-id 42 --limit 10 --attachments --json | jq -simsg watch --chat-id 42 --reactions --jsonimsg send --chat-id 42 --text "OpenClaw imsg test"imsg rpc --helpЗамените
42реальным идентификатором чата изimsg chats. Для отправки требуется разрешение на автоматизацию Messages.app. Если OpenClaw будет работать через SSH, выполняйте эти команды через ту же SSH-обёртку или в том же пользовательском контексте, который будет использовать OpenClaw. Если чтение работает, но отправка завершается ошибкой AppleEvents-1743, проверьте, предоставлено ли разрешение на автоматизацию для/usr/libexec/sshd-keygen-wrapper; см. Сбой отправки через SSH-обёртку с ошибкой AppleEvents -1743. -
Включите мост закрытого API. Настоятельно рекомендуется сделать это для iMessage в OpenClaw, поскольку от него зависят ответы, реакции, эффекты, опросы, ответы на вложения и действия с группами:
bash imsg launchimsg status --jsonДля
imsg launchтребуется отключить SIP (а в современных версиях macOS также ослабить проверку библиотек — см. Включение закрытого API imsg). Базовая отправка, история и отслеживание работают безimsg launch, но полный набор действий OpenClaw для iMessage — нет. -
После включения
channels.imessageи запуска Gateway проверьте мост через OpenClaw:bash openclaw channels status --probeУчётная запись iMessage должна сообщать
works; при наличии--jsonполезная нагрузка проверки содержитprivateApi.available: true. Если она сообщаетfalse, сначала устраните эту проблему — см. Определение возможностей. Для проверки требуется доступный Gateway (иначе CLI возвращает только вывод на основе конфигурации); проверяются только настроенные и включённые учётные записи. -
Создайте резервную копию конфигурации:
bash cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
Перенос конфигурации
iMessage и BlueBubbles используют большинство одинаковых ключей поведения на уровне канала. Различаются транспорт (REST-сервер или локальный CLI) и формат ключей реестра групп.
| BlueBubbles | встроенный iMessage | Примечания |
|---|---|---|
channels.bluebubbles.enabled |
channels.imessage.enabled |
Та же семантика (по умолчанию true после появления блока). |
channels.bluebubbles.serverUrl |
(удалено) | REST-сервера нет — плагин запускает imsg rpc через stdio. |
channels.bluebubbles.password |
(удалено) | Аутентификация Webhook не требуется. |
| (неявно) | channels.imessage.cliPath |
Путь к imsg (по умолчанию imsg); для SSH используйте скрипт-обёртку. |
| (неявно) | channels.imessage.dbPath |
Необязательное переопределение chat.db для Messages.app; при отсутствии определяется автоматически. |
| (неявно) | channels.imessage.remoteHost |
host или user@host — требуется только тогда, когда cliPath является обёрткой SSH и нужно получать вложения через SCP. |
channels.bluebubbles.dmPolicy |
channels.imessage.dmPolicy |
Те же значения (pairing / allowlist / open / disabled); по умолчанию pairing. |
channels.bluebubbles.allowFrom |
channels.imessage.allowFrom |
Те же форматы адресатов (+15555550123, user@example.com). Одобрения из хранилища сопряжений не переносятся — см. ниже. |
channels.bluebubbles.groupPolicy |
channels.imessage.groupPolicy |
Те же значения (allowlist / open / disabled); по умолчанию allowlist. |
channels.bluebubbles.groupAllowFrom |
channels.imessage.groupAllowFrom |
Аналогично. Если значение не задано, iMessage использует allowFrom; явно пустое значение groupAllowFrom: [] блокирует все группы при groupPolicy: "allowlist". |
channels.bluebubbles.groups |
channels.imessage.groups |
Скопируйте запись с подстановочным знаком "*" без изменений; замените ключи записей отдельных групп на числовые chat_id iMessage — см. «Ловушка реестра групп». requireMention, tools, toolsBySender, systemPrompt переносятся без изменений. |
channels.bluebubbles.sendReadReceipts |
channels.imessage.sendReadReceipts |
По умолчанию true. Со встроенным плагином срабатывает только при успешной проверке частного API. |
channels.bluebubbles.includeAttachments |
channels.imessage.includeAttachments |
Та же структура, по умолчанию также отключено. Если в BlueBubbles передавались вложения, задайте это явно — до этого входящие фотографии и медиафайлы незаметно отбрасываются (без строки журнала Inbound message). |
channels.bluebubbles.attachmentRoots |
channels.imessage.attachmentRoots |
Локальные корневые каталоги; те же правила подстановочных знаков. |
| (неприменимо) | channels.imessage.remoteAttachmentRoots |
Используется только тогда, когда для получения через SCP задано remoteHost. |
channels.bluebubbles.mediaMaxMb |
channels.imessage.mediaMaxMb |
По умолчанию в iMessage — 16 МБ (в BlueBubbles по умолчанию было 8 МБ). Задайте явно, чтобы сохранить более низкий предел. |
channels.bluebubbles.textChunkLimit |
channels.imessage.textChunkLimit |
В обоих случаях по умолчанию 4000. |
channels.bluebubbles.coalesceSameSenderDms |
channels.imessage.coalesceSameSenderDms |
Так же включается явно. Только для личных сообщений — в группах сохраняется отправка каждого сообщения отдельно. Если не задано messages.inbound.byChannel.imessage или глобальное значение messages.inbound.debounceMs, стандартная задержка объединения входящих сообщений увеличивается до 7000 мс. См. Объединение личных сообщений, отправленных частями. |
channels.bluebubbles.enrichGroupParticipantsFromContacts |
(неприменимо) | imsg уже предоставляет отображаемые имена отправителей из chat.db. |
channels.bluebubbles.actions.* |
channels.imessage.actions.* |
Те же переключатели для отдельных действий (reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment) плюс новый polls. Все включены по умолчанию; действия частного API по-прежнему требуют моста. |
Конфигурации с несколькими учётными записями (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: { "*": { ... } }: этот фильтр пропускает все группы.
- Блок
Ловушка миграции: BlueBubbles использовал для записей 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":
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123", "chat_guid:any;-;..."], }, },}Эта конфигурация разрешает указанным отправителям писать в любой группе. Добавьте записи groups, чтобы ограничить разрешённые чаты или задать параметры отдельных чатов, например requireMention; скопируйте запись BlueBubbles "*" без изменений, но замените ключи отдельных записей числовыми значениями chat_id iMessage.
Пошаговая инструкция
-
Преобразуйте конфигурацию. Во время редактирования оставьте новый блок отключённым; старый блок
channels.bluebubblesигнорируется текущей версией OpenClaw и может оставаться рядом для справки:json5 { channels: { imessage: { enabled: false, // переключите на true, когда будете готовы к переходу cliPath: "/opt/homebrew/bin/imsg", dmPolicy: "pairing", allowFrom: ["+15555550123"], // скопируйте из bluebubbles.allowFrom groupPolicy: "allowlist", groupAllowFrom: [], // скопируйте из bluebubbles.groupAllowFrom groups: { "*": { requireMention: true } }, // подстановочный знак копируется дословно; измените ключи записей отдельных чатов на chat_id // действия по умолчанию включены; чтобы отключить отдельные действия, задайте соответствующим переключателям false }, },} -
Выполните переход и проверку. Задайте
channels.imessage.enabled: true, перезапустите Gateway и убедитесь, что канал сообщает об исправном состоянии:bash openclaw gateway restartopenclaw channels status --probe --channel imessage # ожидается "works"; --json показывает privateApi.available: trueДля проверки требуется доступный 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.
Краткое сравнение доступных действий
| Действие | устаревший BlueBubbles | встроенный iMessage |
|---|---|---|
| Отправка текста / резервная отправка через SMS | ✅ | ✅ |
| Отправка медиафайлов (фото, видео, файл, голосовое сообщение) | ✅ | ✅ |
Ответ в ветке (reply_to_guid) |
✅ | ✅ (закрывает #51892) |
Tapback (react) |
✅ | ✅ |
| Редактирование / отмена отправки (получатели на macOS 13+) | ✅ | ✅ |
| Отправка с экранным эффектом | ✅ | ✅ (частично закрывает #9394) |
| Форматирование текста: полужирный / курсив / подчёркивание / зачёркивание | ✅ | ✅ (форматирование типизированных сегментов через attributedBody) |
| Нативные опросы Messages (создание и голосование) | ❌ | ✅ (actions.polls; для нативного отображения получателям требуется iOS/macOS 26+) |
| Переименование группы / установка значка группы | ✅ | ✅ |
| Добавление / удаление участника, выход из группы | ✅ | ✅ |
| Уведомления о прочтении и индикатор набора текста | ✅ | ✅ (доступность определяется проверкой закрытого API) |
| Объединение личных сообщений от одного отправителя | ✅ | ✅ (только для личных сообщений; включается через channels.imessage.coalesceSameSenderDms) |
| Восстановление входящих сообщений после перезапуска | ✅ | ✅ (автоматически: повторное воспроизведение since_rowid + дедупликация по GUID; более широкое окно при локальном развёртывании) |
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 выбирает канал для исходящих ответов.