Gateway
Protokol Gateway
Gateway protokol WS adalah bidang kontrol tunggal dan transportasi Node untuk OpenClaw. Klien operator dan Node (CLI, UI web, aplikasi macOS, Node iOS/Android, Node headless) terhubung melalui WebSocket dan mendeklarasikan peran serta cakupan saat handshake.
Paket npm
Paket-paket ini disertakan dalam rangkaian rilis OpenClaw. Selama peluncuran awal,
npm mungkin mengembalikan E404 hingga rilis pertama yang memuat paket dipublikasikan.
@openclaw/gateway-protocolmemublikasikan skema, validator, tipe TypeScript, pembantu frame dan galat yang ringan, serta konstanta versi. Tarball-nya menyertakan kontrak yang dapat dibaca mesinprotocol.schema.jsonyang dihasilkan.@openclaw/gateway-clientmemublikasikan klien Node referensi dan titik masuk yang aman untuk peramban di@openclaw/gateway-client/browser.
Untuk panduan siklus hidup aplikasi, lihat Membangun klien Gateway. Untuk aplikasi yang mengawasi Gateway sebagai proses anak, lihat Menyematkan OpenClaw.
Transportasi dan framing
- WebSocket, frame teks, payload JSON.
- Frame pertama harus berupa permintaan
connect. - Frame prapenyambungan dibatasi hingga 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES). Setelah handshake, ikutihello-ok.policy.maxPayloaddanhello-ok.policy.maxBufferedBytes. Dengan diagnostik diaktifkan, frame masuk yang terlalu besar dan buffer keluar yang lambat memancarkan peristiwapayload.largesebelum gateway menutup atau membuang frame. Peristiwa ini membawasurface, ukuran byte, batas, dan kode alasan yang aman, tetapi tidak pernah memuat isi pesan, konten lampiran, byte frame mentah, token, cookie, atau rahasia.
Bentuk frame:
- Permintaan:
{type:"req", id, method, params} - Respons:
{type:"res", id, ok, payload|error} - Peristiwa:
{type:"event", event, payload, seq?, stateVersion?}
Galat respons menggunakan { code, message, details?, retryable?, retryAfterMs? }.
Klien sebaiknya membuat percabangan berdasarkan code dan details.code; message tetap dapat dibaca manusia
dan dapat berubah, kecuali jika catatan kompatibilitas menyatakan sebaliknya. Kegagalan
otorisasi tingkat metode menggunakan code: "FORBIDDEN" tingkat atas dengan detail
cakupan yang tidak tersedia secara terstruktur:
- Cakupan tidak tersedia:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }.requiredScopesadalah kumpulan lengkap cakupan yang diketahui untuk operasi yang diminta. Pesan lamamissing scope: <scope>dipertahankan untuk klien lama.
Klien sebaiknya membaca details terlebih dahulu dan menggunakan pesan lama hanya sebagai fallback
kompatibilitas. readMissingScopeError dan readMissingScopeErrorDetails diekspor dari
@openclaw/gateway-protocol/gateway-error-details; klien gateway yang aman untuk peramban
mengekspornya kembali dari @openclaw/gateway-client/browser.
Skema diekspor sebagai GatewayErrorDetailsSchema,
MissingScopeErrorDetailsSchema dari @openclaw/gateway-protocol/schema.
Kegagalan cakupan HTTP mencerminkan objek MISSING_SCOPE di bawah error.details dan
menggunakan status HTTP 403.
Metode yang menimbulkan efek samping memerlukan kunci idempotensi (lihat skema).
Handshake
Gateway mengirimkan tantangan prapenyambungan:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}Klien membalas dengan connect:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway merespons dengan hello-ok:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}server, features, snapshot, policy, dan auth semuanya diwajibkan oleh
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts). auth
melaporkan peran/cakupan yang dinegosiasikan meskipun tidak ada token perangkat yang diterbitkan (bentuk
di atas). pluginSurfaceUrls bersifat opsional dan memetakan nama permukaan plugin (mis.
canvas) ke URL terhosting dengan cakupan; URL tersebut dapat kedaluwarsa, sehingga Node memanggil
node.pluginSurface.refresh dengan { "surface": "canvas" } untuk mendapatkan entri baru.
Jalur canvasHostUrl / canvasCapability / node.canvas.capability.refresh
yang tidak digunakan lagi tidak didukung; gunakan permukaan plugin.
appliedConfigHash opsional pada snapshot adalah revisi konfigurasi sumber yang telah diuraikan
dan diterima oleh runtime Gateway aktif. Klien dapat membandingkannya dengan
config.get.configRevisionHash untuk menentukan apakah konfigurasi tersimpan yang lebih baru masih
memerlukan mulai ulang. config.get.hash tetap menjadi revisi berkas akar mentah yang digunakan oleh
pelindung konflik penulisan konfigurasi.
Saat gateway masih menyelesaikan sidecar startup, connect dapat mengembalikan
galat UNAVAILABLE yang dapat dicoba ulang dengan details.reason: "startup-sidecars" dan
retryAfterMs. Coba ulang dalam anggaran koneksi Anda, alih-alih menganggapnya sebagai
kegagalan handshake terminal.
Saat token perangkat diterbitkan, hello-ok.auth menambahkannya:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}Bootstrap kode QR/penyiapan bawaan adalah jalur serah terima seluler. Koneksi kode penyiapan dasar yang berhasil mengembalikan satu token Node utama ditambah satu token operator terbatas:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}Serah terima operator ini sengaja dibatasi: cukup untuk memulai loop
operator seluler dan penyiapan native, termasuk operator.talk.secrets untuk pembacaan
konfigurasi Talk, tetapi tanpa cakupan mutasi pemasangan dan tanpa operator.admin. Akses
pemasangan/admin yang lebih luas memerlukan pemasangan atau alur token terpisah yang disetujui. Persistenkan
hello-ok.auth.deviceTokens hanya ketika autentikasi bootstrap dijalankan melalui
transportasi tepercaya (wss:// atau pemasangan loopback/lokal).
Klien backend dalam proses yang sama dan tepercaya (client.id: "gateway-client",
client.mode: "backend") dapat menghilangkan device pada koneksi loopback langsung saat
melakukan autentikasi dengan token/kata sandi gateway bersama. Jalur ini disediakan
untuk RPC bidang kontrol internal (mis. pembaruan sesi subagen) dan mencegah
dasar pemasangan CLI/perangkat yang usang memblokir pekerjaan backend lokal. Klien jarak jauh,
berasal dari peramban, Node, dan klien token perangkat/identitas perangkat eksplisit tetap
melalui pemeriksaan pemasangan serta peningkatan cakupan normal.
Peran worker dan protokol tertutup
Worker cloud menggunakan ingress loopback khusus melalui tunnel SSH milik gateway
dengan kunci host yang disematkan. Ingress ini hanya menerima identitas worker dan tidak pernah meneruskan
autentikasi umum, peristiwa Node, RPC operator, atau metode plugin. connect yang ketat
memverifikasi kredensial berumur pendek dengan hash saat tersimpan yang terikat pada lingkungan, hash
bundel, epoch pemilik, versi kumpulan RPC, kedaluwarsa, dan satu sesi yang dapat bernilai null; secara
terpisah, kredensial ini memeriksa versi dan kumpulan fitur saat ini. Keberhasilan mengembalikan
worker-hello-ok minimal; negosiasi fitur tidak bergantung pada versi protokol umum.
Ukuran frame tetap di bawah 64 KiB, kecuali frame worker.inference.start
yang dinegosiasikan dapat mencapai 25 MiB. Daftar izin tertutup berisi worker.heartbeat,
worker.transcript.commit, worker.live-event, worker.inference.start, dan
worker.inference.cancel.
Commit transkrip menggunakan fencing epoch pemilik, pengikatan sesi milik gateway, compare-and-swap daun dasar, serta pemutaran ulang urutan yang tahan lama; gateway menghasilkan entri transkrip dan ID induk melalui penulis sesi normal. Kepemilikan dan kedaluwarsa diperiksa ulang pada setiap RPC.
Kapabilitas klien
Klien operator dapat mengiklankan kapabilitas opsional dalam connect.params.caps:
tool-events: menerima peristiwa siklus hidup alat yang terstruktur.inline-widgets: dapat merender hasil alat widget inline yang dihosting.
Kapabilitas klien menjelaskan klien yang terhubung, bukan otorisasi. Alat agen dapat mendeklarasikan kapabilitas yang diperlukan; Gateway menghilangkan alat tersebut kecuali setiap persyaratan muncul dalam caps milik klien asal. Eksekusi yang berasal dari saluran tidak memiliki kapabilitas klien Gateway, sehingga alat yang dibatasi kapabilitas tidak tersedia meskipun kebijakan alat secara eksplisit mengizinkannya.
Contoh koneksi Node
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Node mendeklarasikan klaim kapabilitas saat koneksi:
caps: kategori tingkat tinggi seperticamera,canvas,screen,location,voice,talk.commands: daftar izin perintah untuk pemanggilan.permissions: sakelar terperinci (mis.screen.record,camera.capture).
Gateway memperlakukan ini sebagai klaim dan memberlakukan daftar izin di sisi server.
Peran dan cakupan
Untuk model cakupan operator lengkap, pemeriksaan saat persetujuan, dan semantik rahasia bersama, lihat Cakupan operator.
Peran:
operator: klien bidang kontrol (CLI/UI/otomatisasi).node: host kapabilitas (kamera/layar/kanvas/system.run).worker: host eksekusi cloud pada protokol worker khusus yang tertutup.
Cakupan operator (src/gateway/operator-scopes.ts), kumpulan tertutup lengkap:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config dengan includeSecrets: true memerlukan operator.talk.secrets (atau
operator.admin). Saat rahasia disertakan, baca kredensial penyedia Talk aktif
dari talk.resolved.config.apiKey; talk.providers.<id>.apiKey
tetap berbentuk sumber dan dapat berupa objek SecretRef atau string yang disunting.
Metode RPC gateway yang didaftarkan plugin dapat meminta cakupan operatornya sendiri,
tetapi prefiks inti yang dicadangkan ini selalu diuraikan menjadi operator.admin
(src/shared/gateway-method-policy.ts): config.*, exec.approvals.*,
wizard.*, update.*.
Cakupan metode hanyalah gerbang pertama. Beberapa perintah garis miring yang dicapai melalui
chat.send menerapkan pemeriksaan tingkat perintah yang lebih ketat: penulisan persisten /config set dan
/config unset memerlukan operator.admin, bahkan untuk klien gateway yang
sudah memiliki cakupan operator yang lebih rendah.
node.pair.approve memiliki pemeriksaan cakupan tambahan saat persetujuan di atas cakupan
metode dasar (operator.pairing), berdasarkan commands
(src/infra/node-pairing-authz.ts) yang dideklarasikan oleh permintaan tertunda:
| Perintah yang dideklarasikan | Cakupan yang diperlukan |
|---|---|
| tidak ada | operator.pairing |
| perintah biasa | operator.pairing + operator.write |
mencakup system.run, system.run.prepare, system.which, browser.proxy, fs.listDir, atau system.execApprovals.get/set |
operator.pairing + operator.admin |
Kapabilitas/perintah/izin (node)
Node mendeklarasikan klaim kapabilitas saat terhubung:
caps: kategori kapabilitas tingkat tinggi seperticamera,canvas,screen,location,voice, dantalk.commands: daftar izin perintah untuk pemanggilan.permissions: pengaturan terperinci (misalnyascreen.record,camera.capture).
Gateway memperlakukan ini sebagai klaim dan memberlakukan daftar izin di sisi server.
Node yang terhubung dapat menerbitkan deskriptor Plugin atau alat MCP opsional yang terlihat oleh agen
dengan node.pluginTools.update setelah berhasil terhubung atau
terhubung kembali. Host node tanpa antarmuka memulai ulang untuk menerapkan perubahan inventaris MCP
deklaratif. Metode pembaruan ini adalah satu-satunya jalur penerbitan; deskriptor alat Plugin tidak diterima dalam
parameter connect. Setiap deskriptor harus menggunakan name alat yang aman bagi penyedia dan menyebutkan
command dalam daftar izin perintah node saat ini. Gateway memercayai metadata deskriptor
dari node yang dipasangkan, memfilter deskriptor di luar permukaan perintah yang disetujui,
menghapusnya saat node terputus, dan menolak upaya operator
untuk mengubah katalog node lain. Atur gateway.nodes.pluginTools.enabled: false
untuk mengabaikan deskriptor yang diterbitkan node.
Host node yang terhubung menerbitkan katalog pengganti skill lengkapnya dengan
node.skills.update. Metode peran node ini adalah satu-satunya jalur penerbitan skill
node; skill tidak diterima dalam parameter connect. Setiap deskriptor berisi
nama yang aman, deskripsi, dan konten SKILL.md yang dibatasi. Gateway mengurai
konten tersebut dengan pemuat Skills normal, menyertakannya dalam snapshot Skills agen
selama node terhubung, dan menghapusnya saat terputus. Atur
gateway.nodes.skills.enabled: false untuk mengabaikan Skills yang diterbitkan node.
Kehadiran
system-presencemengembalikan entri yang dikunci berdasarkan identitas perangkat, termasukdeviceId,roles, danscopes, sehingga UI dapat menampilkan satu baris per perangkat bahkan ketika perangkat terhubung sebagai operator dan node sekaligus.node.listmencakuplastSeenAtMsdanlastSeenReasonopsional. Node yang terhubung melaporkan waktu koneksi saat ini dengan alasanconnect; node yang dipasangkan juga dapat melaporkan kehadiran latar belakang yang persisten melalui peristiwa node tepercaya.
Node macOS native juga dapat mengirim peristiwa node.presence.activity yang diautentikasi
dengan waktu input tidak aktif yang dibatasi. Gateway memperoleh stempel waktu aktivitas menggunakan
waktunya sendiri, mengekspos Mac terhubung yang paling baru melalui node.list dan
node.describe, serta menyiarkan pembaruan node.presence kepada klien dengan cakupan baca.
Lihat Kehadiran komputer aktif untuk perilaku pemilihan, privasi, konteks
model, dan perutean notifikasi.
Peristiwa node tetap aktif di latar belakang
Node memanggil node.event dengan event: "node.presence.alive" untuk mencatat bahwa
node yang dipasangkan aktif selama pembangkitan latar belakang, tanpa menandainya sebagai terhubung:
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger adalah enum tertutup: background, silent_push, bg_app_refresh,
significant_location, manual, connect. Nilai yang tidak dikenal dinormalisasi menjadi
background (src/shared/node-presence.ts). Peristiwa hanya dipersistenkan untuk
sesi perangkat node yang diautentikasi; sesi tanpa perangkat atau tidak dipasangkan mengembalikan
handled: false.
Gateway yang berhasil mengembalikan hasil terstruktur:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Gateway lama mungkin hanya mengembalikan { "ok": true } untuk node.event; perlakukan hal tersebut
sebagai RPC yang diakui, bukan persistensi kehadiran yang tahan lama.
Pencakupan peristiwa siaran
Peristiwa siaran yang didorong server dibatasi berdasarkan cakupan sehingga sesi yang
hanya memiliki cakupan pemasangan atau node tidak menerima konten sesi secara pasif
(src/gateway/server-broadcast.ts):
- Bingkai percakapan, agen, dan hasil alat (peristiwa
agentyang dialirkan, peristiwa hasil alat) memerlukan setidaknyaoperator.read. Sesi yang tidak memilikinya melewati bingkai ini sepenuhnya. - Siaran
plugin.*yang ditentukan Plugin secara default dibatasi untukoperator.writeatauoperator.admin; entri eksplisit sepertiplugin.approval.requested/plugin.approval.resolvedmenggunakanoperator.approvalssebagai gantinya. - Peristiwa status/transportasi (
heartbeat,presence,tick, siklus hidup sambung/putus) tetap tidak dibatasi agar kesehatan transportasi dapat diamati oleh setiap sesi yang diautentikasi. - Keluarga peristiwa siaran yang tidak dikenal dibatasi berdasarkan cakupan secara default (gagal-tertutup) kecuali pengendali terdaftar secara eksplisit melonggarkannya.
Setiap koneksi klien mempertahankan nomor urut per kliennya sendiri, sehingga siaran tetap diurutkan secara monoton pada soket tersebut meskipun klien yang berbeda melihat subset aliran peristiwa terfilter cakupan yang berbeda.
Keluarga metode RPC
hello-ok.features.methods adalah daftar penemuan konservatif yang dibuat dari
src/gateway/server-methods-list.ts ditambah ekspor metode Plugin/saluran
yang dimuat—ini bukan dump yang dihasilkan dari setiap metode, dan beberapa metode (misalnya
push.test, web.login.start, web.login.wait, sessions.usage)
sengaja dikecualikan dari penemuan meskipun merupakan metode nyata yang dapat
dipanggil. Perlakukan ini sebagai penemuan fitur, bukan enumerasi lengkap
src/gateway/server-methods/*.ts.
Sistem dan identitas
healthmengembalikan snapshot kesehatan Gateway yang tersimpan dalam cache atau baru diperiksa.diagnostics.stabilitymengembalikan pencatat stabilitas diagnostik terbaru yang dibatasi: nama peristiwa, jumlah, ukuran byte, pembacaan memori, status antrean/sesi, nama saluran/Plugin, id sesi. Tidak ada teks percakapan, isi Webhook, keluaran alat, isi permintaan/respons mentah, token, cookie, atau rahasia. Memerlukanoperator.read.statusmengembalikan ringkasan Gateway bergaya/status; bidang sensitif hanya untuk klien operator dengan cakupan admin.gateway.identity.getmengembalikan identitas perangkat Gateway yang digunakan oleh alur relai dan pemasangan.system-presencemengembalikan snapshot kehadiran saat ini untuk perangkat operator/node yang terhubung.system-eventmenambahkan peristiwa sistem dan dapat memperbarui/menyiarkan konteks kehadiran.last-heartbeatmengembalikan peristiwa Heartbeat persisten terbaru.set-heartbeatsmengaktifkan atau menonaktifkan pemrosesan Heartbeat pada Gateway.gateway.suspend.preparemembuat sewa penangguhan kooperatif singkat hanya ketika pekerjaan Gateway yang dilacak sedang tidak aktif.gateway.suspend.statusmemeriksa sewa tersebut, dangateway.suspend.resumemelepaskannya setelah pencairan atau operasi host yang dibatalkan.
Model dan penggunaan
models.listmengembalikan katalog model yang diizinkan runtime. Lihat "tampilanmodels.list" di bawah.usage.statusmengembalikan ringkasan jendela penggunaan penyedia/kuota tersisa.usage.costmengembalikan ringkasan penggunaan biaya gabungan untuk suatu rentang tanggal. TeruskanagentIduntuk satu agen, atauagentScope: "all"untuk menggabungkan agen yang dikonfigurasi.doctor.memory.statusmengembalikan kesiapan memori vektor/embedding yang tersimpan dalam cache untuk ruang kerja agen default aktif. Teruskan{ "probe": true }atau{ "deep": true }hanya untuk ping eksplisit ke penyedia embedding aktif. Teruskan{ "agentId": "agent-id" }untuk membatasi statistik penyimpanan Dreaming ke satu ruang kerja agen; jika dihilangkan, statistik ruang kerja Dreaming yang dikonfigurasi akan digabungkan.doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifacts, dandoctor.memory.dedupeDreamDiarymenerima{ "agentId": "agent-id" }opsional; jika dihilangkan, metode tersebut beroperasi pada ruang kerja agen default yang dikonfigurasi.doctor.memory.remHarnessmengembalikan pratinjau harness REM hanya-baca yang dibatasi untuk klien bidang kontrol jarak jauh, termasuk jalur ruang kerja, cuplikan memori, markdown berdasar yang dirender, dan kandidat promosi mendalam. Memerlukanoperator.read.sessions.usagemengembalikan ringkasan penggunaan per sesi. TeruskanagentIduntuk satu agen, atauagentScope: "all"untuk mencantumkan agen yang dikonfigurasi bersama-sama. Kedua metode penggunaan menerimamode: "specific"dengantimeZoneIANA untuk batas dan kelompok hari kalender yang mempertimbangkan DST.utcOffsettetap didukung untuk klien lama dan sebagai cadangan ketika runtime Gateway tidak mengenali zona yang diminta.sessions.usage.timeseriesmengembalikan penggunaan deret waktu untuk satu sesi.sessions.usage.logsmengembalikan entri log penggunaan untuk satu sesi.
Saluran dan pembantu login
channels.statusmengembalikan ringkasan status saluran/Plugin bawaan + terpaket.channels.logoutmengeluarkan akun dari saluran/akun tertentu jika saluran mendukungnya.web.login.startmemulai alur login QR/web untuk penyedia saluran web saat ini yang mendukung QR.web.login.waitmenunggu alur tersebut selesai dan memulai saluran jika berhasil.push.testmengirim push APNs pengujian ke node iOS terdaftar.voicewake.getmengembalikan pemicu kata aktivasi yang tersimpan.voicewake.setmemperbarui pemicu kata aktivasi dan menyiarkan perubahan.
Pengelolaan Plugin
plugins.list(operator.read) mengembalikan inventaris Plugin yang terinstal beserta pilihan resmi yang dikurasi secara lokal, diagnostik, dan apakah mode instalasi saat ini mengizinkan perubahan.plugins.search(operator.read) mencari keluarga Plugin kode dan Plugin bundel ClawHub yang dapat diinstal. Teruskanqueryyang tidak kosong danlimitopsional dari 1 hingga 100.plugins.install(operator.admin) menginstal entri katalog resmi dengan{ source: "official", pluginId }atau paket ClawHub dengan{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }. Instalasi ClawHub mempertahankan pemeriksaan kepercayaan, integritas, dan kebijakan instalasi Gateway. Instalasi yang berhasil memerlukan mulai ulang Gateway.plugins.setEnabled(operator.admin) mengubah kebijakan pengaktifan satu Plugin yang terinstal dengan{ pluginId, enabled }. Respons mencakup entri katalog yang diperbarui, metadata mulai ulang, dan peringatan pemilihan slot.plugins.uninstall(operator.admin) menghapus satu Plugin yang diinstal secara eksternal dengan{ pluginId }: referensi konfigurasi, catatan instalasi, dan file terkelola. Plugin terpaket tidak dapat dihapus instalasinya, hanya dapat dinonaktifkan. Respons mencantumkan tindakan penghapusan dan selalu memerlukan mulai ulang Gateway.
Pesan dan log
sendadalah RPC pengiriman keluar langsung untuk pengiriman yang menargetkan kanal/akun/utas di luar runner chat.logs.tailmengembalikan bagian akhir log berkas Gateway yang dikonfigurasi dengan kontrol kursor/batas dan byte maksimum.
Terminal operator
terminal.openmemulai PTY host untukagentIdeksplisit atau agen default dan mengembalikan agen yang ditetapkan, direktori kerja, shell, dan status pembatasan.terminal.input,terminal.resize, danterminal.closehanya beroperasi pada sesi yang dimiliki oleh koneksi pemanggil.terminal.uploadmenerima satu berkas base64 hingga 16 MiB, menempatkannya di direktori sementara privat selama 24 jam pada Gateway sesi atau host node yang dipasangkan, dan mengembalikan jalur absolut. Pemanggil tetap harus menempelkan atau menggunakan jalur tersebut dengan cara lain; RPC tidak pernah menulis masukan terminal atau menjalankan perintah.- Peristiwa
terminal.datadanterminal.exithanya dialirkan ke koneksi yang memiliki sesi. - Sesi yang koneksinya terputus akan dilepaskan, bukan dihentikan: sesi tersebut tetap dapat disambungkan kembali selama
gateway.terminal.detachedSessionTimeoutSeconds(default 300;0memulihkan penghentian saat koneksi terputus), sementara keluaran terbaru terakumulasi dalam buffer sisi server yang dibatasi. terminal.listmengembalikan sesi yang dapat disambungkan;terminal.attachmengikat ulang sesi aktif atau yang dilepaskan ke koneksi pemanggil dan mengembalikan buffer pemutaran ulang (pengambilalihan bergaya tmux — pemilik aktif sebelumnya menerimaterminal.exitdengan alasandetached);terminal.textmembaca buffer sebagai teks biasa tanpa menyambungkan.- Setiap metode terminal memerlukan
operator.admin;gateway.terminal.enabledharus secara eksplisit bernilai true. Agen yang sepenuhnya berada dalam sandbox ditolak, dan perubahan kebijakan agen menutup PTY yang ada maupun yang sedang diproses, termasuk yang dilepaskan.
Percakapan dan TTS
talk.catalogmengembalikan katalog penyedia Percakapan hanya-baca untuk ucapan, transkripsi streaming, dan suara waktu nyata: id penyedia kanonis, alias registri, label, status konfigurasi, hasilreadytingkat grup opsional, id model/suara yang diekspos, mode kanonis, transportasi, strategi otak, serta flag audio/kapabilitas waktu nyata, tanpa mengembalikan rahasia penyedia atau mengubah konfigurasi global. Gateway saat ini menetapkanreadysetelah menerapkan pemilihan penyedia runtime; anggap ketiadaannya sebagai belum terverifikasi pada Gateway lama.talk.configmengembalikan payload konfigurasi Percakapan yang berlaku;includeSecretsmemerlukanoperator.talk.secrets(atauoperator.admin).talk.session.createmembuat sesi Percakapan milik Gateway untukrealtime/gateway-relay,transcription/gateway-relay, ataustt-tts/managed-room. Untukstt-tts/managed-room, pemanggiloperator.writeyang meneruskansessionKeyjuga harus meneruskanspawnedByuntuk visibilitas kunci sesi tercakup; pembuatansessionKeytanpa cakupan danbrain: "direct-tools"memerlukanoperator.admin.talk.session.joinmemvalidasi token sesi ruang terkelola, memancarkansession.readyatausession.replacedsesuai kebutuhan, dan mengembalikan metadata ruang/sesi beserta peristiwa Percakapan terbaru, tanpa pernah mengembalikan token teks biasa atau hash-nya.talk.session.appendAudiomenambahkan audio masukan PCM base64 ke sesi relai waktu nyata dan transkripsi milik Gateway.talk.session.startTurn,talk.session.endTurn, dantalk.session.cancelTurnmengendalikan siklus hidup giliran ruang terkelola dengan penolakan giliran kedaluwarsa sebelum status dihapus.talk.session.cancelOutputmenghentikan keluaran audio asisten, terutama untuk interupsi yang dibatasi VAD dalam sesi relai Gateway.talk.session.submitToolResultmenyelesaikan pemanggilan alat penyedia yang dipancarkan oleh sesi relai waktu nyata milik Gateway. Permintaan menunggu sinyal penyelesaian asinkron apa pun yang diekspos oleh jembatan penyedia; pengiriman yang gagal mempertahankan proses terkait tetap aktif dan tidak memancarkan peristiwa hasil alat yang berhasil. Teruskanoptions: { willContinue: true }untuk keluaran alat sementara atauoptions: { suppressResponse: true }saat jembatan penyedia mengiklankan dukungan supresi dan hasil tidak boleh memulai respons lain.talk.session.steermengirimkan kontrol suara proses aktif ke sesi Percakapan berbasis agen milik Gateway:{ sessionId, text, mode? }, denganmodeberupastatus,steer,cancel, ataufollowup; mode yang dihilangkan diklasifikasikan dari teks yang diucapkan.talk.session.closemenutup sesi relai, transkripsi, atau ruang terkelola milik Gateway dan memancarkan peristiwa Percakapan terminal.talk.modemenetapkan/menyiarkan status mode Percakapan saat ini untuk klien WebChat/Control UI.talk.client.createmembuat atau melanjutkan sesi penyedia waktu nyata milik klien menggunakanwebrtcatauprovider-websocket, sementara Gateway memiliki kredensial, instruksi, kebijakan alat, danvoiceSessionIdyang dikembalikan. Klien meneruskansessionKeydan menggunakan kembalivoiceSessionIdsaat mengganti transportasi penyedia selama satu panggilan.talk.client.transcriptmenambahkan satu item{ role, text }yang telah difinalisasi ke sesi agen normal.entryIdyang diwajibkan bersifat idempoten dalamvoiceSessionId; percobaan ulang tidak menduplikasi pesan transkrip.talk.client.closemenutup sesi suara logis setelah penulisan transkrip yang tertunda. Penutupan bersifat idempoten dan dapat mengirimkan ringkasan panggilan khusus-mutasi ke kanal non-WebChat terakhir sesi.talk.client.toolCallmemungkinkan transportasi waktu nyata milik klien meneruskan pemanggilan alat penyedia ke kebijakan Gateway. Alat pertama yang didukung adalahopenclaw_agent_consult; klien mendapatkan id proses dan menunggu peristiwa siklus hidup chat normal sebelum mengirimkan hasil alat khusus penyedia. Tindakan berdampak tinggi yang terikat suara mengembalikanVOICE_CONFIRMATION_REQUIRED:<id>hingga ucapan pengguna berikutnya yang telah difinalisasi secara eksplisit mengonfirmasi tindakan tersebut dan konsultasi berikutnya memasokconfirmationId.talk.client.steermengirimkan kontrol suara proses aktif untuk transportasi waktu nyata milik klien. Gateway menetapkan proses tertanam yang aktif darisessionKeydan mengembalikan hasil diterima/ditolak yang terstruktur alih-alih membuang pengarahan secara diam-diam.talk.eventadalah kanal peristiwa Percakapan tunggal untuk adaptor waktu nyata, transkripsi, STT/TTS, ruang terkelola, telefoni, dan rapat.talk.speakmenyintesis ucapan melalui penyedia ucapan Percakapan yang aktif.tts.statusmengembalikan status pengaktifan TTS, penyedia aktif, penyedia cadangan, dan status konfigurasi penyedia.tts.providersmengembalikan inventaris penyedia TTS yang terlihat.tts.enabledantts.disablemengalihkan status preferensi TTS.tts.setProvidermemperbarui penyedia TTS pilihan.tts.convertmenjalankan konversi teks-ke-ucapan satu kali.tts.speak(operator.write) merendertextyang tidak kosong dengan rantai penyedia TTS umum yang dikonfigurasi dan mengembalikan satu klip utuh secara inline sebagaiaudioBase64, besertaproviderdan metadata opsionaloutputFormat,mimeType, sertafileExtension. Tidak sepertitts.convert, metode ini tidak mengembalikan jalur lokal Gateway; tidak sepertitalk.speak, metode ini tidak memerlukan penyedia Percakapan. Teks di atasmessages.tts.maxTextLengthmengembalikanINVALID_REQUEST; kegagalan sintesis mengembalikanUNAVAILABLE.
Rahasia, konfigurasi, pembaruan, dan wisaya
secrets.reloadmenetapkan ulang SecretRef aktif dan memublikasikan status runtime yang mengenali pemilik secara atomik. Kegagalan pemilik yang memenuhi syarat dapat dipublikasikan sebagai degradasi dingin atau kedaluwarsa denganwarningCount; kegagalan ketat atau yang tidak dipetakan menolak pemuatan ulang dan mempertahankan snapshot aktif.secrets.resolvemenetapkan penugasan rahasia target perintah untuk kumpulan perintah/target tertentu.config.getmengembalikan snapshot konfigurasi pada disk saat ini,hashberkas root mentah,configRevisionHashyang ditetapkan, danappliedConfigHashopsional untuk revisi yang ditetapkan dan diterima oleh runtime Gateway aktif.config.setmenulis payload konfigurasi yang telah divalidasi.config.patchmenggabungkan pembaruan konfigurasi parsial. Penggantian array yang destruktif memerlukan jalur yang terdampak dalamreplacePaths; array bersarang di bawah entri array menggunakan jalur[]sepertiagents.list[].skills.config.applymemvalidasi + mengganti payload konfigurasi lengkap.config.schemamengembalikan payload skema konfigurasi langsung yang digunakan oleh Control UI dan alat CLI: skema,uiHints, versi, metadata pembuatan, serta metadata skema Plugin + kanal bila dapat dimuat. Payload ini mencakup metadatatitle/descriptiondari teks label/bantuan yang sama dengan UI, termasuk cabang komposisi objek bersarang, wildcard, item array, dananyOf/oneOf/allOfsaat dokumentasi kolom yang cocok tersedia.config.schema.lookupmengembalikan payload pencarian tercakup jalur untuk satu jalur konfigurasi: jalur yang dinormalisasi, node skema dangkal, petunjuk yang cocok +hintPath,reloadKindopsional, dan ringkasan anak langsung untuk penelusuran UI/CLI.reloadKindadalah salah satu darirestart,hot, ataunone(src/config/schema.ts) dan mencerminkan perencana pemuatan ulang konfigurasi Gateway untuk jalur yang diminta. Node skema pencarian mempertahankan dokumentasi yang ditampilkan kepada pengguna dan kolom validasi umum (title,description,type,enum,const,format,pattern, batas numerik/string/array/objek,additionalProperties,deprecated,readOnly,writeOnly). Ringkasan anak mengeksposkey,pathyang dinormalisasi,type,required,hasChildren,reloadKindopsional, besertahint/hintPathyang cocok.update.runmenjalankan alur pembaruan Gateway dan menjadwalkan mulai ulang hanya jika pembaruan berhasil; pemanggil yang memiliki sesi dapat menyertakancontinuationMessageagar proses awal melanjutkan satu giliran agen tindak lanjut melalui antrean kelanjutan mulai ulang. Pembaruan pengelola paket dan pembaruan checkout git yang diawasi dari bidang kontrol menggunakan serah-terima layanan terkelola yang dilepaskan, alih-alih mengganti hierarki paket atau mengubah keluaran checkout/build di dalam Gateway yang aktif. Serah-terima yang dimulai mengembalikanok: truedenganresult.reason: "managed-service-handoff-started"danhandoff.status: "started".update.runkonkuren kedua yang ditangani oleh proses Gateway yang sama mengembalikanok: falsedenganresult.reason: "managed-service-handoff-already-running"danhandoff.status: "already-running"; kelanjutannya tidak diterima sehingga pemanggil dapat mencoba lagi setelah pembaruan aktif selesai. Pembaru CLI mandiri dan proses Gateway pengganti berada di luar perlindungan lokal-proses ini. Serah-terima yang tidak tersedia atau gagal mengembalikanok: falsedenganmanaged-service-handoff-unavailableataumanaged-service-handoff-failed, besertahandoff.commandketika pembaruan shell manual diperlukan. Tidak tersedia berarti OpenClaw tidak memiliki batas supervisor yang aman atau identitas layanan persisten, sepertiOPENCLAW_SYSTEMD_UNITuntuk systemd. Selama serah-terima yang telah dimulai, sentinel mulai ulang dapat secara singkat melaporkanstats.reason: "restart-health-pending"; kelanjutan ditunda hingga CLI memverifikasi Gateway yang telah dimulai ulang dan menulis sentinel akhirok.update.statusmenyegarkan dan mengembalikan sentinel mulai ulang pembaruan terbaru, termasuk versi yang berjalan setelah mulai ulang jika tersedia.wizard.start,wizard.next,wizard.status, danwizard.cancelmengekspos wisaya orientasi awal melalui RPC WS.
Pembantu agen dan ruang kerja
agents.listmengembalikan entri agen yang terlihat oleh Gateway, termasuk metadata model/runtime efektif dankindsemantik opsional (agentatausystem). Klien mengiklankan kapabilitas handshakeagent-kinduntuk menerima daftar lengkap bertipe; klien tanpa kapabilitas tersebut tetap menggunakan daftar lama yang aman untuk pemilih tanpa baris sistem. Klien yang memahami jenis mengecualikan barissystemdari pemilih biasa, tetapi tetap menyertakannya dalam tampilan diagnostik. Gateway v4 yang lebih lama dapat mengembalikan baris tanpakind.agents.create,agents.update, danagents.deletemengelola catatan agen dan pengkabelan ruang kerja.agents.files.list,agents.files.get, danagents.files.setmengelola file ruang kerja bootstrap yang diekspos untuk agen.audit.activity.listmengembalikan buku besar aktivitas berversi yang hanya berisi metadata;audit.listtetap menjadi RPC proses/alat yang aman untuk kompatibilitas.agents.workspace.listdanagents.workspace.get(operator.read) menyediakan penelusuran berpaginasi hanya-baca atas direktori ruang kerja agen bagi klien dalam domain operator tepercaya yang dijelaskan di Cakupan operator. Permintaan hanya menerima jalur relatif terhadap ruang kerja; pembacaan tetap dibatasi pada root ruang kerja yang telah di-realpath (pelolosan melalui symlink dan hardlink ditolak), dibatasi ukurannya, dan terbatas pada teks UTF-8 serta jenis gambar umum (base64). Respons tidak mengekspos jalur ruang kerja host. Tidak ada operasi tulis dalam namespace ini.tasks.list,tasks.get, dantasks.cancelmengekspos buku besar tugas Gateway kepada klien SDK dan operator. Lihat RPC buku besar tugas di bawah.artifacts.list,artifacts.get, danartifacts.downloadmengekspos ringkasan dan unduhan artefak yang diturunkan dari transkrip untuk cakupansessionKey,runId, atautaskIdyang eksplisit. Kueri proses dan tugas menentukan sesi pemilik di sisi server dan hanya mengembalikan media transkrip dengan asal-usul yang cocok; sumber URL yang tidak aman atau lokal mengembalikan unduhan yang tidak didukung alih-alih mengambilnya di sisi server.environments.listdanenvironments.statusmempertahankan penemuan lingkungan lokal Gateway dan Node. Worker cloud yang dikonfigurasi dan catatan tahan lama yang ditinggalkan oleh profil sebelumnya menambahkan metadataworkerdenganproviderId,leaseIdopsional,state,ageMs,idleMsopsional, danattachedSessionIds. Status siklus hidup worker adalahrequested,provisioning,bootstrapping,ready,attached,idle,draining,destroying,destroyed,failed, danorphaned.environments.create({ profileId, idempotencyKey }) menyediakan worker dari profil penyedia plugin yang dikonfigurasi; percobaan ulang dengan kunci yang sama menggunakan kembali operasi tahan lama tersebut.environments.destroy({ environmentId }) meminta pembongkaran idempoten atas lingkungan worker tahan lama. Keduanya memerlukanoperator.admin, merupakan penulisan bidang kontrol, dan mengembalikan bentuk ringkasan lingkungan yang sama dengan yang digunakan oleh respons status.agent.identity.getmengembalikan identitas asisten efektif untuk agen atau sesi.agent.waitmenunggu proses selesai dan mengembalikan snapshot terminal jika tersedia.
Kontrol sesi
sessions.listmengembalikan indeks sesi saat ini, termasuk metadataagentRuntimeper baris ketika backend runtime agen dikonfigurasi. Saat penempatan worker cloud diaktifkan atau status pemulihan tahan lama tersedia, baris sesi juga menyertakan statusplacementtertutup (local,requested,provisioning,syncing,starting,active,draining,reconciling,reclaimed, ataufailed) beserta bidang lingkungan, epoch pemilik, ruang kerja, bundel, kursor ACK, atau pemulihan yang spesifik untuk status tersebut.sessions.subscribedansessions.unsubscribemengaktifkan atau menonaktifkan langganan peristiwa perubahan sesi untuk klien WS saat ini.sessions.messages.subscribedansessions.messages.unsubscribemengaktifkan atau menonaktifkan langganan peristiwa transkrip/pesan untuk satu sesi. TeruskanincludeApprovals: trueagar juga menerima peristiwa siklus hidupsession.approvalyang telah disanitasi untuk persetujuan yang audiens tersimpannya mencakup sesi tersebut secara persis dan yang pengikatan peninjaunya mengizinkan klien pelanggan. Respons langganan kemudian menyertakanapprovalReplaytertunda yang dibatasi; nilai tersebut bersifat otoritatif saattruncatedbernilai false. Keikutsertaan ini berlaku per panggilan langganan, bukan persisten: berlangganan ulang ke sesi yang sama tanpaincludeApprovals: truemenghapus langganan persetujuan yang sudah ada. Selain otoritas baca sesi normal, keikutsertaan ini memerlukanoperator.admin, atauoperator.approvalspada perangkat yang dipasangkan.sessions.previewmengembalikan pratinjau transkrip terbatas untuk kunci sesi tertentu.sessions.describemengembalikan satu baris sesi Gateway untuk kunci sesi yang persis.sessions.resolvemenentukan atau mengkanoniskan target sesi.sessions.createmembuat entri sesi baru. NilaimodeldanthinkingLevelopsional menyimpan penggantian awal model dan penalaran secara atomik.worktree: truemenyediakan worktree terkelola;worktreeBaseRef/worktreeNameopsional memilih ref dasar dan nama cabang, danexecNode(operator.admin) mengikat eksekusi sesi ke host Node. Worktree yang dibuat dicerminkan dalam hasil dan disimpan pada baris sesi (worktree: { id, branch, repoRoot }). Ketika entri berhasil dibuat tetapichat.sendawal bertingkatnya ditolak, hasil yang berhasil menyertakanrunStarted: falsedanrunError; klien dapat mempertahankan prompt dan mencoba kembali menggunakan kunci sesi yang dikembalikan. Pemanggil yang meneruskanparentSessionKeydenganemitCommandHooks: truejuga harus mendeklarasikan disposisi siklus hidup anak yang berbeda:succeedsParent: truemengakhiri induk dengansession_end, sedangkanfalsemempertahankan induk tetap aktif dan hanya memancarkansession_startmilik anak. MenghilangkansucceedsParentmempertahankan perilaku peralihan induk lama untuk klien yang sudah ada. Disposisi tersebut memerlukan tautan induk dan hook perintah; fork tidak dapat menyelesaikan induknya dengan sukses. Perilaku reset di tempat untuk sesi utama tidak berubah karena tidak ada anak terpisah yang dibuat.sessions.dispatch(operator.admin) memindahkan sesi OpenClaw lokal yang sudah ada dengan worktree terkelola milik sesi ke profil worker cloud yang dikonfigurasi. Teruskan{ key, profileId, agentId? }. Metode ini tidak tersedia ketika tidak ada profil worker yang dikonfigurasi, menutup penerimaan giliran lokal sebelum menguras pekerjaan aktif, dan hanya kembali setelah penempatan mencapai kepemilikan workeractive. Pengiriman bersifat satu arah; penarikan kembali dari worker ke lokal bukan bagian dari RPC ini.sessions.groups.list,sessions.groups.put,sessions.groups.rename, dansessions.groups.deletemengelola katalog grup sesi khusus milik Gateway (nama + urutan tampilan). Keanggotaan tetap berada di bidangcategorysetiap sesi; penggantian nama dan penghapusan memperbarui sesi anggota di sisi server.sessions.sendmengirim pesan ke sesi yang sudah ada.sessions.steeradalah varian interupsi-dan-arahkan untuk sesi aktif.sessions.abortmembatalkan pekerjaan aktif untuk suatu sesi. TeruskankeybesertarunIdopsional, atau hanyarunIduntuk proses aktif yang dapat ditentukan oleh Gateway ke suatu sesi.sessions.patchmemperbarui metadata/penggantian sesi serta melaporkan model kanonis yang telah ditentukan besertaagentRuntimeefektif.sessions.reset,sessions.delete, dansessions.compactmelakukan pemeliharaan sesi.sessions.getmengembalikan baris sesi tersimpan secara lengkap.- Eksekusi chat tetap menggunakan
chat.history,chat.send,chat.abort, danchat.inject.chat.historydinormalisasi untuk tampilan bagi klien UI: tag direktif sebaris dihapus dari teks yang terlihat, payload XML panggilan alat berbentuk teks biasa (<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, dan blok panggilan alat yang terpotong) serta token kontrol model ASCII/lebar penuh yang bocor dihapus, baris asisten yang hanya berisi token senyap (NO_REPLY/no_replysecara persis) dihilangkan, dan baris yang terlalu besar dapat diganti dengan placeholder. chat.message.getadalah pembaca pesan lengkap terbatas yang bersifat aditif untuk satu entri transkrip yang terlihat. TeruskansessionKey,agentIdopsional ketika pemilihan sesi dibatasi pada agen, danmessageIdtranskrip yang sebelumnya ditampilkan melaluichat.history; Gateway mengembalikan proyeksi ternormalisasi untuk tampilan yang sama tanpa batas pemotongan riwayat ringan ketika entri tersimpan masih tersedia dan tidak terlalu besar.chat.toolTitlesmengembalikan judul tujuan singkat untuk panggilan alat yang dirender di Control UI (secara batch, maksimum 24 item dengan masukan terbatas). Fitur ini diaktifkan melalui keikutsertaangateway.controlUi.toolTitles(secara default nonaktif); Gateway yang dinonaktifkan menjawab{ titles: {}, disabled: true }tanpa panggilan model agar klien berhenti meminta. Saat diaktifkan, judul menggunakan perutean model utilitas standar:utilityModelyang dikonfigurasi secara eksplisit (keputusan operator yang, seperti semua tugas utilitas, dapat mengirim konten tugas terbatas kepada penyedia yang dipilih), atau default model kecil yang dideklarasikan oleh penyedia sesi sehingga tidak ada tujuan keluar baru yang muncul secara implisit;utilityModelkosong menonaktifkannya sepenuhnya. Judul tidak pernah beralih ke model utama sebagai cadangan. Hasil disimpan dalam cache di basis data status per agen dengan kunci berupa nama alat + masukan, sehingga tampilan berulang tidak pernah menagihkan ulang panggilan yang sama.chat.sendmenerimafastMode: "auto"satu giliran untuk menggunakan mode cepat bagi panggilan model yang dimulai sebelum batas otomatis, lalu memulai panggilan percobaan ulang, cadangan, hasil alat, atau lanjutan setelahnya tanpa mode cepat. Batas tersebut secara default adalah 60 detik (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) dan dapat dikonfigurasi per model denganagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. Pemanggilchat.senddapat meneruskanfastAutoOnSecondssatu giliran untuk mengganti batas bagi permintaan tersebut. TeruskanqueueMode(steer,followup,collect, atauinterrupt) untuk mengganti mode antrean tersimpan hanya bagi permintaan ini; tindakan pengarahan Control UI yang eksplisit menggunakanqueueMode: "steer".
Pemasangan perangkat dan token perangkat
device.pair.listmengembalikan perangkat terpasang yang tertunda dan disetujui.device.pair.setupCodemembuat kode penyiapan seluler dan, secara default, URL data QR PNG. Tindakan ini memerlukanoperator.admindan sengaja tidak disertakan dalam penemuan yang diiklankan. Hasilnya menyertakansetupCode,qrDataUrlopsional,gatewayUrl, labelauthyang tidak bersifat rahasia, danurlSource.device.pair.approve,device.pair.reject, dandevice.pair.removemengelola catatan pemasangan perangkat.device.pair.renamemenetapkan label operator ({ deviceId, label }) yang lebih diutamakan daripada nama tampilan yang dilaporkan klien dan tetap bertahan setelah perbaikan perangkat atau persetujuan ulang.device.token.rotatemerotasi token perangkat terpasang dalam batas peran yang disetujui dan cakupan pemanggilnya.device.token.revokemencabut token perangkat terpasang dalam batas peran yang disetujui dan cakupan pemanggilnya.
Kode penyiapan menyematkan kredensial bootstrap berumur pendek. Klien tidak boleh mencatat atau menyimpannya setelah alur pemasangan selesai.
Pemasangan Node, pemanggilan, dan pekerjaan tertunda
node.pair.list,node.pair.approve,node.pair.reject, dannode.pair.removemencakup persetujuan kapabilitas Node.node.pair.requestdannode.pair.verifydihapus pada 2026.7 bersama penyimpanan pemasangan Node mandiri; permintaan tertunda dibuat oleh Gateway saat Node terhubung.node.listdannode.describemengembalikan status Node yang diketahui/terhubung.node.renamememperbarui label Node yang telah dipasangkan.node.invokemeneruskan perintah ke Node yang terhubung.node.invoke.resultmengembalikan hasil untuk permintaan pemanggilan.mcp.tools.call.v1adalah perintah host Node tanpa antarmuka grafis untuk memanggil alat MCP lokal Node yang telah dikonfigurasi. Perintah ini diteruskan melaluinode.invoke, mengharuskan Node mendeklarasikan perintah tersebut, dan tetap tunduk pada persetujuan pemasangan sertagateway.nodes.denyCommands.node.eventmembawa peristiwa yang berasal dari Node kembali ke Gateway.node.pluginTools.updateadalah satu-satunya jalur publikasi untuk mengganti deskriptor alat plugin/MCP milik Node terhubung yang terlihat oleh agen; parameterconnecttidak membawanya.node.pending.pulldannode.pending.ackadalah API antrean Node terhubung.node.pending.enqueuedannode.pending.drainmengelola pekerjaan tertunda yang persisten untuk Node luring/terputus.
Kelompok persetujuan
approval.historymengembalikan persetujuan terminal dari yang terbaru yang disimpan selama 30 hari untuk permintaan eksekusi, plugin, dan agen sistem (cakupanoperator.approvals). Metode ini mendukung paginasi kursor beserta filter jenis opsional; persetujuan tertunda bukan baris riwayat.approval.getdanapproval.resolveadalah metode persetujuan persisten yang tidak bergantung pada jenis (cakupanoperator.approvals).approval.getmengembalikan proyeksi terminal tertunda atau tersimpan yang telah disanitasi denganurlPathyang stabil;approval.resolvemenerima ID persetujuan kanonis,kindeksplisit, dan keputusan, menerapkan penyelesaian berdasarkan jawaban pertama, serta selalu mengembalikan hasil kanonis yang tercatat.exec.approval.request,exec.approval.get,exec.approval.list, danexec.approval.resolvemencakup permintaan persetujuan eksekusi sekali pakai beserta pencarian/pemutaran ulang persetujuan tertunda. Semuanya merupakan adaptor batas protokol di atas registri persetujuan persisten yang sama.exec.approval.waitDecisionmenunggu satu persetujuan eksekusi tertunda dan mengembalikan keputusan akhir (ataunullsaat batas waktu tercapai).exec.approvals.getdanexec.approvals.setmengelola snapshot kebijakan persetujuan eksekusi Gateway.exec.approvals.node.getdanexec.approvals.node.setmengelola kebijakan persetujuan eksekusi lokal Node melalui perintah relai Node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecision, danplugin.approval.resolvemencakup alur persetujuan yang ditentukan plugin.
Perintah Control UI
ui.commandmemungkinkan pemanggiloperator.writemengirim perintah tata letak dan navigasi bertipe ke klien Control UI terhubung yang mengiklankan kapabilitasui-commands.- Perintah mencakup pemisahan/penutupan/fokus panel, visibilitas bilah samping, visibilitas dan dok panel terminal/peramban, serta navigasi sesi.
- Protokol v1 sengaja menyebarkan perintah ke setiap Control UI terhubung yang memiliki kapabilitas tersebut. Jika tidak ada yang terhubung, permintaan gagal dengan
UNAVAILABLE, alih-alih berpura-pura bahwa tata letak telah berubah.
Otomatisasi, Skills, dan alat
- Otomatisasi:
wakemenjadwalkan injeksi teks pengaktifan segera atau pada Heartbeat berikutnya;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsmengelola pekerjaan terjadwal. cron.runtetap menjadi RPC bergaya antrekan untuk eksekusi manual. Klien yang memerlukan semantik penyelesaian harus membacarunIdyang dikembalikan dan melakukan polling terhadapcron.runs.cron.runsmenerima filterrunIdopsional yang tidak kosong agar klien dapat mengikuti satu eksekusi manual yang diantrekan tanpa berlomba dengan entri riwayat lain untuk tugas yang sama.- Skills dan alat:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke. Lihat Metode pembantu operator di bawah ini.
Kelompok peristiwa umum
chat: pembaruan obrolan UI sepertichat.injectdan peristiwa obrolan lain yang hanya ada dalam transkrip. Dalam protokol v4, payload delta membawadeltaText;messagetetap menjadi snapshot kumulatif asisten. Penggantian nonprefiks menetapkanreplace=truedan menggunakandeltaTextsebagai teks pengganti.session.message,session.operation,session.tool: pembaruan transkrip, operasi sesi yang sedang berlangsung, dan aliran peristiwa untuk sesi yang dilanggani.session.approval: status sebenarnya persetujuan tertunda dan terminal yang telah disanitasi untuk pelanggan sesi persis yang secara eksplisit ikut serta. Persetujuan turunan menggunakan audiens leluhur yang dipersistenkan; peristiwa tidak pernah mengubah transkrip atau membangunkan agen.sessions.changed: indeks atau metadata sesi berubah.presence: pembaruan snapshot keberadaan sistem.tick: peristiwa keepalive/keaktifan berkala.health: pembaruan snapshot kesehatan Gateway.heartbeat: pembaruan aliran peristiwa Heartbeat.cron: peristiwa perubahan eksekusi/tugas Cron.shutdown: notifikasi penonaktifan Gateway.node.pair.requested/node.pair.resolved: siklus hidup pemasangan Node.node.invoke.request: penyiaran permintaan pemanggilan Node.device.pair.requested/device.pair.resolved: siklus hidup perangkat yang dipasangkan.voicewake.changed: konfigurasi pemicu kata aktivasi berubah.config.changed: penulisan konfigurasi dipersistenkan (payload membawa jalur konfigurasi, hash snapshot baru, dan stempel waktu—tidak pernah membawa isi konfigurasi). Berada dalam cakupan baca operator; klien menyegarkan melaluiconfig.get.exec.approval.requested/exec.approval.resolved: siklus hidup persetujuan eksekusi.plugin.approval.requested/plugin.approval.resolved: siklus hidup persetujuan plugin.
Metode pembantu Node
Node dapat memanggil skills.bins untuk mengambil daftar executable Skills saat ini
untuk pemeriksaan izin otomatis.
RPC buku besar audit
audit.activity.list memberikan kepada klien operator tampilan stabil dari yang terbaru atas metadata
siklus hidup eksekusi agen, tindakan alat, dan pesan yang disertakan secara opsional. Metode ini memerlukan
operator.read. Kueri mengecualikan catatan yang berusia lebih dari 30 hari, dan buku besar
SQLite bersama dibatasi hingga 100,000 catatan. Baris kedaluwarsa dihapus saat
Gateway dimulai, pemeliharaan setiap jam, dan penulisan berikutnya. Lihat
Riwayat audit untuk model data dan semantik privasi.
- Parameter:
agentId,sessionKey, ataurunIdpersis yang bersifat opsional;kindopsional ("agent_run","tool_action", atau"message");statusopsional ("started","succeeded","failed","cancelled","timed_out","blocked", atau"unknown");directionpesan opsional ("inbound"atau"outbound") danchannelpersis; batas milidetik Unix inklusifafter/beforeyang bersifat opsional;limitopsional dari1hingga500; dan stringcursoropsional dari halaman sebelumnya. - Hasil:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }.
Union hasil V1 bernama memiliki skema terpisah untuk eksekusi agen, tindakan alat, pesan masuk,
dan pesan keluar. Diskriminator eventType masing-masing adalah
agent_run, tool_action, inbound_message, atau outbound_message; kind dan
direction pesan tetap tersedia untuk pemfilteran dan tampilan. Setiap peristiwa memiliki
schemaVersion: 1 bilangan bulat. Referensi identitas pesan menggunakan format
hmac-sha256:v1:<32 hex key id>:<64 hex digest> yang persis; ID aktor pengirim kanal
menggunakan format yang sama.
Semua varian mewajibkan eventType, schemaVersion, eventId, sequence,
sourceSequence, occurredAt, kind, action, status, actor, dan
redaction. Bidang varian adalah:
eventType |
Bidang wajib | Bidang opsional |
|---|---|---|
agent_run |
agentId, runId; kind: "agent_run" |
sessionKey, sessionId, errorCode |
tool_action |
agentId, runId; kind: "tool_action" |
sessionKey, sessionId, toolCallId, toolName, errorCode |
inbound_message |
direction: "inbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, referensi identitas, reasonCode, errorCode |
outbound_message |
direction: "outbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, referensi identitas, reasonCode, deliveryKind, failureStage, errorCode |
Enum pesan tertutup adalah:
conversationKind:direct,group,channel, atauunknown.outcomemasuk:completed,skipped, ataufailed;reasonCodeopsional:duplicate,reply_operation_active,reply_operation_aborted,fast_abort,plugin_bound_handled,plugin_bound_unavailable,plugin_bound_declined,plugin_bound_error,before_dispatch_handled,acp_dispatch_completed,acp_dispatch_failed,acp_dispatch_empty, atauacp_dispatch_aborted.outcomekeluar:sent,suppressed,failed, atauunknown;reasonCodeopsional:cancelled_by_message_sending_hook,cancelled_by_reply_payload_sending_hook,empty_after_message_sending_hook,empty_after_reply_payload_sending_hook, atauno_visible_payload. Adaptor yang tidak mengembalikan identitas platform adalahunknown, karena efek samping eksternal tidak dapat dibuktikan tidak terjadi.deliveryKind:text,media, atauother;failureStage:platform_send,queue, atauunknown.
Bidang terminal saling berkorelasi, bukan opsional secara independen:
| Varian | Pemetaan terminal |
|---|---|
| Eksekusi agen | started tidak memiliki errorCode; setiap status selesai yang bukan berhasil memerlukan kode run_* yang sesuai. |
| Tindakan alat | started dan berhasil tidak memiliki errorCode; setiap status selesai lainnya memerlukan kode tool_* yang sesuai. |
| Pesan masuk | berhasil = completed; diblokir = skipped; gagal = failed ditambah message_processing_failed. reasonCode, jika ada, harus termasuk dalam keluarga terminal tersebut. |
| Pesan keluar | berhasil = sent; diblokir = suppressed ditambah reasonCode; gagal = failed ditambah errorCode dan failureStage; tidak diketahui = unknown ditambah failureStage. |
Setiap peristiwa aktivitas mencakup id peristiwa yang stabil, urutan ledger monotonik,
urutan peristiwa sumber, stempel waktu, pelaku, tindakan, status, bilangan bulat
schemaVersion: 1, dan redaction: "metadata_only". Rekaman eksekusi dan alat
memerlukan asal-usul agen dan eksekusi serta dapat mencakup asal-usul sesi. Rekaman
pesan dapat mencakup id agen dan eksekusi, tetapi secara sengaja tidak pernah mencakup
sessionKey atau sessionId; karena itu, filter kueri sessionKey hanya berlaku untuk
baris eksekusi dan alat. Peristiwa alat dapat mencakup id panggilan alat dan nama alat.
Rekaman pesan menggunakan message.inbound.processed atau
message.outbound.finished dan menambahkan arah, saluran, jenis percakapan,
hasil yang dinormalisasi, serta jenis pengiriman, tahap kegagalan, durasi,
jumlah hasil, kode alasan, dan pseudonim akun/percakapan/pesan/target
berkunci yang bersifat lokal untuk instalasi dan opsional. Pseudonim ini membantu
korelasi, tetapi bukan anonimisasi: basis data status berisi kuncinya,
sedangkan ekspor RPC dan CLI tidak. Ledger tidak menyimpan prompt, isi pesan,
argumen alat, hasil alat, keluaran perintah, atau teks kesalahan mentah.
Nilai sessionKey eksekusi/alat tetap berupa metadata korelasi mentah dan dapat menyematkan
id akun platform atau rekan; rekaman pesan tidak menyertakan kunci sesi.
Untuk baris masuk, durationMs mengukur pengiriman inti hingga terminalnya dan
resultCount menghitung muatan alat, pemblokiran, dan balasan dalam antrean yang telah difinalisasi. Untuk
baris keluar, durationMs mencakup kepemilikan pengiriman hingga pengakuan,
surat mati, atau rekonsiliasi (termasuk waktu tunggu dalam antrean), dan resultCount
menghitung pengiriman fisik platform yang teridentifikasi. deliveryKind, jika ada,
menjelaskan muatan efektif setelah hook dan perenderan; baris yang disupresi atau
ambigu akibat crash tidak menyertakannya.
Cakupan pesan saat ini mencakup pesan masuk yang diterima dan mencapai
pengiriman inti, termasuk hasil duplikat/terminal inti. Cakupan keluar menulis
satu baris terminal per muatan balasan logis asli yang mencapai pengiriman
bersama yang tahan lama; pemotongan dan fan-out adaptor diagregasikan dalam resultCount. Pengiriman
dalam antrean yang dapat dicoba ulang atau ambigu hanya dicatat setelah pengakuan, surat
mati, atau rekonsiliasi. Jalur lokal Plugin dan pengiriman langsung yang melewati
batas bersama tersebut belum dicakup. Antrean pekerja terbatas bersifat upaya terbaik
dan dapat menghilangkan rekaman saat terjadi kegagalan atau kejenuhan, sehingga permukaan ini bukan
arsip kepatuhan tanpa kehilangan data.
Pencatatan aktif secara default dan dikendalikan oleh
audit.enabled. Pencatatan pesan
dikendalikan secara terpisah oleh audit.messages dan secara default bernilai "off". Saat
pencatatan dinonaktifkan, audit.activity.list tetap menyajikan rekaman yang ditulis
sebelumnya hingga kedaluwarsa.
Skema permintaan, hasil, dan AuditEvent dari audit.list yang dirilis tetap
tidak berubah dan hanya mengembalikan rekaman eksekusi agen dan tindakan alat. Klien
operator baru harus memanggil audit.activity.list saat Gateway mengiklankannya. Gateway
lama dapat melaporkan unknown method: audit.activity.list atau, karena
otorisasi mendahului pencarian metode dalam versi yang dirilis, missing scope: operator.admin terhadap permintaan dengan cakupan baca. Perlakukan yang terakhir sebagai ketiadaan metode
hanya jika metode tersebut tidak diiklankan. Klien kemudian dapat mencoba ulang audit.list
hanya jika filternya tidak memerlukan dukungan jenis pesan, arah, atau saluran.
Gunakan openclaw audit untuk kueri teks dan ekspor JSON terbatas.
RPC ledger tugas
Klien operator memeriksa dan membatalkan rekaman tugas latar belakang gateway melalui
RPC ledger tugas (packages/gateway-protocol/src/schema/tasks.ts). RPC ini
mengembalikan ringkasan tugas yang telah disanitasi, bukan status runtime mentah.
tasks.listmemerlukanoperator.read.- Parameter:
statusopsional ("queued","running","completed","failed","cancelled", atau"timed_out") atau larik status tersebut,agentIdopsional,sessionKeyopsional,limitopsional dari1hingga500, dan stringcursoropsional. - Hasil:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Parameter:
tasks.getmemerlukanoperator.read.- Parameter:
{ "taskId": string }. - Hasil:
{ "task": TaskSummary }. - Id tugas yang tidak ditemukan mengembalikan bentuk kesalahan tidak ditemukan milik gateway.
- Parameter:
tasks.cancelmemerlukanoperator.write.- Parameter:
{ "taskId": string, "reason"?: string }. - Hasil:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundmelaporkan apakah ledger memiliki tugas yang cocok.cancelledmelaporkan apakah runtime menerima atau mencatat pembatalan.
- Parameter:
TaskSummary mencakup id, status, dan metadata opsional: kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, stempel waktu, progres,
ringkasan terminal, dan teks kesalahan yang telah disanitasi. agentId mengidentifikasi agen
yang menjalankan tugas; sessionKey dan ownerKey mempertahankan konteks peminta dan kontrol.
Metode pembantu operator
commands.list(operator.read) mengambil inventaris perintah runtime untuk sebuah agen.agentIdbersifat opsional; hilangkan untuk membaca ruang kerja agen default.scopemengontrol permukaan yang ditargetkan olehnameutama:textmengembalikan token perintah teks utama tanpa/di awal;nativedan jalur defaultbothmengembalikan nama native yang mempertimbangkan penyedia jika tersedia.textAliasesmembawa alias garis miring yang persis seperti/modeldan/m.nativeNamemembawa nama perintah native yang mempertimbangkan penyedia jika tersedia.providerbersifat opsional dan hanya memengaruhi penamaan native serta ketersediaan perintah Plugin native.includeArgs=falsemenghilangkan metadata argumen yang diserialisasi dari respons.
tools.catalog(operator.read) mengambil katalog alat runtime untuk sebuah agen. Respons mencakup alat yang dikelompokkan dan metadata asal:source:coreataupluginpluginId: pemilik Plugin ketikasource="plugin"optional: apakah alat Plugin bersifat opsional
tools.effective(operator.read) mengambil inventaris alat yang berlaku efektif saat runtime untuk sebuah sesi.sessionKeywajib diisi.- Gateway memperoleh konteks runtime tepercaya dari sesi di sisi server alih-alih menerima konteks autentikasi atau pengiriman yang diberikan pemanggil.
- Respons merupakan proyeksi inventaris aktif yang berasal dari server dan tercakup pada sesi, termasuk alat inti, Plugin, saluran, dan server MCP yang telah ditemukan.
tools.effectivebersifat hanya-baca untuk MCP: ini dapat memproyeksikan katalog MCP sesi yang telah siap melalui kebijakan alat akhir, tetapi tidak membuat runtime MCP, menghubungkan transportasi, atau menerbitkantools/list. Jika tidak ada katalog siap yang cocok, respons dapat menyertakan pemberitahuan sepertimcp-not-yet-connected,mcp-not-yet-listed, ataumcp-stale-catalog.- Entri alat efektif menggunakan
source="core",source="plugin",source="channel", atausource="mcp".
tools.invoke(operator.write) memanggil satu alat yang tersedia melalui jalur kebijakan Gateway yang sama seperti/tools/invoke.namewajib diisi.args,sessionKey,agentId,confirm, danidempotencyKeybersifat opsional.- Jika
sessionKeydanagentIdsama-sama ada, agen sesi yang diresolusikan harus cocok denganagentId. - Pembungkus inti khusus pemilik seperti
cron,gateway, dannodesmemerlukan identitas pemilik/admin (operator.admin) meskipuntools.invokesendiri adalahoperator.write. - Respons merupakan amplop yang ditujukan untuk SDK dengan bidang
ok,toolName,outputopsional, danerrorbertipe. Penolakan persetujuan atau kebijakan mengembalikanok:falsedalam muatan alih-alih melewati Pipeline kebijakan alat Gateway.
skills.status(operator.read) mengambil inventaris Skills yang terlihat untuk sebuah agen.agentIdbersifat opsional; hilangkan untuk membaca ruang kerja agen default.- Respons mencakup kelayakan, persyaratan yang belum terpenuhi, pemeriksaan konfigurasi, dan opsi instalasi yang disanitasi tanpa mengekspos nilai rahasia mentah.
skills.searchdanskills.detail(operator.read) mengembalikan metadata penemuan ClawHub.skills.upload.begin,skills.upload.chunk, danskills.upload.commit(operator.admin) menyiapkan arsip skill privat sebelum menginstalnya. Ini adalah jalur unggah admin terpisah untuk klien tepercaya, bukan alur instalasi skill ClawHub normal, dan dinonaktifkan secara default kecualiskills.install.allowUploadedArchivesdiaktifkan.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })membuat unggahan yang terikat pada slug dan nilai force tersebut.skills.upload.chunk({ uploadId, offset, dataBase64 })menambahkan byte pada offset terdekode yang persis.skills.upload.commit({ uploadId, sha256? })memverifikasi ukuran akhir dan SHA-256. Commit hanya menyelesaikan unggahan; tindakan ini tidak menginstal skill.- Arsip skill yang diunggah adalah arsip zip yang berisi akar
SKILL.md. Nama direktori internal arsip tidak pernah menentukan target instalasi.
skills.install(operator.admin) memiliki tiga mode:- Mode ClawHub:
{ source: "clawhub", slug, version?, force? }menginstal sebuah folder skill ke direktoriskills/pada ruang kerja agen default. - Mode unggah:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }menginstal unggahan yang telah di-commit ke direktoriskills/<slug>pada ruang kerja agen default. Slug dan nilai force harus cocok dengan permintaanskills.upload.beginawal. Ditolak kecualiskills.install.allowUploadedArchivesdiaktifkan; pengaturan ini tidak memengaruhi instalasi ClawHub. - Mode penginstal Gateway:
{ name, installId, timeoutMs? }menjalankan tindakanmetadata.openclaw.installyang dideklarasikan pada host Gateway. Klien lama mungkin masih mengirimdangerouslyForceUnsafeInstall; bidang ini tidak digunakan lagi, hanya diterima untuk kompatibilitas protokol, dan diabaikan. Gunakansecurity.installPolicyuntuk keputusan instalasi yang dimiliki operator.
- Mode ClawHub:
skills.update(operator.admin) memiliki dua mode:- Mode ClawHub memperbarui satu slug terlacak atau semua instalasi ClawHub terlacak di ruang kerja agen default.
- Mode konfigurasi menambal nilai
skills.entries.<skillKey>sepertienabled,apiKey, danenv.
Tampilan models.list
models.list menerima parameter view opsional
(src/agents/model-catalog-visibility.ts):
- Dihilangkan atau
"default": jikaagents.defaults.modelPolicy.allowdikonfigurasi, responsnya adalah katalog yang diizinkan, termasuk model yang ditemukan secara dinamis untuk entriprovider/*. Jika tidak, responsnya adalah katalog Gateway lengkap. "configured": perilaku berukuran pemilih. Jikaagents.defaults.modelPolicy.allowdikonfigurasi, ini tetap diprioritaskan, termasuk penemuan yang tercakup pada penyedia untuk entriprovider/*. Tanpa daftar izin, respons menggunakan entrimodels.providers.<provider>.modelseksplisit, dengan kembali ke katalog lengkap hanya ketika tidak ada baris model yang dikonfigurasi."provider-config": inventarismodels.providers.*.modelsyang ditulis oleh sumber, terlepas dari daftar izin pemilih. Baris mencakup kapabilitas model publik dan ketersediaan yang mempertimbangkan rute, tetapi menghilangkan endpoint penyedia, materi autentikasi, dan konfigurasi permintaan runtime."all": katalog Gateway lengkap, melewatiagents.defaults.modelPolicy.allow. Gunakan untuk UI diagnostik/penemuan, bukan pemilih model normal.
Persetujuan eksekusi
- Ketika permintaan eksekusi memerlukan persetujuan, Gateway menyiarkan
exec.approval.requested. - Klien operator menyelesaikannya dengan memanggil
exec.approval.resolve(memerlukanoperator.approvals). - Untuk
host=node,exec.approval.requestharus menyertakansystemRunPlan(metadataargv/cwd/rawCommand/sesi kanonis). Permintaan tanpasystemRunPlanditolak. - Setelah disetujui, panggilan
node.invoke system.runyang diteruskan menggunakan kembalisystemRunPlankanonis tersebut sebagai konteks perintah/cwd/sesi yang otoritatif. - Jika pemanggil mengubah
command,rawCommand,cwd,agentId, atausessionKeydi antara persiapan dan penerusansystem.runyang akhirnya disetujui, Gateway menolak eksekusi alih-alih memercayai muatan yang telah diubah.
Fallback pengiriman agen
- Permintaan
agentdapat menyertakandeliver=trueuntuk meminta pengiriman keluar. bestEffortDeliver=false(default) mempertahankan perilaku ketat: target pengiriman yang tidak dapat diresolusikan atau hanya internal mengembalikanINVALID_REQUEST.bestEffortDeliver=truemengizinkan fallback ke eksekusi khusus sesi ketika tidak ada rute eksternal yang dapat dikirimi yang bisa diresolusikan (misalnya sesi internal/webchat atau konfigurasi multi-saluran yang ambigu).- Hasil akhir
agentdapat menyertakanresult.deliveryStatusketika pengiriman diminta, menggunakan statussent,suppressed,partial_failed, danfailedyang sama seperti yang didokumentasikan untukopenclaw agent --json --deliver.
Pembuatan versi
PROTOCOL_VERSION,MIN_CLIENT_PROTOCOL_VERSION,MIN_NODE_PROTOCOL_VERSION, danMIN_PROBE_PROTOCOL_VERSIONberada dipackages/gateway-protocol/src/version.ts.- Klien mengirim
minProtocol+maxProtocol. Klien operator dan UI harus menyertakan protokol saat ini dalam rentang tersebut; klien dan server saat ini menjalankan protokol v4. - Klien terautentikasi yang memiliki
role: "node"danclient.mode: "node"dapat menggunakan protokol Node N-1 (saat ini v3). Probe mulai ulang ringan menggunakan jendela N-1 yang sama. Autentikasi perangkat, pemasangan, cakupan, kebijakan perintah, dan persetujuan eksekusi tidak berubah oleh jendela kompatibilitas ini. Kapabilitas dan perintah Node milik Plugin tidak diberikan hingga Node ditingkatkan ke protokol saat ini karena permukaan yang di-host bukan bagian dari kontrak N-1. - Skema dan model dihasilkan dari definisi TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Konstanta klien
Implementasi klien referensi berada di packages/gateway-client/src/
(OpenClaw membungkusnya melalui fasad tipis src/gateway/client.ts). Nilai
default ini stabil di seluruh protokol v4 dan merupakan dasar yang diharapkan untuk
klien pihak ketiga.
| Konstanta | Default | Sumber |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_NODE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
| Batas waktu permintaan (per RPC) | 30_000 ms |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| Batas waktu praautentikasi / tantangan koneksi | 15_000 ms |
packages/gateway-client/src/timeouts.ts (env OPENCLAW_HANDSHAKE_TIMEOUT_MS dapat menaikkan anggaran server/klien yang berpasangan) |
| Backoff koneksi ulang awal | 1_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Backoff koneksi ulang maksimum | 30_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Batas retry cepat setelah penutupan token perangkat | 250 ms |
packages/gateway-client/src/client.ts |
Masa tenggang penghentian paksa sebelum terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
Batas waktu default stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Interval tick default (sebelum hello-ok) |
30_000 ms |
packages/gateway-client/src/client.ts |
| Penutupan karena batas waktu tick | kode 4000 ketika periode tanpa aktivitas melampaui tickIntervalMs * 2 |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
Server mengumumkan policy.tickIntervalMs,
policy.maxPayload, dan policy.maxBufferedBytes efektif dalam hello-ok; klien
harus mengikuti nilai tersebut, bukan default sebelum handshake.
Klien referensi mengizinkan permintaan terbatas memiliki tenggat terkonfigurasinya ketika
setiap permintaan tertunda memilikinya. Permintaan expectFinal tanpa
timeoutMs terbatas, permintaan apa pun dengan timeoutMs: null, atau campuran permintaan
terbatas dan tanpa batas membuat watchdog tick tetap aktif. Jika event masuk dan
respons tetap tidak ada hingga melewati ambang batas waktu tick, klien menutup
soket dengan kode 4000, menolak setiap permintaan tertunda, dan menghubungkan ulang. Klien
tidak memutar ulang permintaan yang ditolak setelah menghubungkan ulang.
Autentikasi
- Autentikasi Gateway dengan rahasia bersama menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, bergantung padagateway.auth.modeyang dikonfigurasi ("none" | "token" | "password" | "trusted-proxy"). - Mode yang memuat identitas seperti Tailscale Serve (
gateway.auth.allowTailscale: true) ataugateway.auth.mode: "trusted-proxy"non-loopback memenuhi pemeriksaan autentikasi koneksi dari header permintaan, bukan dariconnect.params.auth.*. gateway.auth.mode: "none"ingress privat sepenuhnya melewati autentikasi koneksi dengan rahasia bersama; jangan mengekspos mode tersebut pada ingress publik/tidak tepercaya.- Setelah pemasangan, Gateway menerbitkan token perangkat yang cakupannya dibatasi pada
peran + cakupan koneksi, yang dikembalikan dalam
hello-ok.auth.deviceToken. Klien harus menyimpannya setelah setiap koneksi yang berhasil. - Saat menghubungkan ulang dengan token perangkat tersimpan tersebut, gunakan kembali juga kumpulan cakupan tersimpan yang telah disetujui untuk token itu. Hal ini mempertahankan akses baca/probe/status yang telah diberikan dan mencegah koneksi ulang secara diam-diam menyusut menjadi cakupan implisit yang lebih sempit dan khusus admin.
- Penyusunan autentikasi koneksi di sisi klien (
selectConnectAuthdalampackages/gateway-client/src/client.ts):auth.passwordbersifat ortogonal dan selalu diteruskan ketika ditetapkan.auth.tokendiisi berdasarkan urutan prioritas: token bersama eksplisit terlebih dahulu, kemudiandeviceTokeneksplisit, lalu token per perangkat tersimpan (dikunci berdasarkandeviceId+role).auth.bootstrapTokendikirim hanya jika tidak satu pun dari hal di atas menghasilkanauth.token. Token bersama atau token perangkat apa pun yang berhasil ditentukan akan menonaktifkannya.- Promosi otomatis token perangkat tersimpan pada retry satu kali
AUTH_TOKEN_MISMATCHdibatasi hanya untuk endpoint tepercaya: loopback, atauwss://dengantlsFingerprintyang dipasangi pin.wss://publik tanpa pin tidak memenuhi syarat.
- Bootstrap kode penyiapan bawaan mengembalikan
hello-ok.auth.deviceTokenNode utama beserta token operator terbatas dalamhello-ok.auth.deviceTokensuntuk penyerahan seluler tepercaya. Token operator menyertakanoperator.talk.secretsuntuk pembacaan konfigurasi Talk native, tetapi mengecualikan cakupan mutasi pemasangan danoperator.admin. - Saat bootstrap kode penyiapan non-baseline menunggu persetujuan,
detail
PAIRING_REQUIREDmencakuprecommendedNextStep: "wait_then_retry",retryable: true, danpauseReconnect: false. Terus hubungkan ulang dengan token bootstrap yang sama hingga permintaan disetujui atau token menjadi tidak valid. - Simpan
hello-ok.auth.deviceTokenshanya ketika koneksi menggunakan autentikasi bootstrap pada transport tepercaya sepertiwss://atau pemasangan loopback/lokal. - Jika klien memberikan
deviceTokeneksplisit atauscopeseksplisit, kumpulan cakupan yang diminta pemanggil tersebut tetap menjadi acuan; cakupan yang di-cache hanya digunakan kembali ketika klien menggunakan kembali token per perangkat yang tersimpan. - Token perangkat dapat dirotasi/dicabut melalui
device.token.rotatedandevice.token.revoke(memerlukanoperator.pairing). Merotasi atau mencabut token Node atau peran non-operator lainnya juga memerlukanoperator.admin. device.token.rotatemengembalikan metadata rotasi. Metadata tersebut menyertakan token bearer pengganti hanya untuk panggilan dari perangkat yang sama yang telah diautentikasi dengan token perangkat tersebut, sehingga klien yang hanya menggunakan token dapat menyimpan penggantinya sebelum menghubungkan ulang. Rotasi bersama/admin tidak menyertakan token bearer.- Penerbitan, rotasi, dan pencabutan token tetap dibatasi pada kumpulan peran yang disetujui dan tercatat dalam entri pemasangan perangkat tersebut; mutasi token tidak dapat memperluas atau menargetkan peran perangkat yang tidak pernah diberikan oleh persetujuan pemasangan.
- Untuk sesi token perangkat terpasang, pengelolaan perangkat terbatas pada diri sendiri kecuali
pemanggil juga memiliki
operator.admin: pemanggil non-admin hanya dapat mengelola token operator untuk entri perangkatnya sendiri. Pengelolaan token Node dan non-operator lainnya hanya untuk admin, bahkan untuk perangkat pemanggil sendiri. device.token.rotatedandevice.token.revokejuga memeriksa kumpulan cakupan token operator target terhadap cakupan sesi pemanggil saat ini. Pemanggil non-admin tidak dapat merotasi atau mencabut token operator yang cakupannya lebih luas daripada yang telah mereka miliki.- Kegagalan autentikasi mencakup
error.details.codebeserta petunjuk pemulihan:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep: salah satu dariretry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration(packages/gateway-protocol/src/connect-error-details.ts).
- Perilaku klien untuk
AUTH_TOKEN_MISMATCH:- Klien tepercaya dapat mencoba satu retry terbatas dengan token per perangkat yang di-cache.
- Jika retry tersebut gagal, hentikan loop koneksi ulang otomatis dan tampilkan panduan tindakan operator.
AUTH_SCOPE_MISMATCHberarti token perangkat dikenali tetapi tidak mencakup peran/cakupan yang diminta. Jangan menampilkannya sebagai token yang salah; minta operator untuk memasangkan ulang atau menyetujui kontrak cakupan yang lebih sempit/luas.
Identitas dan pemasangan perangkat
- Node harus menyertakan identitas perangkat stabil (
device.id) yang berasal dari fingerprint pasangan kunci. - Gateway menerbitkan token per perangkat + peran.
- Persetujuan pemasangan diperlukan untuk ID perangkat baru kecuali persetujuan otomatis lokal diaktifkan.
- Persetujuan otomatis pemasangan berpusat pada koneksi loopback lokal langsung.
- OpenClaw juga memiliki jalur koneksi mandiri backend/kontainer-lokal yang sempit untuk alur helper rahasia bersama tepercaya.
- Koneksi tailnet atau LAN pada host yang sama tetap diperlakukan sebagai koneksi jarak jauh untuk pemasangan dan memerlukan persetujuan.
- Klien WS biasanya menyertakan identitas
deviceselamaconnect(operator + Node). Satu-satunya pengecualian operator tanpa perangkat adalah jalur kepercayaan eksplisit:gateway.controlUi.allowInsecureAuth=trueuntuk kompatibilitas HTTP tidak aman khusus localhost.- autentikasi Control UI operator
gateway.auth.mode: "trusted-proxy"yang berhasil. gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, penurunan keamanan yang parah).- RPC backend
gateway-clientloopback langsung pada jalur helper internal yang dicadangkan.
- Menghilangkan identitas perangkat memiliki konsekuensi terhadap cakupan. Ketika koneksi
operator tanpa perangkat diizinkan melalui jalur kepercayaan eksplisit, OpenClaw
tetap mengosongkan cakupan yang dideklarasikan sendiri kecuali jalur tersebut memiliki
pengecualian preservasi cakupan bernama. Metode yang dibatasi cakupan kemudian gagal dengan
missing scope. gateway.controlUi.dangerouslyDisableDeviceAuth=trueadalah jalur preservasi cakupan break-glass Control UI. Jalur ini tidak memberikan cakupan kepada klien WebSocket backend kustom atau berbentuk CLI secara sembarang.- Jalur helper backend
gateway-clientloopback langsung yang dicadangkan mempertahankan cakupan hanya untuk RPC bidang kontrol lokal internal; ID backend kustom tidak menerima pengecualian ini. - Semua koneksi harus menandatangani nonce
connect.challengeyang disediakan server.
Diagnostik migrasi autentikasi perangkat
Untuk klien lama yang masih menggunakan perilaku penandatanganan sebelum tantangan, connect
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 tidak menyertakan device.nonce (atau mengirimkannya kosong). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Klien menandatangani dengan nonce yang kedaluwarsa/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 toleransi penyimpangan yang diizinkan. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id tidak cocok dengan sidik jari kunci publik. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Format/kanonisasi kunci publik gagal. |
Target migrasi:
- Selalu tunggu
connect.challenge. - Tandatangani payload v2 yang menyertakan nonce server.
- Kirim nonce yang sama dalam
connect.params.device.nonce. - Payload tanda tangan yang disarankan adalah
v3(buildDeviceAuthPayloadV3dalampackages/gateway-client/src/device-auth.ts), yang mengikatplatformdandeviceFamilyselain bidang perangkat/klien/peran/cakupan/token/nonce. - Tanda tangan
v2lama tetap diterima untuk kompatibilitas, tetapi penyematan metadata perangkat yang dipasangkan tetap mengendalikan kebijakan perintah saat tersambung kembali.
TLS dan penyematan
- TLS didukung untuk koneksi WS (konfigurasi
gateway.tls). - Klien dapat secara opsional menyematkan sidik jari sertifikat Gateway melalui
gateway.remote.tlsFingerprintatau CLI--tls-fingerprint.
Cakupan
Protokol ini mengekspos API Gateway lengkap: status, saluran, model, obrolan,
agen, sesi, node, persetujuan, dan lainnya. Permukaan persisnya ditentukan oleh
skema TypeBox yang diekspor ulang dari packages/gateway-protocol/src/schema.ts.