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.
Untuk deployment OpenClaw iMessage, gunakan
imsg pada host macOS Messages yang sudah masuk. Jika Gateway Anda berjalan di Linux atau Windows, arahkan channels.imessage.cliPath ke wrapper SSH yang menjalankan imsg di Mac.Catchup saat Gateway tidak aktif bersifat opt-in. Saat diaktifkan (channels.imessage.catchup.enabled: true), gateway memutar ulang pesan masuk yang mendarat di chat.db saat offline (crash, restart, Mac sleep) pada startup berikutnya. Dinonaktifkan secara default — lihat Menyusul setelah gateway tidak aktif. Menutup openclaw#78649.imsg rpc dan berkomunikasi melalui JSON-RPC pada stdio (tanpa daemon/port terpisah). Tindakan lanjutan memerlukan imsg launch dan probe API privat yang berhasil.
Tindakan API privat
Balasan, tapback, efek, lampiran, dan manajemen grup.
Pairing
DM iMessage default ke mode pairing.
Mac jarak jauh
Gunakan wrapper SSH saat Gateway tidak berjalan di Mac Messages.
Referensi konfigurasi
Referensi lengkap field iMessage.
Penyiapan cepat
- Mac lokal (jalur cepat)
- Mac jarak jauh melalui SSH
Persyaratan dan izin (macOS)
- Messages harus sudah masuk di Mac yang menjalankan
imsg. - Full Disk Access diperlukan untuk konteks proses yang menjalankan OpenClaw/
imsg(akses DB Messages). - Izin Automation diperlukan untuk mengirim pesan melalui Messages.app.
- Untuk tindakan lanjutan (react / edit / unsend / threaded reply / effects / group ops), System Integrity Protection harus dinonaktifkan — lihat Mengaktifkan API privat imsg di bawah. Kirim/terima teks dan media dasar berfungsi tanpanya.
Mengaktifkan API privat imsg
imsg hadir dalam dua mode operasional:
- Mode dasar (default, tidak perlu perubahan SIP): teks dan media keluar melalui
send, watch/history masuk, daftar chat. Ini yang Anda dapatkan langsung daribrew install steipete/tap/imsgbaru ditambah izin macOS standar di atas. - Mode API privat:
imsgmenyuntikkan dylib helper keMessages.appuntuk memanggil fungsi internalIMCore. Ini yang membukareact,edit,unsend,reply(berutas),sendWithEffect,renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, plus indikator mengetik dan tanda dibaca.
imsg menyatakan persyaratan tersebut dengan jelas:
Fitur lanjutan sepertiTeknik injeksi helper menggunakan dylib milikread,typing,launch, rich send yang didukung bridge, mutasi pesan, dan manajemen chat bersifat opt-in. Fitur tersebut memerlukan SIP dinonaktifkan dan dylib helper disuntikkan keMessages.app.imsg launchmenolak melakukan injeksi saat SIP aktif.
imsg sendiri untuk menjangkau API privat Messages. Tidak ada server pihak ketiga atau runtime BlueBubbles pada jalur OpenClaw iMessage.
Penyiapan
-
Instal (atau tingkatkan)
imsgpada Mac yang menjalankan Messages.app:Outputimsg status --jsonmelaporkanbridge_version,rpc_methods, danselectorsper metode sehingga Anda dapat melihat apa yang didukung build saat ini sebelum mulai. -
Nonaktifkan System Integrity Protection. Ini spesifik versi macOS karena persyaratan Apple yang mendasarinya bergantung pada OS dan perangkat keras:
- macOS 10.13–10.15 (Sierra–Catalina): nonaktifkan Library Validation melalui Terminal, reboot ke Recovery Mode, jalankan
csrutil disable, restart. - macOS 11+ (Big Sur dan lebih baru), Intel: Recovery Mode (atau Internet Recovery),
csrutil disable, restart. - macOS 11+, Apple Silicon: urutan startup tombol daya untuk masuk Recovery; pada versi macOS terbaru tahan tombol Left Shift saat Anda mengeklik Continue, lalu
csrutil disable. Penyiapan mesin virtual mengikuti alur terpisah — ambil snapshot VM terlebih dahulu. - macOS 26 / Tahoe: kebijakan library-validation dan pemeriksaan private-entitlement
imagentmakin diperketat;imsgmungkin memerlukan build yang diperbarui untuk mengikutinya. Jika injeksiimsg launchatauselectorstertentu mulai mengembalikan false setelah upgrade mayor macOS, periksa catatan rilisimsgsebelum mengasumsikan langkah SIP berhasil.
imsg launch. - macOS 10.13–10.15 (Sierra–Catalina): nonaktifkan Library Validation melalui Terminal, reboot ke Recovery Mode, jalankan
-
Suntikkan helper. Dengan SIP dinonaktifkan dan Messages.app sudah masuk:
imsg launchmenolak melakukan injeksi saat SIP masih aktif, jadi ini juga berfungsi sebagai konfirmasi bahwa langkah 2 diterapkan. -
Verifikasi bridge dari OpenClaw:
Entri iMessage harus melaporkan
works, danimsg status --json | jq '.selectors'harus menampilkanretractMessagePart: trueplus selector edit / typing / read apa pun yang diekspos build macOS Anda. Gating per metode Plugin OpenClaw diactions.tshanya mengiklankan tindakan yang selector dasarnya bernilaitrue, sehingga permukaan tindakan yang Anda lihat di daftar alat agent mencerminkan apa yang benar-benar dapat dilakukan bridge pada host ini.
openclaw channels status --probe melaporkan channel sebagai works tetapi tindakan tertentu melempar “iMessage <action> requires the imsg private API bridge” pada waktu dispatch, jalankan imsg launch lagi — helper dapat terlepas (restart Messages.app, pembaruan OS, dll.) dan status available: true yang di-cache akan tetap mengiklankan tindakan sampai probe berikutnya menyegarkan.
Saat Anda tidak dapat menonaktifkan SIP
Jika SIP yang dinonaktifkan tidak dapat diterima untuk model ancaman Anda:imsgfallback ke mode dasar — hanya teks + media + terima.- Plugin OpenClaw tetap mengiklankan kirim teks/media dan pemantauan masuk; Plugin hanya menyembunyikan
react,edit,unsend,reply,sendWithEffect, dan operasi grup dari permukaan tindakan (sesuai gate kemampuan per metode). - Anda dapat menjalankan Mac non-Apple-Silicon terpisah (atau Mac bot khusus) dengan SIP mati untuk beban kerja iMessage, sambil tetap mengaktifkan SIP pada perangkat utama Anda. Lihat Pengguna macOS bot khusus (identitas iMessage terpisah) di bawah.
Kontrol akses dan perutean
- Kebijakan DM
- Kebijakan grup + mention
- Sesi dan balasan deterministik
channels.imessage.dmPolicy mengontrol pesan langsung:pairing(default)allowlistopen(memerlukanallowFrommenyertakan"*")disabled
channels.imessage.allowFrom.Entri allowlist harus mengidentifikasi pengirim: handle atau grup akses pengirim statis (accessGroup:<name>). Gunakan channels.imessage.groupAllowFrom untuk target chat seperti chat_id:*, chat_guid:*, atau chat_identifier:*; gunakan channels.imessage.groups untuk kunci registry chat_id numerik.Binding percakapan ACP
Chat iMessage legacy juga dapat diikat ke sesi ACP. Alur operator cepat:- Jalankan
/acp spawn codex --bind heredi dalam DM atau chat grup yang diizinkan. - Pesan berikutnya dalam percakapan iMessage yang sama dirutekan ke sesi ACP yang dibuat.
/newdan/resetmereset sesi ACP terikat yang sama di tempat./acp closemenutup sesi ACP dan menghapus binding.
bindings[] tingkat atas dengan type: "acp" dan match.channel: "imessage".
match.peer.id dapat menggunakan:
- handle DM ternormalisasi seperti
+15555550123atauuser@example.com chat_id:<id>(direkomendasikan untuk binding grup yang stabil)chat_guid:<guid>chat_identifier:<identifier>
Pola deployment
Pengguna macOS bot khusus (identitas iMessage terpisah)
Pengguna macOS bot khusus (identitas iMessage terpisah)
Gunakan Apple ID dan pengguna macOS khusus agar traffic bot terisolasi dari profil Messages pribadi Anda.Alur umum:
- Buat/masuk sebagai pengguna macOS khusus.
- Masuk ke Messages dengan Apple ID bot pada pengguna tersebut.
- Instal
imsgpada pengguna tersebut. - Buat wrapper SSH agar OpenClaw dapat menjalankan
imsgdalam konteks pengguna tersebut. - Arahkan
channels.imessage.accounts.<id>.cliPathdan.dbPathke profil pengguna tersebut.
Mac jarak jauh melalui Tailscale (contoh)
Mac jarak jauh melalui Tailscale (contoh)
Topologi umum:Gunakan kunci SSH agar SSH dan SCP sama-sama non-interaktif.
Pastikan kunci host dipercaya terlebih dahulu (misalnya
- gateway berjalan di Linux/VM
- iMessage +
imsgberjalan di Mac dalam tailnet Anda - wrapper
cliPathmenggunakan SSH untuk menjalankanimsg remoteHostmengaktifkan pengambilan lampiran melalui SCP
ssh bot@mac-mini.tailnet-1234.ts.net) agar known_hosts terisi.Pola multi-akun
Pola multi-akun
iMessage mendukung konfigurasi per akun di bawah
channels.imessage.accounts.Setiap akun dapat menimpa field seperti cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, pengaturan riwayat, dan allowlist root lampiran.Media, chunking, dan target pengiriman
Lampiran dan media
Lampiran dan media
- ingest lampiran masuk nonaktif secara default — setel
channels.imessage.includeAttachments: trueuntuk meneruskan foto, memo suara, video, dan lampiran lain ke agen. Jika dinonaktifkan, iMessage yang hanya berisi lampiran digugurkan sebelum mencapai agen dan mungkin tidak menghasilkan baris logInbound messagesama sekali. - path lampiran jarak jauh dapat diambil melalui SCP ketika
remoteHostdisetel - path lampiran harus cocok dengan root yang diizinkan:
channels.imessage.attachmentRoots(lokal)channels.imessage.remoteAttachmentRoots(mode SCP jarak jauh)- pola root default:
/Users/*/Library/Messages/Attachments
- SCP menggunakan pemeriksaan kunci host ketat (
StrictHostKeyChecking=yes) - ukuran media keluar menggunakan
channels.imessage.mediaMaxMb(default 16 MB)
Chunking keluar
Chunking keluar
- batas chunk teks:
channels.imessage.textChunkLimit(default 4000) - mode chunk:
channels.imessage.chunkModelength(default)newline(pemisahan dengan paragraf lebih dulu)
Format pengalamatan
Format pengalamatan
Target eksplisit yang disarankan:
chat_id:123(direkomendasikan untuk routing yang stabil)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Aksi API privat
Ketikaimsg launch berjalan dan openclaw channels status --probe melaporkan privateApi.available: true, alat pesan dapat menggunakan aksi native iMessage selain pengiriman teks normal.
Aksi yang tersedia
Aksi yang tersedia
- react: Tambah/hapus tapback iMessage (
messageId,emoji,remove). Tapback yang didukung dipetakan ke love, like, dislike, laugh, emphasize, dan question. - reply: Kirim balasan ber-thread ke pesan yang ada (
messageId,textataumessage, ditambahchatGuid,chatId,chatIdentifier, atauto). - sendWithEffect: Kirim teks dengan efek iMessage (
textataumessage,effectataueffectId). - edit: Edit pesan terkirim pada versi macOS/API privat yang didukung (
messageId,textataunewText). - unsend: Tarik kembali pesan terkirim pada versi macOS/API privat yang didukung (
messageId). - upload-file: Kirim media/file (
buffersebagai base64 ataumedia/path/filePathyang sudah dihidrasi,filename,asVoiceopsional). Alias legacy:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Kelola chat grup ketika target saat ini adalah percakapan grup.
ID pesan
ID pesan
Konteks iMessage masuk menyertakan nilai
MessageSid pendek dan GUID pesan lengkap jika tersedia. ID pendek memiliki cakupan pada cache balasan in-memory terbaru dan diperiksa terhadap chat saat ini sebelum digunakan. Jika ID pendek telah kedaluwarsa atau milik chat lain, coba lagi dengan MessageSidFull lengkap.Deteksi kapabilitas
Deteksi kapabilitas
OpenClaw menyembunyikan aksi API privat hanya ketika status probe yang di-cache mengatakan bridge tidak tersedia. Jika statusnya tidak diketahui, aksi tetap terlihat dan dispatch menjalankan probe secara lazy sehingga aksi pertama dapat berhasil setelah
imsg launch tanpa refresh status manual terpisah.Tanda dibaca dan mengetik
Tanda dibaca dan mengetik
Ketika bridge API privat aktif, chat masuk yang diterima ditandai sudah dibaca sebelum dispatch dan gelembung mengetik ditampilkan kepada pengirim saat agen menghasilkan respons. Nonaktifkan penandaan dibaca dengan:Build
imsg lama yang dibuat sebelum daftar kapabilitas per metode akan menonaktifkan typing/read secara diam-diam; OpenClaw mencatat peringatan satu kali per restart agar tanda terima yang hilang dapat diatribusikan.Tapback masuk
Tapback masuk
OpenClaw berlangganan tapback iMessage dan merutekan reaksi yang diterima sebagai peristiwa sistem, bukan teks pesan normal, sehingga tapback pengguna tidak memicu loop balasan biasa.Mode notifikasi dikendalikan oleh
channels.imessage.reactionNotifications:"own"(default): beri tahu hanya ketika pengguna bereaksi terhadap pesan yang ditulis bot."all": beri tahu untuk semua tapback masuk dari pengirim resmi."off": abaikan tapback masuk.
channels.imessage.accounts.<id>.reactionNotifications.Penulisan konfigurasi
iMessage mengizinkan penulisan konfigurasi yang diprakarsai channel secara default (untuk/config set|unset ketika commands.config: true).
Nonaktifkan:
Menggabungkan DM split-send (perintah + URL dalam satu komposisi)
Ketika pengguna mengetik perintah dan URL bersamaan — misalnyaDump https://example.com/article — aplikasi Messages Apple membagi pengiriman menjadi dua baris chat.db terpisah:
- Pesan teks (
"Dump"). - Balon pratinjau URL (
"https://...") dengan gambar pratinjau OG sebagai lampiran.
imsg.
channels.imessage.coalesceSameSenderDms mengikutsertakan DM untuk menggabungkan baris berurutan dari pengirim yang sama menjadi satu giliran agen. Obrolan grup tetap dikirim per pesan agar struktur giliran multi-pengguna tetap dipertahankan.
- Kapan mengaktifkan
- Mengaktifkan
- Trade-off
Aktifkan ketika:
- Anda mengirim Skills yang mengharapkan
command + payloaddalam satu pesan (dump, paste, save, queue, dll.). - Pengguna Anda menempelkan URL, gambar, atau konten panjang bersama perintah.
- Anda dapat menerima latensi tambahan pada giliran DM (lihat di bawah).
- Anda membutuhkan latensi perintah minimum untuk pemicu DM satu kata.
- Semua alur Anda adalah perintah sekali jalan tanpa tindak lanjut payload.
Skenario dan apa yang dilihat agen
| Pengguna menulis | chat.db menghasilkan | Flag nonaktif (default) | Flag aktif + jendela 2500 md |
|---|---|---|---|
Dump https://example.com (satu pengiriman) | 2 baris selisih ~1 dtk | Dua giliran agen: “Dump” saja, lalu URL | Satu giliran: teks gabungan Dump https://example.com |
Save this 📎image.jpg caption (lampiran + teks) | 2 baris | Dua giliran (lampiran hilang saat penggabungan) | Satu giliran: teks + gambar dipertahankan |
/status (perintah mandiri) | 1 baris | Pengiriman seketika | Tunggu hingga jendela, lalu kirim |
| URL ditempelkan sendiri | 1 baris | Pengiriman seketika | Pengiriman seketika (hanya satu entri dalam bucket) |
| Teks + URL dikirim sebagai dua pesan terpisah sengaja, terpaut menit | 2 baris di luar jendela | Dua giliran | Dua giliran (jendela kedaluwarsa di antaranya) |
| Banjir cepat (>10 DM kecil dalam jendela) | N baris | N giliran | Satu giliran, output dibatasi (pertama + terbaru, batas teks/lampiran diterapkan) |
| Dua orang mengetik dalam obrolan grup | N baris dari M pengirim | M+ giliran (satu per bucket pengirim) | M+ giliran — obrolan grup tidak digabungkan |
Mengejar ketertinggalan setelah Gateway tidak aktif
Ketika Gateway offline (crash, restart, Mac sleep, mesin mati),imsg watch melanjutkan dari status chat.db saat ini setelah Gateway kembali aktif — apa pun yang tiba selama jeda, secara default, tidak pernah terlihat. Catchup memutar ulang pesan-pesan tersebut pada startup berikutnya sehingga agen tidak diam-diam melewatkan lalu lintas masuk.
Catchup dinonaktifkan secara default. Aktifkan per kanal:
Cara kerjanya
Satu lintasan per startupmonitorIMessageProvider, diurutkan sebagai imsg launch siap → watch.subscribe → performIMessageCatchup → loop pengiriman langsung. Catchup sendiri menggunakan chats.list + messages.history per obrolan terhadap klien JSON-RPC yang sama dengan yang digunakan oleh imsg watch. Apa pun yang tiba selama lintasan catchup mengalir melalui pengiriman langsung secara normal; cache dedupe masuk yang ada menyerap tumpang tindih apa pun dengan baris yang diputar ulang.
Setiap baris yang diputar ulang dimasukkan melalui jalur pengiriman langsung (evaluateIMessageInbound + dispatchInboundMessage), sehingga daftar izin, kebijakan grup, debouncer, cache echo, dan tanda dibaca berperilaku identik pada pesan yang diputar ulang dan pesan langsung.
Semantik kursor dan percobaan ulang
Catchup menyimpan kursor per akun di<openclawStateDir>/imessage/catchup/<account>__<hash>.json (direktori status OpenClaw default ke ~/.openclaw, dapat ditimpa dengan OPENCLAW_STATE_DIR):
- Kursor maju pada setiap pengiriman yang berhasil dan ditahan ketika pengiriman sebuah baris melempar error — startup berikutnya mencoba ulang baris yang sama dari kursor yang ditahan.
- Setelah
maxFailureRetrieslemparan berturut-turut terhadapguidyang sama, catchup mencatatwarndan memaksa kursor maju melewati pesan yang macet sehingga startup berikutnya dapat terus berjalan. - GUID yang sudah diserahkan dilewati saat terlihat (tanpa percobaan pengiriman) pada run berikutnya dan dihitung di bawah
skippedGivenUpdalam ringkasan run.
Sinyal yang terlihat operator
WARN ... capped to perRunLimit berarti satu startup tidak mengosongkan seluruh backlog. Naikkan perRunLimit (maks 500) jika jeda Anda secara rutin melebihi lintasan default 50 baris.
Kapan membiarkannya nonaktif
- Gateway berjalan terus-menerus dengan restart otomatis watchdog dan jeda selalu < beberapa detik — default nonaktif sudah cukup.
- Volume DM rendah dan pesan yang terlewat tidak akan mengubah perilaku agen — jendela awal
firstRunLookbackMinutesdapat mengirim konteks lama yang mengejutkan saat pertama kali diaktifkan.
firstRunLookbackMinutes (default 30 mnt), bukan seluruh jendela maxAgeMinutes — ini menghindari pemutaran ulang riwayat panjang pesan sebelum fitur diaktifkan.
Pemecahan masalah
imsg tidak ditemukan atau RPC tidak didukung
imsg tidak ditemukan atau RPC tidak didukung
Validasi biner dan dukungan RPC:Jika probe melaporkan RPC tidak didukung, perbarui
imsg. Jika tindakan API privat tidak tersedia, jalankan imsg launch dalam sesi pengguna macOS yang sedang login dan probe lagi. Jika Gateway tidak berjalan di macOS, gunakan penyiapan Remote Mac melalui SSH di atas, bukan jalur imsg lokal default.Gateway tidak berjalan di macOS
Gateway tidak berjalan di macOS
cliPath: "imsg" default harus berjalan di Mac yang masuk ke Messages. Di Linux atau Windows, tetapkan channels.imessage.cliPath ke skrip wrapper yang melakukan SSH ke Mac tersebut dan menjalankan imsg "$@".DM diabaikan
DM diabaikan
Periksa:
channels.imessage.dmPolicychannels.imessage.allowFrom- persetujuan pairing (
openclaw pairing list imessage)
Pesan grup diabaikan
Pesan grup diabaikan
Periksa:
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- perilaku daftar izin
channels.imessage.groups - konfigurasi pola mention (
agents.list[].groupChat.mentionPatterns)
Lampiran jarak jauh gagal
Lampiran jarak jauh gagal
Periksa:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- auth kunci SSH/SCP dari host Gateway
- kunci host ada di
~/.ssh/known_hostspada host Gateway - keterbacaan path jarak jauh di Mac yang menjalankan Messages
Prompt izin macOS terlewat
Prompt izin macOS terlewat
Jalankan ulang di terminal GUI interaktif dalam konteks pengguna/sesi yang sama dan setujui prompt:Pastikan Full Disk Access + Automation diberikan untuk konteks proses yang menjalankan OpenClaw/
imsg.Penunjuk referensi konfigurasi
Terkait
- Ikhtisar Kanal — semua kanal yang didukung
- Penghapusan BlueBubbles dan jalur imsg iMessage — pengumuman dan ringkasan migrasi
- Beralih dari BlueBubbles — tabel terjemahan konfigurasi dan cutover langkah demi langkah
- Pairing — autentikasi DM dan alur pairing
- Grup — perilaku obrolan grup dan gating mention
- Perutean Kanal — perutean sesi untuk pesan
- Keamanan — model akses dan hardening