imessage тепер досягає тієї самої поверхні приватного API, що й BlueBubbles (react, edit, unsend, reply, sendWithEffect, керування групами, вкладення), керуючи steipete/imsg через JSON-RPC. Якщо у вас уже працює Mac із установленим imsg, ви можете прибрати сервер BlueBubbles і дозволити Plugin напряму спілкуватися з Messages.app.
Підтримку BlueBubbles видалено. OpenClaw підтримує iMessage лише через imsg. Цей посібник призначений для міграції старих конфігурацій channels.bluebubbles на channels.imessage; іншого підтримуваного шляху міграції немає.
Коротке оголошення та резюме для оператора див. у Видалення BlueBubbles і шлях imsg для iMessage.
Контрольний список міграції
Використовуйте цей контрольний список, якщо ви вже знаєте свою стару конфігурацію 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.cliPathSSH-обгортку та задайтеremoteHostдля віддаленого отримання вкладень. - Коли Gateway зупинено, увімкніть
channels.imessage, а потім виконайтеopenclaw channels status --probe --channel imessage. - Протестуйте одне особисте повідомлення, одну дозволену групу, вкладення, якщо вони ввімкнені, і кожну дію приватного API, яку, як ви очікуєте, використовуватиме агент.
- Видаліть сервер BlueBubbles і стару конфігурацію
channels.bluebubblesпісля перевірки шляху iMessage.
Коли ця міграція має сенс
- Ви вже запускаєте
imsgна тому самому Mac (або на доступному через SSH), де виконано вхід у Messages.app. - Ви хочете на один рухомий компонент менше — без окремого сервера BlueBubbles, без кінцевої точки REST для автентифікації, без обв’язки Webhook. Один бінарний файл CLI замість сервера + клієнтського застосунку + допоміжного компонента.
- Ви використовуєте підтримувану збірку macOS /
imsg, де перевірка приватного API повідомляєavailable: true.
Що робить imsg
imsg — це локальний CLI для macOS для Messages. 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. Саме це відкриває сповіщення про прочитання, індикатори набору, розширене надсилання, редагування, скасування надсилання, відповідь у треді, tapback-реакції та керування групами. - Збірки Linux можуть переглядати скопійований
chat.db, але не можуть надсилати, стежити за живою базою даних Mac або керувати Messages.app. Для OpenClaw iMessage запускайтеimsgна Mac із виконаним входом або через SSH-обгортку до цього Mac.
Перш ніж почати
-
Установіть
imsgна Mac, де працює Messages.app:Якщоimsg chatsзавершується помилкоюunable to open database file, порожнім виводом абоauthorization denied, надайте повний доступ до диска терміналу, редактору, процесу Node, службі Gateway або батьківському SSH-процесу, який запускаєimsg, а потім повторно відкрийте цей батьківський процес. -
Перевірте поверхні читання, спостереження, надсилання та RPC перед зміною конфігурації OpenClaw:
Замініть
42на справжній ідентифікатор чату зimsg chats. Для надсилання потрібен дозвіл автоматизації для Messages.app. Якщо OpenClaw працюватиме через SSH, запускайте ці команди через ту саму SSH-обгортку або контекст користувача, який використовуватиме OpenClaw. Якщо читання й перевірки працюють, але надсилання завершується помилкою AppleEvents-1743, перевірте, чи дозвіл автоматизації потрапив на/usr/libexec/sshd-keygen-wrapper; див. Надсилання через SSH-обгортку завершується помилкою AppleEvents -1743. -
Увімкніть міст приватного API, якщо вам потрібні розширені дії:
imsg launchвимагає вимкненого SIP. Базове надсилання, історія та спостереження працюють безimsg launch; розширені дії — ні. -
Після додавання ввімкненої конфігурації
channels.imessageперевірте міст через OpenClaw:Вам потрібноimessage.privateApi.available: true. Якщо повідомляєтьсяfalse, спершу виправте це — див. Виявлення можливостей.channels status --probeперевіряє лише налаштовані й увімкнені облікові записи. -
Зробіть знімок конфігурації:
Переклад конфігурації
iMessage і BlueBubbles мають багато спільної конфігурації на рівні каналу. Ключі, які змінюються, здебільшого стосуються транспорту (REST-сервер проти локального CLI). Ключі поведінки (dmPolicy, groupPolicy, allowFrom тощо) зберігають те саме значення.
| BlueBubbles | bundled iMessage | Примітки |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Та сама семантика. |
channels.bluebubbles.serverUrl | (вилучено) | Немає REST-сервера — plugin запускає imsg rpc через stdio. |
channels.bluebubbles.password | (вилучено) | Автентифікація webhook не потрібна. |
| (неявно) | channels.imessage.cliPath | Шлях до imsg (типово imsg); використовуйте wrapper-скрипт для SSH. |
| (неявно) | channels.imessage.dbPath | Необов’язкове перевизначення chat.db для Messages.app; автоматично визначається, якщо пропущено. |
| (неявно) | channels.imessage.remoteHost | host або user@host — потрібно лише тоді, коли cliPath є SSH wrapper і ви хочете отримувати вкладення через SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Ті самі значення (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Схвалення спарювання переносяться за handle, а не за токеном. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Ті самі значення (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Так само. |
channels.bluebubbles.groups | channels.imessage.groups | Скопіюйте це дослівно, включно з будь-яким wildcard-записом groups: { "*": { ... } }. Параметри requireMention, tools, toolsBySender для окремих груп переносяться. З groupPolicy: "allowlist" порожній або відсутній блок groups непомітно відкидає кожне групове повідомлення — див. «Пастка реєстру груп» нижче. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Типово true. З bundled plugin це спрацьовує лише тоді, коли активна перевірка приватного API. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Та сама форма, так само вимкнено за замовчуванням. Якщо у вас вкладення передавалися в BlueBubbles, потрібно явно знову встановити це в блоці iMessage — це не переноситься неявно, а вхідні фото/медіа тихо відкидатися без рядка журналу Inbound message, доки ви цього не зробите. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Локальні корені; ті самі правила wildcard. |
| (Н/Д) | channels.imessage.remoteAttachmentRoots | Використовується лише тоді, коли remoteHost задано для отримання через SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Типово 16 MB в iMessage (типове значення BlueBubbles було 8 MB). Задайте явно, якщо хочете зберегти нижче обмеження. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Типово 4000 в обох. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | Те саме явне ввімкнення. Лише для DM — групові чати в обох каналах зберігають миттєве надсилання кожного повідомлення. Якщо ввімкнено без явного messages.inbound.byChannel.imessage або глобального messages.inbound.debounceMs, розширює типовий debounce для вхідних повідомлень до 7000 мс. Див. документацію iMessage § Об’єднання DM, надісланих частинами. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (Н/Д) | iMessage вже читає відображувані імена відправників із chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Перемикачі для кожної дії: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) переносяться один-до-одного в channels.imessage.accounts.*.
Пастка реєстру груп
Bundled iMessage plugin запускає два окремі шлюзи allowlist для груп поспіль. Обидва мають пройти, щоб групове повідомлення дійшло до агента:- Allowlist відправника / цілі чату (
channels.imessage.groupAllowFrom) — перевіряєтьсяisAllowedIMessageSender. Зіставляє вхідні повідомлення за handle відправника,chat_guid,chat_identifierабоchat_id. Та сама форма, що й у BlueBubbles. - Реєстр груп (
channels.imessage.groups) — перевіряєтьсяresolveChannelGroupPolicyзinbound-processing.ts:199. ЗgroupPolicy: "allowlist"цей шлюз вимагає одне з такого:- wildcard-запис
groups: { "*": { ... } }(встановлюєallowAll = true), або - явний запис для окремого
chat_idуgroups.
- wildcard-запис
warn, тож це більше не відбувається непомітно на типовому рівні журналювання:
- Одноразовий стартовий
warnдля кожного облікового запису, коли заданоgroupPolicy: "allowlist", алеchannels.imessage.groupsпорожній (немає wildcard"*", немає записів для окремихchat_id) — спрацьовує до надходження будь-яких повідомлень. - Одноразовий
warnдля кожногоchat_idпід час першого відкидання конкретної групи в runtime, із зазначенням chat_id і точного ключа, який потрібно додати доgroups, щоб дозволити її.
groupAllowFrom і groupPolicy, але пропускають блок groups, бо BlueBubbles’ groups: { "*": { "requireMention": true } } виглядає як не пов’язане налаштування згадки. Насправді воно критично важливе для шлюзу реєстру.
Мінімальна конфігурація, щоб групові повідомлення продовжили проходити після groupPolicy: "allowlist":
requireMention: true під * нешкідливий, коли шаблони згадок не налаштовані: runtime встановлює canDetectMention = false і обходить відкидання згадки в inbound-processing.ts:512. З налаштованими шаблонами згадок (agents.list[].groupChat.mentionPatterns) це працює як очікується.
Якщо в журналах Gateway є imessage: dropping group message from chat_id=<id> або стартовий рядок imessage: groupPolicy="allowlist" but channels.imessage.groups is empty, відкидає шлюз 2 — додайте блок groups.
Покроково
-
Додайте блок iMessage поруч з наявним блоком BlueBubbles. Тримайте його вимкненим, поки Gateway усе ще маршрутизує трафік BlueBubbles:
-
Перевірте до того, як трафік стане важливим — зупиніть Gateway, тимчасово увімкніть блок iMessage і підтвердьте, що iMessage повідомляє про справний стан із CLI:
channels status --probeперевіряє лише налаштовані, увімкнені облікові записи. Не перезапускайте Gateway з одночасно увімкненими BlueBubbles та iMessage, якщо ви навмисно не хочете, щоб працювали обидва монітори каналів. Якщо ви не перемикаєтесь негайно, встановітьchannels.imessage.enabledназад уfalseперед перезапуском Gateway. Використовуйте прямі командиimsgу Перед початком, щоб перевірити Mac перед увімкненням трафіку OpenClaw. -
Перемкніться. Коли увімкнений обліковий запис iMessage повідомляє про справний стан, видаліть конфігурацію BlueBubbles і залиште iMessage увімкненим:
Перезапустіть Gateway. Вхідний трафік iMessage тепер проходить через вбудований Plugin.
- Перевірте приватні повідомлення. Надішліть агенту пряме повідомлення; підтвердьте, що відповідь доставлена.
-
Перевірте групи окремо. Приватні повідомлення й групи проходять різними шляхами коду — успіх приватного повідомлення не доводить, що групи маршрутизуються. Надішліть агенту повідомлення в спарений груповий чат і підтвердьте, що відповідь доставлена. Якщо група замовкає (немає відповіді агента, немає помилки), перевірте журнал Gateway на
imessage: dropping group message from chat_id=<id>або стартовий рядокimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— обидва з’являються на типовому рівні журналювання. Якщо з’являється будь-який із них, ваш блокgroupsвідсутній або порожній — див. «пастку реєстру груп» вище. -
Перевірте поверхню дій — зі спареного приватного повідомлення попросіть агента поставити реакцію, відредагувати, скасувати надсилання, відповісти, надіслати фото, а також (у групі) перейменувати групу / додати або видалити учасника. Кожна дія має нативно з’явитися в Messages.app. Якщо будь-що видає “iMessage
<action>requires the imsg private API bridge”, знову запустітьimsg launchі оновітьchannels status --probe. -
Видаліть сервер і конфігурацію BlueBubbles, коли приватні повідомлення iMessage, групи й дії перевірено. OpenClaw не використовуватиме
channels.bluebubbles.
Стислий огляд паритету дій
| Дія | застарілий BlueBubbles | вбудований iMessage |
|---|---|---|
| Надсилання тексту / резервний SMS | ✅ | ✅ |
| Надсилання медіа (фото, відео, файл, голос) | ✅ | ✅ |
Відповідь у треді (reply_to_guid) | ✅ | ✅ (закриває #51892) |
Tapback (react) | ✅ | ✅ |
| Редагування / скасування надсилання (одержувачі macOS 13+) | ✅ | ✅ |
| Надсилання з екранним ефектом | ✅ | ✅ (закриває частину #9394) |
| Форматований текст жирний / курсив / підкреслення / закреслення | ✅ | ✅ (форматування typed-run через attributedBody) |
| Перейменування групи / встановлення іконки групи | ✅ | ✅ |
| Додавання / видалення учасника, вихід із групи | ✅ | ✅ |
| Сповіщення про прочитання й індикатор набору | ✅ | ✅ (обмежено перевіркою приватного API) |
| Об’єднання приватних повідомлень від того самого відправника | ✅ | ✅ (лише для приватних повідомлень; opt-in через channels.imessage.coalesceSameSenderDms) |
| Відновлення вхідних повідомлень після перезапуску | ✅ (повтор webhook + отримання історії) | ✅ (автоматично: повтор пропущених через since_rowid + дедуплікація; ширше вікно локально) |
imsg watch.subscribe since_rowid і дедуплікує за GUID, а віковий бар’єр застарілого backlog приглушує Push-flush “backlog bomb”. Це працює через RPC-з’єднання imsg, тому працює і для налаштувань віддаленого SSH cliPath; локальні налаштування отримують ширше вікно відновлення, бо можуть читати chat.db. Див. Відновлення вхідних повідомлень після перезапуску мосту або Gateway.
Спарювання, сеанси та прив’язки ACP
- Схвалення спарювання переносяться за handle. Вам не потрібно повторно схвалювати відомих відправників —
channels.imessage.allowFromрозпізнає ті самі рядки+15555550123/user@example.com, які використовував BlueBubbles. - Сеанси залишаються обмеженими агентом + чатом. Приватні повідомлення згортаються в основний сеанс агента за типового
session.dmScope=main; групові сеанси залишаються ізольованими заchat_id. Ключі сеансів відрізняються (agent:<id>:imessage:group:<chat_id>проти еквівалента BlueBubbles) — стара історія розмов за ключами сеансів BlueBubbles не переноситься в сеанси iMessage. - Прив’язки ACP, що посилаються на
match.channel: "bluebubbles", потрібно оновити до"imessage". Формиmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, простий handle) ідентичні.
Немає каналу відкату
Немає підтримуваного runtime BlueBubbles, на який можна перемкнутися назад. Якщо перевірка iMessage не вдається, встановітьchannels.imessage.enabled: false, перезапустіть Gateway, виправте блокер imsg і повторіть перемикання.
Кеш відповідей зберігається в SQLite-стані Plugin. openclaw doctor --fix імпортує та архівує старий sidecar imessage/reply-cache.jsonl, якщо він присутній.
Пов’язане
- Видалення BlueBubbles і шлях imsg iMessage — коротке оголошення та підсумок для оператора.
- iMessage — повна довідка каналу iMessage, зокрема налаштування
imsg launchі виявлення можливостей. /channels/bluebubbles— застаріла URL-адреса, що переспрямовує на цей посібник із міграції.- Спарювання — автентифікація приватних повідомлень і потік спарювання.
- Маршрутизація каналів — як Gateway вибирає канал для вихідних відповідей.