Mainstream messaging
Перехід із BlueBubbles
Підтримку BlueBubbles вилучено. OpenClaw підтримує iMessage лише через вбудований плагін imessage, який керує steipete/imsg через JSON-RPC і надає доступ до тих самих приватних API, що й BlueBubbles (react, edit, unsend, reply, sendWithEffect, нативні опитування, керування групами, вкладення). Один виконуваний файл CLI замінює сервер BlueBubbles, клієнтський застосунок та інфраструктуру Webhook: без кінцевої точки REST і без автентифікації Webhook.
У цьому посібнику описано перенесення старих конфігурацій 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-адреси Webhook і налаштування сервера BlueBubbles. - Якщо Gateway працює не на тому Mac, де запущено Messages, установіть для
channels.imessage.cliPathзначення обгортки SSH, а для віддаленого отримання вкладень налаштуйтеremoteHost. - Увімкніть
channels.imessage, перезапустіть Gateway, а потім виконайтеopenclaw channels status --probe --channel imessage. - Перевірте одне особисте повідомлення, одну дозволену групу, вкладення, якщо їх увімкнено, і кожну дію приватного API, яку має використовувати агент.
- Після перевірки шляху iMessage видаліть сервер BlueBubbles і стару конфігурацію
channels.bluebubbles.
Що робить imsg
imsg — це локальний CLI для Messages у macOS. OpenClaw запускає imsg rpc як дочірній процес і обмінюється даними через JSON-RPC за допомогою stdin/stdout. Немає HTTP-сервера, URL-адреси Webhook, фонового демона, агента запуску чи порту, який потрібно відкривати.
- Читання виконується з
~/Library/Messages/chat.dbчерез дескриптор SQLite лише для читання. - Вхідні повідомлення в реальному часі надходять із
imsg watch/watch.subscribe, який відстежує події файлової системи дляchat.dbіз резервним опитуванням. - Для звичайного надсилання тексту й файлів використовується автоматизація Messages.app.
- Розширені дії використовують
imsg launch, щоб впровадити допоміжний компонентimsgу Messages.app. Саме це надає сповіщення про прочитання, індикатори введення, форматоване надсилання, редагування, скасування надсилання, відповіді в гілках, реакції, опитування та керування групами. - Збірки для Linux можуть переглядати скопійовану базу даних
chat.db, але не можуть надсилати повідомлення, відстежувати активну базу даних Mac або керувати Messages.app. Для роботи iMessage в OpenClaw запускайте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, а потім перезапустіть цей батьківський процес. -
Перевірте можливості читання, спостереження, надсилання та RPC, перш ніж змінювати конфігурацію OpenClaw:
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, але повний набір дій iMessage у OpenClaw — ні. -
Після ввімкнення
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-сервера немає — Plugin запускає 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. Із вбудованим Plugin це спрацьовує лише тоді, коли перевірка приватного 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 |
Типово 16 МБ в iMessage (типове значення BlueBubbles становило 8 МБ). Задайте явно, щоб зберегти нижче обмеження. |
channels.bluebubbles.textChunkLimit |
channels.imessage.textChunkLimit |
Типово 4000 в обох випадках. |
channels.bluebubbles.coalesceSameSenderDms |
channels.imessage.coalesceSameSenderDms |
Та сама явна активація. Лише для приватних повідомлень — у групах зберігається окрема обробка кожного повідомлення. Збільшує типову затримку усунення брязкоту для вхідних повідомлень до 7000 мс, якщо не задано messages.inbound.byChannel.imessage або глобальний messages.inbound.debounceMs. Див. Об’єднання приватних повідомлень, надісланих частинами. |
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.*.
Пастка реєстру груп
Вбудований Plugin 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, тому також підтримуються конфігурації віддаленого SSH із cliPath; локальні конфігурації отримують ширше вікно відновлення, оскільки можуть читати 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, і повторіть перехід.
Кеш відповідей зберігається у стані Plugin у SQLite. openclaw doctor --fix імпортує й архівує старий допоміжний файл imessage/reply-cache.jsonl, якщо він наявний.
Пов’язані матеріали
- Видалення BlueBubbles і шлях iMessage через imsg — коротке оголошення та зведення для операторів.
- iMessage — повна довідка щодо каналу iMessage, зокрема налаштування
imsg launchі виявлення можливостей. /channels/bluebubbles— застаріла URL-адреса, яка переспрямовує до цього посібника з міграції.- Пов’язування — автентифікація особистих повідомлень і процес пов’язування.
- Маршрутизація каналів — як Gateway вибирає канал для вихідних відповідей.