Mainstream messaging
Beralih dari BlueBubbles
Dukungan BlueBubbles telah dihapus. OpenClaw mendukung iMessage hanya melalui plugin bawaan imessage, yang menjalankan steipete/imsg melalui JSON-RPC dan menjangkau permukaan API privat yang sama seperti yang dimiliki BlueBubbles (react, edit, unsend, reply, sendWithEffect, jajak pendapat native, pengelolaan grup, lampiran). Satu biner CLI menggantikan server BlueBubbles + aplikasi klien + rangkaian webhook: tanpa endpoint REST, tanpa autentikasi webhook.
Panduan ini memigrasikan konfigurasi lama channels.bluebubbles ke channels.imessage. Tidak ada jalur migrasi lain yang didukung. Pada OpenClaw saat ini, blok channels.bluebubbles yang tersisa tidak aktif—tidak ada runtime yang membacanya.
Daftar periksa migrasi
Jalur aman tersingkat jika Anda sudah memahami konfigurasi BlueBubbles lama Anda:
- Verifikasi
imsgsecara langsung di Mac yang menjalankan Messages.app (imsg chats,imsg history,imsg send,imsg rpc --help). - Salin kunci perilaku dari
channels.bluebubbleskechannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDms, danactions. - Hapus kunci transport yang sudah tidak ada:
serverUrl,password, URL webhook, dan penyiapan server BlueBubbles. - Jika Gateway tidak berjalan di Mac tempat Messages berada, atur
channels.imessage.cliPathke pembungkus SSH dan aturremoteHostuntuk mengambil lampiran jarak jauh. - Aktifkan
channels.imessage, mulai ulang Gateway, lalu jalankanopenclaw channels status --probe --channel imessage. - Uji satu pesan langsung, satu grup yang diizinkan, lampiran jika diaktifkan, dan setiap tindakan API privat yang Anda harapkan digunakan oleh agen.
- Hapus server BlueBubbles dan konfigurasi lama
channels.bluebubblessetelah jalur iMessage terverifikasi.
Fungsi imsg
imsg adalah CLI macOS lokal untuk Messages. OpenClaw memulai imsg rpc sebagai proses anak dan berkomunikasi menggunakan JSON-RPC melalui stdin/stdout. Tidak ada server HTTP, URL webhook, daemon latar belakang, agen peluncuran, atau port yang perlu diekspos.
- Pembacaan berasal dari
~/Library/Messages/chat.dbmenggunakan handel SQLite hanya-baca. - Pesan langsung yang masuk berasal dari
imsg watch/watch.subscribe, yang mengikuti peristiwa sistem berkaschat.dbdengan polling sebagai cadangan. - Pengiriman menggunakan otomatisasi Messages.app untuk mengirim teks dan berkas biasa.
- Tindakan lanjutan menggunakan
imsg launchuntuk menyuntikkan pembantuimsgke Messages.app. Inilah yang mengaktifkan tanda terima baca, indikator sedang mengetik, pengiriman kaya, pengeditan, pembatalan pengiriman, balasan berutas, tapback, jajak pendapat, dan pengelolaan grup. - Versi Linux dapat memeriksa salinan
chat.db, tetapi tidak dapat mengirim, memantau basis data Mac secara langsung, atau mengendalikan Messages.app. Untuk iMessage OpenClaw, jalankanimsgdi Mac yang telah masuk atau melalui pembungkus SSH ke Mac tersebut.
Sebelum memulai
-
Instal
imsgdi Mac yang menjalankan Messages.app:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg chats --limit 3Untuk penyiapan lokal biasa, penyiapan OpenClaw dapat menawarkan instalasi atau pembaruan Homebrew untuk
imsgyang dikonfirmasi pengguna di Mac Messages yang telah masuk. Penyiapan manual dan topologi pembungkus SSH tetap dikelola oleh operator: ulangi pembaruan Homebrew dalam konteks pengguna lokal atau jarak jauh yang sama dengan yang akan menjalankanimsg. Jikaimsg chatsgagal denganunable to open database file, keluaran kosong, atauauthorization denied, berikan Full Disk Access kepada terminal, editor, proses Node, layanan Gateway, atau proses induk SSH yang meluncurkanimsg, lalu buka kembali proses induk tersebut. -
Verifikasi permukaan baca, pemantauan, pengiriman, dan RPC sebelum mengubah konfigurasi OpenClaw:
bash imsg chats --limit 10 --json | jq -simsg history --chat-id 42 --limit 10 --attachments --json | jq -simsg watch --chat-id 42 --reactions --jsonimsg send --chat-id 42 --text "OpenClaw imsg test"imsg rpc --helpGanti
42dengan id obrolan sebenarnya dariimsg chats. Pengiriman memerlukan izin Automation untuk Messages.app. Jika OpenClaw akan berjalan melalui SSH, jalankan perintah ini melalui pembungkus SSH atau konteks pengguna yang sama dengan yang akan digunakan OpenClaw. Jika pembacaan berfungsi tetapi pengiriman gagal dengan AppleEvents-1743, periksa apakah Automation diterapkan pada/usr/libexec/sshd-keygen-wrapper; lihat Pengiriman melalui pembungkus SSH gagal dengan AppleEvents -1743. -
Aktifkan jembatan API privat. Ini sangat dianjurkan untuk iMessage OpenClaw karena balasan, tapback, efek, jajak pendapat, balasan lampiran, dan tindakan grup bergantung padanya:
bash imsg launchimsg status --jsonimsg launchmengharuskan SIP dinonaktifkan (dan pada macOS modern, validasi pustaka dilonggarkan—lihat Mengaktifkan API privat imsg). Pengiriman dasar, riwayat, dan pemantauan berfungsi tanpaimsg launch; seluruh permukaan tindakan iMessage OpenClaw tidak. -
Setelah Anda mengaktifkan
channels.imessagedan memulai Gateway, verifikasi jembatan melalui OpenClaw:bash openclaw channels status --probeAkun iMessage seharusnya melaporkan
works; dengan--json, payload pemeriksaan mencakupprivateApi.available: true. Jika melaporkanfalse, perbaiki itu terlebih dahulu—lihat Deteksi kemampuan. Pemeriksaan memerlukan Gateway yang dapat dijangkau (jika tidak, CLI akan kembali menampilkan keluaran berbasis konfigurasi saja) dan hanya memeriksa akun terkonfigurasi yang diaktifkan. -
Buat snapshot konfigurasi Anda:
bash cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
Penerjemahan konfigurasi
iMessage dan BlueBubbles berbagi sebagian besar kunci perilaku tingkat kanal. Yang berubah adalah transport (server REST dibandingkan CLI lokal) dan format kunci registri grup.
| BlueBubbles | iMessage bawaan | Catatan |
|---|---|---|
channels.bluebubbles.enabled |
channels.imessage.enabled |
Semantik sama (nilai bawaan true setelah blok tersedia). |
channels.bluebubbles.serverUrl |
(dihapus) | Tidak ada server REST — Plugin menjalankan imsg rpc melalui stdio. |
channels.bluebubbles.password |
(dihapus) | Autentikasi webhook tidak diperlukan. |
| (implisit) | channels.imessage.cliPath |
Jalur ke imsg (nilai bawaan imsg); gunakan skrip pembungkus untuk SSH. |
| (implisit) | channels.imessage.dbPath |
Penggantian chat.db Messages.app opsional; terdeteksi otomatis jika dihilangkan. |
| (implisit) | channels.imessage.remoteHost |
host atau user@host — hanya diperlukan ketika cliPath merupakan pembungkus SSH dan Anda ingin mengambil lampiran melalui SCP. |
channels.bluebubbles.dmPolicy |
channels.imessage.dmPolicy |
Nilai sama (pairing / allowlist / open / disabled); nilai bawaan pairing. |
channels.bluebubbles.allowFrom |
channels.imessage.allowFrom |
Format alamat sama (+15555550123, user@example.com). Persetujuan penyimpanan pemasangan tidak ditransfer — lihat di bawah. |
channels.bluebubbles.groupPolicy |
channels.imessage.groupPolicy |
Nilai sama (allowlist / open / disabled); nilai bawaan allowlist. |
channels.bluebubbles.groupAllowFrom |
channels.imessage.groupAllowFrom |
Sama. Jika tidak ditetapkan, iMessage kembali menggunakan allowFrom; groupAllowFrom: [] yang secara eksplisit kosong memblokir semua grup di bawah groupPolicy: "allowlist". |
channels.bluebubbles.groups |
channels.imessage.groups |
Salin entri wildcard "*" persis seperti aslinya; ubah kunci entri per grup berdasarkan chat_id numerik iMessage — lihat "Jebakan registri grup". requireMention, tools, toolsBySender, systemPrompt tetap berlaku. |
channels.bluebubbles.sendReadReceipts |
channels.imessage.sendReadReceipts |
Nilai bawaan true. Dengan Plugin bawaan, ini hanya dijalankan saat pemeriksaan API privat aktif. |
channels.bluebubbles.includeAttachments |
channels.imessage.includeAttachments |
Bentuk sama, sama-sama dinonaktifkan secara bawaan. Jika lampiran diteruskan di BlueBubbles, tetapkan ini secara eksplisit — foto/media masuk dibuang secara diam-diam (tanpa baris log Inbound message) sampai Anda melakukannya. |
channels.bluebubbles.attachmentRoots |
channels.imessage.attachmentRoots |
Direktori akar lokal; aturan wildcard sama. |
| (Tidak berlaku) | channels.imessage.remoteAttachmentRoots |
Hanya digunakan ketika remoteHost ditetapkan untuk pengambilan melalui SCP. |
channels.bluebubbles.mediaMaxMb |
channels.imessage.mediaMaxMb |
Nilai bawaan 16 MB di iMessage (nilai bawaan BlueBubbles adalah 8 MB). Tetapkan secara eksplisit untuk mempertahankan batas yang lebih rendah. |
channels.bluebubbles.textChunkLimit |
channels.imessage.textChunkLimit |
Nilai bawaan 4000 pada keduanya. |
channels.bluebubbles.coalesceSameSenderDms |
channels.imessage.coalesceSameSenderDms |
Keikutsertaan opsional yang sama. Khusus DM — grup tetap mengirimkan per pesan. Memperlebar debounce masuk bawaan menjadi 7000 md kecuali messages.inbound.byChannel.imessage atau messages.inbound.debounceMs global ditetapkan. Lihat Penggabungan DM kirim-terpisah. |
channels.bluebubbles.enrichGroupParticipantsFromContacts |
(Tidak berlaku) | imsg sudah menyediakan nama tampilan pengirim dari chat.db. |
channels.bluebubbles.actions.* |
channels.imessage.actions.* |
Tombol aktif/nonaktif per tindakan yang sama (reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment) ditambah polls baru. Semuanya diaktifkan secara bawaan; tindakan API privat tetap memerlukan bridge. |
Konfigurasi multiakun (channels.bluebubbles.accounts.*) diterjemahkan satu-ke-satu menjadi channels.imessage.accounts.*.
Jebakan registri grup
Plugin iMessage bawaan menjalankan dua gerbang grup secara berurutan. Pesan grup harus melewati keduanya agar dapat mencapai agen:
- Daftar yang diizinkan untuk pengirim / target obrolan (
channels.imessage.groupAllowFrom) — mencocokkan alamat pengirim atau target obrolan (entrichat_id:,chat_guid:,chat_identifier:). JikagroupAllowFromtidak ditetapkan, gerbang ini kembali menggunakanallowFrom;groupAllowFrom: []yang eksplisit menonaktifkan mekanisme tersebut dan membuang setiap pesan grup di bawahgroupPolicy: "allowlist". - Registri grup (
channels.imessage.groups) — menggunakanchat_idnumerik iMessage sebagai kunci:- Tidak ada blok
groups(atau blok kosong): grup melewati gerbang ini selama gerbang 1 memiliki daftar efektif pengirim yang diizinkan dan tidak kosong; pemfilteran pengirim mengatur akses dan tidak ada peringatan saat mulai yang menyatakan semua pesan akan dibuang. groupsberisi entri tetapi tanpa"*": hanya kuncichat_idyang tercantum yang lolos. Mencantumkan grup apa pun mengubah registri menjadi daftar yang diizinkan, bahkan di bawahgroupPolicy: "open".groups: { "*": { ... } }: setiap grup melewati gerbang ini.
- Tidak ada blok
Jebakan migrasinya: BlueBubbles menggunakan GUID obrolan / pengenal obrolan sebagai kunci entri groups, sedangkan registri iMessage menggunakan chat_id numerik sebagai kunci. Entri per grup yang disalin persis seperti aslinya akan membuat registri tidak kosong dengan kunci yang tidak pernah cocok, sehingga setiap pesan grup dibuang di gerbang 2. Salin wildcard "*" persis seperti aslinya; ubah kunci entri grup tertentu menggunakan nilai chat_id dari imsg chats.
Kedua jalur pembuangan terlihat pada tingkat log bawaan melalui baris warn:
- Satu kali per akun saat mulai, ketika
groupPolicy: "allowlist"ditetapkan dan daftar efektif pengirim grup yang diizinkan kosong:imessage: groupPolicy="allowlist" for account "<id>" but no group sender allowlist is configured .... TetapkangroupAllowFrom(atauallowFrom) untuk mengizinkan pengirim; menambahkangroupssaja tidak memenuhi gerbang pengirim. - Satu kali per
chat_idsaat waktu proses, ketika registri membuang grup:imessage: dropping group message from chat_id=<id> ... not in channels.imessage.groups allowlist, dengan menyebutkan kunci persis yang harus ditambahkan.
DM tetap berfungsi dalam kedua keadaan — DM menggunakan jalur kode yang berbeda, sehingga keberhasilan DM tidak membuktikan bahwa perutean grup berfungsi.
Konfigurasi minimum dengan cakupan pengirim dan groupPolicy: "allowlist":
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123", "chat_guid:any;-;..."], }, },}Konfigurasi ini mengizinkan pengirim yang dikonfigurasi di grup mana pun. Tambahkan entri groups untuk membatasi obrolan yang diizinkan atau menetapkan opsi per obrolan seperti requireMention; salin entri "*" BlueBubbles persis seperti aslinya, tetapi ubah kunci entri tertentu menggunakan nilai chat_id numerik iMessage.
Langkah demi langkah
-
Terjemahkan konfigurasi. Biarkan blok baru dinonaktifkan selama Anda mengedit; blok
channels.bluebubbleslama diabaikan oleh OpenClaw saat ini dan dapat dibiarkan berdampingan sebagai referensi:json5 { channels: { imessage: { enabled: false, // flip to true when ready to cut over cliPath: "/opt/homebrew/bin/imsg", dmPolicy: "pairing", allowFrom: ["+15555550123"], // copy from bluebubbles.allowFrom groupPolicy: "allowlist", groupAllowFrom: [], // copy from bluebubbles.groupAllowFrom groups: { "*": { requireMention: true } }, // wildcard copies verbatim; re-key per-chat entries by chat_id // actions default to enabled; set individual toggles false to disable }, },} -
Alihkan dan lakukan pemeriksaan. Atur
channels.imessage.enabled: true, mulai ulang Gateway, lalu pastikan kanal dilaporkan dalam kondisi sehat:bash openclaw gateway restartopenclaw channels status --probe --channel imessage # expect "works"; --json shows privateApi.available: truePemeriksaan memerlukan Gateway yang dapat dijangkau dan hanya memeriksa akun yang telah dikonfigurasi serta diaktifkan. Gunakan perintah langsung
imsgdi Sebelum memulai untuk memvalidasi Mac itu sendiri. -
Verifikasi DM. Kirim pesan langsung kepada agen; pastikan balasannya diterima.
-
Verifikasi grup secara terpisah. DM dan grup menggunakan jalur kode yang berbeda — keberhasilan DM tidak membuktikan bahwa perutean grup berfungsi. Kirim pesan di obrolan grup yang diizinkan dan pastikan balasannya diterima. Jika grup tidak memberikan respons (tidak ada balasan agen maupun kesalahan), periksa log Gateway untuk dua baris
warndari "Jebakan registri grup" di atas. Peringatan saat awal proses berarti daftar pengirim yang diizinkan secara efektif kosong; peringatan per-chat_idberarti registrigroupsyang terisi tidak memuat obrolan tersebut. -
Verifikasi permukaan tindakan. Dari DM yang telah dipasangkan, minta agen untuk memberikan reaksi, mengedit, membatalkan pengiriman, membalas, mengirim foto, serta (dalam grup) mengganti nama grup atau menambah/menghapus peserta. Setiap tindakan seharusnya diterapkan secara native di Messages.app. Jika ada tindakan yang menghasilkan
iMessage <action> requires the imsg private API bridge, jalankan kembaliimsg launch, lalu segarkan denganopenclaw channels status --probe. -
Hapus server BlueBubbles dan blok
channels.bluebubblessetelah DM, grup, serta tindakan iMessage selesai diverifikasi. OpenClaw tidak membacachannels.bluebubbles.
Sekilas kesetaraan tindakan
| Tindakan | BlueBubbles lama | iMessage bawaan |
|---|---|---|
| Mengirim teks / alternatif SMS | ✅ | ✅ |
| Mengirim media (foto, video, berkas, suara) | ✅ | ✅ |
Balasan berutas (reply_to_guid) |
✅ | ✅ (menyelesaikan #51892) |
Tapback (react) |
✅ | ✅ |
| Mengedit / membatalkan pengiriman (penerima macOS 13+) | ✅ | ✅ |
| Mengirim dengan efek layar | ✅ | ✅ (menyelesaikan sebagian #9394) |
| Teks kaya tebal / miring / garis bawah / coret | ✅ | ✅ (pemformatan rentang bertipe melalui attributedBody) |
| Jajak pendapat native Messages (membuat dan memilih) | ❌ | ✅ (actions.polls; penerima memerlukan iOS/macOS 26+ untuk perenderan native) |
| Mengganti nama grup / menetapkan ikon grup | ✅ | ✅ |
| Menambah / menghapus peserta, meninggalkan grup | ✅ | ✅ |
| Tanda terima telah dibaca dan indikator pengetikan | ✅ | ✅ (bergantung pada pemeriksaan API privat) |
| Penggabungan DM dari pengirim yang sama | ✅ | ✅ (khusus DM; ikut serta melalui channels.imessage.coalesceSameSenderDms) |
| Pemulihan pesan masuk setelah mulai ulang | ✅ | ✅ (otomatis: pemutaran ulang since_rowid + deduplikasi GUID; jendela lebih luas pada instalasi lokal) |
iMessage memulihkan pesan yang terlewat ketika Gateway tidak aktif: saat dimulai, iMessage memutar ulang dari rowid terakhir yang dikirim melalui imsg watch.subscribe since_rowid, melakukan deduplikasi berdasarkan GUID, dan batas usia backlog lama mencegah "ledakan backlog" akibat pengosongan Push. Proses ini berjalan melalui koneksi RPC imsg, sehingga juga berfungsi untuk penyiapan cliPath SSH jarak jauh; penyiapan lokal mendapatkan jendela pemulihan yang lebih luas karena dapat membaca chat.db. Lihat Pemulihan pesan masuk setelah bridge atau Gateway dimulai ulang.
Pemasangan, sesi, dan pengikatan ACP
- Daftar yang diizinkan dibawa berdasarkan handle.
channels.imessage.allowFrommengenali string+15555550123/user@example.comyang sama dengan yang digunakan BlueBubbles — salin persis tanpa perubahan. - Persetujuan penyimpanan pemasangan tidak ditransfer. Penyimpanan pemasangan berlaku per kanal dan tidak ada proses yang memigrasikan penyimpanan BlueBubbles lama. Pengirim yang hanya disetujui melalui pemasangan harus memasangkan kembali satu kali di iMessage, atau Anda dapat menambahkan handle mereka ke
allowFrom. - Sesi tetap dicakup per agen + obrolan. DM digabungkan ke sesi utama agen dengan pengaturan bawaan
session.dmScope=main; sesi grup tetap terisolasi perchat_id(agent:<agentId>:imessage:group:<chat_id>). Riwayat percakapan lama dalam kunci sesi BlueBubbles tidak dibawa ke sesi iMessage. - Pengikatan ACP yang merujuk ke
match.channel: "bluebubbles"harus diubah menjadi"imessage". Bentukmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, handle tanpa awalan) tetap identik.
Tidak ada kanal untuk kembali
Tidak ada runtime BlueBubbles yang didukung untuk digunakan kembali. Jika verifikasi iMessage gagal, atur channels.imessage.enabled: false, mulai ulang Gateway, perbaiki penghambat imsg, lalu ulangi pengalihan.
Cache balasan disimpan dalam status Plugin SQLite. openclaw doctor --fix mengimpor dan mengarsipkan berkas pendamping lama imessage/reply-cache.jsonl jika tersedia.
Terkait
- Penghapusan BlueBubbles dan jalur iMessage imsg — pengumuman singkat dan ringkasan untuk operator.
- iMessage — referensi lengkap kanal iMessage, termasuk penyiapan
imsg launchdan deteksi kemampuan. /channels/bluebubbles— URL lama yang dialihkan ke panduan migrasi ini.- Pemasangan — autentikasi DM dan alur pemasangan.
- Perutean Kanal — cara Gateway memilih kanal untuk balasan keluar.