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.
Para despliegues de iMessage de OpenClaw, usa
imsg en un host macOS Messages con sesión iniciada. Si tu Gateway se ejecuta en Linux o Windows, apunta channels.imessage.cliPath a un envoltorio SSH que ejecute imsg en el Mac.La puesta al día tras inactividad del Gateway es optativa. Cuando está habilitada (channels.imessage.catchup.enabled: true), el gateway reproduce los mensajes entrantes que llegaron a chat.db mientras estaba sin conexión (fallo, reinicio, suspensión del Mac) en el siguiente inicio. Deshabilitada de forma predeterminada — consulta Ponerse al día después de inactividad del gateway. Cierra openclaw#78649.imsg rpc y se comunica mediante JSON-RPC por stdio (sin demonio/puerto separado). Las acciones avanzadas requieren imsg launch y una comprobación correcta de la API privada.
Private API actions
Respuestas, tapbacks, efectos, adjuntos y gestión de grupos.
Pairing
Los DM de iMessage usan el modo de emparejamiento de forma predeterminada.
Remote Mac
Usa un envoltorio SSH cuando el Gateway no se esté ejecutando en el Mac de Messages.
Configuration reference
Referencia completa de campos de iMessage.
Configuración rápida
- Local Mac (fast path)
- Remote Mac over SSH
Requisitos y permisos (macOS)
- Messages debe tener sesión iniciada en el Mac que ejecuta
imsg. - Se requiere Acceso total al disco para el contexto de proceso que ejecuta OpenClaw/
imsg(acceso a la base de datos de Messages). - Se requiere permiso de Automatización para enviar mensajes mediante Messages.app.
- Para acciones avanzadas (reaccionar / editar / anular envío / respuesta en hilo / efectos / operaciones de grupo), System Integrity Protection debe estar deshabilitado — consulta Habilitar la API privada de imsg más abajo. El envío/recepción básico de texto y multimedia funciona sin ello.
Habilitar la API privada de imsg
imsg se distribuye en dos modos operativos:
- Modo básico (predeterminado, no requiere cambios en SIP): texto y multimedia salientes mediante
send, observación/historial entrante, lista de chats. Esto es lo que obtienes de inmediato con una instalación nueva debrew install steipete/tap/imsgmás los permisos estándar de macOS anteriores. - Modo de API privada:
imsginyecta una dylib auxiliar enMessages.apppara llamar a funciones internas deIMCore. Esto habilitareact,edit,unsend,reply(en hilo),sendWithEffect,renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, además de indicadores de escritura y confirmaciones de lectura.
imsg es explícito sobre el requisito:
Las funciones avanzadas comoLa técnica de inyección del auxiliar usa la propia dylib deread,typing,launch, envío enriquecido respaldado por bridge, mutación de mensajes y gestión de chats son optativas. Requieren que SIP esté deshabilitado y que se inyecte una dylib auxiliar enMessages.app.imsg launchse niega a inyectar cuando SIP está habilitado.
imsg para acceder a las API privadas de Messages. No hay servidor de terceros ni runtime de BlueBubbles en la ruta de iMessage de OpenClaw.
Configuración
-
Instala (o actualiza)
imsgen el Mac que ejecuta Messages.app:La salida deimsg status --jsoninformabridge_version,rpc_methodsyselectorspor método para que puedas ver qué admite la compilación actual antes de empezar. -
Deshabilita System Integrity Protection. Esto depende de la versión de macOS porque el requisito subyacente de Apple depende del SO y del hardware:
- macOS 10.13–10.15 (Sierra–Catalina): deshabilita Library Validation mediante Terminal, reinicia en Recovery Mode, ejecuta
csrutil disable, reinicia. - macOS 11+ (Big Sur y posterior), Intel: Recovery Mode (o Internet Recovery),
csrutil disable, reinicia. - macOS 11+, Apple Silicon: secuencia de inicio con el botón de encendido para entrar en Recovery; en versiones recientes de macOS mantén pulsada la tecla Left Shift cuando hagas clic en Continue, luego
csrutil disable. Las configuraciones de máquinas virtuales siguen un flujo separado — toma primero una instantánea de la VM. - macOS 26 / Tahoe: las políticas de validación de bibliotecas y las comprobaciones de derechos privados de
imagentse han endurecido aún más;imsgpuede necesitar una compilación actualizada para mantenerse al día. Si la inyección deimsg launchoselectorsespecíficos empiezan a devolver falso después de una actualización mayor de macOS, revisa las notas de versión deimsgantes de asumir que el paso de SIP se completó correctamente.
imsg launch. - macOS 10.13–10.15 (Sierra–Catalina): deshabilita Library Validation mediante Terminal, reinicia en Recovery Mode, ejecuta
-
Inyecta el auxiliar. Con SIP deshabilitado y sesión iniciada en Messages.app:
imsg launchse niega a inyectar cuando SIP sigue habilitado, por lo que esto también sirve como confirmación de que el paso 2 surtió efecto. -
Verifica el bridge desde OpenClaw:
La entrada de iMessage debe informar
works, yimsg status --json | jq '.selectors'debe mostrarretractMessagePart: truemás los selectores de edición / escritura / lectura que exponga tu compilación de macOS. La compuerta por método del Plugin de OpenClaw enactions.tssolo anuncia acciones cuyo selector subyacente estrue, por lo que la superficie de acciones que ves en la lista de herramientas del agente refleja lo que el bridge realmente puede hacer en este host.
openclaw channels status --probe informa que el canal está en works pero acciones específicas lanzan “iMessage <action> requires the imsg private API bridge” en el momento de despacho, ejecuta imsg launch de nuevo — el auxiliar puede dejar de estar activo (reinicio de Messages.app, actualización del SO, etc.) y el estado en caché available: true seguirá anunciando acciones hasta que la siguiente comprobación lo actualice.
Cuando no puedes deshabilitar SIP
Si SIP deshabilitado no es aceptable para tu modelo de amenazas:imsgvuelve al modo básico — solo texto + multimedia + recepción.- El Plugin de OpenClaw sigue anunciando envío de texto/multimedia y monitoreo entrante; simplemente oculta
react,edit,unsend,reply,sendWithEffecty operaciones de grupo de la superficie de acciones (según la compuerta de capacidad por método). - Puedes ejecutar un Mac separado que no sea Apple Silicon (o un Mac bot dedicado) con SIP desactivado para la carga de trabajo de iMessage, mientras mantienes SIP habilitado en tus dispositivos principales. Consulta Usuario macOS bot dedicado (identidad de iMessage separada) más abajo.
Control de acceso y enrutamiento
- DM policy
- Group policy + mentions
- Sessions and deterministic replies
channels.imessage.dmPolicy controla los mensajes directos:pairing(predeterminado)allowlistopen(requiere queallowFromincluya"*")disabled
channels.imessage.allowFrom.Las entradas de la lista de permitidos deben identificar a los remitentes: identificadores o grupos estáticos de acceso de remitentes (accessGroup:<name>). Usa channels.imessage.groupAllowFrom para destinos de chat como chat_id:*, chat_guid:* o chat_identifier:*; usa channels.imessage.groups para claves de registro numéricas de chat_id.Enlaces de conversación ACP
Los chats heredados de iMessage también se pueden vincular a sesiones ACP. Flujo rápido para operadores:- Ejecuta
/acp spawn codex --bind heredentro del MD o chat de grupo permitido. - Los mensajes futuros en esa misma conversación de iMessage se enrutan a la sesión ACP generada.
/newy/resetrestablecen la misma sesión ACP vinculada en el lugar./acp closecierra la sesión ACP y elimina el enlace.
bindings[] con type: "acp" y match.channel: "imessage".
match.peer.id puede usar:
- identificador de MD normalizado como
+15555550123ouser@example.com chat_id:<id>(recomendado para enlaces de grupo estables)chat_guid:<guid>chat_identifier:<identifier>
Patrones de despliegue
Dedicated bot macOS user (separate iMessage identity)
Dedicated bot macOS user (separate iMessage identity)
Usa un ID de Apple y un usuario de macOS dedicados para que el tráfico del bot quede aislado de tu perfil personal de Mensajes.Flujo típico:
- Crea/inicia sesión en un usuario de macOS dedicado.
- Inicia sesión en Mensajes con el ID de Apple del bot en ese usuario.
- Instala
imsgen ese usuario. - Crea un contenedor SSH para que OpenClaw pueda ejecutar
imsgen el contexto de ese usuario. - Apunta
channels.imessage.accounts.<id>.cliPathy.dbPatha ese perfil de usuario.
Remote Mac over Tailscale (example)
Remote Mac over Tailscale (example)
Topología común:Usa claves SSH para que tanto SSH como SCP sean no interactivos.
Asegúrate de que la clave del host sea de confianza primero (por ejemplo,
- el Gateway se ejecuta en Linux/VM
- iMessage +
imsgse ejecuta en una Mac en tu tailnet - el contenedor
cliPathusa SSH para ejecutarimsg remoteHosthabilita las obtenciones de adjuntos por SCP
ssh bot@mac-mini.tailnet-1234.ts.net) para que se rellene known_hosts.Multi-account pattern
Multi-account pattern
iMessage admite configuración por cuenta bajo
channels.imessage.accounts.Cada cuenta puede sobrescribir campos como cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, la configuración del historial y las listas de permitidos de raíces de adjuntos.Medios, fragmentación y destinos de entrega
Adjuntos y medios
Adjuntos y medios
- la ingesta de adjuntos entrantes está desactivada de forma predeterminada — establece
channels.imessage.includeAttachments: truepara reenviar fotos, notas de voz, videos y otros adjuntos al agente. Con esto desactivado, los iMessages que solo contienen adjuntos se descartan antes de llegar al agente y pueden no producir ninguna línea de registroInbound message. - las rutas de adjuntos remotos se pueden obtener mediante SCP cuando
remoteHostestá configurado - las rutas de adjuntos deben coincidir con raíces permitidas:
channels.imessage.attachmentRoots(local)channels.imessage.remoteAttachmentRoots(modo SCP remoto)- patrón de raíz predeterminado:
/Users/*/Library/Messages/Attachments
- SCP usa comprobación estricta de clave de host (
StrictHostKeyChecking=yes) - el tamaño de medios salientes usa
channels.imessage.mediaMaxMb(16 MB de forma predeterminada)
Fragmentación saliente
Fragmentación saliente
- límite de fragmento de texto:
channels.imessage.textChunkLimit(4000 de forma predeterminada) - modo de fragmentación:
channels.imessage.chunkModelength(predeterminado)newline(división priorizando párrafos)
Formatos de direccionamiento
Formatos de direccionamiento
Destinos explícitos preferidos:
chat_id:123(recomendado para enrutamiento estable)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Acciones de API privada
Cuandoimsg launch está en ejecución y openclaw channels status --probe informa privateApi.available: true, la herramienta de mensajes puede usar acciones nativas de iMessage además de los envíos de texto normales.
Acciones disponibles
Acciones disponibles
- react: Agrega/elimina tapbacks de iMessage (
messageId,emoji,remove). Los tapbacks admitidos corresponden a amor, me gusta, no me gusta, risa, énfasis y pregunta. - reply: Envía una respuesta en hilo a un mensaje existente (
messageId,textomessage, máschatGuid,chatId,chatIdentifieroto). - sendWithEffect: Envía texto con un efecto de iMessage (
textomessage,effectoeffectId). - edit: Edita un mensaje enviado en versiones compatibles de macOS/API privada (
messageId,textonewText). - unsend: Retrae un mensaje enviado en versiones compatibles de macOS/API privada (
messageId). - upload-file: Envía medios/archivos (
buffercomo base64 o unmedia/path/filePathhidratado,filename,asVoiceopcional). Alias heredado:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Gestiona chats grupales cuando el destino actual es una conversación grupal.
ID de mensajes
ID de mensajes
El contexto entrante de iMessage incluye tanto valores
MessageSid cortos como GUIDs completos de mensajes cuando están disponibles. Los ID cortos tienen alcance limitado a la caché reciente de respuestas en memoria y se comprueban contra el chat actual antes de usarse. Si un ID corto ha expirado o pertenece a otro chat, vuelve a intentarlo con el MessageSidFull completo.Detección de capacidades
Detección de capacidades
OpenClaw oculta las acciones de API privada solo cuando el estado de la sonda en caché indica que el puente no está disponible. Si el estado es desconocido, las acciones siguen siendo visibles y ejecutan sondas de forma diferida para que la primera acción pueda tener éxito después de
imsg launch sin una actualización manual de estado por separado.Confirmaciones de lectura y escritura
Confirmaciones de lectura y escritura
Cuando el puente de API privada está activo, los chats entrantes aceptados se marcan como leídos antes del despacho y se muestra una burbuja de escritura al remitente mientras el agente genera la respuesta. Desactiva el marcado de lectura con:Las compilaciones antiguas de
imsg anteriores a la lista de capacidades por método desactivarán silenciosamente la escritura/lectura; OpenClaw registra una advertencia única por reinicio para que la confirmación faltante sea atribuible.Tapbacks entrantes
Tapbacks entrantes
OpenClaw se suscribe a los tapbacks de iMessage y enruta las reacciones aceptadas como eventos del sistema en lugar de texto de mensaje normal, por lo que un tapback de usuario no desencadena un bucle de respuesta ordinario.El modo de notificación se controla mediante
channels.imessage.reactionNotifications:"own"(predeterminado): notifica solo cuando los usuarios reaccionan a mensajes escritos por el bot."all": notifica todos los tapbacks entrantes de remitentes autorizados."off": ignora los tapbacks entrantes.
channels.imessage.accounts.<id>.reactionNotifications.Escrituras de configuración
iMessage permite escrituras de configuración iniciadas por el canal de forma predeterminada (para/config set|unset cuando commands.config: true).
Desactivar:
Fusión de mensajes directos de envío dividido (comando + URL en una composición)
Cuando un usuario escribe un comando y una URL juntos — por ejemplo,Dump https://example.com/article — la app Mensajes de Apple divide el envío en dos filas separadas de chat.db:
- Un mensaje de texto (
"Dump"). - Un globo de vista previa de URL (
"https://...") con imágenes de vista previa OG como adjuntos.
imsg introduzcan.
channels.imessage.coalesceSameSenderDms permite que un DM fusione filas consecutivas del mismo remitente en un único turno del agente. Los chats grupales siguen despachándose por mensaje para preservar la estructura de turnos de múltiples usuarios.
- Cuándo habilitarlo
- Habilitación
- Compensaciones
Habilítalo cuando:
- Distribuyes Skills que esperan
command + payloaden un solo mensaje (volcar, pegar, guardar, encolar, etc.). - Tus usuarios pegan URL, imágenes o contenido largo junto con comandos.
- Puedes aceptar la latencia adicional en turnos de DM (consulta abajo).
- Necesitas latencia mínima de comandos para disparadores de DM de una sola palabra.
- Todos tus flujos son comandos únicos sin seguimientos de carga útil.
Escenarios y lo que ve el agente
| El usuario compone | chat.db produce | Marca desactivada (predeterminado) | Marca activada + ventana de 2500 ms |
|---|---|---|---|
Dump https://example.com (un envío) | 2 filas con ~1 s de separación | Dos turnos del agente: solo “Dump”, luego URL | Un turno: texto fusionado Dump https://example.com |
Save this 📎image.jpg caption (adjunto + texto) | 2 filas | Dos turnos (adjunto descartado en la fusión) | Un turno: texto + imagen preservados |
/status (comando independiente) | 1 fila | Despacho instantáneo | Espera hasta la ventana y luego despacha |
| URL pegada sola | 1 fila | Despacho instantáneo | Despacho instantáneo (solo una entrada en el bucket) |
| Texto + URL enviados como dos mensajes separados deliberados, con minutos de diferencia | 2 filas fuera de la ventana | Dos turnos | Dos turnos (la ventana vence entre ellos) |
| Ráfaga rápida (>10 DM pequeños dentro de la ventana) | N filas | N turnos | Un turno, salida acotada (primero + más recientes, límites de texto/adjuntos aplicados) |
| Dos personas escribiendo en un chat grupal | N filas de M remitentes | M+ turnos (uno por bucket de remitente) | M+ turnos; los chats grupales no se fusionan |
Ponerse al día tras una caída del Gateway
Cuando el Gateway está sin conexión (cierre inesperado, reinicio, reposo del Mac, máquina apagada),imsg watch se reanuda desde el estado actual de chat.db cuando el Gateway vuelve a estar disponible; por defecto, cualquier cosa que haya llegado durante la interrupción nunca se ve. La recuperación reproduce esos mensajes en el siguiente inicio para que el agente no pierda tráfico entrante silenciosamente.
La recuperación está deshabilitada de forma predeterminada. Habilítala por canal:
Cómo se ejecuta
Una pasada por cada inicio demonitorIMessageProvider, secuenciada como imsg launch listo → watch.subscribe → performIMessageCatchup → bucle de despacho en vivo. La recuperación usa chats.list + messages.history por chat contra el mismo cliente JSON-RPC que usa imsg watch. Cualquier cosa que llegue durante la pasada de recuperación fluye por el despacho en vivo normalmente; la caché de deduplicación entrante existente absorbe cualquier solapamiento con las filas reproducidas.
Cada fila reproducida se envía por la ruta de despacho en vivo (evaluateIMessageInbound + dispatchInboundMessage), por lo que las listas de permitidos, la política de grupos, el debouncer, la caché de eco y las confirmaciones de lectura se comportan de forma idéntica en mensajes reproducidos y en vivo.
Semántica de cursor y reintento
La recuperación mantiene un cursor por cuenta en<openclawStateDir>/imessage/catchup/<account>__<hash>.json (el directorio de estado de OpenClaw tiene como valor predeterminado ~/.openclaw, se puede sobrescribir con OPENCLAW_STATE_DIR):
- El cursor avanza tras cada despacho correcto y se mantiene cuando el despacho de una fila lanza una excepción; el siguiente inicio reintenta la misma fila desde el cursor retenido.
- Después de
maxFailureRetriesexcepciones consecutivas contra el mismoguid, la recuperación registra unwarny fuerza el avance del cursor más allá del mensaje bloqueado para que los inicios posteriores puedan progresar. - Los GUID ya abandonados se omiten al detectarlos (sin intento de despacho) en ejecuciones posteriores y se contabilizan bajo
skippedGivenUpen el resumen de ejecución.
Señales visibles para el operador
WARN ... capped to perRunLimit significa que un único inicio no agotó todo el backlog. Aumenta perRunLimit (máximo 500) si tus interrupciones superan regularmente la pasada predeterminada de 50 filas.
Cuándo dejarlo desactivado
- El Gateway se ejecuta continuamente con reinicio automático por watchdog y las interrupciones siempre son de menos de unos segundos; el valor predeterminado desactivado está bien.
- El volumen de DM es bajo y los mensajes perdidos no cambiarían el comportamiento del agente; la ventana inicial
firstRunLookbackMinutespuede despachar contexto antiguo inesperado al habilitarlo por primera vez.
firstRunLookbackMinutes (30 min de forma predeterminada), no la ventana completa de maxAgeMinutes; esto evita reproducir un historial largo de mensajes anteriores a la habilitación.
Solución de problemas
imsg no encontrado o RPC no compatible
imsg no encontrado o RPC no compatible
Valida el binario y la compatibilidad con RPC:Si la comprobación informa que RPC no es compatible, actualiza
imsg. Si las acciones de API privada no están disponibles, ejecuta imsg launch en la sesión del usuario de macOS con sesión iniciada y vuelve a comprobar. Si el Gateway no se está ejecutando en macOS, usa la configuración de Mac remoto por SSH anterior en lugar de la ruta local predeterminada de imsg.El Gateway no se está ejecutando en macOS
El Gateway no se está ejecutando en macOS
El Luego ejecuta:
cliPath: "imsg" predeterminado debe ejecutarse en el Mac con sesión iniciada en Mensajes. En Linux o Windows, establece channels.imessage.cliPath en un script envoltorio que se conecte por SSH a ese Mac y ejecute imsg "$@".Los DM se ignoran
Los DM se ignoran
Comprueba:
channels.imessage.dmPolicychannels.imessage.allowFrom- aprobaciones de emparejamiento (
openclaw pairing list imessage)
Los mensajes grupales se ignoran
Los mensajes grupales se ignoran
Comprueba:
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- comportamiento de lista de permitidos de
channels.imessage.groups - configuración de patrones de mención (
agents.list[].groupChat.mentionPatterns)
Fallan los adjuntos remotos
Fallan los adjuntos remotos
Comprueba:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- autenticación con clave SSH/SCP desde el host del Gateway
- la clave de host existe en
~/.ssh/known_hostsen el host del Gateway - legibilidad de la ruta remota en el Mac que ejecuta Mensajes
Se pasaron por alto los avisos de permisos de macOS
Se pasaron por alto los avisos de permisos de macOS
Vuelve a ejecutar en una terminal GUI interactiva en el mismo contexto de usuario/sesión y aprueba los avisos:Confirma que Full Disk Access + Automation estén concedidos para el contexto del proceso que ejecuta OpenClaw/
imsg.Punteros de referencia de configuración
Relacionado
- Resumen de canales — todos los canales compatibles
- Eliminación de BlueBubbles y la ruta iMessage de imsg — anuncio y resumen de migración
- Migrar desde BlueBubbles — tabla de traducción de configuración y migración paso a paso
- Emparejamiento — autenticación de DM y flujo de emparejamiento
- Grupos — comportamiento de chats grupales y compuerta por mención
- Enrutamiento de canales — enrutamiento de sesiones para mensajes
- Seguridad — modelo de acceso y endurecimiento