App complementare OpenClaw per macOS (barra dei menu + broker del gateway)
L’app macOS è l’app complementare nella barra dei menu per OpenClaw. Gestisce i permessi, amministra/si collega al Gateway in locale (launchd o manuale) ed espone le capacità di macOS all’agente come nodo.Cosa fa
- Mostra notifiche native e stato nella barra dei menu.
- Gestisce i prompt TCC (Notifiche, Accessibilità, Registrazione dello schermo, Microfono, Riconoscimento vocale, Automazione/AppleScript).
- Esegue o si connette al Gateway (locale o remoto).
- Espone strumenti solo macOS (Canvas, Fotocamera, Registrazione dello schermo,
system.run). - Avvia il servizio host del nodo locale in modalità remote (launchd), e lo arresta in modalità local.
- Facoltativamente ospita PeekabooBridge per l’automazione UI.
- Installa la CLI globale (
openclaw) su richiesta tramite npm, pnpm o bun (l’app preferisce npm, poi pnpm, poi bun; Node resta il runtime Gateway consigliato).
Modalità locale vs remota
- Local (predefinita): l’app si collega a un Gateway locale in esecuzione se presente;
altrimenti abilita il servizio launchd tramite
openclaw gateway install. - Remote: l’app si connette a un Gateway tramite SSH/Tailscale e non avvia mai un processo locale. L’app avvia il servizio host del nodo locale così il Gateway remoto può raggiungere questo Mac. L’app non genera il Gateway come processo figlio. Il rilevamento del Gateway ora preferisce i nomi Tailscale MagicDNS agli IP tailnet grezzi, quindi l’app Mac si ripristina in modo più affidabile quando gli IP tailnet cambiano.
Controllo launchd
L’app gestisce un LaunchAgent per utente con etichettaai.openclaw.gateway
(o ai.openclaw.<profile> quando si usa --profile/OPENCLAW_PROFILE; il legacy com.openclaw.* viene comunque scaricato).
ai.openclaw.<profile> quando esegui un profilo con nome.
Se il LaunchAgent non è installato, abilitalo dall’app o esegui
openclaw gateway install.
Capacità del nodo (Mac)
L’app macOS si presenta come un nodo. Comandi comuni:- Canvas:
canvas.present,canvas.navigate,canvas.eval,canvas.snapshot,canvas.a2ui.* - Fotocamera:
camera.snap,camera.clip - Schermo:
screen.record - Sistema:
system.run,system.notify
permissions così gli agenti possono decidere cosa è consentito.
Servizio nodo + IPC dell’app:
- Quando il servizio host del nodo headless è in esecuzione (modalità remota), si connette al Gateway WS come nodo.
system.runviene eseguito nell’app macOS (contesto UI/TCC) tramite un socket Unix locale; prompt + output restano nell’app.
Approvazioni exec (system.run)
system.run è controllato da Exec approvals nell’app macOS (Settings → Exec approvals).
Sicurezza + richiesta + allowlist sono archiviati localmente sul Mac in:
- Le voci
allowlistsono pattern glob per i percorsi binari risolti. - Il testo del comando shell grezzo che contiene sintassi di controllo o espansione della shell (
&&,||,;,|,`,$,<,>,(,)) viene trattato come una mancata corrispondenza dell’allowlist e richiede approvazione esplicita (oppure l’inserimento nell’allowlist del binario della shell). - Scegliere “Always Allow” nel prompt aggiunge quel comando all’allowlist.
- Gli override dell’ambiente
system.runvengono filtrati (eliminaPATH,DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4) e poi uniti con l’ambiente dell’app. - Per i wrapper shell (
bash|sh|zsh ... -c/-lc), gli override dell’ambiente con ambito richiesta vengono ridotti a una piccola allowlist esplicita (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Per le decisioni always-allow in modalità allowlist, i wrapper di dispatch noti (
env,nice,nohup,stdbuf,timeout) mantengono i percorsi eseguibili interni invece dei percorsi dei wrapper. Se l’unwrapping non è sicuro, nessuna voce di allowlist viene mantenuta automaticamente.
Deep link
L’app registra lo schema URLopenclaw:// per azioni locali.
openclaw://agent
Attiva una richiesta Gateway agent.
OC_I18N_900004
Parametri della query:
message(obbligatorio)sessionKey(facoltativo)thinking(facoltativo)deliver/to/channel(facoltativo)timeoutSeconds(facoltativo)key(facoltativo, chiave per modalità non presidiata)
- Senza
key, l’app richiede conferma. - Senza
key, l’app applica un limite breve al messaggio per il prompt di conferma e ignoradeliver/to/channel. - Con una
keyvalida, l’esecuzione è non presidiata (pensata per automazioni personali).
Flusso di onboarding (tipico)
- Installa e avvia OpenClaw.app.
- Completa la checklist dei permessi (prompt TCC).
- Assicurati che la modalità Local sia attiva e che il Gateway sia in esecuzione.
- Installa la CLI se vuoi l’accesso dal terminale.
Posizionamento della directory di stato (macOS)
Evita di mettere la directory di stato di OpenClaw in iCloud o in altre cartelle sincronizzate nel cloud. I percorsi supportati dalla sincronizzazione possono aggiungere latenza e occasionalmente causare race di blocco file/sincronizzazione per sessioni e credenziali. Preferisci un percorso di stato locale non sincronizzato come: OC_I18N_900005 Seopenclaw doctor rileva lo stato sotto:
~/Library/Mobile Documents/com~apple~CloudDocs/...~/Library/CloudStorage/...
Flusso di build e sviluppo (nativo)
cd apps/macos && swift buildswift run OpenClaw(o Xcode)- Impacchetta l’app:
scripts/package-mac-app.sh
Debug della connettività gateway (CLI macOS)
Usa la CLI di debug per esercitare la stessa logica di handshake e rilevamento del Gateway WebSocket usata dall’app macOS, senza avviare l’app. OC_I18N_900006 Opzioni di connessione:--url <ws://host:port>: override della configurazione--mode <local|remote>: risoluzione dalla configurazione (predefinito: configurazione o local)--probe: forza un nuovo health probe--timeout <ms>: timeout della richiesta (predefinito:15000)--json: output strutturato per il confronto delle differenze
--include-local: include i gateway che verrebbero filtrati come “local”--timeout <ms>: finestra complessiva di rilevamento (predefinito:2000)--json: output strutturato per il confronto delle differenze
openclaw gateway discover --json per vedere se la
pipeline di rilevamento dell’app macOS (local. più il dominio wide-area configurato, con
fallback wide-area e Tailscale Serve) differisce da
quella della CLI Node basata su dns-sd.
Infrastruttura delle connessioni remote (tunnel SSH)
Quando l’app macOS è in esecuzione in modalità Remote, apre un tunnel SSH così i componenti UI locali possono comunicare con un Gateway remoto come se fosse in localhost.Tunnel di controllo (porta WebSocket Gateway)
- Scopo: health check, stato, Web Chat, configurazione e altre chiamate del piano di controllo.
- Porta locale: la porta Gateway (predefinita
18789), sempre stabile. - Porta remota: la stessa porta Gateway sull’host remoto.
- Comportamento: nessuna porta locale casuale; l’app riusa un tunnel esistente e sano oppure lo riavvia se necessario.
- Forma SSH:
ssh -N -L <local>:127.0.0.1:<remote>con opzioni BatchMode + ExitOnForwardFailure + keepalive. - Reporting IP: il tunnel SSH usa loopback, quindi il gateway vedrà l’IP del nodo
come
127.0.0.1. Usa il trasporto Direct (ws/wss) se vuoi che compaia il vero IP del client (vedi accesso remoto macOS).