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.
Per le distribuzioni OpenClaw iMessage, usa
imsg su un host macOS Messages con accesso effettuato. Se il tuo Gateway gira su Linux o Windows, punta channels.imessage.cliPath a un wrapper SSH che esegue imsg sul Mac.Il recupero dopo inattività del Gateway è facoltativo. Quando è abilitato (channels.imessage.catchup.enabled: true), il gateway riproduce i messaggi in ingresso arrivati in chat.db mentre era offline (crash, riavvio, sospensione del Mac) all’avvio successivo. Disabilitato per impostazione predefinita — vedi Recupero dopo inattività del gateway. Chiude openclaw#78649.imsg rpc e comunica tramite JSON-RPC su stdio (nessun daemon/porta separati). Le azioni avanzate richiedono imsg launch e una verifica riuscita dell’API privata.
Private API actions
Risposte, tapback, effetti, allegati e gestione dei gruppi.
Pairing
I DM iMessage usano per impostazione predefinita la modalità di associazione.
Remote Mac
Usa un wrapper SSH quando il Gateway non è in esecuzione sul Mac di Messages.
Configuration reference
Riferimento completo dei campi iMessage.
Configurazione rapida
- Local Mac (fast path)
- Remote Mac over SSH
Requisiti e autorizzazioni (macOS)
- Messages deve avere l’accesso effettuato sul Mac che esegue
imsg. - È richiesto Accesso completo al disco per il contesto di processo che esegue OpenClaw/
imsg(accesso al DB di Messages). - È richiesta l’autorizzazione Automazione per inviare messaggi tramite Messages.app.
- Per le azioni avanzate (reazione / modifica / annullamento invio / risposta in thread / effetti / operazioni sui gruppi), System Integrity Protection deve essere disabilitata — vedi Abilitazione dell’API privata imsg sotto. L’invio/ricezione di testo e contenuti multimediali di base funziona senza.
Abilitazione dell’API privata imsg
imsg viene distribuito in due modalità operative:
- Modalità base (predefinita, non sono necessarie modifiche a SIP): testo e contenuti multimediali in uscita tramite
send, monitoraggio/cronologia in ingresso, elenco chat. È ciò che ottieni subito con una nuova installazionebrew install steipete/tap/imsgpiù le autorizzazioni macOS standard indicate sopra. - Modalità API privata:
imsginietta una dylib helper inMessages.appper chiamare funzioni interne diIMCore. Questo sbloccareact,edit,unsend,reply(in thread),sendWithEffect,renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, oltre agli indicatori di digitazione e alle conferme di lettura.
imsg è esplicito sul requisito:
Funzionalità avanzate comeLa tecnica di iniezione dell’helper usa la dylib diread,typing,launch, invio avanzato basato su bridge, mutazione dei messaggi e gestione delle chat sono facoltative. Richiedono che SIP sia disabilitato e che una dylib helper venga iniettata inMessages.app.imsg launchrifiuta l’iniezione quando SIP è abilitato.
imsg per raggiungere le API private di Messages. Nel percorso iMessage di OpenClaw non c’è alcun server di terze parti o runtime BlueBubbles.
Configurazione
-
Installa (o aggiorna)
imsgsul Mac che esegue Messages.app:L’output diimsg status --jsonriportabridge_version,rpc_methodse iselectorsper metodo, così puoi vedere cosa supporta la build corrente prima di iniziare. -
Disabilita System Integrity Protection. Questo dipende dalla versione di macOS perché il requisito Apple sottostante dipende dal sistema operativo e dall’hardware:
- macOS 10.13–10.15 (Sierra–Catalina): disabilita Library Validation tramite Terminale, riavvia in Recovery Mode, esegui
csrutil disable, riavvia. - macOS 11+ (Big Sur e successivi), Intel: Recovery Mode (o Internet Recovery),
csrutil disable, riavvia. - macOS 11+, Apple Silicon: sequenza di avvio con il pulsante di accensione per entrare in Recovery; nelle versioni recenti di macOS tieni premuto il tasto Shift sinistro quando fai clic su Continua, poi
csrutil disable. Le configurazioni con macchine virtuali seguono un flusso separato — crea prima uno snapshot della VM. - macOS 26 / Tahoe: le policy di convalida delle librerie e i controlli di entitlement privati di
imagentsono stati ulteriormente irrigiditi;imsgpotrebbe richiedere una build aggiornata per restare compatibile. Se l’iniezione diimsg launchoselectorsspecifici iniziano a restituire false dopo un aggiornamento major di macOS, controlla le note di rilascio diimsgprima di presumere che il passaggio SIP sia riuscito.
imsg launch. - macOS 10.13–10.15 (Sierra–Catalina): disabilita Library Validation tramite Terminale, riavvia in Recovery Mode, esegui
-
Inietta l’helper. Con SIP disabilitato e accesso effettuato in Messages.app:
imsg launchrifiuta l’iniezione quando SIP è ancora abilitato, quindi funge anche da conferma che il passaggio 2 ha avuto effetto. -
Verifica il bridge da OpenClaw:
La voce iMessage dovrebbe riportare
works, eimsg status --json | jq '.selectors'dovrebbe mostrareretractMessagePart: truepiù gli eventuali selettori di modifica / digitazione / lettura esposti dalla tua build macOS. Il gating per metodo del plugin OpenClaw inactions.tspubblicizza solo azioni il cui selettore sottostante ètrue, quindi la superficie di azioni che vedi nell’elenco strumenti dell’agente riflette ciò che il bridge può effettivamente fare su questo host.
openclaw channels status --probe riporta il canale come works ma azioni specifiche generano “iMessage <action> requires the imsg private API bridge” al momento del dispatch, esegui di nuovo imsg launch — l’helper può disattivarsi (riavvio di Messages.app, aggiornamento del sistema operativo, ecc.) e lo stato memorizzato nella cache available: true continuerà a pubblicizzare le azioni finché la prossima verifica non lo aggiorna.
Quando non puoi disabilitare SIP
Se SIP disabilitato non è accettabile per il tuo modello di minaccia:imsgtorna alla modalità base — solo testo + contenuti multimediali + ricezione.- Il plugin OpenClaw continua a pubblicizzare l’invio di testo/media e il monitoraggio in ingresso; nasconde solo
react,edit,unsend,reply,sendWithEffecte le operazioni sui gruppi dalla superficie di azioni (secondo il gate di capacità per metodo). - Puoi eseguire un Mac non Apple Silicon separato (o un Mac dedicato al bot) con SIP disattivato per il carico iMessage, mantenendo SIP abilitato sui dispositivi principali. Vedi Utente macOS dedicato al bot (identità iMessage separata) sotto.
Controllo degli accessi e instradamento
- DM policy
- Group policy + mentions
- Sessioni e risposte deterministiche
channels.imessage.dmPolicy controlla i messaggi diretti:pairing(predefinito)allowlistopen(richiede cheallowFromincluda"*")disabled
channels.imessage.allowFrom.Le voci allowlist devono identificare i mittenti: handle o gruppi di accesso mittente statici (accessGroup:<name>). Usa channels.imessage.groupAllowFrom per destinazioni chat come chat_id:*, chat_guid:* o chat_identifier:*; usa channels.imessage.groups per chiavi di registro numeriche chat_id.Binding delle conversazioni ACP
Le chat iMessage legacy possono anche essere associate a sessioni ACP. Flusso rapido per l’operatore:- Esegui
/acp spawn codex --bind heredentro il DM o la chat di gruppo consentita. - I messaggi futuri nella stessa conversazione iMessage vengono instradati alla sessione ACP generata.
/newe/resetreimpostano la stessa sessione ACP associata sul posto./acp closechiude la sessione ACP e rimuove il binding.
bindings[] di primo livello con type: "acp" e match.channel: "imessage".
match.peer.id può usare:
- handle DM normalizzato come
+15555550123ouser@example.com chat_id:<id>(consigliato per binding di gruppo stabili)chat_guid:<guid>chat_identifier:<identifier>
Pattern di distribuzione
Utente macOS bot dedicato (identità iMessage separata)
Utente macOS bot dedicato (identità iMessage separata)
Usa un Apple ID e un utente macOS dedicati in modo che il traffico del bot sia isolato dal tuo profilo personale di Messaggi.Flusso tipico:
- Crea/accedi a un utente macOS dedicato.
- Accedi a Messaggi con l’Apple ID del bot in quell’utente.
- Installa
imsgin quell’utente. - Crea un wrapper SSH in modo che OpenClaw possa eseguire
imsgnel contesto di quell’utente. - Punta
channels.imessage.accounts.<id>.cliPathe.dbPatha quel profilo utente.
Mac remoto tramite Tailscale (esempio)
Mac remoto tramite Tailscale (esempio)
Topologia comune:Usa chiavi SSH in modo che sia SSH sia SCP siano non interattivi.
Assicurati prima che la chiave host sia considerata attendibile (per esempio
- il Gateway viene eseguito su Linux/VM
- iMessage +
imsgviene eseguito su un Mac nella tua tailnet - il wrapper
cliPathusa SSH per eseguireimsg remoteHostabilita il recupero degli allegati tramite SCP
ssh bot@mac-mini.tailnet-1234.ts.net) così known_hosts viene popolato.Pattern multi-account
Pattern multi-account
iMessage supporta la configurazione per account sotto
channels.imessage.accounts.Ogni account può sovrascrivere campi come cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, impostazioni della cronologia e allowlist delle radici degli allegati.Media, suddivisione in blocchi e target di consegna
Allegati e media
Allegati e media
- l’acquisizione degli allegati in ingresso è disattivata per impostazione predefinita: imposta
channels.imessage.includeAttachments: trueper inoltrare foto, memo vocali, video e altri allegati all’agente. Con questa opzione disabilitata, gli iMessage composti solo da allegati vengono scartati prima di raggiungere l’agente e potrebbero non produrre alcuna riga di logInbound message. - i percorsi degli allegati remoti possono essere recuperati tramite SCP quando
remoteHostè impostato - i percorsi degli allegati devono corrispondere alle radici consentite:
channels.imessage.attachmentRoots(locale)channels.imessage.remoteAttachmentRoots(modalità SCP remota)- pattern radice predefinito:
/Users/*/Library/Messages/Attachments
- SCP usa il controllo rigoroso della chiave host (
StrictHostKeyChecking=yes) - la dimensione dei media in uscita usa
channels.imessage.mediaMaxMb(predefinito 16 MB)
Suddivisione in blocchi in uscita
Suddivisione in blocchi in uscita
- limite dei blocchi di testo:
channels.imessage.textChunkLimit(predefinito 4000) - modalità di suddivisione in blocchi:
channels.imessage.chunkModelength(predefinita)newline(suddivisione che privilegia i paragrafi)
Formati di indirizzamento
Formati di indirizzamento
Target espliciti preferiti:
chat_id:123(consigliato per un instradamento stabile)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Azioni API private
Quandoimsg launch è in esecuzione e openclaw channels status --probe riporta privateApi.available: true, lo strumento di messaggistica può usare azioni native di iMessage oltre ai normali invii di testo.
Azioni disponibili
Azioni disponibili
- react: aggiunge/rimuove tapback di iMessage (
messageId,emoji,remove). I tapback supportati mappano a amore, mi piace, non mi piace, risata, enfasi e domanda. - reply: invia una risposta in thread a un messaggio esistente (
messageId,textomessage, piùchatGuid,chatId,chatIdentifieroto). - sendWithEffect: invia testo con un effetto iMessage (
textomessage,effectoeffectId). - edit: modifica un messaggio inviato nelle versioni macOS/API private supportate (
messageId,textonewText). - unsend: ritira un messaggio inviato nelle versioni macOS/API private supportate (
messageId). - upload-file: invia media/file (
buffercome base64 o unmedia/path/filePathidratato,filename,asVoicefacoltativo). Alias legacy:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: gestiscono le chat di gruppo quando il target corrente è una conversazione di gruppo.
ID messaggio
ID messaggio
Il contesto iMessage in ingresso include sia valori
MessageSid brevi sia GUID messaggio completi quando disponibili. Gli ID brevi hanno ambito nella cache in memoria delle risposte recenti e vengono verificati rispetto alla chat corrente prima dell’uso. Se un ID breve è scaduto o appartiene a un’altra chat, riprova con il MessageSidFull completo.Rilevamento delle capability
Rilevamento delle capability
OpenClaw nasconde le azioni API private solo quando lo stato del probe in cache indica che il bridge non è disponibile. Se lo stato è sconosciuto, le azioni restano visibili ed eseguono i probe in modo lazy, così la prima azione può riuscire dopo
imsg launch senza un aggiornamento manuale separato dello stato.Conferme di lettura e digitazione
Conferme di lettura e digitazione
Quando il bridge API private è attivo, le chat in ingresso accettate vengono contrassegnate come lette prima del dispatch e viene mostrato un fumetto di digitazione al mittente mentre l’agente genera. Disabilita il contrassegno di lettura con:Le build
imsg più vecchie, precedenti all’elenco delle capability per metodo, disattiveranno silenziosamente digitazione/lettura; OpenClaw registra un avviso una tantum per riavvio così la conferma mancante è attribuibile.Tapback in ingresso
Tapback in ingresso
OpenClaw sottoscrive i tapback di iMessage e instrada le reazioni accettate come eventi di sistema invece che come normale testo del messaggio, quindi un tapback dell’utente non attiva un normale ciclo di risposta.La modalità di notifica è controllata da
channels.imessage.reactionNotifications:"own"(predefinito): notifica solo quando gli utenti reagiscono a messaggi creati dal bot."all": notifica per tutti i tapback in ingresso da mittenti autorizzati."off": ignora i tapback in ingresso.
channels.imessage.accounts.<id>.reactionNotifications.Scritture di configurazione
iMessage consente per impostazione predefinita le scritture di configurazione avviate dal canale (per/config set|unset quando commands.config: true).
Disabilita:
Coalescing dei DM inviati in modo suddiviso (comando + URL in un’unica composizione)
Quando un utente digita insieme un comando e un URL, per esempioDump https://example.com/article, l’app Messaggi di Apple divide l’invio in due righe chat.db separate:
- Un messaggio di testo (
"Dump"). - Un fumetto di anteprima URL (
"https://...") con immagini di anteprima OG come allegati.
imsg.
channels.imessage.coalesceSameSenderDms fa sì che un DM unisca righe consecutive dello stesso mittente in un singolo turno dell’agente. Le chat di gruppo continuano a essere inviate per messaggio, così la struttura dei turni multiutente viene preservata.
- When to enable
- Enabling
- Trade-offs
Abilita quando:
- Distribuisci skills che si aspettano
command + payloadin un solo messaggio (dump, paste, save, queue, ecc.). - I tuoi utenti incollano URL, immagini o contenuti lunghi insieme ai comandi.
- Puoi accettare la latenza aggiunta al turno DM (vedi sotto).
- Ti serve la latenza minima dei comandi per trigger DM di una sola parola.
- Tutti i tuoi flussi sono comandi one-shot senza payload successivi.
Scenari e cosa vede l’agente
| L’utente compone | chat.db produce | Flag disattivo (predefinito) | Flag attivo + finestra di 2500 ms |
|---|---|---|---|
Dump https://example.com (un invio) | 2 righe a ~1 s di distanza | Due turni dell’agente: solo “Dump”, poi URL | Un turno: testo unito Dump https://example.com |
Save this 📎image.jpg caption (allegato + testo) | 2 righe | Due turni (allegato scartato nell’unione) | Un turno: testo + immagine preservati |
/status (comando autonomo) | 1 riga | Invio immediato | Attende fino alla finestra, poi invia |
| URL incollato da solo | 1 riga | Invio immediato | Invio immediato (una sola voce nel bucket) |
| Testo + URL inviati come due messaggi separati intenzionali, a minuti di distanza | 2 righe fuori finestra | Due turni | Due turni (la finestra scade tra i due) |
| Raffica rapida (>10 piccoli DM dentro la finestra) | N righe | N turni | Un turno, output limitato (prima + più recenti, limiti testo/allegati applicati) |
| Due persone scrivono in una chat di gruppo | N righe da M mittenti | M+ turni (uno per bucket mittente) | M+ turni: le chat di gruppo non vengono aggregate |
Recupero dopo inattività del gateway
Quando il gateway è offline (crash, riavvio, sleep del Mac, macchina spenta),imsg watch riprende dallo stato corrente di chat.db quando il gateway torna attivo: qualsiasi cosa arrivata durante l’intervallo, per impostazione predefinita, non viene mai vista. Il recupero riproduce quei messaggi al successivo avvio, così l’agente non perde silenziosamente il traffico in ingresso.
Il recupero è disabilitato per impostazione predefinita. Abilitalo per canale:
Come viene eseguito
Un passaggio per ogni avvio dimonitorIMessageProvider, sequenziato come imsg launch pronto → watch.subscribe → performIMessageCatchup → ciclo di invio live. Il recupero usa chats.list + messages.history per chat tramite lo stesso client JSON-RPC usato da imsg watch. Tutto ciò che arriva durante il passaggio di recupero attraversa normalmente l’invio live; la cache di deduplicazione in ingresso esistente assorbe qualsiasi sovrapposizione con le righe riprodotte.
Ogni riga riprodotta viene inoltrata attraverso il percorso di invio live (evaluateIMessageInbound + dispatchInboundMessage), quindi allowlist, criteri di gruppo, debouncer, cache echo e conferme di lettura si comportano in modo identico sui messaggi riprodotti e live.
Semantica di cursore e tentativi
Il recupero mantiene un cursore per account in<openclawStateDir>/imessage/catchup/<account>__<hash>.json (la directory di stato di OpenClaw è ~/.openclaw per impostazione predefinita, sovrascrivibile con OPENCLAW_STATE_DIR):
- Il cursore avanza a ogni invio riuscito e resta fermo quando l’invio di una riga genera un’eccezione: l’avvio successivo riprova la stessa riga dal cursore trattenuto.
- Dopo
maxFailureRetrieseccezioni consecutive sullo stessoguid, il recupero registra unwarne forza l’avanzamento del cursore oltre il messaggio bloccato, così gli avvii successivi possono progredire. - I guid già abbandonati vengono saltati a vista (senza tentativo di invio) nelle esecuzioni successive e conteggiati sotto
skippedGivenUpnel riepilogo dell’esecuzione.
Segnali visibili all’operatore
WARN ... capped to perRunLimit significa che un singolo avvio non ha svuotato tutto il backlog. Aumenta perRunLimit (massimo 500) se i tuoi intervalli superano regolarmente il passaggio predefinito da 50 righe.
Quando lasciarlo disattivato
- Il Gateway viene eseguito continuamente con riavvio automatico tramite watchdog e gli intervalli sono sempre < pochi secondi: il valore predefinito disattivato va bene.
- Il volume DM è basso e i messaggi persi non cambierebbero il comportamento dell’agente: la finestra iniziale
firstRunLookbackMinutespuò inviare contesto vecchio inatteso alla prima abilitazione.
firstRunLookbackMinutes (30 min per impostazione predefinita), non per l’intera finestra maxAgeMinutes: questo evita di riprodurre una lunga cronologia di messaggi precedenti all’abilitazione.
Risoluzione dei problemi
imsg not found or RPC unsupported
imsg not found or RPC unsupported
Convalida il binario e il supporto RPC:Se il probe segnala che RPC non è supportato, aggiorna
imsg. Se le azioni API private non sono disponibili, esegui imsg launch nella sessione dell’utente macOS con login effettuato e ripeti il probe. Se il Gateway non è in esecuzione su macOS, usa la configurazione Mac remoto via SSH sopra invece del percorso imsg locale predefinito.Gateway is not running on macOS
Gateway is not running on macOS
Il valore predefinito Poi esegui:
cliPath: "imsg" deve essere eseguito sul Mac con accesso a Messaggi. Su Linux o Windows, imposta channels.imessage.cliPath su uno script wrapper che si connette via SSH a quel Mac ed esegue imsg "$@".DMs are ignored
DMs are ignored
Controlla:
channels.imessage.dmPolicychannels.imessage.allowFrom- approvazioni di pairing (
openclaw pairing list imessage)
Group messages are ignored
Group messages are ignored
Controlla:
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- comportamento allowlist di
channels.imessage.groups - configurazione del pattern di menzione (
agents.list[].groupChat.mentionPatterns)
Remote attachments fail
Remote attachments fail
Controlla:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- autenticazione con chiave SSH/SCP dall’host gateway
- la chiave host esiste in
~/.ssh/known_hostssull’host gateway - leggibilità del percorso remoto sul Mac che esegue Messaggi
macOS permission prompts were missed
macOS permission prompts were missed
Riesegui in un terminale GUI interattivo nello stesso contesto utente/sessione e approva i prompt:Conferma che Accesso completo al disco + Automazione siano concessi per il contesto del processo che esegue OpenClaw/
imsg.Riferimenti alla configurazione
Correlati
- Panoramica dei canali — tutti i canali supportati
- Rimozione di BlueBubbles e percorso iMessage con imsg — annuncio e riepilogo della migrazione
- Provenienza da BlueBubbles — tabella di traduzione della configurazione e passaggio guidato
- Pairing — autenticazione DM e flusso di pairing
- Gruppi — comportamento delle chat di gruppo e gating delle menzioni
- Routing dei canali — routing della sessione per i messaggi
- Sicurezza — modello di accesso e hardening