PluginDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
imessage bawaan kini menjangkau permukaan API privat yang sama seperti BlueBubbles (react, edit, unsend, reply, sendWithEffect, pengelolaan grup, lampiran) dengan menjalankan steipete/imsg melalui JSON-RPC. Jika Anda sudah menjalankan Mac dengan imsg terpasang, Anda dapat menghapus server BlueBubbles dan membiarkan Plugin berbicara langsung dengan 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.
Kapan migrasi ini masuk akal
- Anda sudah menjalankan
imsgpada Mac yang sama (atau yang dapat dijangkau melalui SSH) tempat Messages.app sudah masuk. - Anda ingin satu komponen bergerak lebih sedikit — tanpa server BlueBubbles terpisah, tanpa endpoint REST untuk diautentikasi, tanpa pengaturan Webhook. Satu biner CLI, bukan server + aplikasi klien + helper.
- Anda memakai build macOS /
imsgyang didukung tempat pemeriksaan 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 hanya-baca. - Pesan masuk langsung berasal dari
imsg watch/watch.subscribe, yang mengikuti event sistem filechat.dbdengan fallback polling. - Pengiriman menggunakan otomasi Messages.app untuk teks normal dan pengiriman file.
- Tindakan lanjutan menggunakan
imsg launchuntuk menyuntikkan helperimsgke Messages.app. Itulah yang membuka tanda terima baca, indikator mengetik, pengiriman kaya, edit, urung kirim, balasan berutas, tapback, dan pengelolaan grup. - Build Linux dapat memeriksa salinan
chat.db, tetapi tidak dapat mengirim, memantau database Mac langsung, atau menjalankan Messages.app. Untuk iMessage OpenClaw, jalankanimsgpada Mac yang sudah masuk atau melalui wrapper SSH ke Mac tersebut.
Sebelum Anda mulai
-
Pasang
imsgpada Mac yang menjalankan Messages.app:Jikaimsg chatsgagal denganunable to open database file, output kosong, atauauthorization denied, berikan Full Disk Access ke terminal, editor, proses Node, layanan Gateway, atau proses induk SSH yang meluncurkanimsg, lalu buka ulang proses induk tersebut. -
Verifikasi permukaan baca, pantau, kirim, dan RPC sebelum mengubah konfigurasi OpenClaw:
Ganti
42dengan id chat nyata dariimsg chats. Pengiriman memerlukan izin Automation untuk Messages.app. Jika OpenClaw akan berjalan melalui SSH, jalankan perintah ini melalui wrapper SSH atau konteks pengguna yang sama yang akan digunakan OpenClaw. -
Aktifkan bridge API privat ketika Anda memerlukan tindakan lanjutan:
imsg launchmengharuskan SIP dinonaktifkan. Kirim dasar, riwayat, dan pemantauan berfungsi tanpaimsg launch; tindakan lanjutan tidak. -
Verifikasi bridge melalui OpenClaw:
Anda menginginkan
imessage.privateApi.available: true. Jika melaporkanfalse, perbaiki itu terlebih dahulu — lihat Deteksi kemampuan. -
Ambil snapshot konfigurasi Anda:
Penerjemahan 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 makna yang sama.
| BlueBubbles | iMessage terbundel | 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 perlu autentikasi webhook. |
| (implisit) | channels.imessage.cliPath | Jalur ke imsg (default imsg); gunakan skrip wrapper untuk SSH. |
| (implisit) | channels.imessage.dbPath | Override opsional untuk chat.db Messages.app; terdeteksi otomatis jika dihilangkan. |
| (implisit) | channels.imessage.remoteHost | host atau user@host — hanya diperlukan ketika cliPath adalah wrapper SSH dan Anda menginginkan pengambilan lampiran melalui SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Nilai yang sama (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Persetujuan pairing terbawa berdasarkan handle, bukan 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 apa adanya, termasuk entri wildcard groups: { "*": { ... } } apa pun. requireMention, tools, toolsBySender per grup ikut terbawa. Dengan groupPolicy: "allowlist", blok groups yang kosong atau hilang akan diam-diam membuang setiap pesan grup — lihat “Jebakan registry grup” di bawah. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Default true. Dengan plugin terbundel, ini hanya berjalan ketika probe API privat aktif. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Bentuk yang sama, sama-sama nonaktif secara default. Jika lampiran sudah berjalan di BlueBubbles, Anda harus menyetelnya ulang 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. |
| (T/A) | channels.imessage.remoteAttachmentRoots | Hanya digunakan ketika remoteHost disetel untuk pengambilan SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Default 16 MB di iMessage (default BlueBubbles adalah 8 MB). Setel 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 | Keikutsertaan opsional yang sama. Hanya DM — chat grup tetap menggunakan dispatch instan per pesan di kedua kanal. Memperlebar debounce masuk default menjadi 2500 ms ketika diaktifkan tanpa messages.inbound.byChannel.imessage eksplisit. Lihat dokumentasi iMessage § Menggabungkan DM kirim-terpisah. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (T/A) | iMessage sudah membaca nama tampilan pengirim dari chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Toggle per aksi: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) diterjemahkan satu-ke-satu ke channels.imessage.accounts.*.
Jebakan registry grup
Plugin iMessage terbundel menjalankan dua gerbang allowlist grup terpisah secara berurutan. Keduanya harus lolos agar pesan grup mencapai agen:- Allowlist pengirim / target chat (
channels.imessage.groupAllowFrom) — diperiksa olehisAllowedIMessageSender. Mencocokkan pesan masuk berdasarkan handle pengirim,chat_guid,chat_identifier, atauchat_id. Bentuknya sama seperti BlueBubbles. - Registry grup (
channels.imessage.groups) — diperiksa olehresolveChannelGroupPolicydariinbound-processing.ts:199. DengangroupPolicy: "allowlist", gerbang ini memerlukan salah satu dari:- entri wildcard
groups: { "*": { ... } }(menyetelallowAll = true), atau - entri per-
chat_ideksplisit di bawahgroups.
- entri wildcard
warn sehingga ini tidak lagi diam pada tingkat log default:
warnstartup satu kali per akun ketikagroupPolicy: "allowlist"disetel 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 pada runtime, menyebutkan chat_id dan kunci persis yang perlu ditambahkan kegroupsuntuk mengizinkannya.
groupAllowFrom dan groupPolicy tetapi melewatkan blok groups, karena groups: { "*": { "requireMention": true } } milik BlueBubbles tampak seperti pengaturan mention yang tidak terkait. Sebenarnya, itu penting untuk gerbang registry.
Konfigurasi minimum agar pesan grup tetap mengalir setelah groupPolicy: "allowlist":
requireMention: true di bawah * tidak bermasalah saat tidak ada pola penyebutan yang dikonfigurasi: runtime menetapkan canDetectMention = false dan melewati pengguguran penyebutan di inbound-processing.ts:512. Dengan pola penyebutan yang dikonfigurasi (agents.list[].groupChat.mentionPatterns), ini berfungsi seperti yang diharapkan.
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 yang menggugurkan — tambahkan blok groups.
Langkah demi langkah
-
Tambahkan blok iMessage di samping blok BlueBubbles yang ada. Simpan blok lama hanya sebagai sumber salinan sampai jalur baru diverifikasi:
-
Probe dry-run — jalankan Gateway dan pastikan iMessage melaporkan status sehat:
Karena
imessage.enabledmasihfalse, belum ada traffic iMessage masuk yang dirutekan — tetapi--probemenguji bridge sehingga Anda dapat menemukan masalah izin/instalasi sebelum cutover. -
Cut over. Hapus konfigurasi BlueBubbles dan aktifkan iMessage dalam satu edit konfigurasi:
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 menggunakan jalur kode yang berbeda — keberhasilan DM tidak membuktikan bahwa grup sudah dirutekan. Kirim pesan ke agen dalam obrolan 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 satunya muncul, blokgroupsAnda hilang atau kosong — lihat “Jebakan registry grup” di atas. -
Verifikasi permukaan aksi — dari DM yang sudah dipasangkan, minta agen untuk memberi reaksi, mengedit, membatalkan pengiriman, membalas, mengirim foto, dan (dalam grup) mengganti nama grup / menambah atau menghapus peserta. Setiap aksi seharusnya 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 menggunakan
channels.bluebubbles.
Sekilas paritas aksi
| Aksi | BlueBubbles legacy | iMessage bawaan |
|---|---|---|
| Kirim teks / fallback SMS | ✅ | ✅ |
| Kirim media (foto, video, file, suara) | ✅ | ✅ |
Balasan berutas (reply_to_guid) | ✅ | ✅ (menutup #51892) |
Tapback (react) | ✅ | ✅ |
| Edit / batalkan pengiriman (penerima macOS 13+) | ✅ | ✅ |
| Kirim dengan efek layar | ✅ | ✅ (menutup sebagian #9394) |
| Teks kaya tebal / miring / garis bawah / coret | ✅ | ✅ (pemformatan typed-run melalui attributedBody) |
| Ganti nama grup / atur ikon grup | ✅ | ✅ |
| Tambah / hapus peserta, tinggalkan grup | ✅ | ✅ |
| Tanda dibaca dan indikator mengetik | ✅ | ✅ (dibatasi oleh probe API privat) |
| Penggabungan DM pengirim yang sama | ✅ | ✅ (khusus DM; ikut serta melalui channels.imessage.coalesceSameSenderDms) |
| Catchup pesan masuk yang diterima saat Gateway mati | ✅ (pemutaran ulang Webhook + pengambilan riwayat) | ✅ (ikut serta melalui channels.imessage.catchup.enabled; menutup #78649) |
channels.imessage.catchup.enabled adalah true, Gateway menjalankan satu pass chats.list + messages.history per obrolan terhadap klien JSON-RPC yang sama yang digunakan oleh imsg watch, memutar ulang setiap baris masuk yang terlewat melalui jalur dispatch live (allowlist, kebijakan grup, debouncer, cache echo), dan menyimpan cursor per akun sehingga startup berikutnya melanjutkan dari posisi terakhir. Lihat Mengejar ketertinggalan setelah downtime Gateway untuk penyetelan.
Pairing, sesi, dan binding ACP
- Persetujuan Pairing berpindah 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 + obrolan. DM digabungkan ke sesi utama agen di bawah
session.dmScope=maindefault; 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 mereferensikan
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, aturchannels.imessage.enabled: false, mulai ulang Gateway, perbaiki pemblokir imsg, dan coba lagi cutover.
Cache balasan berada di ~/.openclaw/state/imessage/reply-cache.jsonl (mode 0600, direktori induk 0700). Aman untuk dihapus jika Anda menginginkan awal yang bersih.
Terkait
- iMessage — referensi lengkap channel iMessage, termasuk penyiapan
imsg launchdan deteksi kapabilitas. /channels/bluebubbles— URL legacy yang dialihkan ke panduan migrasi ini.- Pairing — autentikasi DM dan alur Pairing.
- Perutean Channel — cara Gateway memilih channel untuk balasan keluar.