iMessage (legado: imsg)
Recomendado: Use BlueBubbles para novas configurações do iMessage.
O canal imsg é uma integração legada via CLI externa e pode ser removido em uma versão futura.
Status: integração legada via CLI externa. O Gateway inicia imsg rpc (JSON-RPC sobre stdio).
Início rápido (iniciante)
- Garanta que o Messages esteja conectado neste Mac.
- Instale
imsg:brew install steipete/tap/imsg
- Configure o OpenClaw com
channels.imessage.cliPathechannels.imessage.dbPath. - Inicie o gateway e aprove quaisquer prompts do macOS (Automação + Acesso Total ao Disco).
O que é
- Canal do iMessage baseado em
imsgno macOS. - Roteamento determinístico: respostas sempre retornam ao iMessage.
- DMs compartilham a sessão principal do agente; grupos são isolados (
agent:<agentId>:imessage:group:<chat_id>). - Se um tópico com múltiplos participantes chegar com
is_group=false, você ainda pode isolá-lochat_idusandochannels.imessage.groups(veja “Tópicos tipo grupo” abaixo).
Escritas de configuração
Por padrão, o iMessage tem permissão para escrever atualizações de configuração acionadas por/config set|unset (requer commands.config: true).
Desative com:
Requisitos
- macOS com o Messages conectado.
- Acesso Total ao Disco para o OpenClaw +
imsg(acesso ao DB do Messages). - Permissão de Automação ao enviar.
channels.imessage.cliPathpode apontar para qualquer comando que faça proxy de stdin/stdout (por exemplo, um script wrapper que conecta via SSH a outro Mac e executaimsg rpc).
Solução de problemas de Privacidade e Segurança TCC do macOS
Se o envio/recebimento falhar (por exemplo,imsg rpc sai com código diferente de zero, expira, ou o gateway parece travar), uma causa comum é um prompt de permissão do macOS que nunca foi aprovado.
O macOS concede permissões TCC por app/contexto de processo. Aprove os prompts no mesmo contexto que executa imsg (por exemplo, Terminal/iTerm, uma sessão LaunchAgent ou um processo iniciado via SSH).
Checklist:
- Acesso Total ao Disco: permita acesso ao processo que executa o OpenClaw (e a qualquer wrapper de shell/SSH que execute
imsg). Isso é necessário para ler o banco de dados do Messages (chat.db). - Automação → Messages: permita que o processo que executa o OpenClaw (e/ou seu terminal) controle o Messages.app para envios de saída.
- Saúde da CLI
imsg: verifique seimsgestá instalado e oferece suporte a RPC (imsg rpc --help).
Configuração (caminho rápido)
- Garanta que o Messages esteja conectado neste Mac.
- Configure o iMessage e inicie o gateway.
Usuário macOS dedicado para bot (para identidade isolada)
Se você quiser que o bot envie a partir de uma identidade iMessage separada (e manter seus Messages pessoais limpos), use um Apple ID dedicado + um usuário macOS dedicado.- Crie um Apple ID dedicado (exemplo:
[email protected]).- A Apple pode exigir um número de telefone para verificação / 2FA.
- Crie um usuário macOS (exemplo:
openclawhome) e faça login nele. - Abra o Messages nesse usuário macOS e entre no iMessage usando o Apple ID do bot.
- Ative o Login Remoto (Ajustes do Sistema → Geral → Compartilhamento → Login Remoto).
- Instale
imsg:brew install steipete/tap/imsg
- Configure o SSH para que
ssh <bot-macos-user>@localhost truefuncione sem senha. - Aponte
channels.imessage.accounts.bot.cliPathpara um wrapper SSH que executeimsgcomo o usuário do bot.
imsg rpc parecer travado ou encerrar, faça login nesse usuário (Compartilhamento de Tela ajuda), execute um imsg chats --limit 1 / imsg send ... único, aprove os prompts e tente novamente. Veja Solução de problemas de Privacidade e Segurança TCC do macOS.
Wrapper de exemplo (chmod +x). Substitua <bot-macos-user> pelo seu nome de usuário macOS real:
channels.imessage.cliPath, channels.imessage.dbPath) em vez do mapa accounts.
Variante remota/SSH (opcional)
Se você quiser o iMessage em outro Mac, definachannels.imessage.cliPath para um wrapper que execute imsg no host macOS remoto via SSH. O OpenClaw precisa apenas de stdio.
Wrapper de exemplo:
cliPath aponta para um host remoto via SSH, os caminhos de anexos no banco de dados do Messages referenciam arquivos na máquina remota. O OpenClaw pode buscar esses arquivos automaticamente via SCP ao definir channels.imessage.remoteHost:
remoteHost não estiver definido, o OpenClaw tenta detectá-lo automaticamente analisando o comando SSH no seu script wrapper. A configuração explícita é recomendada para confiabilidade.
Mac remoto via Tailscale (exemplo)
Se o Gateway roda em um host/VM Linux, mas o iMessage precisa rodar em um Mac, o Tailscale é a ponte mais simples: o Gateway se comunica com o Mac pela tailnet, executaimsg via SSH e copia anexos de volta via SCP.
Arquitetura:
Exemplo concreto de configuração (hostname do Tailscale):
~/.openclaw/scripts/imsg-ssh):
- Garanta que o Mac esteja conectado ao Messages e que o Login Remoto esteja ativado.
- Use chaves SSH para que
ssh [email protected]funcione sem prompts. remoteHostdeve corresponder ao destino SSH para que o SCP possa buscar anexos.
channels.imessage.accounts com configuração por conta e name opcional. Veja gateway/configuration para o padrão compartilhado. Não versionar ~/.openclaw/openclaw.json (geralmente contém tokens).
Controle de acesso (DMs + grupos)
DMs:- Padrão:
channels.imessage.dmPolicy = "pairing". - Remetentes desconhecidos recebem um código de pareamento; as mensagens são ignoradas até a aprovação (códigos expiram após 1 hora).
- Aprovar via:
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>
- O pareamento é a troca de tokens padrão para DMs do iMessage. Detalhes: Pareamento
channels.imessage.groupPolicy = open | allowlist | disabled.channels.imessage.groupAllowFromcontrola quem pode acionar em grupos quandoallowlistestá definido.- O bloqueio por menção usa
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) porque o iMessage não tem metadados nativos de menção. - Substituição multiagente: defina padrões por agente em
agents.list[].groupChat.mentionPatterns.
Como funciona (comportamento)
imsgtransmite eventos de mensagens; o gateway os normaliza no envelope de canal compartilhado.- As respostas sempre retornam ao mesmo id de chat ou handle.
Tópicos tipo grupo (is_group=false)
Alguns tópicos do iMessage podem ter vários participantes, mas ainda chegar com is_group=false, dependendo de como o Messages armazena o identificador do chat.
Se você configurar explicitamente um chat_id em channels.imessage.groups, o OpenClaw trata esse tópico como um “grupo” para:
- isolamento de sessão (chave de sessão
agent:<agentId>:imessage:group:<chat_id>separada) - comportamento de lista de permissões de grupo / bloqueio por menção
Mídia + limites
- Ingestão opcional de anexos via
channels.imessage.includeAttachments. - Limite de mídia via
channels.imessage.mediaMaxMb.
Limites
- Texto de saída é dividido em blocos de
channels.imessage.textChunkLimit(padrão 4000). - Divisão opcional por nova linha: defina
channels.imessage.chunkMode="newline"para dividir em linhas em branco (limites de parágrafo) antes da divisão por tamanho. - Uploads de mídia são limitados por
channels.imessage.mediaMaxMb(padrão 16).
Endereçamento / destinos de entrega
Prefirachat_id para roteamento estável:
chat_id:123(preferido)chat_guid:...chat_identifier:...- handles diretos:
imessage:+1555/sms:+1555/[email protected]
Referência de configuração (iMessage)
Configuração completa: Configuração Opções do provedor:channels.imessage.enabled: habilitar/desabilitar a inicialização do canal.channels.imessage.cliPath: caminho paraimsg.channels.imessage.dbPath: caminho do DB do Messages.channels.imessage.remoteHost: host SSH para transferência de anexos via SCP quandocliPathaponta para um Mac remoto (por exemplo,user@gateway-host). Auto-detectado a partir do wrapper SSH se não estiver definido.channels.imessage.service:imessage | sms | auto.channels.imessage.region: região de SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(padrão: pareamento).channels.imessage.allowFrom: lista de permissões de DM (handles, e-mails, números E.164 ouchat_id:*).openrequer"*". O iMessage não tem nomes de usuário; use handles ou destinos de chat.channels.imessage.groupPolicy:open | allowlist | disabled(padrão: lista de permissões).channels.imessage.groupAllowFrom: lista de permissões de remetentes de grupo.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: máximo de mensagens de grupo a incluir como contexto (0 desativa).channels.imessage.dmHistoryLimit: limite de histórico de DM em turnos de usuário. Substituições por usuário:channels.imessage.dms["<handle>"].historyLimit.channels.imessage.groups: padrões por grupo + lista de permissões (use"*"para padrões globais).channels.imessage.includeAttachments: ingerir anexos no contexto.channels.imessage.mediaMaxMb: limite de mídia de entrada/saída (MB).channels.imessage.textChunkLimit: tamanho de bloco de saída (caracteres).channels.imessage.chunkMode:length(padrão) ounewlinepara dividir em linhas em branco (limites de parágrafo) antes da divisão por tamanho.
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns).messages.responsePrefix.