Protokol gateway (WebSocket)
Protokol WS Gateway adalah control plane + transport node tunggal untuk OpenClaw. Semua klien (CLI, UI web, app macOS, node iOS/Android, node headless) terhubung melalui WebSocket dan mendeklarasikan role + scope mereka saat handshake.Transport
- WebSocket, frame teks dengan payload JSON.
- Frame pertama harus berupa permintaan
connect.
Handshake (connect)
Gateway → Klien (tantangan pra-koneksi):hello-ok juga menyertakan:
hello-ok.auth juga dapat menyertakan entri
role tambahan yang dibatasi dalam deviceTokens:
scopes: [] dan token operator yang di-handoff tetap dibatasi pada allowlist operator bootstrap
(operator.approvals, operator.read,
operator.talk.secrets, operator.write). Pemeriksaan scope bootstrap tetap
berawalan role: entri operator hanya memenuhi permintaan operator, dan role non-operator
tetap memerlukan scope di bawah prefiks role mereka sendiri.
Contoh node
Framing
- Permintaan:
{type:"req", id, method, params} - Respons:
{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
Roles + scopes
Roles
operator= klien control plane (CLI/UI/otomatisasi).node= host kapabilitas (camera/screen/canvas/system.run).
Scopes (operator)
Scope umum:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config dengan includeSecrets: true memerlukan operator.talk.secrets
(atau operator.admin).
Metode RPC gateway yang didaftarkan plugin dapat meminta scope operatornya sendiri, tetapi
prefiks admin inti yang dicadangkan (config.*, exec.approvals.*, wizard.*,
update.*) selalu diresolusikan ke operator.admin.
Scope metode hanyalah gerbang pertama. Beberapa slash command yang dicapai melalui
chat.send menerapkan pemeriksaan tingkat perintah yang lebih ketat di atasnya. Misalnya,
penulisan persisten /config set dan /config unset memerlukan operator.admin.
node.pair.approve juga memiliki pemeriksaan scope tambahan pada saat persetujuan di atas
scope metode dasar:
- permintaan tanpa perintah:
operator.pairing - permintaan dengan perintah node non-exec:
operator.pairing+operator.write - permintaan yang menyertakan
system.run,system.run.prepare, atausystem.which:operator.pairing+operator.admin
Caps/commands/permissions (node)
Node mendeklarasikan klaim kapabilitas saat waktu connect:caps: kategori kapabilitas tingkat tinggi.commands: allowlist perintah untuk invoke.permissions: toggle terperinci (misalnyascreen.record,camera.capture).
Presence
system-presencemengembalikan entri yang diberi key oleh identitas perangkat.- Entri presence mencakup
deviceId,roles, danscopessehingga UI dapat menampilkan satu baris per perangkat bahkan saat perangkat itu terhubung sebagai operator dan node.
Keluarga metode RPC umum
Halaman ini bukan dump penuh yang dihasilkan, tetapi permukaan WS publik lebih luas daripada contoh handshake/auth di atas. Ini adalah keluarga metode utama yang diekspose Gateway saat ini.hello-ok.features.methods adalah daftar penemuan konservatif yang dibangun dari
src/gateway/server-methods-list.ts ditambah ekspor metode plugin/channel yang dimuat.
Perlakukan ini sebagai penemuan fitur, bukan sebagai dump hasil generate dari setiap helper yang dapat dipanggil
yang diimplementasikan di src/gateway/server-methods/*.ts.
Sistem dan identitas
healthmengembalikan snapshot kesehatan gateway yang di-cache atau baru diprobe.statusmengembalikan ringkasan gateway bergaya/status; field sensitif hanya disertakan untuk klien operator dengan scope admin.gateway.identity.getmengembalikan identitas perangkat gateway yang digunakan oleh alur relay dan pairing.system-presencemengembalikan snapshot presence saat ini untuk perangkat operator/node yang terhubung.system-eventmenambahkan event sistem dan dapat memperbarui/menyiarkan context presence.last-heartbeatmengembalikan event heartbeat tersimpan terbaru.set-heartbeatsmengaktifkan/menonaktifkan pemrosesan heartbeat pada gateway.
Model dan penggunaan
models.listmengembalikan katalog model yang diizinkan runtime.usage.statusmengembalikan ringkasan jendela penggunaan provider/kuota tersisa.usage.costmengembalikan ringkasan penggunaan biaya teragregasi untuk rentang tanggal.doctor.memory.statusmengembalikan kesiapan vector-memory / embedding untuk workspace agen default aktif.sessions.usagemengembalikan ringkasan penggunaan per sesi.sessions.usage.timeseriesmengembalikan penggunaan deret waktu untuk satu sesi.sessions.usage.logsmengembalikan entri log penggunaan untuk satu sesi.
Channel dan helper login
channels.statusmengembalikan ringkasan status channel/plugin bawaan + terbundel.channels.logoutmelakukan logout dari channel/akun tertentu jika channel mendukung logout.web.login.startmemulai alur login QR/web untuk provider channel web yang mampu menampilkan QR saat ini.web.login.waitmenunggu alur login QR/web tersebut selesai dan memulai channel saat berhasil.push.testmengirim push APNs uji ke node iOS yang terdaftar.voicewake.getmengembalikan pemicu wake-word yang tersimpan.voicewake.setmemperbarui pemicu wake-word dan menyiarkan perubahan.
Pesan dan log
sendadalah RPC pengiriman keluar langsung untuk pengiriman yang ditargetkan ke channel/akun/thread di luar chat runner.logs.tailmengembalikan tail log file gateway yang dikonfigurasi dengan kontrol cursor/limit dan byte maksimum.
Talk dan TTS
talk.configmengembalikan payload config Talk yang efektif;includeSecretsmemerlukanoperator.talk.secrets(atauoperator.admin).talk.modemenetapkan/menyiarkan status mode Talk saat ini untuk klien WebChat/Control UI.talk.speakmensintesis ucapan melalui provider speech Talk yang aktif.tts.statusmengembalikan status TTS aktif, provider aktif, provider fallback, dan status config provider.tts.providersmengembalikan inventaris provider TTS yang terlihat.tts.enabledantts.disablemengubah status preferensi TTS.tts.setProvidermemperbarui provider TTS yang diutamakan.tts.convertmenjalankan konversi text-to-speech sekali jalan.
Secrets, config, update, dan wizard
secrets.reloadmeresolusikan ulang SecretRef aktif dan menukar status secret runtime hanya saat seluruh proses berhasil.secrets.resolvemeresolusikan penetapan secret target-perintah untuk sekumpulan perintah/target tertentu.config.getmengembalikan snapshot dan hash config saat ini.config.setmenulis payload config yang tervalidasi.config.patchmenggabungkan pembaruan config parsial.config.applymemvalidasi + mengganti seluruh payload config.config.schemamengembalikan payload skema config live yang digunakan oleh Control UI dan tooling CLI: skema,uiHints, versi, dan metadata generasi, termasuk metadata skema plugin + channel saat runtime dapat memuatnya. Skema ini mencakup metadata fieldtitle/descriptionyang diturunkan dari label yang sama dan teks bantuan yang digunakan UI, termasuk object bertingkat, wildcard, item array, dan cabang komposisianyOf/oneOf/allOfsaat dokumentasi field yang cocok tersedia.config.schema.lookupmengembalikan payload lookup yang dicakup path untuk satu path config: path yang dinormalisasi, node skema dangkal, petunjuk yang cocok +hintPath, dan ringkasan child langsung untuk drill-down UI/CLI.- Node skema lookup mempertahankan dokumentasi yang terlihat pengguna dan field validasi umum:
title,description,type,enum,const,format,pattern, batas numerik/string/array/object, dan flag boolean sepertiadditionalProperties,deprecated,readOnly,writeOnly. - Ringkasan child mengekspos
key,pathyang dinormalisasi,type,required,hasChildren, plushint/hintPathyang cocok.
- Node skema lookup mempertahankan dokumentasi yang terlihat pengguna dan field validasi umum:
update.runmenjalankan alur pembaruan gateway dan menjadwalkan mulai ulang hanya saat pembaruan itu sendiri berhasil.wizard.start,wizard.next,wizard.status, danwizard.cancelmengekspos wizard onboarding melalui WS RPC.
Keluarga utama yang sudah ada
Helper agen dan workspace
agents.listmengembalikan entri agen yang dikonfigurasi.agents.create,agents.update, danagents.deletemengelola catatan agen dan pengkabelan workspace.agents.files.list,agents.files.get, danagents.files.setmengelola file bootstrap workspace yang diekspos untuk sebuah agen.agent.identity.getmengembalikan identitas asisten yang efektif untuk agen atau sesi.agent.waitmenunggu sebuah eksekusi selesai dan mengembalikan snapshot terminal saat tersedia.
Kontrol sesi
sessions.listmengembalikan indeks sesi saat ini.sessions.subscribedansessions.unsubscribemengaktifkan/menonaktifkan langganan event perubahan sesi untuk klien WS saat ini.sessions.messages.subscribedansessions.messages.unsubscribemengaktifkan/menonaktifkan langganan event transkrip/pesan untuk satu sesi.sessions.previewmengembalikan pratinjau transkrip terbatas untuk session key tertentu.sessions.resolvemeresolusikan atau mengkanonisasi target sesi.sessions.createmembuat entri sesi baru.sessions.sendmengirim pesan ke sesi yang ada.sessions.steeradalah varian interrupt-and-steer untuk sesi yang aktif.sessions.abortmembatalkan pekerjaan aktif untuk sebuah sesi.sessions.patchmemperbarui metadata/override sesi.sessions.reset,sessions.delete, dansessions.compactmelakukan pemeliharaan sesi.sessions.getmengembalikan baris sesi tersimpan lengkap.- eksekusi chat masih menggunakan
chat.history,chat.send,chat.abort, danchat.inject. chat.historydinormalisasi untuk tampilan pada klien UI: tag directive inline dihapus dari teks yang terlihat, payload XML pemanggilan tool teks biasa (termasuk<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, dan blok pemanggilan tool yang terpotong) serta token kontrol model ASCII/lebar penuh yang bocor dihapus, baris asisten token-senyap murni sepertiNO_REPLY/no_replyyang persis sama dihilangkan, dan baris yang terlalu besar dapat diganti dengan placeholder.
Pairing perangkat dan token perangkat
device.pair.listmengembalikan perangkat berpasangan yang tertunda dan disetujui.device.pair.approve,device.pair.reject, dandevice.pair.removemengelola catatan pairing perangkat.device.token.rotatemerotasi token perangkat yang berpasangan di dalam batas role dan scope yang disetujui.device.token.revokemencabut token perangkat yang berpasangan.
Pairing node, invoke, dan pekerjaan tertunda
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject, dannode.pair.verifymencakup pairing node dan verifikasi bootstrap.node.listdannode.describemengembalikan status node yang diketahui/terhubung.node.renamememperbarui label node yang berpasangan.node.invokemeneruskan perintah ke node yang terhubung.node.invoke.resultmengembalikan hasil untuk permintaan invoke.node.eventmembawa event yang berasal dari node kembali ke gateway.node.canvas.capability.refreshmenyegarkan token kapabilitas canvas yang dicakup.node.pending.pulldannode.pending.ackadalah API antrean node terhubung.node.pending.enqueuedannode.pending.drainmengelola pekerjaan tertunda yang tahan lama untuk node offline/terputus.
Keluarga persetujuan
exec.approval.requestdanexec.approval.resolvemencakup permintaan persetujuan exec sekali jalan.exec.approval.waitDecisionmenunggu satu persetujuan exec tertunda dan mengembalikan keputusan akhir (ataunullsaat timeout).exec.approvals.getdanexec.approvals.setmengelola snapshot kebijakan persetujuan exec gateway.exec.approvals.node.getdanexec.approvals.node.setmengelola kebijakan persetujuan exec lokal node melalui perintah relay node.plugin.approval.request,plugin.approval.waitDecision, danplugin.approval.resolvemencakup alur persetujuan yang didefinisikan plugin.
Keluarga utama lainnya
- otomatisasi:
wakemenjadwalkan injeksi teks wake segera atau pada heartbeat berikutnyacron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- skills/tools:
skills.*,tools.catalog,tools.effective
Keluarga event umum
chat: pembaruan chat UI sepertichat.injectdan event chat lain yang hanya untuk transkrip.session.messagedansession.tool: pembaruan transkrip/aliran event untuk sesi yang dilanggani.sessions.changed: indeks sesi atau metadata berubah.presence: pembaruan snapshot presence sistem.tick: event keepalive / liveness berkala.health: pembaruan snapshot kesehatan gateway.heartbeat: pembaruan aliran event heartbeat.cron: event perubahan eksekusi/pekerjaan cron.shutdown: notifikasi shutdown gateway.node.pair.requested/node.pair.resolved: siklus hidup pairing node.node.invoke.request: siaran permintaan invoke node.device.pair.requested/device.pair.resolved: siklus hidup perangkat berpasangan.voicewake.changed: config pemicu wake-word berubah.exec.approval.requested/exec.approval.resolved: siklus hidup persetujuan exec.plugin.approval.requested/plugin.approval.resolved: siklus hidup persetujuan plugin.
Metode helper node
- Node dapat memanggil
skills.binsuntuk mengambil daftar executable skill saat ini untuk pemeriksaan auto-allow.
Metode helper operator
- Operator dapat memanggil
tools.catalog(operator.read) untuk mengambil katalog tool runtime untuk sebuah agen. Responsnya mencakup tool yang dikelompokkan dan metadata provenance:source:coreataupluginpluginId: pemilik plugin saatsource="plugin"optional: apakah tool plugin bersifat opsional
- Operator dapat memanggil
tools.effective(operator.read) untuk mengambil inventaris tool efektif runtime untuk sebuah sesi.sessionKeywajib.- Gateway menurunkan context runtime tepercaya dari sesi di sisi server alih-alih menerima auth atau context pengiriman yang disediakan pemanggil.
- Responsnya dicakup per sesi dan mencerminkan apa yang dapat digunakan percakapan aktif saat ini, termasuk tool inti, plugin, dan channel.
- Operator dapat memanggil
skills.status(operator.read) untuk mengambil inventaris skill yang terlihat bagi sebuah agen.agentIdbersifat opsional; hilangkan untuk membaca workspace agen default.- Responsnya mencakup kelayakan, persyaratan yang hilang, pemeriksaan config, dan opsi instalasi yang telah disanitasi tanpa mengekspos nilai secret mentah.
- Operator dapat memanggil
skills.searchdanskills.detail(operator.read) untuk metadata penemuan ClawHub. - Operator dapat memanggil
skills.install(operator.admin) dalam dua mode:- Mode ClawHub:
{ source: "clawhub", slug, version?, force? }menginstal folder skill ke direktoriskills/workspace agen default. - Mode installer gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }menjalankan aksimetadata.openclaw.installyang dideklarasikan pada host gateway.
- Mode ClawHub:
- Operator dapat memanggil
skills.update(operator.admin) dalam dua mode:- Mode ClawHub memperbarui satu slug yang dilacak atau semua instalasi ClawHub yang dilacak di workspace agen default.
- Mode config mem-patch nilai
skills.entries.<skillKey>sepertienabled,apiKey, danenv.
Persetujuan exec
- Saat permintaan exec memerlukan persetujuan, gateway menyiarkan
exec.approval.requested. - Klien operator menyelesaikannya dengan memanggil
exec.approval.resolve(memerlukan scopeoperator.approvals). - Untuk
host=node,exec.approval.requestharus menyertakansystemRunPlan(argv/cwd/rawCommand/metadata sesi kanonis). Permintaan yang tidak memilikisystemRunPlanditolak. - Setelah persetujuan, panggilan
node.invoke system.runyang diteruskan menggunakan kembalisystemRunPlankanonis tersebut sebagai context perintah/cwd/sesi yang otoritatif. - Jika pemanggil memodifikasi
command,rawCommand,cwd,agentId, atausessionKeyantara prepare dan penerusan akhirsystem.runyang disetujui, gateway menolak eksekusi tersebut alih-alih mempercayai payload yang diubah.
Fallback pengiriman agen
- Permintaan
agentdapat menyertakandeliver=trueuntuk meminta pengiriman keluar. bestEffortDeliver=falsemempertahankan perilaku ketat: target pengiriman yang tidak teresolusikan atau hanya-internal mengembalikanINVALID_REQUEST.bestEffortDeliver=truememungkinkan fallback ke eksekusi khusus-sesi saat tidak ada rute eksternal yang dapat dikirim yang dapat diresolusikan (misalnya sesi internal/webchat atau config multi-channel yang ambigu).
Pembuatan versi
PROTOCOL_VERSIONberada disrc/gateway/protocol/schema.ts.- Klien mengirim
minProtocol+maxProtocol; server menolak ketidakcocokan. - Skema + model dihasilkan dari definisi TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth
- Auth gateway dengan shared-secret menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, tergantung pada mode auth yang dikonfigurasi. - Mode yang membawa identitas seperti Tailscale Serve
(
gateway.auth.allowTailscale: true) ataugateway.auth.mode: "trusted-proxy"non-loopback memenuhi pemeriksaan auth connect dari header permintaan alih-alihconnect.params.auth.*. - Ingress privat
gateway.auth.mode: "none"sepenuhnya melewati auth connect shared-secret; jangan ekspos mode itu pada ingress publik/tidak tepercaya. - Setelah pairing, Gateway menerbitkan token perangkat yang dicakup ke role + scope koneksi.
Token itu dikembalikan dalam
hello-ok.auth.deviceTokendan harus dipertahankan oleh klien untuk koneksi berikutnya. - Klien harus mempertahankan
hello-ok.auth.deviceTokenutama setelah connect berhasil mana pun. - Menyambung kembali dengan token perangkat tersimpan itu juga harus menggunakan kembali kumpulan scope tersimpan yang telah disetujui untuk token tersebut. Ini mempertahankan akses baca/probe/status yang sudah diberikan dan menghindari runtuhnya penyambungan ulang secara diam-diam ke scope implicit admin-only yang lebih sempit.
- Prioritas auth connect normal adalah token/password bersama eksplisit terlebih dahulu, lalu
deviceTokeneksplisit, lalu token per-perangkat tersimpan, lalu token bootstrap. - Entri tambahan
hello-ok.auth.deviceTokensadalah token handoff bootstrap. Pertahankan token itu hanya saat connect menggunakan auth bootstrap pada transport tepercaya sepertiwss://atau pairing loopback/lokal. - Jika klien memasok
deviceTokeneksplisit atauscopeseksplisit, kumpulan scope yang diminta pemanggil itu tetap otoritatif; scope cache hanya digunakan kembali saat klien menggunakan kembali token per-perangkat tersimpan. - Token perangkat dapat dirotasi/dicabut melalui
device.token.rotatedandevice.token.revoke(memerlukan scopeoperator.pairing). - Penerbitan/rotasi token tetap dibatasi pada kumpulan role yang disetujui yang dicatat di entri pairing perangkat tersebut; merotasi token tidak dapat memperluas perangkat ke role yang tidak pernah diberikan oleh persetujuan pairing.
- Untuk sesi token perangkat berpasangan, manajemen perangkat dicakup ke diri sendiri kecuali
pemanggil juga memiliki
operator.admin: pemanggil non-admin hanya dapat menghapus/mencabut/merotasi entri perangkat mereka sendiri. device.token.rotatejuga memeriksa kumpulan scope operator yang diminta terhadap scope sesi pemanggil saat ini. Pemanggil non-admin tidak dapat merotasi token ke kumpulan scope operator yang lebih luas daripada yang sudah mereka pegang.- Kegagalan auth mencakup
error.details.codeplus petunjuk pemulihan:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Perilaku klien untuk
AUTH_TOKEN_MISMATCH:- Klien tepercaya dapat mencoba satu percobaan ulang terbatas dengan token per-perangkat cache.
- Jika percobaan ulang itu gagal, klien harus menghentikan loop penyambungan ulang otomatis dan menampilkan panduan tindakan operator.
Identitas perangkat + pairing
- Node harus menyertakan identitas perangkat stabil (
device.id) yang diturunkan dari fingerprint keypair. - Gateway menerbitkan token per perangkat + role.
- Persetujuan pairing diperlukan untuk
device.idbaru kecuali persetujuan otomatis lokal diaktifkan. - Persetujuan otomatis pairing berpusat pada koneksi direct local loopback.
- OpenClaw juga memiliki jalur self-connect backend/container-local yang sempit untuk alur helper shared-secret tepercaya.
- Koneksi tailnet atau LAN host yang sama tetap diperlakukan sebagai remote untuk pairing dan memerlukan persetujuan.
- Semua klien WS harus menyertakan identitas
deviceselamaconnect(operator + node). Control UI hanya dapat menghilangkannya dalam mode berikut:gateway.controlUi.allowInsecureAuth=trueuntuk kompatibilitas HTTP tidak aman khusus localhost.- auth operator
gateway.auth.mode: "trusted-proxy"Control UI yang berhasil. gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, penurunan keamanan berat).
- Semua koneksi harus menandatangani nonce
connect.challengeyang disediakan server.
Diagnostik migrasi auth perangkat
Untuk klien lama yang masih menggunakan perilaku penandatanganan pra-challenge,connect kini mengembalikan
kode detail DEVICE_AUTH_* di bawah error.details.code dengan error.details.reason yang stabil.
Kegagalan migrasi umum:
| Pesan | details.code | details.reason | Arti |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Klien menghilangkan device.nonce (atau mengirim kosong). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Klien menandatangani dengan nonce yang basi/salah. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Payload tanda tangan tidak cocok dengan payload v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Stempel waktu yang ditandatangani berada di luar skew yang diizinkan. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id tidak cocok dengan fingerprint public key. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Format/kanonisasi public key gagal. |
- Selalu tunggu
connect.challenge. - Tanda tangani payload v2 yang mencakup nonce server.
- Kirim nonce yang sama di
connect.params.device.nonce. - Payload tanda tangan yang disarankan adalah
v3, yang mengikatplatformdandeviceFamilyselain field device/client/role/scopes/token/nonce. - Tanda tangan
v2lama tetap diterima untuk kompatibilitas, tetapi pinning metadata perangkat berpasangan tetap mengontrol kebijakan perintah saat reconnect.
TLS + pinning
- TLS didukung untuk koneksi WS.
- Klien secara opsional dapat mem-pin fingerprint sertifikat gateway (lihat config
gateway.tlsplusgateway.remote.tlsFingerprintatau CLI--tls-fingerprint).
Cakupan
Protokol ini mengekspos API gateway penuh (status, channel, model, chat, agen, sesi, node, persetujuan, dll.). Permukaan pastinya didefinisikan oleh skema TypeBox disrc/gateway/protocol/schema.ts.