Skip to main content
Для звичайного розгортання OpenClaw з iMessage запускайте Gateway і imsg на тому самому хості macOS із виконаним входом у Messages. Якщо Gateway працює в іншому місці, укажіть для channels.imessage.cliPath прозору SSH-обгортку, яка запускає imsg на Mac.Відновлення вхідних повідомлень відбувається автоматично. Після перезапуску мосту або Gateway iMessage повторно відтворює повідомлення, пропущені під час простою, і пригнічує застарілу «лавину накопичених повідомлень», яку Apple може надіслати після відновлення Push, усуваючи дублікати, щоб жодне повідомлення не було передано двічі. Для ввімкнення не потрібна конфігурація — див. Відновлення вхідних повідомлень після перезапуску мосту або Gateway.
Підтримку BlueBubbles вилучено. Перенесіть конфігурації channels.bluebubbles до channels.imessage; OpenClaw підтримує iMessage лише через imsg. Почніть із Вилучення BlueBubbles і шлях imsg для iMessage, щоб прочитати коротке оголошення, або з Перехід із BlueBubbles, щоб переглянути повну таблицю міграції.
Стан: нативна інтеграція із зовнішнім CLI. Gateway запускає imsg rpc і взаємодіє через JSON-RPC у stdio — без окремого демона чи порту. Для повноцінного каналу iMessage наполегливо рекомендовано режим Private API; відповіді, реакції tapback, ефекти, опитування, відповіді на вкладення та групові дії потребують imsg launch й успішної перевірки Private API. Для поширеного локального налаштування майстер OpenClaw може запропонувати підтверджене користувачем установлення або оновлення imsg через Homebrew на Mac із виконаним входом у Messages. Ручне налаштування й топології з SSH-обгорткою залишаються під керуванням оператора: установлюйте або оновлюйте imsg у тому самому користувацькому контексті, у якому працюватиме Gateway або обгортка.

Дії Private API

Відповіді, реакції tapback, ефекти, опитування, вкладення та керування групами.

Сполучення

Приватні повідомлення iMessage типово використовують режим сполучення.

Віддалений Mac

Використовуйте SSH-обгортку, якщо Gateway не працює на Mac із Messages.

Довідник із конфігурації

Повний довідник полів iMessage.

Швидке налаштування

1

Установіть і перевірте imsg

Коли локальний майстер налаштування виявляє відсутню типову команду imsg, він може запропонувати встановити steipete/tap/imsg через Homebrew. Якщо він виявляє керований Homebrew компонент imsg, то може запропонувати повторно встановити або оновити його. Користувацькі обгортки cliPath не змінюються.
2

Налаштуйте OpenClaw

3

Запустіть Gateway

4

Схваліть перше сполучення для приватних повідомлень (типова dmPolicy)

Термін дії запитів на сполучення спливає через 1 годину.

Вимоги та дозволи (macOS)

  • На Mac, де працює imsg, має бути виконано вхід у Messages.
  • Для контексту процесу, у якому працює OpenClaw/imsg, потрібен Full Disk Access (для доступу до бази даних Messages).
  • Для надсилання повідомлень через Messages.app потрібен дозвіл Automation.
  • Для розширених дій (реакція / редагування / скасування надсилання / відповідь у гілці / ефекти / опитування / групові операції) потрібно вимкнути System Integrity Protection — див. Увімкнення Private API imsg. Базове надсилання й отримання тексту та медіафайлів працює без цього.
Дозволи надаються окремо для кожного контексту процесу. Якщо Gateway працює без графічного сеансу (LaunchAgent/SSH), один раз виконайте інтерактивну команду в тому самому контексті, щоб викликати запити дозволів:
Конфігурація з віддаленим SSH може читати чати, проходити channels status --probe та обробляти вхідні повідомлення, хоча надсилання вихідних повідомлень і далі завершується помилкою авторизації AppleEvents:
Перевірте базу даних TCC користувача віддаленого Mac із виконаним входом або System Settings > Privacy & Security > Automation. Якщо запис Automation зареєстровано для /usr/libexec/sshd-keygen-wrapper, а не для imsg або процесу локальної оболонки, macOS може не показувати придатний перемикач Messages для цього серверного клієнта SSH:
У такому стані повторне виконання tccutil reset AppleEvents або повторний запуск imsg send через ту саму SSH-обгортку може й надалі завершуватися помилкою, оскільки доступ до Automation для Messages потрібен контексту процесу SSH-обгортки, а не застосунку, якому інтерфейс може надати дозвіл.Натомість використовуйте один із підтримуваних контекстів процесу imsg:
  • Запускайте Gateway або принаймні міст imsg у локальному сеансі користувача, який увійшов у Messages.
  • Запускайте Gateway за допомогою LaunchAgent цього користувача після надання Full Disk Access і Automation у тому самому сеансі.
  • Якщо зберігається двокористувацька топологія SSH, перед увімкненням каналу перевірте, що реальне вихідне надсилання imsg send успішно виконується через цю точну обгортку. Якщо надати їй Automation неможливо, замість використання SSH-обгортки для надсилання перейдіть на однокористувацьку конфігурацію imsg.

Увімкнення Private API imsg

imsg постачається у двох режимах роботи. Для OpenClaw рекомендовано режим Private API, оскільки він надає каналу нативні дії iMessage, на які очікують користувачі. Базовий режим залишається корисним для встановлень із низьким ризиком, початкової перевірки або хостів, де SIP неможливо вимкнути.
  • Базовий режим (типовий, не потребує змін SIP): вихідні текстові й медіаповідомлення через send, спостереження за вхідними повідомленнями та історією, список чатів. Це доступно одразу після нового встановлення brew install steipete/tap/imsg і надання стандартних дозволів macOS, зазначених вище.
  • Режим Private API: imsg впроваджує допоміжну dylib у Messages.app для виклику внутрішніх функцій IMCore. Це відкриває доступ до react, edit, unsend, reply (у гілці), sendWithEffect, poll і poll-vote (нативні опитування Messages), renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, а також індикаторів набору тексту та сповіщень про прочитання.
Рекомендований на цій сторінці набір дій потребує режиму Private API. README для imsg прямо зазначає цю вимогу:
Розширені функції, як-от read, typing, launch, розширене надсилання через міст, зміна повідомлень і керування чатами, є необов’язковими. Для них потрібно вимкнути SIP і впровадити допоміжну dylib у Messages.app. imsg launch відмовляється виконувати впровадження, коли SIP увімкнено.
Метод впровадження допоміжної бібліотеки використовує власну dylib компонента imsg для доступу до приватних API Messages. У шляху iMessage для OpenClaw немає стороннього сервера чи середовища виконання BlueBubbles.
Вимкнення SIP — це справжній компроміс щодо безпеки. SIP є одним з основних механізмів захисту macOS від виконання зміненого системного коду; його загальносистемне вимкнення створює додаткову поверхню атаки та побічні наслідки. Зокрема, вимкнення SIP на комп’ютерах Mac з Apple Silicon також унеможливлює встановлення й запуск застосунків iOS на Mac.Розглядайте це як свідоме експлуатаційне рішення, особливо на основному особистому Mac. Для повноцінного використання OpenClaw з iMessage варто віддати перевагу окремому Mac або користувачеві-боту macOS, для якого прийнятно ввімкнути міст. Якщо ваша модель загроз не допускає вимкнення SIP на жодному пристрої, вбудована інтеграція з iMessage обмежується базовим режимом — лише надсилання й отримання тексту та медіафайлів, без реакцій / редагування / скасування надсилання / ефектів / групових операцій.

Налаштування

  1. Установіть (або оновіть) imsg на Mac, де працює Messages.app:
    Вивід imsg status --json повідомляє про bridge_version, rpc_methods і selectors для кожного методу, щоб перед початком роботи можна було побачити, що підтримує поточна збірка.
  2. Вимкніть захист цілісності системи, а в сучасних версіях macOS — також перевірку бібліотек. Для впровадження допоміжної бібліотеки dylib не від Apple у підписаний Apple процес Messages.app потрібно вимкнути SIP і послабити перевірку бібліотек. Крок із SIP у режимі відновлення залежить від версії macOS:
    • macOS 10.13–10.15 (Sierra–Catalina): вимкніть перевірку бібліотек через Terminal, перезавантажтеся в режим відновлення, виконайте csrutil disable, перезапустіть систему.
    • macOS 11+ (Big Sur і новіші), Intel: перейдіть у режим відновлення (або відновлення через інтернет), виконайте csrutil disable, перезапустіть систему.
    • macOS 11+, Apple Silicon: скористайтеся послідовністю запуску кнопкою живлення, щоб увійти в режим відновлення; у нових версіях macOS утримуйте клавішу Left Shift, коли натискаєте Continue, а потім виконайте csrutil disable. Для віртуальних машин діє окрема процедура, тому спочатку створіть знімок віртуальної машини.
    У macOS 11 і новіших версіях одного csrutil disable зазвичай недостатньо. Apple усе одно застосовує перевірку бібліотек до Messages.app як до платформного виконуваного файла, тому допоміжний компонент зі спеціальним підписом відхиляється (Library Validation failed: ... platform binary, but mapped file is not) навіть за вимкненого SIP. Після вимкнення SIP також вимкніть перевірку бібліотек і перезавантажте систему:
    macOS 26 (Tahoe), перевірено у версії 26.5.1: вимкненого SIP разом із наведеною вище командою DisableLibraryValidation достатньо для впровадження допоміжного компонента у версіях від 26.0 до 26.5.x. Жодні параметри завантаження не потрібні. Вирішальним чинником є файл plist, і саме цей крок найчастіше пропускають, коли впровадження в Tahoe завершується невдало:
    • З файлом plist: imsg launch виконує впровадження, а imsg status повідомляє advanced_features: true.
    • Без файла plist (навіть за вимкненого SIP): imsg launch завершується помилкою Failed to launch: Timeout waiting for Messages.app to initialize. AMFI відхиляє допоміжний компонент зі спеціальним підписом під час завантаження, тому міст не переходить у стан готовності, а запуск завершується через перевищення часу очікування. Саме з таким симптомом найчастіше стикаються в Tahoe; виправленням є наведений вище файл plist, а не радикальніше послаблення захисту.
    Якщо після оновлення macOS впровадження imsg launch або певні selectors починають повертати false, звичайною причиною є ця перевірка. Перш ніж припускати, що сам крок із SIP не спрацював, перевірте стан SIP і перевірки бібліотек. Якщо ці параметри правильні, але міст усе одно не може виконати впровадження, зберіть imsg status --json разом із виводом imsg launch і повідомте про це в проєкт imsg, замість того щоб додатково послаблювати загальносистемні засоби захисту.
  3. Впровадьте допоміжний компонент. Коли SIP вимкнено, а в Messages.app виконано вхід:
    imsg launch відмовляється виконувати впровадження, якщо SIP усе ще ввімкнено, тож це також підтверджує успішність кроку 2.
  4. Перевірте міст з OpenClaw:
    Запис iMessage має повідомити works, а imsg status --json | jq '{rpc_methods, selectors}' — показати можливості, доступні у вашій збірці macOS. Для створення опитувань потрібен selectors.pollPayloadMessage; для голосування потрібні і selectors.pollVoteMessage, і метод RPC poll.vote. Plugin OpenClaw оголошує лише дії, підтримувані кешованою перевіркою, тоді як за порожнього кешу він оптимістично вважає їх доступними та виконує перевірку під час першого надсилання.
Якщо openclaw channels status --probe повідомляє, що канал має стан works, але певні дії під час надсилання спричиняють помилку “iMessage <action> requires the imsg private API bridge”, знову виконайте imsg launch — допоміжний компонент може від’єднатися (через перезапуск Messages.app, оновлення ОС тощо), а кешований стан available: true продовжуватиме оголошувати дії до наступного оновлення перевірки.

Коли SIP залишається ввімкненим

Якщо вимкнення SIP неприйнятне для вашої моделі загроз:
  • imsg переходить у базовий режим — лише текст, медіафайли та отримання.
  • Plugin OpenClaw усе одно оголошує надсилання тексту й медіафайлів та моніторинг вхідних повідомлень; він приховує react, edit, unsend, reply, sendWithEffect і групові операції з поверхні дій (відповідно до перевірки можливостей для кожного методу).
  • Для навантаження iMessage можна використовувати окремий Mac без Apple Silicon (або спеціалізований Mac для бота) з вимкненим SIP, залишивши SIP увімкненим на основних пристроях. Див. нижче Спеціалізований користувач macOS для бота (окрема ідентичність iMessage).

Керування доступом і маршрутизація

channels.imessage.dmPolicy керує приватними повідомленнями:
  • pairing (типове значення)
  • allowlist (потрібен принаймні один запис allowFrom)
  • open (потрібно, щоб allowFrom містив "*")
  • disabled
Поле списку дозволених: channels.imessage.allowFrom.Записи списку дозволених мають ідентифікувати відправників: дескриптори або статичні групи доступу відправників (accessGroup:<name>). Використовуйте channels.imessage.groupAllowFrom для цілей чатів, як-от chat_id:*, chat_guid:* або chat_identifier:*; використовуйте channels.imessage.groups для числових ключів реєстру chat_id.

Прив’язки розмов ACP

Чати iMessage можна прив’язувати до сеансів ACP. Швидка процедура для оператора:
  • Виконайте /acp spawn codex --bind here у приватному повідомленні або дозволеному груповому чаті.
  • Подальші повідомлення в тій самій розмові iMessage спрямовуватимуться до створеного сеансу ACP.
  • /new і /reset скидають той самий прив’язаний сеанс ACP без його заміни.
  • /acp close закриває сеанс ACP і видаляє прив’язку.
Налаштовані постійні прив’язки використовують записи верхнього рівня bindings[] з type: "acp" і match.channel: "imessage". match.peer.id може використовувати:
  • нормалізований дескриптор приватного повідомлення, як-от +15555550123 або user@example.com
  • chat_id:<id> (рекомендовано для стабільних групових прив’язок)
  • chat_guid:<guid>
  • chat_identifier:<identifier>
Приклад:
Спільну поведінку прив’язок ACP описано в розділі Агенти ACP.

Схеми розгортання

Використовуйте окремі Apple ID і обліковий запис користувача macOS, щоб трафік бота був ізольований від вашого особистого профілю Messages.Типова процедура:
  1. Створіть окремого користувача macOS або ввійдіть до його облікового запису.
  2. Увійдіть у Messages за допомогою Apple ID бота в обліковому записі цього користувача.
  3. Установіть imsg в обліковому записі цього користувача.
  4. Створіть обгортку SSH, щоб OpenClaw міг запускати imsg у контексті цього користувача.
  5. Спрямуйте channels.imessage.accounts.<id>.cliPath і .dbPath до профілю цього користувача.
Під час першого запуску можуть знадобитися дозволи в графічному інтерфейсі (Automation + Full Disk Access) у сеансі користувача бота.
Типова топологія:
  • Gateway працює на Linux/VM
  • iMessage + imsg працює на Mac у вашій мережі tailnet
  • Обгортка cliPath використовує SSH для запуску imsg
  • remoteHost уможливлює отримання вкладень через SCP
Приклад:
Використовуйте ключі SSH, щоб взаємодія через SSH і SCP не потребувала введення даних. Спочатку переконайтеся, що ключ хоста є довіреним (наприклад, ssh bot@mac-mini.tailnet-1234.ts.net), щоб заповнити known_hosts.
iMessage підтримує конфігурацію для кожного облікового запису в channels.imessage.accounts.Для кожного облікового запису можна перевизначити такі поля, як cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, налаштування історії та списки дозволених кореневих каталогів вкладень.
Установіть channels.imessage.dmHistoryLimit, щоб додавати до нових сеансів особистих повідомлень нещодавню декодовану історію imsg для цієї розмови. Використовуйте channels.imessage.dms["<sender>"].historyLimit для перевизначень для окремих відправників, зокрема 0, щоб вимкнути історію для певного відправника.Історія особистих повідомлень iMessage отримується на вимогу з imsg. Якщо не задавати dmHistoryLimit, глобальне початкове заповнення історії особистих повідомлень буде вимкнено, але додатне значення channels.imessage.dms["<sender>"].historyLimit для окремого відправника все одно ввімкне початкове заповнення для нього.

Медіафайли, поділ на фрагменти та цілі доставлення

  • Приймання вхідних вкладень типово вимкнено — установіть channels.imessage.includeAttachments: true, щоб передавати фотографії, голосові нотатки, відео та інші вкладення агенту. Коли цю функцію вимкнено, повідомлення iMessage, що містять лише вкладення, відкидаються до надходження агенту й можуть узагалі не створювати рядок журналу Inbound message.
  • Шляхи до віддалених вкладень можна отримувати через SCP, якщо задано remoteHost
  • Шляхи до вкладень мають відповідати дозволеним кореневим каталогам:
    • channels.imessage.attachmentRoots (локально)
    • channels.imessage.remoteAttachmentRoots (віддалений режим SCP)
    • Налаштовані кореневі каталоги розширюють типовий шаблон кореневого каталогу /Users/*/Library/Messages/Attachments (об’єднуються, а не замінюють його)
  • SCP використовує сувору перевірку ключа хоста (StrictHostKeyChecking=yes)
  • Розмір вихідних медіафайлів визначає channels.imessage.mediaMaxMb (типово 16 MB)
  • Обмеження розміру текстового фрагмента: channels.imessage.textChunkLimit (типово 4000)
  • Режим поділу на фрагменти: channels.imessage.streaming.chunkMode
    • length (типово)
    • newline (поділ насамперед за абзацами)
  • Вихідне форматування Markdown — напівжирний текст, курсив, підкреслення та закреслення — перетворюється на текст із нативними стилями (одержувачі з macOS 15+ бачать форматування, а зі старішими версіями — звичайний текст без маркерів); таблиці Markdown перетворюються відповідно до режиму таблиць Markdown каналу
  • channels.imessage.sendTransport (auto типово, bridge, applescript) визначає, як imsg доставляє надіслані повідомлення
Бажані явні цілі:
  • chat_id:123 (рекомендовано для стабільного маршрутизування)
  • chat_guid:...
  • chat_identifier:...
Також підтримуються цілі у вигляді ідентифікаторів користувачів:
  • imessage:+1555...
  • sms:+1555...
  • user@example.com

Дії приватного API

Коли imsg launch працює, а openclaw channels status --probe повідомляє privateApi.available: true, інструмент повідомлень може використовувати нативні дії iMessage на додачу до звичайного надсилання тексту. Усі дії типово ввімкнено; використовуйте channels.imessage.actions, щоб вимкнути окремі дії:
  • react: Додає або видаляє реакції iMessage (messageId, emoji, remove). Підтримувані реакції відповідають любові, схваленню, несхваленню, сміху, наголосу та запитанню. Видалення без емодзі очищує будь-яку встановлену реакцію.
  • reply: Надсилає відповідь у гілці на наявне повідомлення (messageId, text або message, а також chatGuid, chatId, chatIdentifier або to). Для відповіді з вкладенням додатково потрібна збірка imsg, у якій send-rich підтримує --file.
  • sendWithEffect: Надсилає текст з ефектом iMessage (text або message, effect або effectId). Короткі назви: slam, loud, gentle, invisibleink, confetti, lasers, fireworks, balloon, heart, echo, happybirthday, shootingstar, sparkles, spotlight.
  • edit: Редагує надіслане повідомлення в підтримуваних версіях macOS/приватного API (messageId, text або newText). Редагувати можна лише повідомлення, надіслані самим Gateway.
  • unsend: Відкликає надіслане повідомлення в підтримуваних версіях macOS/приватного API (messageId). Відкликати можна лише повідомлення, надіслані самим Gateway.
  • upload-file: Надсилає медіафайли/файли (buffer у форматі base64 або завантажений media/path/filePath, filename, необов’язковий asVoice). Застарілий псевдонім: sendAttachment.
  • renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Керують груповими чатами, коли поточною ціллю є групова розмова. Ці дії змінюють ідентичність Messages на хості, тому їх має виконувати відправник-власник або клієнт Gateway operator.admin.
  • poll: Створює нативне опитування Apple Messages (pollQuestion, pollOption, повторений від 2 до 12 разів, а також chatGuid, chatId, chatIdentifier або to). Одержувачі з iOS/iPadOS/macOS 26+ бачать його та голосують у нативному інтерфейсі; користувачі старіших версій ОС натомість отримують текст «Sent a poll». Потрібен selectors.pollPayloadMessage.
  • poll-vote: Голосує в наявному опитуванні (pollId або messageId, а також рівно один із pollOptionIndex, pollOptionId або pollOptionText). Потрібні selectors.pollVoteMessage і метод RPC poll.vote.
Прийняті вхідні опитування відображаються для агента із запитанням, пронумерованими підписами варіантів, кількістю голосів та ідентифікатором повідомлення опитування, потрібним для poll-vote.
Контекст вхідних повідомлень iMessage містить як короткі значення MessageSid, так і повні GUID повідомлень (MessageSidFull), якщо вони доступні. Короткі ідентифікатори діють у межах нещодавнього кешу відповідей на основі SQLite та перед використанням перевіряються щодо поточного чату. Якщо термін дії короткого ідентифікатора сплив, повторіть спробу з його MessageSidFull, указавши ціллю розмову, з якої його отримано. Повні ідентифікатори не обходять прив’язку до розмови або облікового запису, тому замініть ідентифікатор з іншого чату на ідентифікатор із поточної цілі. Віддалені делеговані виклики можуть відхиляти застарілі повні ідентифікатори, коли немає підтвердження їхньої належності до поточної розмови.
OpenClaw приховує дії приватного API лише тоді, коли кешований стан перевірки вказує, що міст недоступний. Якщо стан невідомий, дії залишаються видимими, а під час їх виконання перевірки запускаються відкладено, щоб перша дія могла успішно виконатися після imsg launch без окремого ручного оновлення стану.
Коли міст приватного API працює, прийняті вхідні чати позначаються як прочитані, а в особистих чатах індикатор введення з’являється щойно запит прийнято, поки агент готує контекст і генерує відповідь. Щоб вимкнути позначення як прочитаного, використовуйте:
У старіших збірках imsg, створених до появи списку можливостей для окремих методів, введення тексту та сповіщення про прочитання мовчки вимикаються; OpenClaw записує одноразове попередження після кожного перезапуску, щоб можна було визначити причину відсутності сповіщення.
OpenClaw підписується на реакції iMessage та маршрутизує прийняті реакції як системні події, а не як звичайний текст повідомлення, тому реакція користувача не запускає звичайний цикл відповідей.Режим сповіщень визначає channels.imessage.reactionNotifications:
  • "own" (типово): сповіщати лише тоді, коли користувачі реагують на повідомлення, створені ботом.
  • "all": сповіщати про всі вхідні реакції від авторизованих відправників.
  • "off": ігнорувати вхідні реакції.
Перевизначення для окремих облікових записів використовують channels.imessage.accounts.<id>.reactionNotifications.
Коли approvals.exec.enabled або approvals.plugin.enabled має значення true, а запит маршрутизується до iMessage, Gateway доставляє запит на схвалення в нативному форматі та приймає реакцію для його вирішення:
  • 👍 (реакція Like) → allow-once
  • 👎 (реакція Dislike) → deny
  • allow-always залишається ручним запасним варіантом: надішліть /approve <id> allow-always як звичайну відповідь.
Для обробки реакції ідентифікатор користувача, який її поставив, має бути явно вказаний серед осіб, уповноважених схвалювати запити. Список таких осіб зчитується з channels.imessage.allowFrom (або channels.imessage.accounts.<id>.allowFrom); додайте номер телефону користувача у форматі E.164 або адресу електронної пошти його Apple ID (цілі чату, як-от chat_id:*, не є допустимими записами цього списку). Запис із символом узагальнення "*" підтримується, але дає змогу будь-якому відправнику схвалювати запити; порожній список повністю вимикає швидке схвалення за допомогою реакції. Цей спосіб навмисно обходить reactionNotifications, dmPolicy і groupAllowFrom, оскільки для вирішення запиту на схвалення має значення лише явний список дозволених осіб.Авторизація текстової команди /approve використовує той самий список: коли channels.imessage.allowFrom не порожній, /approve <id> <decision> авторизується за цим списком осіб, уповноважених схвалювати запити (а не за ширшим списком дозволених особистих повідомлень), і відправники, яким дозволено надсилати особисті повідомлення, але яких немає в allowFrom, отримують явну відмову. Коли allowFrom порожній, продовжує діяти запасний механізм у межах того самого чату, а /approve авторизує всіх, кому дозволено надсилати особисті повідомлення. Додайте кожного оператора, який повинен мати змогу схвалювати запити — через /approve або за допомогою реакцій, — до allowFrom.Примітки для оператора:
  • Прив’язка реакції зберігається як у пам’яті, так і в постійному сховищі Gateway із ключами (TTL відповідає терміну дії схвалення), а Gateway також опитує запити, що очікують, щодо реакцій tapback, тож реакція tapback, яка надходить невдовзі після перезапуску Gateway, усе одно завершує схвалення.
  • Власна реакція tapback оператора is_from_me=true (наприклад, зі спареного пристрою Apple) завершує схвалення, якщо цей ідентифікатор явно вказано як схвалювача.
  • Запити на схвалення спрямовуються до групової розмови лише тоді, коли явно налаштовано схвалювачів; інакше схвалити міг би будь-який учасник групи.
  • Застарілі текстові реакції tapback (Liked "…" у вигляді звичайного тексту з дуже старих клієнтів Apple) не можуть завершувати схвалення, оскільки не містять GUID повідомлення; для визначення реакції потрібні структуровані метадані tapback, які надсилають сучасні клієнти macOS / iOS.

Запис конфігурації

iMessage за замовчуванням дозволяє ініційований каналом запис конфігурації (для /config set|unset, коли commands.config: true). Щоб вимкнути:

Об’єднання розділених надсилань у приватних повідомленнях (команда + URL в одному введенні)

Коли користувач вводить разом команду та URL — наприклад, Dump https://example.com/article — застосунок Apple Messages розділяє надсилання на два окремі рядки chat.db:
  1. Текстове повідомлення ("Dump").
  2. Бульбашка попереднього перегляду URL ("https://...") із зображеннями попереднього перегляду OG як вкладеннями.
У більшості конфігурацій ці два рядки надходять до OpenClaw з інтервалом ~0.8-2.0 s. Без об’єднання агент отримує лише команду в ході 1 (і часто відповідає «надішліть мені URL») до того, як URL надійде в ході 2. Це конвеєр надсилання Apple, а не поведінка, яку додає OpenClaw або imsg. channels.imessage.coalesceSameSenderDms вмикає для приватної розмови буферизацію послідовних рядків від одного відправника. Коли imsg надає структурний маркер попереднього перегляду URL balloon_bundle_id: "com.apple.messages.URLBalloonProvider" в одному з вихідних рядків, OpenClaw об’єднує лише це справжнє розділене надсилання, а всі інші буферизовані рядки залишає окремими ходами. У старіших збірках imsg, які взагалі не надають метаданих бульбашки, OpenClaw не може відрізнити розділене надсилання від окремих надсилань, тому натомість об’єднує весь пакет. Це зберігає поведінку до появи метаданих і не допускає регресії, за якої розділені надсилання Dump <url> знову оброблялися б у два ходи. Групові чати й надалі обробляють кожне повідомлення окремо, щоб зберегти структуру ходів за участю кількох користувачів.
Увімкніть, якщо:
  • Ви постачаєте Skills, які очікують command + payload в одному повідомленні (dump, paste, save, queue тощо).
  • Ваші користувачі вставляють URL разом із командами.
  • Для вас прийнятна додаткова затримка ходу в приватній розмові (див. нижче).
Залиште вимкненим, якщо:
  • Вам потрібна мінімальна затримка команд для однослівних тригерів у приватних повідомленнях.
  • Усі ваші потоки — одноразові команди без подальшого надсилання корисного навантаження.

Сценарії та те, що бачить агент

Стовпець «Прапорець увімкнено» показує поведінку збірки imsg, яка надає balloon_bundle_id. У старіших збірках imsg, які взагалі не надають метаданих бульбашки, позначені нижче рядки «Два ходи» / «N ходів» натомість використовують застаріле об’єднання (один хід): OpenClaw не може структурно відрізнити розділене надсилання від окремих надсилань, тому зберігає об’єднання, що застосовувалося до появи метаданих. Точне розділення активується, коли збірка починає надавати метадані бульбашки.

Відновлення вхідних повідомлень після перезапуску мосту або Gateway

iMessage відновлює повідомлення, пропущені під час простою Gateway, і водночас пригнічує застарілу «лавину накопичених повідомлень», яку Apple може надіслати після відновлення Push. Ця типова поведінка завжди ввімкнена й побудована на усуненні дублікатів вхідних повідомлень.
  • Усунення дублікатів повторного відтворення. Кожне оброблене вхідне повідомлення записується за його Apple GUID у постійному стані Plugin (imessage.inbound-dedupe): резервується під час приймання та фіксується після обробки (звільняється в разі тимчасової помилки, щоб повторити спробу). Усе вже оброблене відкидається замість повторної обробки. Завдяки цьому відновлення може активно повторно відтворювати повідомлення без окремого обліку кожного з них.
  • Відновлення після простою. Під час запуску монітор пам’ятає останній оброблений rowid chat.db (збережений курсор для кожного облікового запису) і передає його до imsg watch.subscribe як since_rowid, тому imsg повторно відтворює рядки, що надійшли під час простою Gateway, а потім переходить до відстеження в реальному часі. Повторне відтворення обмежене 500 найновішими рядками та повідомленнями віком до ~2 годин, а механізм усунення дублікатів відкидає все вже оброблене.
  • Часова межа для застарілих накопичених повідомлень. Рядки вище початкової межі справді надходять у реальному часі; якщо дата надсилання одного з них більш ніж на ~15 хвилин передує часу його надходження, це накопичені повідомлення після Push-відновлення, і вони пригнічуються. Для повторно відтворених рядків (на межі або нижче неї) натомість використовується ширше вікно відновлення, тому нещодавно пропущене повідомлення доставляється, а давня історія — ні.
Відновлення працює як у локальних, так і у віддалених конфігураціях cliPath, оскільки повторне відтворення since_rowid виконується через те саме RPC-з’єднання imsg. Відмінність полягає у вікні: коли Gateway може читати chat.db (локально), він прив’язується до початкової межі rowid, обмежує діапазон повторного відтворення й доставляє пропущені повідомлення віком до кількох годин. Через віддалений SSH cliPath він не може читати базу даних, тому повторне відтворення не обмежується, а до кожного рядка застосовується часова межа реального часу — нещодавно пропущені повідомлення все одно відновлюються, а старі накопичені повідомлення пригнічуються, але з вужчим вікном реального часу. Для ширшого вікна відновлення запускайте Gateway на комп’ютері Mac із Messages.

Сигнал, видимий оператору

Пригнічені накопичені повідомлення реєструються на типовому рівні й ніколи не відкидаються без повідомлення (прапорець recovery указує, яке вікно застосовано):

Міграція

channels.imessage.catchup.* застарів — відновлення після простою виконується автоматично й не потребує конфігурації для нових установок. Наявні конфігурації з catchup.enabled: true і надалі підтримуються як профіль сумісності для вікна повторного відтворення під час відновлення. Вимкнені блоки наздоганяння (enabled: false або без enabled: true) вилучено; openclaw doctor --fix видаляє їх.

Усунення несправностей

Перевірте двійковий файл і підтримку RPC:
Якщо перевірка повідомляє, що RPC не підтримується, оновіть imsg. Якщо дії приватного API недоступні, запустіть imsg launch у сеансі користувача macOS, який увійшов у систему, і повторіть перевірку. Якщо Gateway не працює в macOS, використовуйте описану вище конфігурацію віддаленого Mac через SSH замість типового локального шляху imsg.
Спочатку перевірте, чи надійшло повідомлення на локальний Mac. Якщо chat.db не змінюється, OpenClaw не може отримати повідомлення, навіть якщо imsg status --json повідомляє про справний міст.
Якщо повідомлення, надіслані з телефону, не створюють нових рядків, відновіть роботу Messages у macOS і рівня Apple Push, перш ніж змінювати конфігурацію OpenClaw. Часто достатньо одноразового оновлення служби:
Надішліть нове повідомлення iMessage з телефона та переконайтеся, що з’явився новий рядок chat.db або подія imsg watch, перш ніж налагоджувати сеанси OpenClaw. Не запускайте це як періодичний цикл повторного запуску моста; повторні imsg launch разом із перезапусками Gateway під час активної роботи можуть перервати доставлення та залишити незавершені запуски каналу в завислому стані.
Стандартний cliPath: "imsg" має виконуватися на Mac, на якому здійснено вхід у Messages. У Linux або Windows задайте для channels.imessage.cliPath сценарій-обгортку, який підключається до цього Mac через SSH і запускає imsg "$@".
Потім виконайте:
Перевірте:
  • channels.imessage.dmPolicy
  • channels.imessage.allowFrom
  • схвалення сполучення (openclaw pairing list imessage)
Перевірте:
  • channels.imessage.groupPolicy
  • channels.imessage.groupAllowFrom
  • channels.imessage.groups поведінку списку дозволених
  • налаштування шаблону згадок (agents.list[].groupChat.mentionPatterns)
Перевірте:
  • channels.imessage.remoteHost
  • channels.imessage.remoteAttachmentRoots
  • автентифікацію за ключем SSH/SCP з хоста Gateway
  • наявність ключа хоста в ~/.ssh/known_hosts на хості Gateway
  • доступність віддаленого шляху для читання на Mac, де працює Messages
Повторно запустіть команди в інтерактивному терміналі з графічним інтерфейсом у контексті того самого користувача й сеансу та схваліть запити:
Переконайтеся, що для контексту процесу, у якому працює OpenClaw/imsg, надано повний доступ до диска й дозвіл на автоматизацію.

Посилання на довідник із налаштування

Пов’язані матеріали