OpenClaw macOS Companion (barra de menú + broker del Gateway)
La app de macOS es la aplicación complementaria de la barra de menú para OpenClaw. Gestiona permisos, administra/se adjunta al Gateway de forma local (launchd o manual) y expone capacidades de macOS al agente como un nodo.Qué hace
- Muestra notificaciones nativas y estado en la barra de menú.
- Gestiona solicitudes TCC (Notificaciones, Accesibilidad, Grabación de Pantalla, Micrófono, Reconocimiento de Voz, Automatización/AppleScript).
- Ejecuta o se conecta al Gateway (local o remoto).
- Expone herramientas exclusivas de macOS (Canvas, Cámara, Grabación de Pantalla,
system.run). - Inicia el servicio local de host de nodo en modo remoto (launchd) y lo detiene en modo local.
- Opcionalmente aloja PeekabooBridge para automatización de UI.
- Instala la CLI global (
openclaw) vía npm/pnpm bajo solicitud (bun no se recomienda para el runtime del Gateway).
Modo local vs remoto
- Local (predeterminado): la app se adjunta a un Gateway local en ejecución si existe;
de lo contrario habilita el servicio launchd mediante
openclaw gateway install. - Remoto: la app se conecta a un Gateway por SSH/Tailscale y nunca inicia un proceso local. La app inicia el servicio de host de nodo local para que el Gateway remoto pueda alcanzar este Mac. La app no crea el Gateway como proceso hijo.
Control de Launchd
La app administra un LaunchAgent por usuario etiquetadobot.molt.gateway
(o bot.molt.<profile> cuando se usa --profile/OPENCLAW_PROFILE; el legado com.openclaw.* aún se descarga).
bot.molt.<profile> cuando ejecute un perfil con nombre.
Si el LaunchAgent no está instalado, habilítelo desde la app o ejecute
openclaw gateway install.
Capacidades del nodo (mac)
La app de macOS se presenta como un nodo. Comandos comunes:- Canvas:
canvas.present,canvas.navigate,canvas.eval,canvas.snapshot,canvas.a2ui.* - Cámara:
camera.snap,camera.clip - Pantalla:
screen.record - Sistema:
system.run,system.notify
permissions para que los agentes decidan qué está permitido.
Servicio del nodo + IPC de la app:
- Cuando el servicio de host de nodo sin interfaz está en ejecución (modo remoto), se conecta al WS del Gateway como un nodo.
system.runse ejecuta en la app de macOS (contexto de UI/TCC) a través de un socket Unix local; las solicitudes y la salida permanecen dentro de la app.
Aprobaciones de ejecución (system.run)
system.run está controlado por Aprobaciones de ejecución en la app de macOS (Ajustes → Aprobaciones de ejecución).
La seguridad + confirmación + lista de permitidos se almacenan localmente en el Mac en:
- Las entradas
allowlistson patrones glob para rutas de binarios resueltas. - Elegir “Permitir siempre” en la solicitud agrega ese comando a la lista de permitidos.
- Las anulaciones de entorno
system.runse filtran (se descartanPATH,DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT) y luego se combinan con el entorno de la app.
Enlaces profundos
La app registra el esquema de URLopenclaw:// para acciones locales.
openclaw://agent
Dispara una solicitud agent del Gateway.
message(requerido)sessionKey(opcional)thinking(opcional)deliver/to/channel(opcional)timeoutSeconds(opcional)key(clave opcional de modo desatendido)
- Sin
key, la app solicita confirmación. - Sin
key, la aplicación aplica un límite corto de mensaje para el aviso de confirmación e ignoradeliver/to/channel. - Con un
keyválido, la ejecución es desatendida (pensada para automatizaciones personales).
Flujo de incorporación (típico)
- Instale y abra OpenClaw.app.
- Complete la lista de verificación de permisos (solicitudes TCC).
- Asegúrese de que el modo Local esté activo y que el Gateway esté en ejecución.
- Instale la CLI si desea acceso desde la terminal.
Flujo de compilación y desarrollo (nativo)
cd apps/macos && swift buildswift run OpenClaw(o Xcode)- Empaquetar la app:
scripts/package-mac-app.sh
Depurar conectividad del Gateway (CLI de macOS)
Use la CLI de depuración para ejercitar el mismo saludo de WebSocket del Gateway y la lógica de descubrimiento que usa la app de macOS, sin iniciar la app.--url <ws://host:port>: sobrescribir configuración--mode <local|remote>: resolver desde la configuración (predeterminado: configuración o local)--probe: forzar una nueva sonda de salud--timeout <ms>: tiempo de espera de la solicitud (predeterminado:15000)--json: salida estructurada para comparar diferencias
--include-local: incluir gateways que se filtrarían como “locales”--timeout <ms>: ventana general de descubrimiento (predeterminado:2000)--json: salida estructurada para comparar diferencias
openclaw gateway discover --json para ver si el
pipeline de descubrimiento de la app de macOS (NWBrowser + fallback DNS‑SD de tailnet) difiere del descubrimiento basado en dns-sd de la CLI de Node.
Plomería de conexión remota (túneles SSH)
Cuando la app de macOS se ejecuta en modo Remoto, abre un túnel SSH para que los componentes de UI locales puedan comunicarse con un Gateway remoto como si estuviera en localhost.Túnel de control (puerto WebSocket del Gateway)
- Propósito: comprobaciones de salud, estado, Web Chat, configuración y otras llamadas del plano de control.
- Puerto local: el puerto del Gateway (predeterminado
18789), siempre estable. - Puerto remoto: el mismo puerto del Gateway en el host remoto.
- Comportamiento: sin puerto local aleatorio; la app reutiliza un túnel saludable existente o lo reinicia si es necesario.
- Forma de SSH:
ssh -N -L <local>:127.0.0.1:<remote>con BatchMode + ExitOnForwardFailure + opciones de keepalive. - Reporte de IP: el túnel SSH usa loopback, por lo que el gateway verá la IP del nodo
como
127.0.0.1. Use el transporte Direct (ws/wss) si desea que aparezca la IP real del cliente (consulte acceso remoto en macOS).