Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Для розгортань OpenClaw iMessage використовуйте
imsg на хості macOS Messages із виконаним входом. Якщо ваш Gateway працює на Linux або Windows, вкажіть channels.imessage.cliPath на SSH-обгортку, яка запускає imsg на Mac.Надолуження після простою Gateway вмикається явно. Коли ввімкнено (channels.imessage.catchup.enabled: true), gateway під час наступного запуску відтворює вхідні повідомлення, що потрапили до chat.db, поки він був офлайн (збій, перезапуск, сон Mac). Типово вимкнено — див. Надолуження після простою gateway. Закриває openclaw#78649.imsg rpc і взаємодіє через JSON-RPC у stdio (без окремого демона/порту). Розширені дії потребують imsg launch і успішної перевірки приватного API.
Дії приватного API
Відповіді, tapback-реакції, ефекти, вкладення та керування групами.
Сполучення
Особисті повідомлення iMessage типово використовують режим сполучення.
Віддалений Mac
Використовуйте SSH-обгортку, коли Gateway не запущено на Mac із Messages.
Довідник конфігурації
Повний довідник полів iMessage.
Швидке налаштування
- Локальний Mac (швидкий шлях)
- Віддалений Mac через SSH
Вимоги та дозволи (macOS)
- На Mac, де запускається
imsg, має бути виконано вхід у Messages. - Для контексту процесу, що запускає OpenClaw/
imsg, потрібен повний доступ до диска (доступ до БД Messages). - Для надсилання повідомлень через Messages.app потрібен дозвіл на автоматизацію.
- Для розширених дій (реакція / редагування / скасування надсилання / відповідь у треді / ефекти / групові операції) потрібно вимкнути System Integrity Protection — див. Увімкнення приватного API imsg нижче. Базове надсилання й отримання тексту та медіа працює без цього.
Увімкнення приватного API imsg
imsg постачається у двох робочих режимах:
- Базовий режим (типовий, зміни SIP не потрібні): вихідні текст і медіа через
send, вхідне спостереження/історія, список чатів. Це те, що ви отримуєте одразу після свіжогоbrew install steipete/tap/imsgплюс стандартні дозволи macOS, наведені вище. - Режим приватного API:
imsgінжектує допоміжну dylib уMessages.app, щоб викликати внутрішні функціїIMCore. Саме це розблоковуєreact,edit,unsend,reply(у треді),sendWithEffect,renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, а також індикатори введення та сповіщення про прочитання.
imsg прямо вказує на цю вимогу:
Розширені можливості, як-отТехніка інжекції helper використовує власну dylibread,typing,launch, розширене надсилання через міст, зміна повідомлень і керування чатами, вмикаються явно. Вони потребують вимкненого SIP і допоміжної dylib, інжектованої вMessages.app.imsg launchвідмовляється виконувати інжекцію, коли SIP увімкнено.
imsg, щоб отримати доступ до приватних API Messages. У шляху OpenClaw iMessage немає стороннього сервера чи середовища виконання BlueBubbles.
Налаштування
-
Установіть (або оновіть)
imsgна Mac, де працює Messages.app:Вивідimsg status --jsonповідомляєbridge_version,rpc_methodsіselectorsдля кожного методу, щоб ви могли побачити, що підтримує поточна збірка, перш ніж почати. -
Вимкніть System Integrity Protection. Це залежить від версії macOS, бо базова вимога Apple залежить від ОС і обладнання:
- macOS 10.13–10.15 (Sierra–Catalina): вимкніть Library Validation через Terminal, перезавантажтеся в Recovery Mode, виконайте
csrutil disable, перезапустіть. - macOS 11+ (Big Sur і новіші), Intel: Recovery Mode (або Internet Recovery),
csrutil disable, перезапустіть. - macOS 11+, Apple Silicon: послідовність запуску з кнопкою живлення для входу в Recovery; у новіших версіях macOS утримуйте клавішу Left Shift, коли натискаєте Continue, потім
csrutil disable. Налаштування віртуальних машин мають окремий процес — спочатку зробіть знімок VM. - macOS 26 / Tahoe: політики library-validation і перевірки приватних entitlement для
imagentстали ще суворішими;imsgможе потребувати оновленої збірки, щоб не відставати. Якщо інжекціяimsg launchабо конкретніselectorsпочинають повертати false після великого оновлення macOS, перевірте примітки до випускуimsg, перш ніж вважати, що крок SIP успішно виконано.
imsg launch. - macOS 10.13–10.15 (Sierra–Catalina): вимкніть Library Validation через Terminal, перезавантажтеся в Recovery Mode, виконайте
-
Інжектуйте helper. Коли SIP вимкнено і в Messages.app виконано вхід:
imsg launchвідмовляється виконувати інжекцію, коли SIP досі увімкнено, тож це також слугує підтвердженням, що крок 2 спрацював. -
Перевірте міст з OpenClaw:
Запис iMessage має повідомляти
works, аimsg status --json | jq '.selectors'має показуватиretractMessagePart: trueплюс ті селектори редагування / введення / прочитання, які надає ваша збірка macOS. Поштучне gating методів у Plugin OpenClaw вactions.tsрекламує лише дії, базовий селектор яких дорівнюєtrue, тож поверхня дій, яку ви бачите в списку інструментів агента, відображає те, що міст реально може виконати на цьому хості.
openclaw channels status --probe повідомляє, що канал має стан works, але конкретні дії під час dispatch викидають “iMessage <action> requires the imsg private API bridge”, запустіть imsg launch ще раз — helper може зникнути (перезапуск Messages.app, оновлення ОС тощо), а кешований статус available: true продовжуватиме рекламувати дії до наступного оновлення probe.
Коли ви не можете вимкнути SIP
Якщо вимкнений SIP неприйнятний для вашої моделі загроз:imsgповертається до базового режиму — лише текст + медіа + отримання.- Plugin OpenClaw усе ще рекламує надсилання тексту/медіа та моніторинг вхідних повідомлень; він просто приховує
react,edit,unsend,reply,sendWithEffectі групові операції з поверхні дій (відповідно до gate можливостей для кожного методу). - Ви можете запустити окремий Mac без Apple Silicon (або виділений bot Mac) з вимкненим SIP для навантаження iMessage, залишивши SIP увімкненим на основних пристроях. Див. Виділений користувач macOS для бота (окрема ідентичність iMessage) нижче.
Контроль доступу та маршрутизація
- Політика DM
- Групова політика + згадки
- Сесії та детерміновані відповіді
channels.imessage.dmPolicy керує особистими повідомленнями:pairing(типово)allowlistopen(потребує, щобallowFromмістив"*")disabled
channels.imessage.allowFrom.Записи списку дозволених мають ідентифікувати відправників: handles або статичні групи доступу відправників (accessGroup:<name>). Використовуйте channels.imessage.groupAllowFrom для цілей чату, як-от chat_id:*, chat_guid:* або chat_identifier:*; використовуйте channels.imessage.groups для числових ключів реєстру chat_id.Прив’язки розмов ACP
Застарілі чати iMessage також можна прив’язувати до сесій ACP. Швидкий операторський процес:- Запустіть
/acp spawn codex --bind hereу DM або дозволеному груповому чаті. - Майбутні повідомлення в тій самій розмові iMessage маршрутизуватимуться до створеної сесії ACP.
/newі/resetскидають ту саму прив’язану сесію ACP на місці./acp closeзакриває сесію ACP і видаляє прив’язку.
bindings[] з type: "acp" і match.channel: "imessage".
match.peer.id може використовувати:
- нормалізований ідентифікатор DM, наприклад
+15555550123абоuser@example.com chat_id:<id>(рекомендовано для стабільних групових прив’язок)chat_guid:<guid>chat_identifier:<identifier>
Шаблони розгортання
Виділений користувач macOS для бота (окрема ідентичність iMessage)
Виділений користувач macOS для бота (окрема ідентичність iMessage)
Використовуйте виділений Apple ID і користувача macOS, щоб трафік бота був ізольований від вашого особистого профілю Messages.Типовий процес:
- Створіть/увійдіть у виділеного користувача macOS.
- Увійдіть у Messages з Apple ID бота в цьому користувачі.
- Установіть
imsgу цьому користувачі. - Створіть SSH-обгортку, щоб OpenClaw міг запускати
imsgу контексті цього користувача. - Спрямуйте
channels.imessage.accounts.<id>.cliPathі.dbPathна профіль цього користувача.
Віддалений Mac через Tailscale (приклад)
Віддалений Mac через Tailscale (приклад)
Поширена топологія:Використовуйте SSH-ключі, щоб і SSH, і SCP були неінтерактивними.
Спочатку переконайтеся, що ключ хоста довірений (наприклад,
- gateway працює на Linux/VM
- iMessage +
imsgпрацює на Mac у вашій tailnet - обгортка
cliPathвикористовує SSH для запускуimsg remoteHostвмикає отримання вкладень через SCP
ssh bot@mac-mini.tailnet-1234.ts.net), щоб known_hosts було заповнено.Шаблон з кількома обліковими записами
Шаблон з кількома обліковими записами
iMessage підтримує налаштування для окремих облікових записів у
channels.imessage.accounts.Кожен обліковий запис може перевизначати поля, як-от cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, налаштування історії та allowlist коренів вкладень.Медіа, розбиття на частини та цілі доставлення
Вкладення та медіа
Вкладення та медіа
- приймання вхідних вкладень вимкнене за замовчуванням — задайте
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.chunkModelength(типово)newline(розділення спочатку за абзацами)
Формати адресування
Формати адресування
Бажані явні цілі:
chat_id:123(рекомендовано для стабільного маршрутизування)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Дії Private API
Колиimsg launch запущено, а openclaw channels status --probe повідомляє privateApi.available: true, інструмент повідомлень може використовувати нативні для iMessage дії на додачу до звичайного надсилання тексту.
Доступні дії
Доступні дії
- react: додати/видалити tapback iMessage (
messageId,emoji,remove). Підтримувані tapback відповідають love, like, dislike, laugh, emphasize і question. - reply: надіслати відповідь у потоці на наявне повідомлення (
messageId,textабоmessage, плюсchatGuid,chatId,chatIdentifierабоto). - sendWithEffect: надіслати текст з ефектом iMessage (
textабоmessage,effectабоeffectId). - edit: редагувати надіслане повідомлення на підтримуваних версіях macOS/Private API (
messageId,textабоnewText). - unsend: відкликати надіслане повідомлення на підтримуваних версіях macOS/Private API (
messageId). - upload-file: надіслати медіа/файли (
bufferяк base64 або гідратованийmedia/path/filePath,filename, необов’язковоasVoice). Застарілий псевдонім:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: керувати груповими чатами, коли поточна ціль є груповою розмовою.
ID повідомлень
ID повідомлень
Контекст вхідного iMessage містить і короткі значення
MessageSid, і повні GUID повідомлень, коли вони доступні. Короткі ID обмежені нещодавнім кешем відповідей у пам’яті та перевіряються щодо поточного чату перед використанням. Якщо короткий ID застарів або належить іншому чату, повторіть спробу з повним MessageSidFull.Виявлення можливостей
Виявлення можливостей
OpenClaw приховує дії Private API лише тоді, коли кешований стан перевірки вказує, що міст недоступний. Якщо стан невідомий, дії залишаються видимими, а dispatch запускає перевірки ліниво, щоб перша дія могла успішно виконатися після
imsg launch без окремого ручного оновлення стану.Сповіщення про прочитання та індикатор набору
Сповіщення про прочитання та індикатор набору
Коли міст Private API працює, прийняті вхідні чати позначаються прочитаними перед dispatch, а відправнику показується індикатор набору, поки агент генерує відповідь. Вимкніть позначення прочитання за допомогою:Старіші збірки
imsg, які передують списку можливостей для окремих методів, тихо вимикатимуть індикатор набору/прочитання; OpenClaw записує одноразове попередження за перезапуск, щоб відсутність підтвердження прочитання можна було пояснити.Вхідні tapback
Вхідні tapback
OpenClaw підписується на tapback iMessage і маршрутизує прийняті реакції як системні події замість звичайного тексту повідомлення, тому tapback користувача не запускає звичайний цикл відповідей.Режим сповіщень контролюється
channels.imessage.reactionNotifications:"own"(типово): сповіщати лише коли користувачі реагують на повідомлення, створені ботом."all": сповіщати про всі вхідні tapback від авторизованих відправників."off": ігнорувати вхідні tapback.
channels.imessage.accounts.<id>.reactionNotifications.Записи конфігурації
iMessage за замовчуванням дозволяє ініційовані каналом записи конфігурації (для/config set|unset, коли commands.config: true).
Вимкнути:
Об’єднання розділених DM (команда + URL в одній композиції)
Коли користувач вводить команду й URL разом — наприклад,Dump https://example.com/article — застосунок Messages від Apple розділяє надсилання на два окремі рядки chat.db:
- Текстове повідомлення (
"Dump"). - Кулька попереднього перегляду URL (
"https://...") із зображеннями OG-preview як вкладеннями.
imsg.
channels.imessage.coalesceSameSenderDms вмикає для DM об’єднання послідовних рядків від того самого відправника в один крок агента. Групові чати й далі надсилаються повідомлення за повідомленням, щоб зберегти структуру кроків із кількома користувачами.
- When to enable
- Enabling
- Trade-offs
Увімкніть, коли:
- Ви постачаєте Skills, які очікують
command + payloadв одному повідомленні (dump, paste, save, queue тощо). - Ваші користувачі вставляють URL, зображення або довгий вміст разом із командами.
- Ви можете прийняти додану затримку кроку DM (див. нижче).
- Вам потрібна мінімальна затримка команди для однословних тригерів DM.
- Усі ваші потоки — це одноразові команди без подальших payload.
Сценарії та що бачить агент
| Користувач створює | chat.db створює | Прапорець вимкнено (за замовчуванням) | Прапорець увімкнено + вікно 2500 мс |
|---|---|---|---|
Dump https://example.com (одне надсилання) | 2 рядки з інтервалом ~1 с | Два кроки агента: лише “Dump”, потім URL | Один крок: об’єднаний текст Dump https://example.com |
Save this 📎image.jpg caption (вкладення + текст) | 2 рядки | Два кроки (вкладення скинуто під час об’єднання) | Один крок: текст + зображення збережено |
/status (окрема команда) | 1 рядок | Миттєве надсилання | Очікування до завершення вікна, потім надсилання |
| URL вставлено окремо | 1 рядок | Миттєве надсилання | Миттєве надсилання (лише один запис у bucket) |
| Текст + URL надіслано як два навмисно окремі повідомлення з різницею в хвилини | 2 рядки поза вікном | Два кроки | Два кроки (вікно спливає між ними) |
| Швидкий потік (>10 малих DM у межах вікна) | N рядків | N кроків | Один крок, обмежений вивід (перший + найновіші, застосовано обмеження тексту/вкладень) |
| Двоє людей друкують у груповому чаті | N рядків від M відправників | M+ кроків (по одному на bucket відправника) | M+ кроків — групові чати не об’єднуються |
Надолуження після простою Gateway
Коли Gateway офлайн (збій, перезапуск, сон Mac, вимкнена машина),imsg watch після повернення Gateway відновлюється з поточного стану chat.db — усе, що надійшло під час прогалини, за замовчуванням ніколи не буде побачено. Catchup відтворює ці повідомлення під час наступного запуску, щоб агент не пропускав вхідний трафік мовчки.
Catchup вимкнено за замовчуванням. Увімкніть його для окремого каналу:
Як це виконується
Один прохід на кожен запускmonitorIMessageProvider, послідовність така: готовність imsg launch → watch.subscribe → performIMessageCatchup → цикл live-надсилання. Сам Catchup використовує chats.list + messages.history для кожного чату через той самий JSON-RPC-клієнт, який використовує imsg watch. Усе, що надходить під час проходу Catchup, проходить через live-надсилання у звичайному режимі; наявний кеш inbound-dedupe поглинає будь-яке перекриття з відтвореними рядками.
Кожен відтворений рядок подається через live-шлях надсилання (evaluateIMessageInbound + dispatchInboundMessage), тож allowlist, політика груп, debouncer, echo cache і сповіщення про прочитання поводяться однаково для відтворених і live-повідомлень.
Семантика курсора й повторів
Catchup зберігає курсор для кожного облікового запису в<openclawStateDir>/imessage/catchup/<account>__<hash>.json (каталог стану OpenClaw за замовчуванням — ~/.openclaw, можна перевизначити через OPENCLAW_STATE_DIR):
- Курсор просувається після кожного успішного надсилання й утримується, коли надсилання рядка кидає помилку — наступний запуск повторює той самий рядок із утриманого курсора.
- Після
maxFailureRetriesпослідовних помилок для того самогоguid, Catchup записуєwarnі примусово просуває курсор повз застрягле повідомлення, щоб подальші запуски могли рухатися далі. - GUID, щодо яких уже відмовилися, пропускаються відразу (без спроби надсилання) у подальших запусках і враховуються в
skippedGivenUpу підсумку запуску.
Сигнали, видимі оператору
WARN ... capped to perRunLimit означає, що один запуск не вичерпав увесь backlog. Збільште perRunLimit (макс. 500), якщо ваші прогалини регулярно перевищують стандартний прохід у 50 рядків.
Коли залишити вимкненим
- Gateway працює безперервно з автоматичним перезапуском через watchdog, а прогалини завжди < кількох секунд — стандартне вимкнене значення підходить.
- Обсяг DM низький, і пропущені повідомлення не змінять поведінку агента — початкове вікно
firstRunLookbackMinutesможе надіслати неочікуваний старий контекст під час першого ввімкнення.
firstRunLookbackMinutes (30 хв за замовчуванням), а не на повне вікно maxAgeMinutes — це запобігає відтворенню довгої історії повідомлень, що передували ввімкненню.
Усунення несправностей
imsg not found or RPC unsupported
imsg not found or RPC unsupported
Перевірте бінарний файл і підтримку RPC:Якщо probe повідомляє, що RPC не підтримується, оновіть
imsg. Якщо дії приватного API недоступні, запустіть imsg launch у сеансі користувача macOS, який увійшов у систему, і знову виконайте probe. Якщо Gateway не працює на macOS, використайте налаштування віддаленого Mac через SSH вище замість стандартного локального шляху imsg.Gateway is not running on macOS
Gateway is not running on macOS
Стандартний Потім виконайте:
cliPath: "imsg" має виконуватися на Mac, який увійшов у Messages. На Linux або Windows встановіть channels.imessage.cliPath на wrapper-скрипт, який підключається до цього Mac через SSH і запускає imsg "$@".DMs are ignored
DMs are ignored
Перевірте:
channels.imessage.dmPolicychannels.imessage.allowFrom- схвалення pairing (
openclaw pairing list imessage)
Group messages are ignored
Group messages are ignored
Перевірте:
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- поведінку allowlist
channels.imessage.groups - конфігурацію шаблонів згадок (
agents.list[].groupChat.mentionPatterns)
Remote attachments fail
Remote attachments fail
Перевірте:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- автентифікацію SSH/SCP-ключем із хоста Gateway
- наявність ключа хоста в
~/.ssh/known_hostsна хості Gateway - доступність віддаленого шляху для читання на Mac, де працює Messages
macOS permission prompts were missed
macOS permission prompts were missed
Повторно запустіть в інтерактивному GUI-терміналі в тому самому контексті користувача/сеансу й підтвердьте запити:Підтвердьте, що Full Disk Access + Automation надано для контексту процесу, який запускає OpenClaw/
imsg.Вказівники довідника конфігурації
Пов’язане
- Огляд каналів — усі підтримувані канали
- Вилучення BlueBubbles і шлях imsg iMessage — оголошення й підсумок міграції
- Перехід із BlueBubbles — таблиця перекладу конфігурації та покрокове перемикання
- Pairing — автентифікація DM і потік pairing
- Групи — поведінка групових чатів і gating згадок
- Маршрутизація каналів — маршрутизація сеансів для повідомлень
- Безпека — модель доступу й зміцнення