Protokol Gateway WS adalah control plane tunggal + transport node untuk OpenClaw. Semua klien (CLI, UI web, aplikasi macOS, node iOS/Android, node headless) terhubung melalui WebSocket dan mendeklarasikan role + scope mereka saat handshake.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Transport
- WebSocket, frame teks dengan payload JSON.
- Frame pertama harus berupa permintaan
connect. - Frame pra-koneksi dibatasi hingga 64 KiB. Setelah handshake berhasil, klien
sebaiknya mengikuti batas
hello-ok.policy.maxPayloaddanhello-ok.policy.maxBufferedBytes. Dengan diagnostik diaktifkan, frame masuk yang terlalu besar dan buffer keluar yang lambat memancarkan eventpayload.largesebelum gateway menutup atau membuang frame yang terdampak. Event ini menyimpan ukuran, batas, surface, dan kode alasan yang aman. Event ini tidak menyimpan isi pesan, konten lampiran, isi frame mentah, token, cookie, atau nilai rahasia.
Handshake (connect)
Gateway → Klien (tantangan pra-koneksi):connect dapat
mengembalikan error UNAVAILABLE yang dapat dicoba ulang dengan details.reason diatur ke
"startup-sidecars" dan retryAfterMs. Klien sebaiknya mencoba ulang respons itu
dalam anggaran koneksi keseluruhan mereka alih-alih menampilkannya sebagai kegagalan
handshake terminal.
server, features, snapshot, dan policy semuanya diwajibkan oleh skema
(src/gateway/protocol/schema/frames.ts). auth juga diwajibkan dan melaporkan
role/scope yang dinegosiasikan. pluginSurfaceUrls bersifat opsional dan memetakan nama surface
plugin, seperti canvas, ke URL yang di-host dengan scope.
URL surface plugin berscope dapat kedaluwarsa. Node dapat memanggil
node.pluginSurface.refresh dengan { "surface": "canvas" } untuk menerima entri baru
di pluginSurfaceUrls. Refaktor Plugin Canvas eksperimental tidak mendukung
jalur kompatibilitas canvasHostUrl, canvasCapability, atau
node.canvas.capability.refresh yang sudah tidak digunakan; klien native dan
gateway saat ini harus menggunakan surface plugin.
Saat tidak ada token perangkat yang diterbitkan, hello-ok.auth melaporkan
izin yang dinegosiasikan tanpa field token:
client.id: "gateway-client",
client.mode: "backend") dapat menghilangkan device pada koneksi loopback langsung saat
mereka melakukan autentikasi dengan token/kata sandi gateway bersama. Jalur ini dicadangkan
untuk RPC control-plane internal dan mencegah baseline pemasangan CLI/perangkat yang usang
memblokir pekerjaan backend lokal seperti pembaruan sesi subagent. Klien jarak jauh,
klien asal browser, klien node, dan klien token-perangkat/identitas-perangkat eksplisit
tetap menggunakan pemeriksaan pemasangan dan peningkatan scope normal.
Saat token perangkat diterbitkan, hello-ok juga menyertakan:
hello-ok.auth juga dapat menyertakan entri role
terbatas tambahan di deviceTokens:
scopes: [] dan token operator apa pun yang diserahkan tetap dibatasi pada allowlist operator
bootstrap (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Pemeriksaan scope bootstrap tetap
berprefiks 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?}
Role + scope
Untuk model scope operator lengkap, pemeriksaan saat persetujuan, dan semantik shared-secret, lihat Scope operator.Role
operator= klien control plane (CLI/UI/otomasi).node= host kapabilitas (camera/screen/canvas/system.run).
Scope (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 operator mereka sendiri, tetapi
prefiks admin inti yang dicadangkan (config.*, exec.approvals.*, wizard.*,
update.*) selalu diselesaikan ke operator.admin.
Scope metode hanyalah gerbang pertama. Beberapa perintah slash yang dicapai melalui
chat.send menerapkan pemeriksaan tingkat perintah yang lebih ketat di atasnya. Misalnya, penulisan
/config set dan /config unset persisten memerlukan operator.admin.
node.pair.approve juga memiliki pemeriksaan scope tambahan 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 terhubung:caps: kategori kapabilitas tingkat tinggi seperticamera,canvas,screen,location,voice, dantalk.commands: allowlist perintah untuk invoke.permissions: toggle granular (mis.screen.record,camera.capture).
Presence
system-presencemengembalikan entri yang dikunci berdasarkan identitas perangkat.- Entri presence mencakup
deviceId,roles, danscopessehingga UI dapat menampilkan satu baris per perangkat bahkan ketika perangkat terhubung sebagai operator dan node. node.listmenyertakan field opsionallastSeenAtMsdanlastSeenReason. Node yang terhubung melaporkan waktu koneksi mereka saat ini sebagailastSeenAtMsdengan alasanconnect; node yang dipasangkan juga dapat melaporkan presence latar belakang yang tahan lama saat event node tepercaya memperbarui metadata pemasangan mereka.
Event hidup latar belakang node
Node dapat memanggilnode.event dengan event: "node.presence.alive" untuk mencatat bahwa node yang dipasangkan
hidup selama wake latar belakang tanpa menandainya terhubung.
trigger adalah enum tertutup: background, silent_push, bg_app_refresh,
significant_location, manual, atau connect. String trigger yang tidak dikenal dinormalisasi ke
background oleh gateway sebelum persistensi. Event ini hanya tahan lama untuk sesi perangkat node
yang terautentikasi; sesi tanpa perangkat atau tidak dipasangkan mengembalikan handled: false.
Gateway yang berhasil mengembalikan hasil terstruktur:
{ "ok": true } untuk node.event; klien sebaiknya memperlakukannya sebagai
RPC yang diakui, bukan sebagai persistensi presence yang tahan lama.
Penscope-an event broadcast
Event broadcast WebSocket yang didorong server diberi gerbang scope sehingga sesi berscope pemasangan atau hanya node tidak menerima konten sesi secara pasif.- Frame chat, agent, dan hasil tool (termasuk event
agentyang dialirkan dan hasil pemanggilan tool) memerlukan setidaknyaoperator.read. Sesi tanpaoperator.readmelewati frame ini sepenuhnya. - Broadcast
plugin.*yang didefinisikan plugin diberi gerbang keoperator.writeatauoperator.admin, tergantung cara plugin mendaftarkannya. - Event status dan transport (
heartbeat,presence,tick, siklus hidup koneksi/diskoneksi, dll.) tetap tidak dibatasi sehingga kesehatan transport tetap dapat diamati oleh setiap sesi terautentikasi. - Keluarga event broadcast yang tidak dikenal diberi gerbang scope secara default (fail-closed) kecuali handler terdaftar secara eksplisit melonggarkannya.
Keluarga metode RPC umum
Surface WS publik lebih luas daripada contoh handshake/auth di atas. Ini bukan dump yang dihasilkan —hello-ok.features.methods adalah daftar discovery
konservatif yang dibangun dari src/gateway/server-methods-list.ts plus ekspor metode
plugin/channel yang dimuat. Perlakukan ini sebagai discovery fitur, bukan enumerasi penuh
dari src/gateway/server-methods/*.ts.
Sistem dan identitas
Sistem dan identitas
healthmengembalikan snapshot kesehatan gateway yang di-cache atau baru diprobe.diagnostics.stabilitymengembalikan perekam stabilitas diagnostik terbatas terbaru. Ini menyimpan metadata operasional seperti nama event, jumlah, ukuran byte, pembacaan memori, status antrean/sesi, nama channel/plugin, dan id sesi. Ini tidak menyimpan teks chat, isi webhook, output tool, isi permintaan atau respons mentah, token, cookie, atau nilai rahasia. Scope baca operator diperlukan.statusmengembalikan ringkasan gateway bergaya/status; field sensitif hanya disertakan untuk klien operator berscope admin.gateway.identity.getmengembalikan identitas perangkat gateway yang digunakan oleh alur relay dan pemasangan.system-presencemengembalikan snapshot presence saat ini untuk perangkat operator/node yang terhubung.system-eventmenambahkan event sistem dan dapat memperbarui/menyiarkan konteks presence.last-heartbeatmengembalikan event heartbeat tersimpan terbaru.set-heartbeatsmengaktifkan atau menonaktifkan pemrosesan heartbeat pada gateway.
Model dan penggunaan
Model dan penggunaan
models.listmengembalikan katalog model yang diizinkan runtime. Teruskan{ "view": "configured" }untuk model terkonfigurasi berukuran pemilih (agents.defaults.modelsterlebih dahulu, lalumodels.providers.*.models), atau{ "view": "all" }untuk katalog lengkap.usage.statusmengembalikan ringkasan jendela penggunaan penyedia/kuota tersisa.usage.costmengembalikan ringkasan penggunaan biaya teragregasi untuk rentang tanggal.doctor.memory.statusmengembalikan kesiapan memori vektor / embedding cache untuk workspace agen default aktif. Teruskan{ "probe": true }atau{ "deep": true }hanya ketika pemanggil secara eksplisit menginginkan ping penyedia embedding langsung.doctor.memory.remHarnessmengembalikan pratinjau harness REM yang terbatas dan hanya baca untuk klien control-plane jarak jauh. Ini dapat menyertakan path workspace, cuplikan memori, markdown grounded yang dirender, dan kandidat promosi mendalam, sehingga pemanggil memerlukanoperator.read.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 pembantu login
Channel dan pembantu login
channels.statusmengembalikan ringkasan status channel/plugin bawaan + terbundel.channels.logoutmengeluarkan akun/channel tertentu ketika channel mendukung logout.web.login.startmemulai alur login QR/web untuk penyedia channel web saat ini yang mendukung QR.web.login.waitmenunggu alur login QR/web tersebut selesai dan memulai channel jika berhasil.push.testmengirim push APNs uji ke node iOS terdaftar.voicewake.getmengembalikan pemicu kata bangun yang tersimpan.voicewake.setmemperbarui pemicu kata bangun dan menyiarkan perubahan.
Pesan dan log
Pesan dan log
sendadalah RPC pengiriman keluar langsung untuk pengiriman yang ditargetkan ke channel/akun/thread di luar runner chat.logs.tailmengembalikan tail log file Gateway yang dikonfigurasi dengan kontrol kursor/batas dan byte maksimum.
Talk dan TTS
Talk dan TTS
talk.catalogmengembalikan katalog penyedia Talk hanya baca untuk ucapan, transkripsi streaming, dan suara realtime. Ini mencakup id penyedia, label, status terkonfigurasi, id model/suara yang diekspos, mode kanonis, transport, strategi brain, serta flag audio/kapabilitas realtime tanpa mengembalikan rahasia penyedia atau mengubah konfigurasi global.talk.configmengembalikan payload konfigurasi Talk efektif;includeSecretsmemerlukanoperator.talk.secrets(atauoperator.admin).talk.session.createmembuat sesi Talk milik Gateway untukrealtime/gateway-relay,transcription/gateway-relay, ataustt-tts/managed-room.brain: "direct-tools"memerlukanoperator.admin.talk.session.joinmemvalidasi token sesi managed-room, memancarkan eventsession.readyatausession.replacedsesuai kebutuhan, dan mengembalikan metadata room/sesi beserta event Talk terbaru tanpa token plaintext atau hash token tersimpan.talk.session.appendAudiomenambahkan audio input PCM base64 ke sesi relay realtime dan transkripsi milik Gateway.talk.session.startTurn,talk.session.endTurn, dantalk.session.cancelTurnmenggerakkan siklus hidup giliran managed-room dengan penolakan giliran basi sebelum status dibersihkan.talk.session.cancelOutputmenghentikan output audio asisten, terutama untuk interupsi yang dijaga VAD dalam sesi relay Gateway.talk.session.submitToolResultmenyelesaikan panggilan tool penyedia yang dipancarkan oleh sesi relay realtime milik Gateway. Teruskanoptions: { willContinue: true }untuk output tool sementara ketika hasil final akan menyusul, atauoptions: { suppressResponse: true }ketika hasil tool harus memenuhi panggilan penyedia tanpa memulai respons asisten realtime lain.talk.session.closemenutup sesi relay, transkripsi, atau managed-room milik Gateway dan memancarkan event Talk terminal.talk.modemenetapkan/menyiarkan status mode Talk saat ini untuk klien WebChat/Control UI.talk.client.createmembuat sesi penyedia realtime milik klien menggunakanwebrtcatauprovider-websocketsementara Gateway memiliki konfigurasi, kredensial, instruksi, dan kebijakan tool.talk.client.toolCallmemungkinkan transport realtime milik klien meneruskan panggilan tool penyedia ke kebijakan Gateway. Tool pertama yang didukung adalahopenclaw_agent_consult; klien menerima id run dan menunggu event siklus hidup chat normal sebelum mengirimkan hasil tool khusus penyedia.talk.eventadalah satu-satunya channel event Talk untuk realtime, transkripsi, STT/TTS, managed-room, teleponi, dan adaptor rapat.talk.speakmensintesis ucapan melalui penyedia ucapan Talk aktif.tts.statusmengembalikan status TTS aktif, penyedia aktif, penyedia fallback, dan status konfigurasi penyedia.tts.providersmengembalikan inventaris penyedia TTS yang terlihat.tts.enabledantts.disablemengaktifkan/menonaktifkan status preferensi TTS.tts.setProvidermemperbarui penyedia TTS pilihan.tts.convertmenjalankan konversi teks-ke-ucapan sekali pakai.
Rahasia, konfigurasi, pembaruan, dan wizard
Rahasia, konfigurasi, pembaruan, dan wizard
secrets.reloadmenyelesaikan ulang SecretRefs aktif dan menukar status rahasia runtime hanya jika sepenuhnya berhasil.secrets.resolvemenyelesaikan penetapan rahasia target perintah untuk kumpulan perintah/target tertentu.config.getmengembalikan snapshot dan hash konfigurasi saat ini.config.setmenulis payload konfigurasi yang divalidasi.config.patchmenggabungkan pembaruan konfigurasi parsial.config.applymemvalidasi + mengganti payload konfigurasi lengkap.config.schemamengembalikan payload skema konfigurasi live yang digunakan oleh tooling Control UI dan CLI: skema,uiHints, versi, dan metadata pembuatan, termasuk metadata skema plugin + channel ketika runtime dapat memuatnya. Skema mencakup metadata fieldtitle/descriptionyang berasal dari label dan teks bantuan yang sama dengan yang digunakan UI, termasuk cabang komposisi objek bersarang, wildcard, item array, dananyOf/oneOf/allOfketika dokumentasi field yang cocok ada.config.schema.lookupmengembalikan payload lookup bercakupan path untuk satu path konfigurasi: path ternormalisasi, node skema dangkal, hint yang cocok +hintPath, dan ringkasan anak langsung untuk drill-down UI/CLI. Node skema lookup mempertahankan dokumentasi yang menghadap pengguna dan field validasi umum (title,description,type,enum,const,format,pattern, batas numerik/string/array/objek, dan flag sepertiadditionalProperties,deprecated,readOnly,writeOnly). Ringkasan anak mengeksposkey,pathternormalisasi,type,required,hasChildren, ditambahhint/hintPathyang cocok.update.runmenjalankan alur pembaruan Gateway dan menjadwalkan restart hanya ketika pembaruan itu sendiri berhasil; pemanggil dengan sesi dapat menyertakancontinuationMessagesehingga startup melanjutkan satu giliran agen lanjutan melalui antrean kelanjutan restart. Pembaruan package manager memaksa restart pembaruan yang tidak ditangguhkan dan tanpa cooldown setelah penukaran paket sehingga proses Gateway lama tidak terus melakukan lazy-loading dari pohondistyang telah diganti.update.statusmengembalikan sentinel restart pembaruan cache terbaru, termasuk versi berjalan pasca-restart jika tersedia.wizard.start,wizard.next,wizard.status, danwizard.cancelmengekspos wizard onboarding melalui WS RPC.
Agen dan pembantu workspace
Agen dan pembantu workspace
agents.listmengembalikan entri agen yang dikonfigurasi, termasuk model efektif dan metadata runtime.agents.create,agents.update, danagents.deletemengelola record agen dan penyambungan workspace.agents.files.list,agents.files.get, danagents.files.setmengelola file workspace bootstrap yang diekspos untuk agen.tasks.list,tasks.get, dantasks.cancelmengekspos ledger tugas Gateway ke klien SDK dan operator.artifacts.list,artifacts.get, danartifacts.downloadmengekspos ringkasan artefak turunan transkrip dan unduhan untuk cakupansessionKey,runId, atautaskIdeksplisit. Kueri run dan tugas menyelesaikan sesi pemilik di sisi server dan hanya mengembalikan media transkrip dengan provenance yang cocok; sumber URL tidak aman atau lokal mengembalikan unduhan tidak didukung alih-alih diambil di sisi server.environments.listdanenvironments.statusmengekspos penemuan environment lokal Gateway dan node yang hanya baca untuk klien SDK.agent.identity.getmengembalikan identitas asisten efektif untuk agen atau sesi.agent.waitmenunggu run selesai dan mengembalikan snapshot terminal jika tersedia.
Kontrol sesi
Kontrol sesi
sessions.listmengembalikan indeks sesi saat ini, termasuk metadataagentRuntimeper baris ketika backend runtime agen dikonfigurasi.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 key sesi tertentu.sessions.describemengembalikan satu baris sesi Gateway untuk key sesi yang persis.sessions.resolvemenyelesaikan atau mengkanoniskan target sesi.sessions.createmembuat entri sesi baru.sessions.sendmengirim pesan ke sesi yang sudah ada.sessions.steeradalah varian interupsi-dan-arahkan untuk sesi aktif.sessions.abortmembatalkan pekerjaan aktif untuk sesi. Pemanggil dapat meneruskankeyplusrunIdopsional, atau meneruskanrunIdsaja untuk run aktif yang dapat diselesaikan Gateway ke sesi.sessions.patchmemperbarui metadata/override sesi dan melaporkan model kanonis yang diselesaikan besertaagentRuntimeefektif.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 bagi klien UI: tag arahan inline dihapus dari teks yang terlihat, payload XML panggilan tool teks biasa (termasuk<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, dan blok panggilan tool terpotong) serta token kontrol model ASCII/lebar penuh yang bocor dihapus, baris asisten token senyap murni seperti persisNO_REPLY/no_replydihilangkan, dan baris yang terlalu besar dapat diganti dengan placeholder.
Pairing perangkat dan token perangkat
Pairing perangkat dan token perangkat
device.pair.listmengembalikan perangkat berpasangan yang tertunda dan disetujui.device.pair.approve,device.pair.reject, dandevice.pair.removemengelola record pairing perangkat.device.token.rotatemerotasi token perangkat berpasangan dalam batas peran yang disetujui dan cakupan pemanggil.device.token.revokemencabut token perangkat berpasangan dalam batas peran yang disetujui dan cakupan pemanggil.
Pairing node, invoke, dan pekerjaan tertunda
Pairing node, invoke, dan pekerjaan tertunda
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.remove, dannode.pair.verifymencakup pairing node dan verifikasi bootstrap.node.listdannode.describemengembalikan status node yang dikenal/terhubung.node.renamememperbarui label node berpasangan.node.invokemeneruskan perintah ke node terhubung.node.invoke.resultmengembalikan hasil untuk permintaan invoke.node.eventmembawa event yang berasal dari node kembali ke gateway.node.pending.pulldannode.pending.ackadalah API antrean node terhubung.node.pending.enqueuedannode.pending.drainmengelola pekerjaan tertunda yang tahan lama untuk node offline/terputus.
Kelompok persetujuan
Kelompok persetujuan
exec.approval.request,exec.approval.get,exec.approval.list, danexec.approval.resolvemencakup permintaan persetujuan exec sekali jalan serta pencarian/pemutaran ulang persetujuan yang tertunda.exec.approval.waitDecisionmenunggu satu persetujuan exec yang tertunda dan mengembalikan keputusan akhir (ataunullsaat waktu habis).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.list,plugin.approval.waitDecision, danplugin.approval.resolvemencakup alur persetujuan yang ditentukan plugin.
Otomasi, Skills, dan alat
Otomasi, Skills, dan alat
- Otomasi:
wakemenjadwalkan injeksi teks wake langsung atau pada heartbeat berikutnya;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsmengelola pekerjaan terjadwal. - Skills dan alat:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Kelompok peristiwa umum
chat: pembaruan chat UI sepertichat.injectdan peristiwa chat lain yang hanya berupa transkrip.session.messagedansession.tool: pembaruan transkrip/aliran peristiwa untuk sesi yang berlangganan.sessions.changed: indeks sesi atau metadata berubah.presence: pembaruan snapshot kehadiran sistem.tick: peristiwa keepalive / liveness berkala.health: pembaruan snapshot kesehatan gateway.heartbeat: pembaruan aliran peristiwa heartbeat.cron: peristiwa perubahan run/job cron.shutdown: notifikasi penghentian 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 yang dipasangkan.voicewake.changed: konfigurasi 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 pembantu Node
- Node dapat memanggil
skills.binsuntuk mengambil daftar executable skill saat ini untuk pemeriksaan auto-allow.
RPC ledger tugas
Klien operator dapat memeriksa dan membatalkan catatan tugas latar belakang Gateway melalui RPC ledger tugas. Metode ini mengembalikan ringkasan tugas yang sudah disanitasi, bukan status runtime mentah.tasks.listmemerlukanoperator.read.- Params:
statusopsional ("queued","running","completed","failed","cancelled", atau"timed_out") atau array status tersebut,agentIdopsional,sessionKeyopsional,limitopsional dari1hingga500, dan stringcursoropsional. - Result:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Params:
tasks.getmemerlukanoperator.read.- Params:
{ "taskId": string }. - Result:
{ "task": TaskSummary }. - Id tugas yang hilang mengembalikan bentuk error not-found Gateway.
- Params:
tasks.cancelmemerlukanoperator.write.- Params:
{ "taskId": string, "reason"?: string }. - Result:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundmelaporkan apakah ledger memiliki tugas yang cocok.cancelledmelaporkan apakah runtime menerima atau mencatat pembatalan.
- Params:
TaskSummary menyertakan id, status, dan metadata opsional seperti kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, timestamp, progres,
ringkasan terminal, dan teks error yang disanitasi.
Metode pembantu operator
- Operator dapat memanggil
commands.list(operator.read) untuk mengambil inventaris perintah runtime untuk agent.agentIdbersifat opsional; hilangkan untuk membaca workspace agent default.scopemengontrol surface yang ditargetkannameutama:textmengembalikan token perintah teks utama tanpa awalan/nativedan jalur defaultbothmengembalikan nama native yang sadar provider saat tersedia
textAliasesmembawa alias slash persis seperti/modeldan/m.nativeNamemembawa nama perintah native yang sadar provider saat ada.providerbersifat opsional dan hanya memengaruhi penamaan native serta ketersediaan perintah plugin native.includeArgs=falsemenghilangkan metadata argumen terserialisasi dari respons.
- Operator dapat memanggil
tools.catalog(operator.read) untuk mengambil katalog alat runtime untuk agent. Respons menyertakan alat yang dikelompokkan dan metadata asal:source:coreataupluginpluginId: pemilik plugin saatsource="plugin"optional: apakah alat plugin bersifat opsional
- Operator dapat memanggil
tools.effective(operator.read) untuk mengambil inventaris alat yang efektif pada runtime untuk sesi.sessionKeywajib.- Gateway menurunkan konteks runtime tepercaya dari sesi di sisi server alih-alih menerima konteks auth atau delivery yang disediakan pemanggil.
- Respons dibatasi pada sesi dan mencerminkan apa yang dapat digunakan percakapan aktif saat ini, termasuk alat core, plugin, dan channel.
- Operator dapat memanggil
tools.invoke(operator.write) untuk meng-invoke satu alat yang tersedia melalui jalur kebijakan gateway yang sama dengan/tools/invoke.namewajib.args,sessionKey,agentId,confirm, danidempotencyKeybersifat opsional.- Jika
sessionKeydanagentIdsama-sama ada, agent sesi yang di-resolve harus cocok denganagentId. - Respons adalah envelope yang menghadap SDK dengan
ok,toolName,outputopsional, dan fielderrorbertipe. Penolakan persetujuan atau kebijakan mengembalikanok:falsedalam payload, bukan melewati pipeline kebijakan alat gateway.
- Operator dapat memanggil
skills.status(operator.read) untuk mengambil inventaris skill yang terlihat untuk agent.agentIdbersifat opsional; hilangkan untuk membaca workspace agent default.- Respons menyertakan kelayakan, persyaratan yang hilang, pemeriksaan konfigurasi, dan opsi instalasi yang disanitasi tanpa mengekspos nilai rahasia mentah.
- Operator dapat memanggil
skills.searchdanskills.detail(operator.read) untuk metadata discovery ClawHub. - Operator dapat memanggil
skills.upload.begin,skills.upload.chunk, danskills.upload.commit(operator.admin) untuk men-stage arsip skill privat sebelum menginstalnya. Ini adalah jalur upload 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 upload yang terikat pada slug dan nilai force tersebut.skills.upload.chunk({ uploadId, offset, dataBase64 })menambahkan byte pada offset hasil dekode yang persis.skills.upload.commit({ uploadId, sha256? })memverifikasi ukuran akhir dan SHA-256. Commit hanya menyelesaikan upload; itu tidak menginstal skill.- Arsip skill yang di-upload adalah arsip zip yang berisi root
SKILL.md. Nama direktori internal arsip tidak pernah memilih target instalasi.
- Operator dapat memanggil
skills.install(operator.admin) dalam tiga mode:- Mode ClawHub:
{ source: "clawhub", slug, version?, force? }menginstal folder skill ke direktoriskills/workspace agent default. - Mode upload:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }menginstal upload yang sudah di-commit ke direktoriskills/<slug>workspace agent default. Slug dan nilai force harus cocok dengan permintaanskills.upload.beginasli. Mode ini ditolak kecualiskills.install.allowUploadedArchivesdiaktifkan. Pengaturan tersebut tidak memengaruhi instalasi ClawHub. - Mode installer Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }menjalankan tindakanmetadata.openclaw.installyang dideklarasikan di host gateway.
- Mode ClawHub:
- Operator dapat memanggil
skills.update(operator.admin) dalam dua mode:- Mode ClawHub memperbarui satu slug terlacak atau semua instalasi ClawHub terlacak di workspace agent default.
- Mode konfigurasi menambal nilai
skills.entries.<skillKey>sepertienabled,apiKey, danenv.
Tampilan models.list
models.list menerima parameter view opsional:
- Dihilangkan atau
"default": perilaku runtime saat ini. Jikaagents.defaults.modelsdikonfigurasi, respons adalah katalog yang diizinkan, termasuk model yang ditemukan secara dinamis untuk entriprovider/*. Jika tidak, respons adalah katalog Gateway lengkap. "configured": perilaku seukuran picker. Jikaagents.defaults.modelsdikonfigurasi, itu tetap menang, termasuk discovery berbasis provider untuk entriprovider/*. Tanpa allowlist, respons menggunakan entri eksplisitmodels.providers.*.models, dengan fallback ke katalog lengkap hanya saat tidak ada baris model terkonfigurasi."all": katalog Gateway lengkap, melewatiagents.defaults.models. Gunakan ini untuk diagnostik dan UI discovery, bukan picker model normal.
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 konteks perintah/cwd/sesi yang otoritatif. - Jika pemanggil memutasi
command,rawCommand,cwd,agentId, atausessionKeyantara prepare dan forwardsystem.runakhir yang disetujui, gateway menolak run alih-alih memercayai payload yang dimutasi.
Fallback delivery agent
- Permintaan
agentdapat menyertakandeliver=trueuntuk meminta delivery keluar. bestEffortDeliver=falsemempertahankan perilaku ketat: target delivery yang tidak ter-resolve atau hanya internal mengembalikanINVALID_REQUEST.bestEffortDeliver=truemengizinkan fallback ke eksekusi hanya sesi saat tidak ada rute deliverable eksternal yang dapat di-resolve (misalnya sesi internal/webchat atau konfigurasi multi-channel yang ambigu).- Hasil akhir
agentdapat menyertakanresult.deliveryStatussaat delivery diminta, menggunakan statussent,suppressed,partial_failed, danfailedyang sama seperti yang didokumentasikan untukopenclaw agent --json --deliver.
Versioning
PROTOCOL_VERSIONberada disrc/gateway/protocol/version.ts.- Klien mengirim
minProtocol+maxProtocol; server menolak rentang yang tidak menyertakan protokol saat ini. Klien native menggunakan batas bawah v3 agar klien v4 aditif tetap dapat menjangkau gateway v3. - Skema + model dibuat dari definisi TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Konstanta klien
Klien referensi disrc/gateway/client.ts menggunakan default ini. Nilainya
stabil di seluruh protokol v4 dan merupakan baseline yang diharapkan untuk klien pihak ketiga.
| Konstanta | Bawaan | Sumber |
|---|---|---|
PROTOCOL_VERSION | 4 | src/gateway/protocol/version.ts |
MIN_CLIENT_PROTOCOL_VERSION | 3 | src/gateway/protocol/version.ts |
| Timeout permintaan (per RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Timeout preauth / tantangan koneksi | 15_000 ms | src/gateway/handshake-timeouts.ts (config/env dapat menaikkan anggaran server/client berpasangan) |
| Backoff koneksi ulang awal | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Backoff koneksi ulang maks | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Batas retry cepat setelah penutupan token perangkat | 250 ms | src/gateway/client.ts |
Tenggang force-stop sebelum terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Timeout bawaan stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Interval tick bawaan (sebelum hello-ok) | 30_000 ms | src/gateway/client.ts |
| Penutupan tick-timeout | kode 4000 ketika kesenyapan melebihi tickIntervalMs * 2 | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload,
dan policy.maxBufferedBytes efektif dalam hello-ok; client harus mematuhi nilai tersebut
alih-alih bawaan sebelum handshake.
Autentikasi
- Autentikasi Gateway dengan shared secret menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, tergantung mode autentikasi yang dikonfigurasi. - Mode yang membawa identitas seperti Tailscale Serve
(
gateway.auth.allowTailscale: true) atau non-loopbackgateway.auth.mode: "trusted-proxy"memenuhi pemeriksaan autentikasi koneksi dari header permintaan alih-alihconnect.params.auth.*. - Ingress privat
gateway.auth.mode: "none"melewati autentikasi koneksi shared secret sepenuhnya; jangan mengekspos mode tersebut pada ingress publik/tidak tepercaya. - Setelah penyandingan, Gateway menerbitkan token perangkat yang dicakup ke role koneksi
- cakupan. Token ini dikembalikan dalam
hello-ok.auth.deviceTokendan harus dipertahankan oleh client untuk koneksi mendatang.
- cakupan. Token ini dikembalikan dalam
- Client harus mempertahankan
hello-ok.auth.deviceTokenutama setelah setiap koneksi yang berhasil. - Menghubungkan ulang dengan token perangkat yang tersimpan tersebut juga harus menggunakan kembali set cakupan yang disetujui dan tersimpan untuk token tersebut. Ini mempertahankan akses baca/probe/status yang sudah diberikan dan menghindari koneksi ulang yang diam-diam menyusut menjadi cakupan implisit khusus admin yang lebih sempit.
- Penyusunan autentikasi koneksi sisi client (
selectConnectAuthdisrc/gateway/client.ts):auth.passwordbersifat ortogonal dan selalu diteruskan saat ditetapkan.auth.tokendiisi berdasarkan urutan prioritas: token bersama eksplisit terlebih dahulu, laludeviceTokeneksplisit, lalu token per perangkat yang tersimpan (dikunci olehdeviceId+role).auth.bootstrapTokendikirim hanya ketika tidak ada hal di atas yang menghasilkanauth.token. Token bersama atau token perangkat apa pun yang berhasil dihasilkan akan menekannya.- Promosi otomatis token perangkat yang tersimpan pada retry sekali jalan
AUTH_TOKEN_MISMATCHdibatasi hanya untuk endpoint tepercaya — loopback, atauwss://dengantlsFingerprintyang disematkan.wss://publik tanpa penyematan tidak memenuhi syarat.
- Entri
hello-ok.auth.deviceTokenstambahan adalah token handoff bootstrap. Pertahankan hanya ketika koneksi menggunakan autentikasi bootstrap pada transport tepercaya sepertiwss://atau penyandingan loopback/lokal. - Jika client menyediakan
deviceTokeneksplisit atauscopeseksplisit, set cakupan yang diminta pemanggil tersebut tetap otoritatif; cakupan cache hanya digunakan kembali ketika client menggunakan ulang token per perangkat yang tersimpan. - Token perangkat dapat dirotasi/dicabut melalui
device.token.rotatedandevice.token.revoke(memerlukan cakupanoperator.pairing). device.token.rotatemengembalikan metadata rotasi. Perintah ini menggemakan token bearer pengganti hanya untuk panggilan perangkat yang sama yang sudah diautentikasi dengan token perangkat tersebut, sehingga client khusus token dapat mempertahankan penggantinya sebelum menghubungkan ulang. Rotasi bersama/admin tidak menggemakan token bearer.- Penerbitan, rotasi, dan pencabutan token tetap dibatasi pada set role yang disetujui yang tercatat dalam entri penyandingan perangkat tersebut; mutasi token tidak dapat memperluas atau menargetkan role perangkat yang tidak pernah diberikan oleh persetujuan penyandingan.
- Untuk sesi token perangkat tersanding, manajemen perangkat bersifat self-scoped kecuali
pemanggil juga memiliki
operator.admin: pemanggil non-admin hanya dapat menghapus/mencabut/merotasi entri perangkat miliknya sendiri. device.token.rotatedandevice.token.revokejuga memeriksa set cakupan token operator target terhadap cakupan sesi pemanggil saat ini. Pemanggil non-admin tidak dapat merotasi atau mencabut token operator yang lebih luas daripada yang sudah mereka miliki.- Kegagalan autentikasi menyertakan
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 client untuk
AUTH_TOKEN_MISMATCH:- Client tepercaya dapat mencoba satu retry terbatas dengan token per perangkat yang di-cache.
- Jika retry tersebut gagal, client harus menghentikan loop koneksi ulang otomatis dan menampilkan panduan tindakan operator.
AUTH_SCOPE_MISMATCHberarti token perangkat dikenali tetapi tidak mencakup role/cakupan yang diminta. Client tidak boleh menampilkannya sebagai token buruk; minta operator untuk menyandingkan ulang atau menyetujui kontrak cakupan yang lebih sempit/lebih luas.
Identitas perangkat + penyandingan
- Node harus menyertakan identitas perangkat stabil (
device.id) yang berasal dari fingerprint keypair. - Gateway menerbitkan token per perangkat + role.
- Persetujuan penyandingan diperlukan untuk ID perangkat baru kecuali persetujuan otomatis lokal diaktifkan.
- Persetujuan otomatis penyandingan berpusat pada koneksi direct local loopback.
- OpenClaw juga memiliki jalur self-connect backend/container-lokal yang sempit untuk alur helper shared secret tepercaya.
- Koneksi tailnet atau LAN pada host yang sama tetap diperlakukan sebagai jarak jauh untuk penyandingan dan memerlukan persetujuan.
- Client 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 berat).- RPC backend
gateway-clientdirect-loopback yang diautentikasi dengan token/password Gateway bersama.
- Semua koneksi harus menandatangani nonce
connect.challengeyang disediakan server.
Diagnostik migrasi autentikasi perangkat
Untuk client lama yang masih menggunakan perilaku penandatanganan sebelum tantangan,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 | Client menghilangkan device.nonce (atau mengirim kosong). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Client menandatangani dengan nonce usang/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 | Timestamp 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/kanonikalisasi public key gagal. |
- Selalu tunggu
connect.challenge. - Tanda tangani payload v2 yang menyertakan nonce server.
- Kirim nonce yang sama di
connect.params.device.nonce. - Payload tanda tangan pilihan adalah
v3, yang mengikatplatformdandeviceFamilyselain field perangkat/client/role/cakupan/token/nonce. - Tanda tangan
v2lama tetap diterima untuk kompatibilitas, tetapi penyematan metadata perangkat tersanding tetap mengontrol kebijakan perintah saat koneksi ulang.
TLS + penyematan
- TLS didukung untuk koneksi WS.
- Client dapat secara opsional menyematkan fingerprint sertifikat Gateway (lihat config
gateway.tlsplusgateway.remote.tlsFingerprintatau CLI--tls-fingerprint).
Cakupan
Protokol ini mengekspos API Gateway lengkap (status, channel, model, chat, agent, sesi, node, persetujuan, dll.). Permukaan persisnya didefinisikan oleh skema TypeBox disrc/gateway/protocol/schema.ts.