Halaman ini adalah desain target untuk mengganti helper giliran channel, pengiriman balasan, streaming pratinjau, dan pengiriman keluar yang tersebar dengan satu siklus hidup pesan yang tahan lama. Versi singkatnya:Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Primitif inti harus berupa terima dan kirim, bukan balas.
- Balasan hanya merupakan relasi pada pesan keluar.
- Giliran adalah kemudahan pemrosesan masuk, bukan pemilik pengiriman.
- Pengiriman harus berbasis konteks:
begin, render, pratinjau atau stream, kirim akhir, commit, gagal. - Penerimaan juga harus berbasis konteks: normalisasi, dedupe, route, catat, dispatch, ack platform, gagal.
- SDK Plugin publik harus diringkas menjadi satu permukaan kecil untuk pesan channel.
Masalah
Stack channel saat ini tumbuh dari beberapa kebutuhan lokal yang valid:- Adapter masuk sederhana menggunakan
runtime.channel.turn.run. - Adapter kaya menggunakan
runtime.channel.turn.runPrepared. - Helper lama menggunakan
dispatchInboundReplyWithBase,recordInboundSessionAndDispatchReply, helper payload balasan, pemotongan balasan, referensi balasan, dan helper runtime keluar. - Streaming pratinjau berada di dispatcher khusus channel.
- Durabilitas pengiriman akhir sedang ditambahkan di sekitar path payload balasan yang ada.
Tujuan
- Satu siklus hidup core untuk semua path terima dan kirim pesan channel.
- Pengiriman akhir yang tahan lama secara default dalam siklus hidup pesan baru setelah adapter mendeklarasikan perilaku yang aman untuk replay.
- Semantik pratinjau, edit, stream, finalisasi, retry, pemulihan, dan receipt bersama.
- Permukaan SDK Plugin kecil yang dapat dipelajari dan dipelihara oleh Plugin pihak ketiga.
- Kompatibilitas untuk pemanggil
channel.turnyang ada selama migrasi. - Titik ekstensi yang jelas untuk kapabilitas channel baru.
- Tidak ada cabang khusus platform di core.
- Tidak ada pesan channel token-delta. Streaming channel tetap berupa pratinjau pesan, edit, append, atau pengiriman blok selesai.
- Metadata asal OpenClaw terstruktur untuk output operasional/sistem agar kegagalan Gateway yang terlihat tidak masuk kembali ke ruang bersama yang mengaktifkan bot sebagai prompt baru.
Bukan tujuan
- Jangan hapus
runtime.channel.turn.*pada fase pertama. - Jangan paksa setiap channel ke perilaku transport native yang sama.
- Jangan ajarkan core topik Telegram, stream native Slack, redaksi Matrix, kartu Feishu, suara QQ, atau aktivitas Teams.
- Jangan publikasikan semua helper migrasi internal sebagai API SDK stabil.
- Jangan buat retry me-replay operasi platform non-idempoten yang sudah selesai.
Model referensi
Vercel Chat memiliki model mental publik yang baik:ChatThreadChannelMessage- metode adapter seperti
postMessage,editMessage,deleteMessage,stream,startTyping, dan pengambilan riwayat - adapter status untuk dedupe, lock, antrean, dan persistensi
- Intent pengiriman keluar yang tahan lama sebelum panggilan transport langsung.
- Konteks pengiriman eksplisit dengan begin, commit, dan fail.
- Konteks penerimaan yang mengetahui kebijakan ack platform.
- Receipt yang bertahan setelah restart dan dapat mendorong edit, hapus, pemulihan, dan penekanan duplikat.
- SDK publik yang lebih kecil. Plugin bawaan dapat menggunakan helper runtime internal, tetapi Plugin pihak ketiga harus melihat satu API pesan yang koheren.
- Perilaku khusus agen: sesi, transkrip, streaming blok, progres tool, approval, direktif media, balasan senyap, dan riwayat mention grup.
thread.post() tidak cukup untuk OpenClaw. Promise tersebut menyembunyikan
batas transaksi yang menentukan apakah pengiriman dapat dipulihkan.
Model core
Domain baru harus berada di bawah namespace core internal sepertisrc/channels/message/*.
Domain ini memiliki empat konsep:
receive memiliki siklus hidup masuk.
send memiliki siklus hidup keluar.
live memiliki status pratinjau, edit, progres, dan stream.
state memiliki penyimpanan intent tahan lama, receipt, idempotensi, pemulihan, lock, dan
dedupe.
Istilah pesan
Pesan
Pesan yang dinormalisasi bersifat netral platform:Target
Target menjelaskan tempat pesan berada:Relasi
Balasan adalah relasi, bukan akar API:Asal
Asal menjelaskan siapa yang menghasilkan pesan dan bagaimana OpenClaw harus memperlakukan echo dari pesan tersebut. Ini terpisah dari relasi: sebuah pesan dapat berupa balasan kepada pengguna dan tetap merupakan output operasional yang berasal dari OpenClaw.allowBots diaktifkan.
Receipt
Receipt adalah kelas utama:Konteks penerimaan
Penerimaan sebaiknya bukan pemanggilan helper polos. Core membutuhkan konteks yang mengetahui dedupe, routing, pencatatan sesi, dan kebijakan ack platform.- Ack transport: memberi tahu webhook atau socket platform bahwa OpenClaw menerima envelope event. Beberapa platform mewajibkan ini sebelum dispatch.
- Ack offset polling: memajukan cursor agar event yang sama tidak diambil lagi. Ini tidak boleh melewati pekerjaan yang tidak dapat dipulihkan.
- Ack record masuk: mengonfirmasi OpenClaw telah mempersistensikan metadata masuk yang cukup untuk dedupe dan route redelivery.
- Receipt yang terlihat pengguna: perilaku baca/status/typing opsional; tidak pernah menjadi batas durabilitas.
ReceiveAckPolicy hanya mengontrol acknowledgement transport atau polling. Ini tidak boleh
digunakan ulang untuk receipt baca atau reaksi status.
Sebelum otorisasi bot, receive harus menerapkan kebijakan echo OpenClaw bersama
ketika channel dapat mendekode metadata asal pesan:
allowBots normal.
Kebijakan ack bersifat eksplisit:
getUpdates upstream Telegram masih dikontrol oleh
library polling, jadi potongan yang lebih dalam yang tersisa adalah sumber polling yang sepenuhnya tahan lama
jika kita membutuhkan redelivery tingkat platform di luar watermark restart
OpenClaw. Platform webhook mungkin membutuhkan ack HTTP langsung, tetapi tetap membutuhkan
dedupe masuk dan intent pengiriman keluar yang tahan lama karena webhook dapat melakukan redelivery.
Konteks pengiriman
Pengiriman juga berbasis konteks:unknown_after_send, bukan diputar ulang secara membabi buta. Kanal
tanpa rekonsiliasi boleh memilih pemutaran ulang at-least-once hanya jika pesan
duplikat yang terlihat adalah tradeoff yang dapat diterima dan terdokumentasi untuk kanal dan relasi tersebut.
Jembatan rekonsiliasi SDK saat ini mengharuskan adaptor mendeklarasikan
reconcileUnknownSend, lalu meminta durableFinal.reconcileUnknownSend untuk
mengklasifikasikan entri tidak dikenal sebagai sent, not_sent, atau unresolved; hanya not_sent
yang mengizinkan pemutaran ulang, dan entri yang belum terselesaikan tetap terminal atau hanya mencoba ulang
pemeriksaan rekonsiliasi.
Kebijakan durabilitas harus eksplisit:
required berarti inti harus gagal tertutup ketika tidak dapat menulis intent tahan lama.
best_effort dapat melanjutkan ketika persistensi tidak tersedia. disabled mempertahankan
perilaku pengiriman langsung lama. Selama migrasi, wrapper lama dan pembantu
kompatibilitas publik default ke disabled; keduanya tidak boleh menyimpulkan required dari
fakta bahwa sebuah kanal memiliki adaptor keluar generik.
Konteks pengiriman juga memiliki efek pascakirim lokal kanal. Migrasi tidak aman
jika pengiriman tahan lama melewati perilaku lokal yang sebelumnya melekat pada
jalur pengiriman langsung kanal. Contohnya mencakup cache supresi self-echo,
penanda partisipasi thread, anchor edit native, rendering tanda tangan model,
dan guard duplikat khusus platform. Efek tersebut harus dipindahkan ke
adaptor pengiriman, adaptor render, atau hook konteks pengiriman bernama sebelum
kanal tersebut dapat mengaktifkan pengiriman final generik yang tahan lama.
Pembantu pengiriman harus mengembalikan tanda terima sepenuhnya sampai ke pemanggilnya. Wrapper
tahan lama tidak boleh menelan id pesan atau mengganti hasil pengiriman kanal dengan
undefined; dispatcher berbuffer menggunakan id tersebut untuk anchor thread, edit berikutnya,
finalisasi pratinjau, dan supresi duplikat.
Pengiriman fallback beroperasi pada batch, bukan payload tunggal. Penulisan ulang silent-reply,
fallback media, fallback kartu, dan proyeksi chunk semuanya dapat menghasilkan lebih dari
satu pesan yang dapat dikirim, sehingga konteks pengiriman harus mengirimkan seluruh
batch terproyeksi atau secara eksplisit mendokumentasikan mengapa hanya satu payload yang valid.
unknown_after_send sampai adaptor merekonsiliasinya.
Konteks live
Perilaku pratinjau, edit, progres, dan stream sebaiknya menjadi satu siklus hidup opt-in.- Pengiriman Telegram plus pratinjau edit, dengan final baru setelah usia pratinjau basi.
- Pengiriman Discord plus pratinjau edit, batal pada media/error/balasan eksplisit.
- Stream native Slack atau pratinjau draf bergantung pada bentuk thread.
- Finalisasi posting draf Mattermost.
- Finalisasi event draf Matrix atau redaksi saat tidak cocok.
- Stream progres native Teams.
- Stream QQ Bot atau fallback terakumulasi.
Permukaan adaptor
Target SDK publik sebaiknya berupa satu subjalur:origin.decode mengembalikan metadata asal OpenClaw. Adaptor penerimaan
menyediakan fakta platform seperti penulis bot dan bentuk ruang; inti memiliki keputusan
drop dan pengurutan sehingga kanal tidak mengimplementasikan ulang filter teks.
Adaptor asal:
MessageOrigin. Kanal hanya menerjemahkannya ke dan dari metadata
transport native. Slack memetakannya ke chat.postMessage({ metadata }) dan
message.metadata masuk; Matrix dapat memetakannya ke konten event tambahan; kanal
tanpa metadata native dapat menggunakan registry tanda terima/keluar ketika itu adalah
pendekatan terbaik yang tersedia.
Kapabilitas:
Pengurangan SDK publik
Permukaan publik baru sebaiknya menyerap atau menghentikan area konseptual ini:reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipeline- sebagian besar penggunaan publik
outbound-runtime - pembantu siklus hidup stream draf ad hoc
plugin-sdk/channel-message setelah tersedia.
Hubungan dengan giliran kanal
runtime.channel.turn.* sebaiknya tetap ada selama migrasi.
Itu sebaiknya menjadi adaptor kompatibilitas:
channel.turn.runPrepared juga sebaiknya tetap ada pada awalnya:
channel.turn dapat dihentikan. Itu tidak boleh dihapus sampai ada
jalur migrasi SDK yang dipublikasikan dan pengujian kontrak yang membuktikan plugin lama masih berfungsi
atau gagal dengan error versi yang jelas.
Guardrail kompatibilitas
Selama migrasi, pengiriman tahan lama generik bersifat opt-in untuk setiap kanal yang callback pengiriman yang ada memiliki efek samping selain “kirim payload ini”. Titik masuk lama bersifat tidak tahan lama secara default:channel.turn.rundandispatchAssembledChannelTurnmenggunakan callback pengiriman kanal kecuali kanal tersebut secara eksplisit menyediakan objek kebijakan/opsi tahan lama yang telah diaudit.channel.turn.runPreparedtetap dimiliki kanal sampai dispatcher yang disiapkan secara eksplisit memanggil konteks pengiriman.- Pembantu kompatibilitas publik seperti
recordInboundSessionAndDispatchReply,dispatchInboundReplyWithBase, dan pembantu direct-DM tidak pernah menyuntikkan pengiriman tahan lama generik sebelum callbackdeliverataureplyyang disediakan pemanggil.
durable: undefined berarti “tidak tahan lama”. Jalur
tahan lama diaktifkan hanya oleh nilai kebijakan/opsi eksplisit. durable: false dapat tetap ada sebagai ejaan kompatibilitas, tetapi implementasi tidak boleh
mengharuskan setiap kanal yang belum bermigrasi menambahkannya.
Kode jembatan saat ini harus menjaga keputusan durabilitas tetap eksplisit:
- Pengiriman final persisten mengembalikan status terdiskriminasi.
handled_visibledanhandled_no_sendbersifat terminal;unsupporteddannot_applicabledapat fallback ke pengiriman yang dimiliki saluran;failedmeneruskan kegagalan pengiriman. - Pengiriman final persisten generik dibatasi oleh kapabilitas adaptor seperti pengiriman senyap, pelestarian target balasan, pelestarian kutipan native, dan hook pengiriman pesan. Paritas yang hilang harus memilih pengiriman yang dimiliki saluran, bukan pengiriman generik yang mengubah perilaku yang terlihat oleh pengguna.
- Pengiriman persisten berbasis antrean mengekspos referensi intent pengiriman. Kolom sesi
pendingFinalDelivery*yang sudah ada dapat membawa id intent selama transisi; keadaan akhirnya adalah penyimpananMessageSendIntent, bukan teks balasan beku plus kolom konteks ad hoc.
- Adaptor pengiriman generik menjalankan perilaku rendering dan transport yang sama seperti jalur langsung lama.
- Efek samping lokal pasca-pengiriman dipertahankan melalui konteks pengiriman.
- Adaptor mengembalikan tanda terima atau hasil pengiriman dengan semua id pesan platform.
- Jalur dispatcher yang disiapkan memanggil konteks pengiriman baru atau tetap didokumentasikan sebagai di luar jaminan persisten.
- Pengiriman fallback menangani setiap payload terproyeksi, bukan hanya yang pertama.
- Pengiriman fallback persisten mencatat seluruh array payload terproyeksi sebagai satu intent atau rencana batch yang dapat diputar ulang.
- Pengiriman monitor iMessage mencatat pesan terkirim dalam cache echo setelah pengiriman berhasil. Pengiriman final persisten tetap harus mengisi cache itu, jika tidak OpenClaw dapat menyerap ulang balasan finalnya sendiri sebagai pesan pengguna masuk.
- Tlon menambahkan tanda tangan model opsional dan mencatat thread yang diikuti setelah balasan grup. Pengiriman persisten generik tidak boleh melewati efek tersebut; pindahkan efek itu ke adaptor render/send/finalize Tlon atau pertahankan Tlon di jalur yang dimiliki saluran.
- Discord dan dispatcher lain yang disiapkan sudah memiliki perilaku pengiriman langsung dan pratinjau. Mereka tidak tercakup oleh jaminan persisten untuk giliran yang dirakit sampai dispatcher yang disiapkan secara eksplisit merutekan final melalui konteks pengiriman.
- Pengiriman fallback senyap Telegram harus mengirimkan seluruh array payload terproyeksi. Pintasan satu payload dapat menjatuhkan payload fallback tambahan setelah proyeksi.
- LINE, Zalo, Nostr, dan jalur rakitan/pembantu lain yang sudah ada mungkin memiliki penanganan token balasan, proxy media, cache pesan terkirim, pembersihan loading/status, atau target khusus callback. Semua itu tetap berada pada pengiriman yang dimiliki saluran sampai semantik tersebut direpresentasikan oleh adaptor pengiriman dan diverifikasi oleh pengujian.
- Pembantu DM langsung dapat memiliki callback balasan yang merupakan satu-satunya target transport
yang benar. Outbound generik tidak boleh menebak dari
OriginatingToatauTodan melewati callback tersebut. - Keluaran kegagalan Gateway OpenClaw harus tetap terlihat oleh manusia, tetapi echo ruang
bertag yang dibuat bot harus dibuang sebelum otorisasi
allowBots. Saluran tidak boleh mengimplementasikan ini dengan filter prefiks teks terlihat kecuali sebagai penghenti darurat singkat; kontrak persisten adalah metadata asal terstruktur.
Penyimpanan internal
Antrean persisten harus menyimpan intent pengiriman pesan, bukan payload balasan.Kelas kegagalan
Adaptor saluran mengklasifikasikan kegagalan transport ke dalam kategori tertutup:- Coba ulang
transientdanrate_limit. - Jangan coba ulang
invalid_payloadkecuali ada fallback render. - Jangan coba ulang
authataupermissionsampai konfigurasi berubah. - Untuk
not_found, izinkan finalisasi langsung fallback dari edit ke pengiriman baru saat saluran menyatakan itu aman. - Untuk
conflict, gunakan aturan tanda terima/idempotensi untuk memutuskan apakah pesan sudah ada. - Kesalahan apa pun setelah adaptor mungkin telah menyelesaikan I/O platform tetapi sebelum commit
tanda terima menjadi
unknown_after_sendkecuali adaptor dapat membuktikan operasi platform tidak terjadi.
Pemetaan saluran
| Channel | Migrasi target |
|---|---|
| Telegram | Kebijakan ack penerimaan serta pengiriman final yang tahan lama. Adapter live memiliki pengiriman serta pratinjau edit, pengiriman final pratinjau kedaluwarsa, topik, lewati pratinjau balasan kutipan, fallback media, dan penanganan retry-after. |
| Discord | Adapter pengiriman membungkus pengiriman payload tahan lama yang sudah ada. Adapter live memiliki edit draf, draf progres, pembatalan pratinjau media/error, pemeliharaan target balasan, dan tanda terima id pesan. Audit gema gateway-failure buatan bot di ruang bersama; gunakan registry keluar atau padanan native lainnya jika Discord tidak dapat membawa metadata asal pada pesan normal. |
| Slack | Adapter pengiriman menangani posting chat normal. Adapter live memilih stream native saat bentuk thread mendukungnya, jika tidak maka pratinjau draf. Tanda terima mempertahankan timestamp thread. Adapter asal memetakan kegagalan Gateway OpenClaw ke chat.postMessage.metadata Slack dan membuang gema ruang bot bertag sebelum otorisasi allowBots. |
| Adapter pengiriman memiliki pengiriman teks/media dengan intent final yang tahan lama. Adapter penerimaan menangani mention grup dan identitas pengirim. Live dapat tetap tidak ada sampai WhatsApp memiliki transport yang dapat diedit. | |
| Matrix | Adapter live memiliki edit event draf, finalisasi, redaksi, batasan media terenkripsi, dan fallback ketidakcocokan target balasan. Adapter penerimaan memiliki hidrasi event terenkripsi dan dedupe. Adapter asal harus mengodekan asal gateway-failure OpenClaw ke dalam konten event Matrix dan membuang gema ruang bot yang dikonfigurasi sebelum penanganan allowBots. |
| Mattermost | Adapter live memiliki satu posting draf, pelipatan progres/tool, finalisasi di tempat, dan fallback pengiriman baru. |
| Microsoft Teams | Adapter live memiliki progres native dan perilaku stream blok. Adapter pengiriman memiliki aktivitas dan tanda terima lampiran/kartu. |
| Feishu | Adapter render memiliki rendering teks/kartu/raw. Adapter live memiliki kartu streaming dan penekanan final duplikat. Adapter pengiriman memiliki komentar, sesi topik, media, dan penekanan suara. |
| QQ Bot | Adapter live memiliki streaming C2C, timeout akumulator, dan pengiriman final fallback. Adapter render memiliki tag media dan teks-sebagai-suara. |
| Signal | Adapter penerimaan plus pengiriman sederhana. Tidak ada adapter live kecuali signal-cli menambahkan dukungan edit yang andal. |
| iMessage | Adapter penerimaan plus pengiriman sederhana. Pengiriman iMessage harus mempertahankan pengisian cache gema monitor sebelum final yang tahan lama dapat melewati pengiriman monitor. |
| Google Chat | Adapter penerimaan plus pengiriman sederhana dengan relasi thread yang dipetakan ke space dan id thread. Audit perilaku ruang allowBots=true untuk gema gateway-failure OpenClaw bertag. |
| LINE | Adapter penerimaan plus pengiriman sederhana dengan batasan reply-token yang dimodelkan sebagai kapabilitas target/relasi. |
| Nextcloud Talk | Bridge penerimaan SDK plus adapter pengiriman. |
| IRC | Adapter penerimaan plus pengiriman sederhana, tanpa tanda terima edit tahan lama. |
| Nostr | Adapter penerimaan plus pengiriman untuk DM terenkripsi; tanda terima adalah id event. |
| QA Channel | Adapter contract-test untuk perilaku penerimaan, pengiriman, live, retry, dan pemulihan. |
| Synology Chat | Adapter penerimaan plus pengiriman sederhana. |
| Tlon | Adapter pengiriman harus mempertahankan rendering tanda tangan model dan pelacakan thread yang diikuti sebelum pengiriman final tahan lama generik diaktifkan. |
| Twitch | Adapter penerimaan plus pengiriman sederhana dengan klasifikasi rate-limit. |
| Zalo | Adapter penerimaan plus pengiriman sederhana. |
| Zalo Personal | Adapter penerimaan plus pengiriman sederhana. |
Rencana migrasi
Fase 1: Domain Pesan Internal
- Tambahkan tipe
src/channels/message/*untuk pesan, target, relasi, asal, tanda terima, kapabilitas, intent tahan lama, konteks penerimaan, konteks pengiriman, konteks live, dan kelas kegagalan. - Tambahkan
origin?: MessageOriginke tipe payload bridge migrasi yang digunakan oleh pengiriman balasan saat ini, lalu pindahkan field itu keChannelMessagedan tipe pesan yang dirender saat refactor menggantikan payload balasan. - Biarkan ini tetap internal sampai adapter dan pengujian membuktikan bentuknya.
- Tambahkan pengujian unit murni untuk transisi state dan serialisasi.
Fase 2: Core Pengiriman Tahan Lama
- Pindahkan antrean keluar yang ada dari durabilitas reply-payload ke intent pengiriman pesan tahan lama.
- Izinkan intent pengiriman tahan lama membawa array payload terproyeksi atau rencana batch, bukan hanya satu payload balasan.
- Pertahankan perilaku pemulihan antrean saat ini melalui konversi kompatibilitas.
- Buat
deliverOutboundPayloadsmemanggilmessages.send. - Jadikan durabilitas pengiriman final sebagai default dan gagal tertutup saat intent tahan lama tidak dapat ditulis dalam siklus hidup pesan baru, setelah adapter mendeklarasikan keamanan replay. Jalur kompatibilitas channel-turn dan SDK yang sudah ada tetap direct-send secara default selama fase ini.
- Catat tanda terima secara konsisten.
- Kembalikan tanda terima dan hasil pengiriman ke pemanggil dispatcher asli, alih-alih memperlakukan pengiriman tahan lama sebagai efek samping terminal.
- Persistenkan asal pesan melalui intent pengiriman tahan lama agar pemulihan, replay, dan pengiriman terpotong mempertahankan provenance operasional OpenClaw.
Fase 3: Bridge Channel Turn
- Implementasikan ulang
channel.turn.rundandispatchAssembledChannelTurndi atasmessages.receivedanmessages.send. - Pertahankan tipe fakta saat ini tetap stabil.
- Pertahankan perilaku legacy secara default. Channel assembled-turn menjadi tahan lama hanya saat adapternya secara eksplisit ikut serta dengan kebijakan durabilitas yang aman replay.
- Pertahankan
durable: falsesebagai escape hatch kompatibilitas untuk jalur yang memfinalisasi edit native dan belum dapat replay dengan aman, tetapi jangan mengandalkan markerfalseuntuk melindungi channel yang belum dimigrasikan. - Jadikan durabilitas assembled-turn default hanya dalam siklus hidup pesan baru, setelah pemetaan channel membuktikan bahwa jalur pengiriman generik mempertahankan semantik pengiriman channel lama.
Fase 4: Bridge Dispatcher yang Disiapkan
- Ganti
deliverDurableInboundReplyPayloaddengan jembatan konteks pengiriman. - Pertahankan helper lama sebagai wrapper.
- Porting Telegram, WhatsApp, Slack, Signal, iMessage, dan Discord terlebih dahulu karena semuanya sudah memiliki pekerjaan final-tahan-lama atau jalur pengiriman yang lebih sederhana.
- Perlakukan setiap dispatcher yang disiapkan sebagai belum tercakup sampai secara eksplisit ikut serta dalam konteks pengiriman. Dokumentasi dan entri changelog harus mengatakan “turn saluran yang dirakit” atau menyebut jalur saluran yang dimigrasikan alih-alih mengklaim semua balasan final otomatis.
- Pertahankan perilaku
recordInboundSessionAndDispatchReply, helper direct-DM, dan helper kompatibilitas publik serupa. Helper tersebut dapat mengekspos ikut serta konteks pengiriman secara eksplisit nanti, tetapi tidak boleh secara otomatis mencoba pengiriman tahan-lama generik sebelum callback pengiriman milik pemanggil.
Fase 5: Siklus Hidup Live Terpadu
- Bangun
messages.livedengan dua adapter pembuktian:- Telegram untuk kirim plus edit plus kirim final basi.
- Matrix untuk finalisasi draf plus fallback redaksi.
- Lalu migrasikan Discord, Slack, Mattermost, Teams, QQ Bot, dan Feishu.
- Hapus kode finalisasi pratinjau yang terduplikasi hanya setelah setiap saluran memiliki pengujian paritas.
Fase 6: SDK Publik
- Tambahkan
openclaw/plugin-sdk/channel-message. - Dokumentasikan sebagai API Plugin saluran yang disukai.
- Perbarui ekspor paket, inventaris entrypoint, baseline API yang dihasilkan, dan dokumentasi SDK Plugin.
- Sertakan
MessageOrigin, hook encode/decode origin, dan predikat bersamashouldDropOpenClawEchodi permukaan SDK channel-message. - Pertahankan wrapper kompatibilitas untuk subpath lama.
- Tandai helper SDK bernama reply sebagai usang dalam dokumentasi setelah Plugin bawaan dimigrasikan.
Fase 7: Semua Pengirim
Pindahkan semua produsen outbound non-reply kemessages.send:
- notifikasi Cron dan Heartbeat
- penyelesaian tugas
- hasil hook
- prompt persetujuan dan hasil persetujuan
- pengiriman message tool
- pengumuman penyelesaian subagent
- pengiriman CLI atau UI Kontrol eksplisit
- jalur otomatisasi/broadcast
Fase 8: Depresiasi Turn
- Pertahankan
channel.turnsebagai wrapper untuk setidaknya satu jendela kompatibilitas. - Publikasikan catatan migrasi.
- Jalankan pengujian kompatibilitas SDK Plugin terhadap impor lama.
- Hapus atau sembunyikan helper internal lama hanya setelah tidak ada Plugin bawaan yang membutuhkannya dan kontrak pihak ketiga memiliki pengganti yang stabil.
Rencana pengujian
Pengujian unit:- Serialisasi dan pemulihan intent pengiriman tahan-lama.
- Penggunaan ulang kunci idempotensi dan penekanan duplikat.
- Commit receipt dan lewati replay.
- Pemulihan
unknown_after_sendyang merekonsiliasi sebelum replay saat sebuah adapter mendukung rekonsiliasi. - Kebijakan klasifikasi kegagalan.
- Urutan kebijakan ack terima.
- Pemetaan relasi untuk pengiriman reply, followup, system, dan broadcast.
- Factory origin kegagalan Gateway dan predikat
shouldDropOpenClawEcho. - Pelestarian origin melalui normalisasi payload, chunking, serialisasi antrean tahan-lama, dan pemulihan.
- Adapter sederhana
channel.turn.runtetap mencatat dan mengirim. - Pengiriman assembled-turn lama tidak menjadi tahan-lama kecuali saluran secara eksplisit ikut serta.
- Jembatan
channel.turn.runPreparedtetap mencatat dan memfinalisasi. - Helper kompatibilitas publik memanggil callback pengiriman milik pemanggil secara default dan tidak melakukan generic-send sebelum callback tersebut.
- Pengiriman fallback tahan-lama memutar ulang seluruh array payload yang diproyeksikan setelah restart dan tidak dapat membuat payload berikutnya tidak tercatat setelah crash awal.
- Pengiriman assembled-turn tahan-lama mengembalikan id pesan platform ke dispatcher buffered.
- Hook pengiriman kustom tetap mengembalikan id pesan platform saat pengiriman tahan-lama dinonaktifkan atau tidak tersedia.
- Balasan final bertahan dari restart antara penyelesaian asisten dan pengiriman platform.
- Draf pratinjau difinalisasi di tempat saat diizinkan.
- Draf pratinjau dibatalkan atau direduksi saat ketidakcocokan media/error/target-reply memerlukan pengiriman normal.
- Streaming blok dan streaming pratinjau tidak sama-sama mengirim teks yang sama.
- Media yang di-stream lebih awal tidak diduplikasi dalam pengiriman final.
- Reply topik Telegram dengan ack polling ditunda sampai watermark completed aman milik konteks penerimaan.
- Pemulihan polling Telegram untuk update yang diterima-tetapi-belum-terkirim tercakup oleh model offset safe-completed yang dipersistenkan.
- Pratinjau basi Telegram mengirim final baru dan membersihkan pratinjau.
- Fallback senyap Telegram mengirim setiap payload fallback yang diproyeksikan.
- Durabilitas fallback senyap Telegram mencatat seluruh array fallback yang diproyeksikan secara atomik, bukan satu intent tahan-lama payload-tunggal per iterasi loop.
- Pembatalan pratinjau Discord pada media/error/reply eksplisit.
- Final dispatcher siap pakai Discord dirutekan melalui konteks pengiriman sebelum dokumentasi atau changelog mengklaim durabilitas final-reply Discord.
- Pengiriman final tahan-lama iMessage mengisi cache echo pesan terkirim monitor.
- Jalur pengiriman lama LINE, Zalo, dan Nostr tidak dilewati oleh pengiriman tahan-lama generik sampai pengujian paritas adapternya ada.
- Pengiriman callback Direct-DM/Nostr tetap otoritatif kecuali dimigrasikan secara eksplisit ke target pesan lengkap dan adapter pengiriman yang aman untuk replay.
- Pesan kegagalan Gateway OpenClaw bertag Slack tetap terlihat outbound, echo
ruang bot bertag turun sebelum
allowBots, dan pesan bot tanpa tag dengan teks terlihat yang sama tetap mengikuti otorisasi bot normal. - Fallback stream native Slack ke pratinjau draf dalam DM tingkat atas.
- Finalisasi pratinjau Matrix dan fallback redaksi.
- Echo ruang kegagalan Gateway OpenClaw bertag Matrix dari akun bot yang dikonfigurasi
turun sebelum penanganan
allowBots. - Audit cascade kegagalan Gateway ruang bersama Discord dan Google Chat mencakup
mode
allowBotssebelum mengklaim perlindungan generik di sana. - Finalisasi draf Mattermost dan fallback kirim-baru.
- Finalisasi progres native Teams.
- Penekanan final duplikat Feishu.
- Fallback timeout akumulator QQ Bot.
- Pengiriman final tahan-lama Tlon mempertahankan rendering tanda tangan model dan pelacakan thread yang diikuti.
- Pengiriman final tahan-lama sederhana WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk, Synology Chat, Tlon, Twitch, Zalo, dan Zalo Personal.
- File Vitest tertarget selama pengembangan.
pnpm check:changeddi Testbox untuk seluruh permukaan yang berubah.pnpm checkyang lebih luas di Testbox sebelum mendaratkan refactor lengkap atau setelah perubahan SDK/ekspor publik.- Smoke live atau qa-channel untuk setidaknya satu saluran berkemampuan edit dan satu saluran sederhana hanya-kirim sebelum menghapus wrapper kompatibilitas.
Pertanyaan terbuka
- Apakah Telegram pada akhirnya harus mengganti sumber runner grammY dengan sumber polling yang sepenuhnya tahan-lama yang dapat mengendalikan redelivery tingkat platform, bukan hanya watermark restart yang dipersistenkan milik OpenClaw.
- Apakah status pratinjau live tahan-lama harus disimpan dalam record antrean yang sama dengan intent pengiriman final atau dalam penyimpanan status live saudara.
- Berapa lama wrapper kompatibilitas tetap terdokumentasi setelah
plugin-sdk/channel-messagedirilis. - Apakah Plugin pihak ketiga harus mengimplementasikan adapter receive secara langsung atau hanya
menyediakan hook normalize/send/live melalui
defineChannelMessageAdapter. - Field receipt mana yang aman diekspos di SDK publik versus status runtime internal.
- Apakah efek samping seperti cache self-echo dan penanda participated-thread harus dimodelkan sebagai hook konteks pengiriman, langkah finalize milik adapter, atau subscriber receipt.
- Saluran mana yang memiliki metadata origin native, mana yang memerlukan registry outbound yang dipersistenkan, dan mana yang tidak dapat menawarkan penekanan echo lintas-bot yang andal.
Kriteria penerimaan
- Setiap saluran pesan bawaan mengirim output final yang terlihat melalui
messages.send. - Setiap saluran pesan inbound masuk melalui
messages.receiveatau wrapper kompatibilitas terdokumentasi. - Setiap saluran pratinjau/edit/stream menggunakan
messages.liveuntuk status draf dan finalisasi. channel.turnhanya sebuah wrapper.- Helper SDK bernama reply adalah ekspor kompatibilitas, bukan jalur yang direkomendasikan.
- Pemulihan tahan-lama dapat memutar ulang pengiriman final tertunda setelah restart tanpa kehilangan respons final atau menduplikasi pengiriman yang sudah di-commit; pengiriman yang hasil platformnya tidak diketahui direkonsiliasi sebelum replay atau didokumentasikan sebagai at-least-once untuk adapter tersebut.
- Pengiriman final tahan-lama fail closed saat intent tahan-lama tidak dapat ditulis, kecuali pemanggil secara eksplisit memilih mode non-tahan-lama yang terdokumentasi.
- Helper kompatibilitas channel-turn dan SDK lama default ke pengiriman langsung milik saluran; pengiriman tahan-lama generik hanya ikut serta eksplisit.
- Receipt mempertahankan semua id pesan platform untuk pengiriman multi-bagian dan id utama untuk kemudahan threading/edit.
- Wrapper tahan-lama mempertahankan efek samping lokal saluran sebelum mengganti callback pengiriman langsung.
- Dispatcher siap pakai tidak dihitung tahan-lama sampai jalur pengiriman finalnya secara eksplisit menggunakan konteks pengiriman.
- Pengiriman fallback menangani setiap payload yang diproyeksikan.
- Pengiriman fallback tahan-lama mencatat setiap payload yang diproyeksikan dalam satu intent atau rencana batch yang dapat di-replay.
- Output kegagalan Gateway yang berasal dari OpenClaw terlihat oleh manusia tetapi echo ruang yang dibuat bot dan bertag dibuang sebelum otorisasi bot pada saluran yang menyatakan dukungan untuk kontrak origin.
- Dokumentasi menjelaskan pengiriman, penerimaan, live, status, receipt, relasi, kebijakan kegagalan, migrasi, dan cakupan pengujian.