Вбудований PluginDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
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; іншого підтримуваного шляху міграції немає.
Коли ця міграція має сенс
- Ви вже запускаєте
imsgна тому самому Mac (або на 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, фонового демона, launch agent або порту, який потрібно відкривати.
- Читання відбувається з
~/Library/Messages/chat.dbчерез read-only SQLite handle. - Живі вхідні повідомлення надходять із
imsg watch/watch.subscribe, який відстежує події файлової системиchat.dbіз резервним опитуванням. - Надсилання використовує автоматизацію Messages.app для звичайного тексту й надсилання файлів.
- Розширені дії використовують
imsg launch, щоб інʼєктувати допоміжний компонентimsgу Messages.app. Саме це відкриває сповіщення про прочитання, індикатори введення, розширене надсилання, редагування, скасування надсилання, відповіді в гілках, tapbacks і керування групами. - Збірки 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, надайте Full Disk Access терміналу, редактору, процесу Node, службі Gateway або батьківському процесу SSH, який запускаєimsg, а потім знову відкрийте цей батьківський процес. -
Перевірте поверхні читання, спостереження, надсилання та RPC перед зміною конфігурації OpenClaw:
Замініть
42на справжній chat id зimsg chats. Для надсилання потрібен дозвіл Automation для Messages.app. Якщо OpenClaw працюватиме через SSH, виконайте ці команди через ту саму SSH-обгортку або в тому самому контексті користувача, який використовуватиме OpenClaw. -
Увімкніть міст приватного API, коли потрібні розширені дії:
imsg launchпотребує вимкненого SIP. Базове надсилання, історія та спостереження працюють безimsg launch; розширені дії — ні. -
Перевірте міст через OpenClaw:
Вам потрібно
imessage.privateApi.available: true. Якщо повідомляєтьсяfalse, спочатку виправте це — див. Виявлення можливостей. -
Зробіть знімок конфігурації:
Переклад конфігурації
iMessage і BlueBubbles мають багато спільних налаштувань рівня каналу. Ключі, що змінюються, здебільшого стосуються транспорту (REST-сервер проти локального CLI). Ключі поведінки (dmPolicy, groupPolicy, allowFrom тощо) зберігають те саме значення.
| BlueBubbles | вбудований iMessage | Примітки |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Та сама семантика. |
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). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Схвалення сполучення переносяться за дескриптором, а не за токеном. |
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. З вбудованим 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 | Та саме opt-in. Лише для DM — групові чати в обох каналах зберігають миттєву відправку кожного повідомлення. Коли ввімкнено без явного messages.inbound.byChannel.imessage, розширює типову затримку debounce для вхідних повідомлень до 2500 ms. Див. документацію 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.*.
Пастка реєстру груп
Вбудований iMessage Plugin запускає два окремі шлюзи allowlist для груп поспіль. Обидва мають пройти, щоб групове повідомлення дійшло до агента:- Allowlist відправника / цільового чату (
channels.imessage.groupAllowFrom) — перевіряєтьсяisAllowedIMessageSender. Зіставляє вхідні повідомлення за дескриптором відправника,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, коли конкретну групу вперше відкинуто під час виконання, із назвою chat_id та точним ключем, який треба додати доgroups, щоб дозволити її.
groupAllowFrom і groupPolicy, але пропускають блок groups, бо groups: { "*": { "requireMention": true } } у BlueBubbles виглядає як непов’язане налаштування згадок. Насправді воно критично потрібне для шлюзу реєстру.
Мінімальна конфігурація, щоб групові повідомлення продовжували надходити після 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 і підтвердьте, що iMessage повідомляє про справний стан:
Оскільки
imessage.enabledусе щеfalse, вхідний трафік iMessage ще не маршрутизується — але--probeперевіряє міст, щоб ви виявили проблеми з дозволами або встановленням до перемикання. -
Перемкніться. Видаліть конфігурацію 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) |
| Об’єднання приватних повідомлень від того самого відправника | ✅ | ✅ (лише для приватних повідомлень; вмикається через channels.imessage.coalesceSameSenderDms) |
| Доназдоганяння вхідних повідомлень, отриманих, поки gateway був вимкнений | ✅ (повтор webhook + отримання історії) | ✅ (вмикається через channels.imessage.catchup.enabled; закриває #78649) |
channels.imessage.catchup.enabled має значення true, gateway виконує один прохід chats.list + messages.history для кожного чату через той самий клієнт JSON-RPC, який використовує imsg watch, повторно пропускає кожен пропущений вхідний рядок через живий шлях диспетчеризації (allowlists, політика груп, debouncer, echo cache) і зберігає курсор для кожного облікового запису, щоб наступні запуски продовжували з місця зупинки. Див. Доназдоганяння після простою gateway для налаштування.
Pairing, сесії та прив’язки ACP
- Схвалення pairing переносяться за 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:, bare handle) ідентичні.
Немає каналу відкату
Немає підтримуваного runtime BlueBubbles, на який можна перемкнутися назад. Якщо перевірка iMessage завершується невдачею, встановітьchannels.imessage.enabled: false, перезапустіть Gateway, виправте блокер imsg і повторіть перемикання.
Кеш відповідей розташований у ~/.openclaw/state/imessage/reply-cache.jsonl (режим 0600, батьківський каталог 0700). Його можна безпечно видалити, якщо потрібен чистий стан.
Пов’язане
- iMessage — повна довідка каналу iMessage, включно з налаштуванням
imsg launchі виявленням можливостей. /channels/bluebubbles— застарілий URL, який переспрямовує на цей посібник із міграції.- Pairing — автентифікація приватних повідомлень і потік pairing.
- Маршрутизація каналів — як gateway вибирає канал для вихідних відповідей.