iMessage (imsg)
Статус: внешняя интеграция CLI. Gateway запускает imsg rpc (JSON-RPC через stdio).
Быстрая настройка (для начинающих)
- Убедитесь, что Messages подключен на этом Mac.
- Установите imsg:
- brew install steipete/tap/imsg
- Настройте OpenClaw с channels.imessage.cliPath и channels.imessage.dbPath.
- Запустите gateway и утвердите любые запросы macOS (Automation + Full Disk Access).
Минимальная конфигурация:
{
channels: {
imessage: {
enabled: true,
cliPath: "/usr/local/bin/imsg",
dbPath: "/Users/<you>/Library/Messages/chat.db"
}
}
}
Что это
- Канал iMessage, поддерживаемый imsg на macOS.
- Детерминированная маршрутизация: ответы всегда возвращаются в iMessage.
- Личные сообщения используют основную сессию агента; группы изолированы (agent:<agentId>:imessage:group:<chat_id>).
- Если приходит поток с несколькими участниками с is_group=false, вы все равно можете изолировать его по chat_id, используя channels.imessage.groups (см. "Группоподобные потоки" ниже).
Запись конфигурации
По умолчанию iMessage разрешено записывать обновления конфигурации, вызванные /config set|unset (требует commands.config: true).
Отключите с помощью:
{
channels: { imessage: { configWrites: false } }
}
Требования
- macOS с подключенным Messages.
- Full Disk Access для OpenClaw + imsg (доступ к БД Messages).
- Разрешение Automation при отправке.
- channels.imessage.cliPath может указывать на любую команду, проксирующую stdin/stdout (например, скрипт-обертка, который использует SSH на другой Mac и запускает imsg rpc).
Настройка (быстрый путь)
- Убедитесь, что Messages подключен на этом Mac.
- Настройте iMessage и запустите gateway.
Выделенный macOS пользователь для бота (для изолированной идентичности)
Если вы хотите, чтобы бот отправлял с отдельной идентичностью iMessage (и сохранял ваш личный Messages чистым), используйте выделенный Apple ID + выделенного macOS пользователя.
- Создайте выделенный Apple ID (пример: [email protected]).
- Apple может потребовать номер телефона для проверки / 2FA.
- Создайте macOS пользователя (пример: openclawhome) и войдите в него.
- Откройте Messages в этом macOS пользователе и войдите в iMessage, используя Apple ID бота.
- Включите Remote Login (Системные настройки → Общие → Общий доступ → Remote Login).
- Установите imsg:
- brew install steipete/tap/imsg
- Настройте SSH так, чтобы ssh <bot-macos-user>@localhost true работал без пароля.
- Направьте channels.imessage.accounts.bot.cliPath на SSH-обертку, запускающую imsg как пользователь бота.
Примечание при первом запуске: отправка/получение может потребовать GUI-утверждений (Automation + Full Disk Access) в macOS пользователе бота. Если imsg rpc выглядит зависшим или завершается, войдите в этого пользователя (Screen Sharing помогает), запустите однократно imsg chats --limit 1 / imsg send ..., утвердите запросы, затем повторите.
Пример обертки (chmod +x). Замените <bot-macos-user> на ваше фактическое имя пользователя macOS:
#!/usr/bin/env bash
set -euo pipefail
# Сначала запустите интерактивный SSH один раз для принятия ключей хоста:
# ssh <bot-macos-user>@localhost true
exec /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=5 -T <bot-macos-user>@localhost \
"/usr/local/bin/imsg" "$@"
Пример конфигурации:
{
channels: {
imessage: {
enabled: true,
accounts: {
bot: {
name: "Bot",
enabled: true,
cliPath: "/path/to/imsg-bot",
dbPath: "/Users/<bot-macos-user>/Library/Messages/chat.db"
}
}
}
}
}
Для настроек с одним аккаунтом используйте плоские параметры (channels.imessage.cliPath, channels.imessage.dbPath) вместо карты accounts.
Удаленный/SSH вариант (опционально)
Если вы хотите iMessage на другом Mac, установите channels.imessage.cliPath на обертку, которая запускает imsg на удаленном macOS хосте через SSH. OpenClaw нужен только stdio.
Пример обертки:
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
Удаленные вложения: Когда cliPath указывает на удаленный хост через SSH, пути вложений в базе данных Messages ссылаются на файлы на удаленной машине. OpenClaw может автоматически получать их через SCP, установив channels.imessage.remoteHost:
{
channels: {
imessage: {
cliPath: "~/imsg-ssh", // SSH-обертка на удаленный Mac
remoteHost: "user@gateway-host", // для передачи файлов SCP
includeAttachments: true
}
}
}
Если remoteHost не установлен, OpenClaw пытается автоматически обнаружить его, разбирая команду SSH в вашем скрипте-обертке. Явная конфигурация рекомендуется для надежности.
Удаленный Mac через Tailscale (пример)
Если Gateway работает на Linux хосте/VM, но iMessage должен работать на Mac, Tailscale — самый простой мост: Gateway общается с Mac через tailnet, запускает imsg через SSH и копирует вложения обратно через SCP.
Архитектура:
┌──────────────────────────────┐ SSH (imsg rpc) ┌──────────────────────────┐
│ Хост Gateway (Linux/VM) │──────────────────────────────────▶│ Mac с Messages + imsg │
│ - openclaw gateway │ SCP (вложения) │ - Messages подключен │
│ - channels.imessage.cliPath │◀──────────────────────────────────│ - Remote Login включен │
└──────────────────────────────┘ └──────────────────────────┘
▲
│ Tailscale tailnet (hostname или 100.x.y.z)
▼
user@gateway-host
Конкретный пример конфигурации (Tailscale hostname):
{
channels: {
imessage: {
enabled: true,
cliPath: "~/.openclaw/scripts/imsg-ssh",
remoteHost: "[email protected]",
includeAttachments: true,
dbPath: "/Users/bot/Library/Messages/chat.db"
}
}
}
Пример обертки (~/.openclaw/scripts/imsg-ssh):
#!/usr/bin/env bash
exec ssh -T [email protected] imsg "$@"
Примечания:
- Убедитесь, что Mac подключен к Messages, и Remote Login включен.
- Используйте SSH-ключи, чтобы ssh [email protected] работал без запросов.
- remoteHost должен соответствовать цели SSH, чтобы SCP мог получать вложения.
Поддержка нескольких аккаунтов: используйте channels.imessage.accounts с конфигурацией для каждого аккаунта и опциональным name. См. gateway/configuration для общего паттерна. Не коммитьте ~/.openclaw/openclaw.json (он часто содержит токены).
Контроль доступа (личные сообщения + группы)
Личные сообщения:
- По умолчанию: channels.imessage.dmPolicy = "pairing".
- Неизвестные отправители получают код сопряжения; сообщения игнорируются до утверждения (коды истекают через 1 час).
- Утвердите через:
- openclaw pairing list imessage
- openclaw pairing approve imessage <CODE>
- Сопряжение — это обмен токенами по умолчанию для личных сообщений iMessage. Подробности: Сопряжение
Группы:
- channels.imessage.groupPolicy = open | allowlist | disabled.
- channels.imessage.groupAllowFrom контролирует, кто может вызывать в группах при установке allowlist.
- Контроль упоминаний использует agents.list[].groupChat.mentionPatterns (или messages.groupChat.mentionPatterns), потому что iMessage не имеет нативных метаданных упоминаний.
- Переопределение нескольких агентов: установите паттерны для каждого агента на agents.list[].groupChat.mentionPatterns.
Как это работает (поведение)
- imsg транслирует события сообщений; gateway нормализует их в общий конверт канала.
- Ответы всегда маршрутизируются обратно к тому же chat id или handle.
Группоподобные потоки (is_group=false)
Некоторые потоки iMessage могут иметь нескольких участников, но все равно приходить с is_group=false в зависимости от того, как Messages хранит идентификатор чата.
Если вы явно настроите chat_id в channels.imessage.groups, OpenClaw будет обрабатывать этот поток как "группу" для:
- изоляции сессии (отдельный ключ сессии agent:<agentId>:imessage:group:<chat_id>)
- поведения белых списков групп / контроля упоминаний
Пример:
{
channels: {
imessage: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"42": { "requireMention": false }
}
}
}
}
Это полезно, когда вы хотите изолированную личность/модель для конкретного потока (см. Маршрутизация нескольких агентов). Для изоляции файловой системы см. Sandboxing.
Медиа + лимиты
- Опциональный прием вложений через channels.imessage.includeAttachments.
- Ограничение медиа через channels.imessage.mediaMaxMb.
Ограничения
- Исходящий текст разбивается на части до channels.imessage.textChunkLimit (по умолчанию 4000).
- Опциональное разбиение по новым строкам: установите channels.imessage.chunkMode="newline" для разделения на пустых строках (границы параграфов) перед разбиением по длине.
- Загрузки медиа ограничены channels.imessage.mediaMaxMb (по умолчанию 16).
Адресация / цели доставки
Предпочитайте chat_id для стабильной маршрутизации:
- chat_id:123 (предпочтительно)
- chat_guid:...
- chat_identifier:...
- прямые handles: imessage:+1555 / sms:+1555 / [email protected]
Список чатов:
imsg chats --limit 20
Справочник конфигурации (iMessage)
Полная конфигурация: Конфигурация
Параметры провайдера:
- channels.imessage.enabled: включить/отключить запуск канала.
- channels.imessage.cliPath: путь к imsg.
- channels.imessage.dbPath: путь к БД Messages.
- channels.imessage.remoteHost: SSH хост для передачи вложений SCP, когда cliPath указывает на удаленный Mac (например, user@gateway-host). Автоматически обнаруживается из SSH-обертки, если не установлен.
- channels.imessage.service: imessage | sms | auto.
- channels.imessage.region: регион SMS.
- channels.imessage.dmPolicy: pairing | allowlist | open | disabled (по умолчанию: pairing).
- channels.imessage.allowFrom: белый список личных сообщений (handles, email, номера E.164 или chat_id:*). open требует "*". iMessage не имеет имен пользователей; используйте handles или цели чата.
- channels.imessage.groupPolicy: open | allowlist | disabled (по умолчанию: allowlist).
- channels.imessage.groupAllowFrom: белый список отправителей группы.
- channels.imessage.historyLimit / channels.imessage.accounts.*.historyLimit: макс сообщений группы для включения в качестве контекста (0 отключает).
- channels.imessage.dmHistoryLimit: лимит истории личных сообщений в пользовательских обращениях. Переопределения для конкретного пользователя: channels.imessage.dms["<handle>"].historyLimit.
- channels.imessage.groups: значения по умолчанию для каждой группы + белый список (используйте "*" для глобальных значений по умолчанию).
- channels.imessage.includeAttachments: принимать вложения в контекст.
- channels.imessage.mediaMaxMb: ограничение входящих/исходящих медиа (МБ).
- channels.imessage.textChunkLimit: размер исходящего фрагмента (символы).
- channels.imessage.chunkMode: length (по умолчанию) или newline для разделения на пустых строках (границы параграфов) перед разбиением по длине.
Связанные глобальные параметры:
- agents.list[].groupChat.mentionPatterns (или messages.groupChat.mentionPatterns).
- messages.responsePrefix.