imessage bawaan kini menjangkau permukaan API privat yang sama seperti BlueBubbles (react, edit, unsend, reply, sendWithEffect, manajemen grup, lampiran) dengan menjalankan steipete/imsg melalui JSON-RPC. Jika Anda sudah menjalankan Mac dengan imsg terinstal, Anda dapat menghentikan server BlueBubbles dan membiarkan Plugin berbicara langsung ke Messages.app.
Dukungan BlueBubbles telah dihapus. OpenClaw mendukung iMessage hanya melalui imsg. Panduan ini untuk memigrasikan konfigurasi channels.bluebubbles lama ke channels.imessage; tidak ada jalur migrasi lain yang didukung.
Untuk pengumuman singkat dan ringkasan operator, lihat Penghapusan BlueBubbles dan jalur imsg iMessage.
Daftar periksa migrasi
Gunakan daftar periksa ini ketika Anda sudah mengetahui konfigurasi BlueBubbles lama dan menginginkan jalur aman tersingkat:- Verifikasi
imsglangsung di Mac yang menjalankan Messages.app (imsg chats,imsg history,imsg send, danimsg rpc --help). - Salin kunci perilaku dari
channels.bluebubbleskechannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDms, danactions. - Hapus kunci transport yang tidak lagi ada:
serverUrl,password, URL webhook, dan penyiapan server BlueBubbles. - Jika Gateway tidak berjalan di Mac Messages, atur
channels.imessage.cliPathke pembungkus SSH dan aturremoteHostuntuk pengambilan lampiran jarak jauh. - Dengan Gateway dihentikan, aktifkan
channels.imessage, lalu jalankanopenclaw channels status --probe --channel imessage. - Uji satu DM, satu grup yang diizinkan, lampiran jika diaktifkan, dan setiap tindakan API privat yang Anda harapkan akan digunakan agen.
- Hapus server BlueBubbles dan konfigurasi
channels.bluebubbleslama setelah jalur iMessage diverifikasi.
Kapan migrasi ini masuk akal
- Anda sudah menjalankan
imsgdi Mac yang sama (atau yang dapat dijangkau melalui SSH) tempat Messages.app sudah masuk. - Anda menginginkan satu komponen bergerak lebih sedikit — tanpa server BlueBubbles terpisah, tanpa endpoint REST untuk diautentikasi, tanpa perpipaan webhook. Satu biner CLI, bukan server + aplikasi klien + helper.
- Anda menggunakan build macOS /
imsgyang didukung tempat probe API privat melaporkanavailable: true.
Apa yang dilakukan imsg
imsg adalah CLI macOS lokal untuk Messages. OpenClaw memulai imsg rpc sebagai proses anak dan berbicara JSON-RPC melalui stdin/stdout. Tidak ada server HTTP, URL webhook, daemon latar belakang, launch agent, atau port yang perlu diekspos.
- Pembacaan berasal dari
~/Library/Messages/chat.dbmenggunakan handle SQLite baca-saja. - Pesan masuk langsung berasal dari
imsg watch/watch.subscribe, yang mengikuti kejadian sistem berkaschat.dbdengan fallback polling. - Pengiriman menggunakan otomatisasi Messages.app untuk teks normal dan pengiriman file.
- Tindakan lanjutan menggunakan
imsg launchuntuk menyuntikkan helperimsgke Messages.app. Inilah yang membuka tanda terima baca, indikator mengetik, pengiriman kaya, edit, batal kirim, balasan berutas, tapback, dan manajemen grup. - Build Linux dapat memeriksa salinan
chat.db, tetapi tidak dapat mengirim, mengawasi database Mac langsung, atau mengendalikan Messages.app. Untuk OpenClaw iMessage, jalankanimsgdi Mac yang sudah masuk atau melalui pembungkus SSH ke Mac tersebut.
Sebelum Anda mulai
-
Instal
imsgdi Mac yang menjalankan Messages.app:Jikaimsg chatsgagal denganunable to open database file, output kosong, atauauthorization denied, berikan Akses Disk Penuh ke terminal, editor, proses Node, layanan Gateway, atau proses induk SSH yang meluncurkanimsg, lalu buka ulang proses induk tersebut. -
Verifikasi permukaan baca, awasi, kirim, dan RPC sebelum mengubah konfigurasi OpenClaw:
Ganti
42dengan id obrolan nyata 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 yang akan digunakan OpenClaw. Jika pembacaan/probe berfungsi tetapi pengiriman gagal dengan AppleEvents-1743, periksa apakah Automation mendarat di/usr/libexec/sshd-keygen-wrapper; lihat Pengiriman pembungkus SSH gagal dengan AppleEvents -1743. -
Aktifkan bridge API privat ketika Anda membutuhkan tindakan lanjutan:
imsg launchmemerlukan SIP dinonaktifkan. Pengiriman dasar, riwayat, dan pengawasan berfungsi tanpaimsg launch; tindakan lanjutan tidak. -
Setelah Anda menambahkan konfigurasi
channels.imessageyang diaktifkan, verifikasi bridge melalui OpenClaw:Yang Anda inginkan adalahimessage.privateApi.available: true. Jika melaporkanfalse, perbaiki itu terlebih dahulu — lihat Deteksi kemampuan.channels status --probehanya mem-probe akun yang dikonfigurasi dan diaktifkan. -
Snapshot konfigurasi Anda:
Terjemahan konfigurasi
iMessage dan BlueBubbles berbagi banyak konfigurasi tingkat channel. Kunci yang berubah sebagian besar adalah transport (server REST vs CLI lokal). Kunci perilaku (dmPolicy, groupPolicy, allowFrom, dll.) mempertahankan arti yang sama.
| BlueBubbles | iMessage bawaan | Catatan |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Semantik yang sama. |
channels.bluebubbles.serverUrl | (dihapus) | Tidak ada server REST — plugin menjalankan imsg rpc melalui stdio. |
channels.bluebubbles.password | (dihapus) | Tidak memerlukan autentikasi webhook. |
| (implisit) | channels.imessage.cliPath | Jalur ke imsg (default imsg); gunakan skrip wrapper untuk SSH. |
| (implisit) | channels.imessage.dbPath | Override Messages.app chat.db opsional; terdeteksi otomatis saat dihilangkan. |
| (implisit) | channels.imessage.remoteHost | host atau user@host — hanya diperlukan saat cliPath adalah wrapper SSH dan Anda ingin mengambil lampiran melalui SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Nilai yang sama (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Persetujuan pairing dibawa berdasarkan handle, bukan berdasarkan token. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Nilai yang sama (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Sama. |
channels.bluebubbles.groups | channels.imessage.groups | Salin ini persis, termasuk entri wildcard groups: { "*": { ... } } apa pun. requireMention, tools, toolsBySender per grup akan terbawa. Dengan groupPolicy: "allowlist", blok groups yang kosong atau hilang akan diam-diam membuang setiap pesan grup — lihat “Jebakan registri grup” di bawah. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Default true. Dengan plugin bawaan, ini hanya berjalan saat probe API privat aktif. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Bentuk yang sama, sama-sama nonaktif secara default. Jika lampiran Anda sebelumnya mengalir di BlueBubbles, Anda harus mengatur ulang ini secara eksplisit pada blok iMessage — ini tidak terbawa secara implisit, dan foto/media masuk akan diam-diam dibuang tanpa baris log Inbound message sampai Anda melakukannya. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Root lokal; aturan wildcard yang sama. |
| (N/A) | channels.imessage.remoteAttachmentRoots | Hanya digunakan saat remoteHost diatur untuk pengambilan SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Default 16 MB pada iMessage (default BlueBubbles adalah 8 MB). Atur secara eksplisit jika Anda ingin mempertahankan batas yang lebih rendah. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Default 4000 pada keduanya. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | Opt-in yang sama. Hanya DM — obrolan grup tetap memakai dispatch per pesan secara instan di kedua channel. Memperlebar debounce inbound default menjadi 7000 ms saat diaktifkan tanpa messages.inbound.byChannel.imessage eksplisit atau messages.inbound.debounceMs global. Lihat dokumen iMessage § Menggabungkan DM split-send. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (N/A) | iMessage sudah membaca nama tampilan pengirim dari chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Toggle per tindakan: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) diterjemahkan satu-ke-satu menjadi channels.imessage.accounts.*.
Jebakan registri grup
Plugin iMessage bawaan menjalankan dua gate allowlist grup terpisah secara berurutan. Keduanya harus lolos agar pesan grup mencapai agen:- Allowlist pengirim / target obrolan (
channels.imessage.groupAllowFrom) — diperiksa olehisAllowedIMessageSender. Mencocokkan pesan masuk berdasarkan handle pengirim,chat_guid,chat_identifier, atauchat_id. Bentuk yang sama seperti BlueBubbles. - Registri grup (
channels.imessage.groups) — diperiksa olehresolveChannelGroupPolicydariinbound-processing.ts:199. DengangroupPolicy: "allowlist", gate ini memerlukan salah satu dari:- entri wildcard
groups: { "*": { ... } }(menetapkanallowAll = true), atau - entri eksplisit per-
chat_iddi bawahgroups.
- entri wildcard
warn sehingga ini tidak lagi senyap pada level log default:
warnstartup satu kali per akun saatgroupPolicy: "allowlist"diatur tetapichannels.imessage.groupskosong (tidak ada wildcard"*", tidak ada entri per-chat_id) — dipicu sebelum pesan apa pun masuk.warnsatu kali per-chat_idsaat pertama kali grup tertentu dibuang saat runtime, menyebutkan chat_id dan key persis yang harus ditambahkan kegroupsuntuk mengizinkannya.
groupAllowFrom dan groupPolicy tetapi melewati blok groups, karena groups: { "*": { "requireMention": true } } milik BlueBubbles terlihat seperti pengaturan mention yang tidak terkait. Sebenarnya itu sangat penting untuk gerbang registry.
Konfigurasi minimum agar pesan grup tetap mengalir setelah groupPolicy: "allowlist":
requireMention: true di bawah * tidak berbahaya saat tidak ada pola mention yang dikonfigurasi: runtime menetapkan canDetectMention = false dan memintas penjatuhan mention di inbound-processing.ts:512. Dengan pola mention yang dikonfigurasi (agents.list[].groupChat.mentionPatterns), ini berfungsi sesuai harapan.
Jika log gateway menampilkan imessage: dropping group message from chat_id=<id> atau baris startup imessage: groupPolicy="allowlist" but channels.imessage.groups is empty, gerbang 2 sedang menjatuhkan pesan — tambahkan blok groups.
Langkah demi langkah
-
Tambahkan blok iMessage berdampingan dengan blok BlueBubbles yang ada. Biarkan nonaktif selama Gateway masih merutekan traffic BlueBubbles:
-
Uji sebelum traffic penting — hentikan Gateway, aktifkan sementara blok iMessage, dan pastikan iMessage melaporkan kondisi sehat dari CLI:
channels status --probehanya menguji akun yang dikonfigurasi dan diaktifkan. Jangan mulai ulang Gateway dengan BlueBubbles dan iMessage sama-sama aktif kecuali Anda memang ingin kedua pemantau channel berjalan. Jika Anda tidak langsung melakukan cutover, setel kembalichannels.imessage.enabledkefalsesebelum memulai ulang Gateway. Gunakan perintah langsungimsgdi Sebelum memulai untuk memvalidasi Mac sebelum mengaktifkan traffic OpenClaw. -
Lakukan cutover. Setelah akun iMessage yang diaktifkan melaporkan kondisi sehat, hapus konfigurasi BlueBubbles dan biarkan iMessage aktif:
Mulai ulang gateway. Traffic iMessage masuk sekarang mengalir melalui Plugin bawaan.
- Verifikasi DM. Kirim pesan langsung ke agen; pastikan balasannya masuk.
-
Verifikasi grup secara terpisah. DM dan grup memakai jalur kode yang berbeda — keberhasilan DM tidak membuktikan grup sudah dirutekan. Kirim pesan ke agen dalam chat grup yang sudah dipasangkan dan pastikan balasannya masuk. Jika grup menjadi senyap (tidak ada balasan agen, tidak ada error), periksa log gateway untuk
imessage: dropping group message from chat_id=<id>atau baris startupimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— keduanya muncul pada level log default. Jika salah satu muncul, blokgroupsAnda hilang atau kosong — lihat “Jebakan registry grup” di atas. -
Verifikasi permukaan aksi — dari DM yang sudah dipasangkan, minta agen untuk bereaksi, mengedit, membatalkan pengiriman, membalas, mengirim foto, dan (dalam grup) mengganti nama grup / menambah atau menghapus peserta. Setiap aksi harus masuk secara native di Messages.app. Jika ada yang melempar “iMessage
<action>requires the imsg private API bridge”, jalankanimsg launchlagi dan segarkanchannels status --probe. -
Hapus server dan konfigurasi BlueBubbles setelah DM, grup, dan aksi iMessage terverifikasi. OpenClaw tidak akan memakai
channels.bluebubbles.
Ringkasan paritas aksi
| Aksi | BlueBubbles lama | iMessage bawaan |
|---|---|---|
| Kirim teks / fallback SMS | ✅ | ✅ |
| Kirim media (foto, video, file, suara) | ✅ | ✅ |
Balasan berutas (reply_to_guid) | ✅ | ✅ (menutup #51892) |
Tapback (react) | ✅ | ✅ |
| Edit / batal kirim (penerima macOS 13+) | ✅ | ✅ |
| Kirim dengan efek layar | ✅ | ✅ (menutup sebagian #9394) |
| Teks kaya bold / italic / underline / strikethrough | ✅ | ✅ (pemformatan typed-run melalui attributedBody) |
| Ganti nama grup / setel ikon grup | ✅ | ✅ |
| Tambah / hapus peserta, keluar dari grup | ✅ | ✅ |
| Tanda dibaca dan indikator mengetik | ✅ | ✅ (dibatasi oleh probe private API) |
| Penggabungan DM dari pengirim yang sama | ✅ | ✅ (khusus DM; opt-in melalui channels.imessage.coalesceSameSenderDms) |
| Pemulihan masuk setelah restart | ✅ (replay webhook + ambil riwayat) | ✅ (otomatis: replay yang terlewat melalui since_rowid + dedupe; jendela lebih lebar pada lokal) |
imsg watch.subscribe since_rowid dan melakukan dedupe berdasarkan GUID, sementara pagar usia backlog basi menekan “bom backlog” Push-flush. Ini berjalan melalui koneksi RPC imsg, sehingga juga berfungsi untuk setup cliPath SSH jarak jauh; setup lokal mendapatkan jendela pemulihan yang lebih lebar karena dapat membaca chat.db. Lihat Pemulihan masuk setelah bridge atau gateway restart.
Pairing, sesi, dan binding ACP
- Persetujuan pairing terbawa berdasarkan handle. Anda tidak perlu menyetujui ulang pengirim yang sudah dikenal —
channels.imessage.allowFrommengenali string+15555550123/user@example.comyang sama dengan yang digunakan BlueBubbles. - Sesi tetap dibatasi per agen + chat. DM digabungkan ke sesi utama agen di bawah default
session.dmScope=main; sesi grup tetap terisolasi perchat_id. Kunci sesi berbeda (agent:<id>:imessage:group:<chat_id>vs padanan BlueBubbles) — riwayat percakapan lama di bawah kunci sesi BlueBubbles tidak terbawa ke sesi iMessage. - Binding ACP yang merujuk ke
match.channel: "bluebubbles"perlu diperbarui menjadi"imessage". Bentukmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, handle polos) identik.
Tidak ada channel rollback
Tidak ada runtime BlueBubbles yang didukung untuk kembali. Jika verifikasi iMessage gagal, setelchannels.imessage.enabled: false, mulai ulang Gateway, perbaiki pemblokir imsg, dan ulangi cutover.
Cache balasan berada di state Plugin SQLite. openclaw doctor --fix mengimpor dan mengarsipkan sidecar lama imessage/reply-cache.jsonl saat ada.
Terkait
- Penghapusan BlueBubbles dan jalur iMessage imsg — pengumuman singkat dan ringkasan operator.
- iMessage — referensi lengkap channel iMessage, termasuk setup
imsg launchdan deteksi kapabilitas. /channels/bluebubbles— URL lama yang mengalihkan ke panduan migrasi ini.- Pairing — autentikasi DM dan alur pairing.
- Perutean Channel — cara gateway memilih channel untuk balasan keluar.