Gateway
Protokol Gateway
Protokol Gateway WS adalah bidang kontrol tunggal + transport node untuk OpenClaw. Semua klien (CLI, UI web, aplikasi macOS, node iOS/Android, node headless) terhubung melalui WebSocket dan mendeklarasikan peran + cakupan mereka saat handshake.
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 peristiwapayload.largesebelum gateway menutup atau menjatuhkan frame yang terdampak. Peristiwa ini menyimpan ukuran, batas, permukaan, dan kode alasan yang aman. Peristiwa ini tidak menyimpan isi pesan, konten lampiran, isi frame mentah, token, cookie, atau nilai rahasia.
Handshake (connect)
Gateway → Klien (tantangan pra-koneksi):
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}Klien → Gateway:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "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 → Klien:
{ "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 } }}Saat Gateway masih menyelesaikan sidecar startup, permintaan connect dapat
mengembalikan galat UNAVAILABLE yang dapat dicoba ulang dengan details.reason disetel ke
"startup-sidecars" dan retryAfterMs. Klien sebaiknya mencoba ulang respons tersebut
dalam anggaran koneksi keseluruhan mereka, bukan menampilkannya sebagai kegagalan
handshake terminal.
server, features, snapshot, dan policy semuanya diwajibkan oleh skema
(packages/gateway-protocol/src/schema/frames.ts). auth juga wajib dan melaporkan
peran/cakupan yang dinegosiasikan. pluginSurfaceUrls bersifat opsional dan memetakan nama
permukaan plugin, seperti canvas, ke URL ter-hosting bercakupan.
URL permukaan plugin bercakupan 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 permukaan plugin.
Saat tidak ada token perangkat yang diterbitkan, hello-ok.auth melaporkan izin
yang dinegosiasikan tanpa kolom token:
{ "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }}Klien backend proses-sama yang tepercaya (client.id: "gateway-client",
client.mode: "backend") dapat menghilangkan device pada koneksi loopback langsung saat
mereka mengautentikasi dengan token/kata sandi gateway bersama. Jalur ini dicadangkan
untuk RPC bidang kontrol internal dan mencegah baseline pemasangan CLI/perangkat yang usang
memblokir pekerjaan backend lokal seperti pembaruan sesi subagen. Klien jarak jauh,
klien asal browser, klien node, dan klien token-perangkat/identitas-perangkat eksplisit
tetap menggunakan pemeriksaan pemasangan dan peningkatan cakupan normal.
Saat token perangkat diterbitkan, hello-ok juga menyertakan:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}Bootstrap kode QR/setup bawaan adalah jalur handoff mobile baru. Koneksi setup-code baseline yang berhasil mengembalikan token node utama plus satu token operator berbatas:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}Handoff operator sengaja dibatasi agar onboarding QR dapat memulai loop
operator mobile dan menyelesaikan setup native tanpa memberikan cakupan mutasi
pemasangan atau operator.admin. Ini menyertakan operator.talk.secrets agar
klien native dapat membaca konfigurasi Talk yang dibutuhkannya setelah bootstrap. Akses
pemasangan dan admin yang lebih luas memerlukan pemasangan operator atau alur token
terpisah yang disetujui. Klien sebaiknya mempertahankan
hello-ok.auth.deviceTokens hanya
saat koneksi menggunakan auth bootstrap pada transport tepercaya seperti wss:// atau
pemasangan loopback/lokal.
Contoh node
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "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": "…" } }}Pembingkaian
- Permintaan:
{type:"req", id, method, params} - Respons:
{type:"res", id, ok, payload|error} - Peristiwa:
{type:"event", event, payload, seq?, stateVersion?}
Metode yang menimbulkan efek samping memerlukan kunci idempotensi (lihat skema).
Peran + cakupan
Untuk model cakupan operator lengkap, pemeriksaan saat persetujuan, dan semantik rahasia bersama, lihat Cakupan operator.
Peran
operator= klien bidang kontrol (CLI/UI/otomasi).node= host kemampuan (camera/screen/canvas/system.run).
Cakupan (operator)
Cakupan umum:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config dengan includeSecrets: true memerlukan operator.talk.secrets
(atau operator.admin).
Saat rahasia disertakan, klien sebaiknya membaca 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 admin inti yang dicadangkan (config.*, exec.approvals.*, wizard.*,
update.*) selalu diselesaikan menjadi operator.admin.
Cakupan metode hanya 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 cakupan tambahan saat persetujuan di atas
cakupan 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
Kapabilitas/perintah/izin (node)
Node mendeklarasikan klaim kemampuan saat koneksi:
caps: kategori kemampuan tingkat tinggi seperticamera,canvas,screen,location,voice, dantalk.commands: allowlist perintah untuk invoke.permissions: toggle granular (mis.screen.record,camera.capture).
Gateway memperlakukan ini sebagai klaim dan memberlakukan allowlist sisi server.
Kehadiran
system-presencemengembalikan entri yang dikunci berdasarkan identitas perangkat.- Entri kehadiran menyertakan
deviceId,roles, danscopessehingga UI dapat menampilkan satu baris per perangkat bahkan ketika perangkat terhubung sebagai operator sekaligus node. node.listmenyertakan kolom opsionallastSeenAtMsdanlastSeenReason. Node yang terhubung melaporkan waktu koneksi saat ini sebagailastSeenAtMsdengan alasanconnect; node yang dipasangkan juga dapat melaporkan kehadiran latar belakang yang tahan lama saat peristiwa node tepercaya memperbarui metadata pemasangannya.
Peristiwa node aktif di latar belakang
Node dapat memanggil node.event dengan event: "node.presence.alive" untuk mencatat bahwa node yang dipasangkan
aktif selama wake latar belakang tanpa menandainya 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, atau connect. String trigger yang tidak dikenal dinormalisasi menjadi
background oleh gateway sebelum persistensi. Peristiwa ini hanya tahan lama untuk sesi perangkat node
terautentikasi; 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 masih mengembalikan { "ok": true } untuk node.event; klien sebaiknya memperlakukannya sebagai
RPC yang diakui, bukan sebagai persistensi kehadiran yang tahan lama.
Pencakupan peristiwa siaran
Peristiwa siaran WebSocket yang didorong server diberi gerbang cakupan sehingga sesi bercakupan pemasangan atau hanya-node tidak menerima konten sesi secara pasif.
- Frame chat, agen, dan hasil alat (termasuk peristiwa
agentyang dialirkan dan hasil panggilan alat) memerlukan setidaknyaoperator.read. Sesi tanpaoperator.readmelewati frame ini sepenuhnya. - Siaran
plugin.*yang ditentukan plugin diberi gerbang keoperator.writeatauoperator.admin, tergantung pada cara plugin mendaftarkannya. - Peristiwa status dan transport (
heartbeat,presence,tick, siklus hidup connect/disconnect, dll.) tetap tidak dibatasi agar kesehatan transport tetap dapat diamati oleh setiap sesi terautentikasi. - Keluarga peristiwa siaran yang tidak dikenal diberi gerbang cakupan secara default (fail-closed) kecuali handler terdaftar secara eksplisit melonggarkannya.
Setiap koneksi klien menyimpan nomor urut per-kliennya sendiri sehingga siaran mempertahankan urutan monotonik pada soket tersebut bahkan ketika klien berbeda melihat subset aliran peristiwa yang difilter cakupannya secara berbeda.
Keluarga metode RPC umum
Permukaan WS publik lebih luas daripada contoh handshake/auth di atas. Ini
bukan dump yang dibuat otomatis — hello-ok.features.methods adalah daftar
penemuan konservatif yang dibuat dari src/gateway/server-methods-list.ts plus ekspor metode
plugin/channel yang dimuat. Perlakukan ini sebagai penemuan fitur, bukan enumerasi lengkap
atas src/gateway/server-methods/*.ts.
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 peristiwa, jumlah, ukuran byte, pembacaan memori, status antrean/sesi, nama channel/Plugin, dan id sesi. Ini tidak menyimpan teks chat, isi webhook, output alat, isi permintaan atau respons mentah, token, cookie, atau nilai rahasia. Cakupan baca operator diperlukan.statusmengembalikan ringkasan Gateway bergaya/status; bidang sensitif disertakan hanya untuk klien operator bercakupan 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 tersimpan terbaru.set-heartbeatsmengaktifkan atau menonaktifkan pemrosesan Heartbeat di Gateway.
Model dan penggunaan
models.listmengembalikan katalog model yang diizinkan runtime. Teruskan{ "view": "configured" }untuk model terkonfigurasi seukuran pemilih (agents.defaults.modelsterlebih dahulu, lalumodels.providers.*.models), atau{ "view": "all" }untuk katalog lengkap.usage.statusmengembalikan ringkasan jendela penggunaan provider/kuota tersisa.usage.costmengembalikan ringkasan penggunaan biaya teragregasi untuk rentang tanggal. TeruskanagentIduntuk satu agen, atauagentScope: "all"untuk mengagregasi agen terkonfigurasi.doctor.memory.statusmengembalikan kesiapan memori vektor / embedding ter-cache untuk workspace agen default aktif. Teruskan{ "probe": true }atau{ "deep": true }hanya ketika pemanggil secara eksplisit menginginkan ping provider embedding langsung. Klien yang memahami Dreaming juga dapat meneruskan{ "agentId": "agent-id" }untuk membatasi statistik penyimpanan Dreaming ke workspace agen yang dipilih; menghilangkanagentIdmempertahankan fallback agen default dan mengagregasi workspace Dreaming terkonfigurasi.doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifacts, dandoctor.memory.dedupeDreamDiarymenerima parameter opsional{ "agentId": "agent-id" }untuk tampilan/tindakan Dreaming agen terpilih. KetikaagentIddihilangkan, semuanya beroperasi pada workspace agen default yang dikonfigurasi.doctor.memory.remHarnessmengembalikan pratinjau harness REM terbatas dan hanya-baca untuk klien control-plane jarak jauh. Ini dapat mencakup path workspace, cuplikan memori, markdown grounded yang dirender, dan kandidat promosi mendalam, sehingga pemanggil memerlukanoperator.read.sessions.usagemengembalikan ringkasan penggunaan per sesi. TeruskanagentIduntuk satu agen, atauagentScope: "all"untuk mencantumkan agen terkonfigurasi bersama-sama.sessions.usage.timeseriesmengembalikan penggunaan deret waktu untuk satu sesi.sessions.usage.logsmengembalikan entri log penggunaan untuk satu sesi.
Channel dan pembantu login
channels.statusmengembalikan ringkasan status channel/Plugin bawaan + terbundel.channels.logoutmengeluarkan channel/akun tertentu ketika channel mendukung logout.web.login.startmemulai alur login QR/web untuk provider channel web saat ini yang mendukung QR.web.login.waitmenunggu alur login QR/web tersebut selesai dan memulai channel saat berhasil.push.testmengirim push APNs percobaan ke Node iOS terdaftar.voicewake.getmengembalikan pemicu wake-word yang tersimpan.voicewake.setmemperbarui pemicu wake-word dan menyiarkan perubahan.
Pesan dan log
sendadalah RPC pengiriman keluar langsung untuk pengiriman yang ditargetkan ke channel/akun/thread di luar runner chat.logs.tailmengembalikan tail log-file Gateway yang dikonfigurasi dengan kontrol kursor/batas dan byte maksimum.
Talk dan TTS
talk.catalogmengembalikan katalog provider Talk hanya-baca untuk ucapan, transkripsi streaming, dan suara waktu nyata. Ini mencakup id provider kanonis, alias registry, label, status terkonfigurasi, hasilreadytingkat grup opsional, id model/suara yang diekspos, mode kanonis, transport, strategi brain, dan flag audio/kapabilitas waktu nyata tanpa mengembalikan rahasia provider atau mengubah konfigurasi global. Gateway saat ini menetapkanreadysetelah menerapkan pilihan provider runtime; klien harus memperlakukan ketiadaannya sebagai belum terverifikasi untuk kompatibilitas dengan Gateway lama.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. Untukstt-tts/managed-room, pemanggiloperator.writeyang meneruskansessionKeyjuga harus meneruskanspawnedByuntuk visibilitas session-key bercakupan; pembuatansessionKeytanpa cakupan danbrain: "direct-tools"memerlukanoperator.admin.talk.session.joinmemvalidasi token sesi managed-room, memancarkan peristiwasession.readyatausession.replacedsesuai kebutuhan, dan mengembalikan metadata room/sesi plus peristiwa Talk terbaru tanpa token plaintext atau hash token tersimpan.talk.session.appendAudiomenambahkan audio input PCM base64 ke sesi relai waktu nyata dan transkripsi milik Gateway.talk.session.startTurn,talk.session.endTurn, dantalk.session.cancelTurnmenjalankan siklus hidup giliran managed-room dengan penolakan giliran usang sebelum status dibersihkan.talk.session.cancelOutputmenghentikan output audio asisten, terutama untuk interupsi yang dibatasi VAD dalam sesi relai Gateway.talk.session.submitToolResultmenyelesaikan panggilan alat provider yang dipancarkan oleh sesi relai waktu nyata milik Gateway. Teruskanoptions: { willContinue: true }untuk output alat sementara ketika hasil final akan menyusul, atauoptions: { suppressResponse: true }ketika hasil alat harus memenuhi panggilan provider tanpa memulai respons asisten waktu nyata lain.talk.session.steermengirim kontrol suara active-run ke sesi Talk berbasis agen milik Gateway. Ini menerima{ sessionId, text, mode? }, denganmodeberupastatus,steer,cancel, ataufollowup; mode yang dihilangkan diklasifikasikan dari teks lisan.talk.session.closemenutup sesi relai, transkripsi, atau managed-room milik Gateway dan memancarkan peristiwa Talk terminal.talk.modemenetapkan/menyiarkan status mode Talk saat ini untuk klien WebChat/Control UI.talk.client.createmembuat sesi provider waktu nyata milik klien menggunakanwebrtcatauprovider-websocketsementara Gateway memiliki konfigurasi, kredensial, instruksi, dan kebijakan alat.talk.client.toolCallmemungkinkan transport waktu nyata milik klien meneruskan panggilan alat provider ke kebijakan Gateway. Alat pertama yang didukung adalahopenclaw_agent_consult; klien menerima id run dan menunggu peristiwa siklus hidup chat normal sebelum mengirimkan hasil alat khusus provider.talk.client.steermengirim kontrol suara active-run untuk transport waktu nyata milik klien. Gateway menyelesaikan run tertanam aktif darisessionKeydan mengembalikan hasil terstruktur diterima/ditolak alih-alih diam-diam membuang steering.talk.eventadalah channel peristiwa Talk tunggal untuk adapter waktu nyata, transkripsi, STT/TTS, managed-room, telefoni, dan rapat.talk.speakmensintesis ucapan melalui provider ucapan Talk aktif.tts.statusmengembalikan status TTS aktif, provider aktif, provider fallback, dan status konfigurasi provider.tts.providersmengembalikan inventaris provider TTS yang terlihat.tts.enabledantts.disablemengaktifkan atau menonaktifkan status preferensi TTS.tts.setProvidermemperbarui provider TTS pilihan.tts.convertmenjalankan konversi teks-ke-ucapan sekali jalan.
Rahasia, konfigurasi, pembaruan, dan wizard
secrets.reloadmenyelesaikan ulang SecretRefs aktif dan menukar status rahasia runtime hanya jika sukses penuh.secrets.resolvemenyelesaikan penetapan rahasia target-perintah untuk set perintah/target tertentu.config.getmengembalikan snapshot dan hash konfigurasi saat ini.config.setmenulis payload konfigurasi tervalidasi.config.patchmenggabungkan pembaruan konfigurasi parsial. Penggantian array destruktif memerlukan path yang terdampak direplacePaths; array bertingkat di bawah entri array menggunakan path[]sepertiagents.list[].skills.config.applymemvalidasi + mengganti payload konfigurasi lengkap.config.schemamengembalikan payload skema konfigurasi langsung yang digunakan oleh Control UI dan tooling CLI: skema,uiHints, versi, dan metadata pembuatan, termasuk metadata skema Plugin + channel ketika runtime dapat memuatnya. Skema mencakup metadata bidangtitle/descriptionyang diturunkan dari label dan teks bantuan yang sama dengan yang digunakan UI, termasuk cabang komposisi objek bertingkat, wildcard, item-array, dananyOf/oneOf/allOfketika dokumentasi bidang yang cocok tersedia.config.schema.lookupmengembalikan payload pencarian bercakupan path untuk satu path konfigurasi: path ternormalisasi, node skema dangkal, hint yang cocok +hintPath,reloadKindopsional, dan ringkasan anak langsung untuk drill-down UI/CLI.reloadKindadalah salah satu darirestart,hot, ataunonedan mencerminkan perencana muat ulang konfigurasi Gateway untuk path yang diminta. Node skema pencarian mempertahankan dokumentasi yang menghadap pengguna dan bidang 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,reloadKindopsional, plushint/hintPathyang cocok.update.runmenjalankan alur pembaruan Gateway dan menjadwalkan restart hanya ketika pembaruan itu sendiri berhasil; pemanggil dengan sesi dapat menyertakancontinuationMessageagar startup melanjutkan satu giliran agen follow-up melalui antrean kelanjutan restart. Pembaruan package-manager dan pembaruan git-checkout tersupervisi dari control plane menggunakan handoff managed-service terlepas alih-alih mengganti pohon paket atau mengubah output checkout/build di dalam Gateway langsung. Handoff yang dimulai mengembalikanok: truedenganresult.reason: "managed-service-handoff-started"danhandoff.status: "started"; handoff yang tidak tersedia atau gagal mengembalikanok: falsedenganmanaged-service-handoff-unavailableataumanaged-service-handoff-failed, plushandoff.commandketika pembaruan shell manual diperlukan. Handoff yang tidak tersedia berarti OpenClaw tidak memiliki batas supervisor yang aman atau identitas layanan yang tahan lama, sepertiOPENCLAW_SYSTEMD_UNITuntuk systemd. Selama handoff yang dimulai, sentinel restart dapat sebentar melaporkanstats.reason: "restart-health-pending"; kelanjutan ditunda sampai CLI memverifikasi Gateway yang direstart dan menulis sentinelokfinal.update.statusmenyegarkan dan mengembalikan sentinel restart pembaruan terbaru, termasuk versi yang berjalan setelah restart jika tersedia.wizard.start,wizard.next,wizard.status, danwizard.cancelmengekspos wizard onboarding melalui WS RPC.
Pembantu agen dan ruang kerja
agents.listmengembalikan entri agen yang dikonfigurasi, termasuk model efektif dan metadata runtime.agents.create,agents.update, danagents.deletemengelola rekaman agen dan pengkabelan ruang kerja.agents.files.list,agents.files.get, danagents.files.setmengelola file ruang kerja 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 asal-usul yang cocok; sumber URL tidak aman atau lokal mengembalikan unduhan yang tidak didukung alih-alih diambil di sisi server.environments.listdanenvironments.statusmengekspos penemuan lingkungan lokal Gateway dan node yang bersifat 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
sessions.listmengembalikan indeks sesi saat ini, termasuk metadataagentRuntimeper baris saat backend runtime agen dikonfigurasi.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.sessions.previewmengembalikan pratinjau transkrip berbatas untuk kunci sesi tertentu.sessions.describemengembalikan satu baris sesi Gateway untuk kunci 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 meneruskankeybesertarunIdopsional, atau meneruskanrunIdsaja untuk run aktif yang dapat diselesaikan Gateway ke sebuah sesi.sessions.patchmemperbarui metadata/override sesi dan melaporkan model kanonis yang terselesaikan besertaagentRuntimeefektif.sessions.reset,sessions.delete, dansessions.compactmelakukan pemeliharaan sesi.sessions.getmengembalikan baris sesi lengkap yang disimpan.- Eksekusi chat tetap menggunakan
chat.history,chat.send,chat.abort, danchat.inject.chat.historydinormalkan untuk tampilan bagi klien UI: tag direktif inline dihapus dari teks yang terlihat, payload XML pemanggilan alat teks biasa (termasuk<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, dan blok pemanggilan alat yang 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. chat.message.getadalah pembaca pesan lengkap berbatas tambahan untuk satu entri transkrip yang terlihat. Klien meneruskansessionKey,agentIdopsional saat pemilihan sesi dicakup agen, besertamessageIdtranskrip yang sebelumnya dimunculkan melaluichat.history, dan Gateway mengembalikan proyeksi ternormalisasi tampilan yang sama tanpa batas pemotongan riwayat ringan saat entri yang disimpan masih tersedia dan tidak terlalu besar.chat.sendmenerimafastMode: "auto"satu putaran untuk menggunakan mode cepat bagi pemanggilan model yang dimulai sebelum batas otomatis, lalu memulai pemanggilan percobaan ulang, fallback, hasil alat, atau kelanjutan berikutnya tanpa mode cepat. Batas default adalah 60 detik dan dapat dikonfigurasi per model denganagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. Pemanggilchat.senddapat meneruskanfastAutoOnSecondssatu putaran untuk menimpa batas bagi permintaan tersebut.
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. Ini memerlukanoperator.admindan sengaja dihilangkan dari penemuan yang diiklankan. Hasilnya mencakupsetupCode,qrDataUrlopsional,gatewayUrl, labelauthnon-rahasia, danurlSource.device.pair.approve,device.pair.reject, dandevice.pair.removemengelola rekaman pemasangan perangkat.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 di luar alur pemasangan.
Pemasangan node, invoke, dan pekerjaan tertunda
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.remove, dannode.pair.verifymencakup pemasangan node dan verifikasi bootstrap.node.listdannode.describemengembalikan status node yang diketahui/terhubung.node.renamememperbarui label node terpasang.node.invokemeneruskan perintah ke node yang terhubung.node.invoke.resultmengembalikan hasil untuk permintaan invoke.node.eventmembawa peristiwa 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.
Keluarga persetujuan
exec.approval.request,exec.approval.get,exec.approval.list, danexec.approval.resolvemencakup permintaan persetujuan exec sekali pakai beserta pencarian/pemutaran ulang persetujuan tertunda.exec.approval.waitDecisionmenunggu satu persetujuan exec tertunda dan mengembalikan keputusan akhir (ataunullsaat timeout).exec.approvals.getdanexec.approvals.setmengelola snapshot kebijakan persetujuan exec gateway.exec.approvals.node.getdanexec.approvals.node.setmengelola kebijakan persetujuan exec lokal node melalui perintah relay node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecision, danplugin.approval.resolvemencakup alur persetujuan yang didefinisikan Plugin.
Otomasi, Skills, dan alat
- Otomasi:
wakemenjadwalkan injeksi teks wake 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 antrean untuk run manual. Klien yang membutuhkan semantik penyelesaian harus membacarunIdyang dikembalikan dan melakukan pollingcron.runs.cron.runsmenerima filterrunIdopsional yang tidak kosong sehingga klien dapat mengikuti satu run manual yang diantrekan tanpa berlomba dengan entri riwayat lain untuk pekerjaan yang sama.- Skills dan alat:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Keluarga peristiwa umum
chat: pembaruan chat UI sepertichat.injectdan peristiwa chat khusus transkrip lainnya. Dalam protokol v4, payload delta membawadeltaText;messagetetap menjadi snapshot asisten kumulatif. Penggantian non-prefix menetapkanreplace=truedan menggunakandeltaTextsebagai teks pengganti.session.message,session.operation, dansession.tool: transkrip, operasi sesi yang sedang berjalan, dan pembaruan aliran peristiwa untuk sesi 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/pekerjaan Cron.shutdown: notifikasi shutdown gateway.node.pair.requested/node.pair.resolved: siklus hidup pemasangan node.node.invoke.request: siaran permintaan invoke node.device.pair.requested/device.pair.resolved: siklus hidup perangkat terpasang.voicewake.changed: konfigurasi pemicu kata wake 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 izinkan-otomatis.
RPC ledger tugas
Klien operator dapat memeriksa dan membatalkan rekaman tugas latar belakang Gateway melalui RPC ledger tugas. Metode ini mengembalikan ringkasan tugas yang disanitasi, bukan status runtime mentah.
tasks.listmemerlukanoperator.read.- Parameter:
statusopsional ("queued","running","completed","failed","cancelled", atau"timed_out") atau array 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 hilang mengembalikan bentuk galat tidak-ditemukan 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 seperti kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, stempel waktu, progres,
ringkasan terminal, dan teks galat yang disanitasi. agentId mengidentifikasi agen
yang mengeksekusi tugas; sessionKey dan ownerKey mempertahankan konteks
peminta dan kontrol.
Metode pembantu operator
- Operator dapat memanggil
commands.list(operator.read) untuk mengambil inventaris perintah runtime bagi agen.agentIdbersifat opsional; hilangkan untuk membaca workspace agen bawaan.scopemengontrol permukaan yang ditargetkan olehnameutama:textmengembalikan token perintah teks utama tanpa awalan/nativedan jalur bawaanbothmengembalikan nama native yang sadar penyedia saat tersedia
textAliasesmembawa alias garis miring persis seperti/modeldan/m.nativeNamemembawa nama perintah native yang sadar penyedia saat ada.providerbersifat opsional dan hanya memengaruhi penamaan native plus ketersediaan perintah Plugin native.includeArgs=falsemenghilangkan metadata argumen berseri dari respons.
- Operator dapat memanggil
tools.catalog(operator.read) untuk mengambil katalog tool runtime bagi agen. Respons mencakup tool yang dikelompokkan dan metadata asal:source:coreataupluginpluginId: pemilik plugin saatsource="plugin"optional: apakah tool plugin bersifat opsional
- Operator dapat memanggil
tools.effective(operator.read) untuk mengambil inventaris tool yang efektif saat runtime bagi sesi.sessionKeywajib diisi.- Gateway menurunkan konteks runtime tepercaya dari sesi di sisi server alih-alih menerima auth atau konteks pengiriman yang diberikan pemanggil.
- Respons adalah proyeksi inventaris aktif berbasis server dengan cakupan sesi, mencakup tool core, plugin, channel, dan server MCP yang sudah ditemukan.
tools.effectivebersifat hanya-baca untuk MCP: ia dapat memproyeksikan katalog MCP sesi hangat melalui kebijakan tool akhir, tetapi tidak membuat runtime MCP, menghubungkan transport, atau menerbitkantools/list. Jika tidak ada katalog hangat yang cocok, respons dapat menyertakan pemberitahuan sepertimcp-not-yet-connected,mcp-not-yet-listed, ataumcp-stale-catalog.- Entri tool efektif menggunakan
source="core",source="plugin",source="channel", atausource="mcp".
- Operator dapat memanggil
tools.invoke(operator.write) untuk menjalankan satu tool 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 diselesaikan harus cocok denganagentId. - Wrapper core khusus pemilik seperti
cron,gateway, dannodesmemerlukan identitas pemilik/admin (operator.admin) meskipun metodetools.invokesendiri adalahoperator.write. - Respons adalah envelope yang menghadap SDK dengan kolom
ok,toolName,outputopsional, danerrorbertipe. Penolakan approval atau kebijakan mengembalikanok:falsedalam payload alih-alih melewati pipeline kebijakan tool Gateway.
- Operator dapat memanggil
skills.status(operator.read) untuk mengambil inventaris skill yang terlihat bagi agen.agentIdbersifat opsional; hilangkan untuk membaca workspace agen bawaan.- Respons mencakup kelayakan, persyaratan yang hilang, pemeriksaan konfigurasi, dan opsi instalasi yang sudah disanitasi tanpa mengekspos nilai rahasia mentah.
- Operator dapat memanggil
skills.searchdanskills.detail(operator.read) untuk metadata penemuan ClawHub. - Operator dapat memanggil
skills.upload.begin,skills.upload.chunk, danskills.upload.commit(operator.admin) untuk menyiapkan arsip skill privat sebelum menginstalnya. Ini adalah jalur unggah admin terpisah untuk klien tepercaya, bukan alur instalasi skill ClawHub normal, dan dinonaktifkan secara bawaan kecualiskills.install.allowUploadedArchivesdiaktifkan.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })membuat unggahan yang terikat ke 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 unggahan; ini tidak menginstal skill.- Arsip skill yang diunggah 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 agen bawaan. - Mode unggahan:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }menginstal unggahan yang sudah dikomit ke direktoriskills/<slug>workspace agen bawaan. Nilai slug dan force harus cocok dengan permintaanskills.upload.beginasli. Mode ini ditolak kecualiskills.install.allowUploadedArchivesdiaktifkan. Pengaturan ini tidak memengaruhi instalasi ClawHub. - Mode penginstal Gateway:
{ name, installId, timeoutMs? }menjalankan aksimetadata.openclaw.installyang dideklarasikan pada host Gateway. Klien lama mungkin masih mengirimdangerouslyForceUnsafeInstall; kolom ini sudah usang, diterima hanya untuk kompatibilitas protokol, dan diabaikan. Gunakansecurity.installPolicyuntuk keputusan instalasi yang dimiliki operator.
- Mode ClawHub:
- Operator dapat memanggil
skills.update(operator.admin) dalam dua mode:- Mode ClawHub memperbarui satu slug yang dilacak atau semua instalasi ClawHub yang dilacak di workspace agen bawaan.
- 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 pemilih. Jikaagents.defaults.modelsdikonfigurasi, itu tetap menang, termasuk penemuan bercakupan penyedia untuk entriprovider/*. Tanpa allowlist, respons menggunakan entrimodels.providers.*.modelseksplisit, dengan fallback ke katalog lengkap hanya ketika tidak ada baris model yang dikonfigurasi."all": katalog Gateway lengkap, melewatiagents.defaults.models. Gunakan ini untuk diagnostik dan UI penemuan, bukan pemilih model normal.
Approval exec
- Saat permintaan exec memerlukan approval, Gateway menyiarkan
exec.approval.requested. - Klien operator menyelesaikannya dengan memanggil
exec.approval.resolve(memerlukan cakupanoperator.approvals). - Untuk
host=node,exec.approval.requestharus menyertakansystemRunPlan(argv/cwd/rawCommand/metadata sesi kanonis). Permintaan yang tidak memilikisystemRunPlanditolak. - Setelah approval, panggilan
node.invoke system.runyang diteruskan menggunakan kembalisystemRunPlankanonis tersebut sebagai konteks perintah/cwd/sesi otoritatif. - Jika pemanggil mengubah
command,rawCommand,cwd,agentId, atausessionKeyantara persiapan dan penerusansystem.runakhir yang disetujui, Gateway menolak run tersebut alih-alih memercayai payload yang diubah.
Fallback pengiriman agen
- Permintaan
agentdapat menyertakandeliver=trueuntuk meminta pengiriman keluar. bestEffortDeliver=falsemempertahankan perilaku ketat: target pengiriman yang tidak terselesaikan atau hanya internal mengembalikanINVALID_REQUEST.bestEffortDeliver=truemengizinkan fallback ke eksekusi hanya-sesi saat tidak ada rute eksternal yang dapat dikirim yang bisa diselesaikan (misalnya sesi internal/webchat atau konfigurasi multi-channel yang ambigu).- Hasil akhir
agentdapat menyertakanresult.deliveryStatussaat pengiriman diminta, menggunakan statussent,suppressed,partial_failed, danfailedyang sama seperti yang didokumentasikan untukopenclaw agent --json --deliver.
Pembuatan versi
PROTOCOL_VERSIONberada dipackages/gateway-protocol/src/version.ts.- Klien mengirim
minProtocol+maxProtocol; server menolak rentang yang tidak menyertakan protokol saat ini. Klien dan server saat ini memerlukan protokol v4. - Skema + model dihasilkan dari definisi TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Konstanta klien
Klien referensi di src/gateway/client.ts menggunakan nilai bawaan ini. Nilai stabil di seluruh protokol v4 dan merupakan baseline yang diharapkan untuk klien pihak ketiga.
| Konstanta | Bawaan | Sumber |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
| Waktu habis permintaan (per RPC) | 30_000 ms |
src/gateway/client.ts (requestTimeoutMs) |
| Waktu habis preauth / connect-challenge | 15_000 ms |
src/gateway/handshake-timeouts.ts (config/env dapat menaikkan anggaran server/klien berpasangan) |
| Backoff reconnect awal | 1_000 ms |
src/gateway/client.ts (backoffMs) |
| Backoff reconnect maksimum | 30_000 ms |
src/gateway/client.ts (scheduleReconnect) |
| Clamp percobaan cepat setelah device-token close | 250 ms |
src/gateway/client.ts |
Masa tenggang force-stop sebelum terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
Waktu habis bawaan stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Interval tick bawaan (sebelum hello-ok) |
30_000 ms |
src/gateway/client.ts |
| Penutupan karena tick-timeout | kode 4000 saat diam melebihi tickIntervalMs * 2 |
src/gateway/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
Server mengiklankan policy.tickIntervalMs, policy.maxPayload, dan policy.maxBufferedBytes yang efektif di hello-ok; klien harus mematuhi nilai tersebut, bukan nilai bawaan pra-handshake.
Auth
- Auth Gateway rahasia bersama menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, tergantung mode auth yang dikonfigurasi. - Mode yang membawa identitas seperti Tailscale Serve
(
gateway.auth.allowTailscale: true) ataugateway.auth.mode: "trusted-proxy"non-loopback memenuhi pemeriksaan auth connect dari header permintaan, bukan dariconnect.params.auth.*. - Ingress privat
gateway.auth.mode: "none"melewati auth connect rahasia bersama sepenuhnya; jangan ekspos mode tersebut pada ingress publik/tidak tepercaya. - Setelah pairing, Gateway menerbitkan token perangkat yang dibatasi pada peran
koneksi + cakupan. Token ini dikembalikan di
hello-ok.auth.deviceTokendan harus dipersistenkan oleh klien untuk connect berikutnya. - Klien harus mempersistenkan
hello-ok.auth.deviceTokenutama setelah connect berhasil. - Menghubungkan ulang dengan token perangkat yang tersimpan tersebut juga harus menggunakan kembali set cakupan tersetujui yang tersimpan untuk token itu. Ini mempertahankan akses baca/probe/status yang sudah diberikan dan menghindari penyempitan diam-diam saat reconnect menjadi cakupan implisit khusus admin yang lebih sempit.
- Perakitan auth connect sisi klien (
selectConnectAuthdisrc/gateway/client.ts):auth.passwordbersifat ortogonal dan selalu diteruskan saat disetel.auth.tokendiisi berdasarkan urutan prioritas: token bersama eksplisit lebih dulu, laludeviceTokeneksplisit, lalu token per-perangkat 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 diselesaikan akan menekannya.- Promosi otomatis token perangkat tersimpan pada retry sekali jalan
AUTH_TOKEN_MISMATCHdibatasi hanya untuk endpoint tepercaya - loopback, atauwss://dengantlsFingerprintyang dipin.wss://publik tanpa pinning tidak memenuhi syarat.
- Bootstrap kode setup bawaan mengembalikan node utama
hello-ok.auth.deviceTokenplus token operator berbatas dihello-ok.auth.deviceTokensuntuk handoff seluler tepercaya. Token operator menyertakanoperator.talk.secretsuntuk pembacaan konfigurasi Talk native, tetapi mengecualikan cakupan mutasi pairing danoperator.admin. - Saat bootstrap kode setup non-baseline menunggu persetujuan, detail
PAIRING_REQUIREDmenyertakanrecommendedNextStep: "wait_then_retry",retryable: true, danpauseReconnect: false. Klien harus terus reconnect dengan token bootstrap yang sama hingga permintaan disetujui atau token menjadi tidak valid. - Persistenkan
hello-ok.auth.deviceTokenshanya ketika connect menggunakan auth bootstrap pada transport tepercaya sepertiwss://atau pairing loopback/local. - Jika klien menyediakan
deviceTokeneksplisit atauscopeseksplisit, set cakupan yang diminta pemanggil tersebut tetap otoritatif; cakupan cache hanya digunakan kembali ketika klien menggunakan kembali token per-perangkat tersimpan. - Token perangkat dapat dirotasi/dicabut melalui
device.token.rotatedandevice.token.revoke(memerlukan cakupanoperator.pairing). Merotasi atau mencabut node atau peran non-operator lain juga memerlukanoperator.admin. device.token.rotatemengembalikan metadata rotasi. Ini menggemakan token bearer pengganti hanya untuk panggilan perangkat yang sama yang sudah diautentikasi dengan token perangkat tersebut, sehingga klien khusus token dapat mempersistenkan penggantinya sebelum reconnect. Rotasi shared/admin tidak menggemakan token bearer.- Penerbitan, rotasi, dan pencabutan token tetap dibatasi pada set peran tersetujui yang tercatat di entri pairing perangkat tersebut; mutasi token tidak dapat memperluas atau menargetkan peran perangkat yang tidak pernah diberikan oleh persetujuan pairing.
- Untuk sesi token perangkat yang dipairing, manajemen perangkat bersifat self-scoped kecuali
pemanggil juga memiliki
operator.admin: pemanggil non-admin hanya dapat mengelola token operator untuk entri perangkat miliknya sendiri. Manajemen token node dan non-operator lain hanya untuk admin, bahkan untuk perangkat milik pemanggil 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 auth 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 klien untuk
AUTH_TOKEN_MISMATCH:- Klien tepercaya dapat mencoba satu retry berbatas dengan token per-perangkat yang di-cache.
- Jika retry tersebut gagal, klien harus menghentikan loop reconnect otomatis dan menampilkan panduan tindakan operator.
AUTH_SCOPE_MISMATCHberarti token perangkat dikenali tetapi tidak mencakup peran/cakupan yang diminta. Klien tidak boleh menampilkannya sebagai token buruk; minta operator melakukan re-pair atau menyetujui kontrak cakupan yang lebih sempit/lebih luas.
Identitas perangkat + pairing
- Node harus menyertakan identitas perangkat stabil (
device.id) yang berasal dari fingerprint keypair. - Gateway menerbitkan token per perangkat + peran.
- Persetujuan pairing diperlukan untuk ID perangkat baru kecuali persetujuan otomatis lokal diaktifkan.
- Persetujuan otomatis pairing berpusat pada connect local loopback langsung.
- OpenClaw juga memiliki jalur self-connect backend/container-lokal sempit untuk alur helper rahasia bersama tepercaya.
- Connect tailnet atau LAN pada host yang sama tetap diperlakukan sebagai remote untuk pairing 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.- auth Control UI operator
gateway.auth.mode: "trusted-proxy"yang berhasil. gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, penurunan keamanan berat).- RPC backend
gateway-clientdirect-loopback pada jalur helper internal yang dicadangkan.
- Menghilangkan identitas perangkat memiliki konsekuensi cakupan. Ketika koneksi operator tanpa perangkat
diizinkan melalui jalur kepercayaan eksplisit, OpenClaw tetap mengosongkan
cakupan yang dideklarasikan sendiri menjadi set kosong kecuali jalur tersebut memiliki pengecualian
pelestarian cakupan bernama. Metode yang dibatasi cakupan kemudian gagal dengan
missing scope. gateway.controlUi.dangerouslyDisableDeviceAuth=trueadalah jalur pelestarian cakupan break-glass Control UI. Ini tidak memberikan cakupan kepada klien WebSocket backend kustom atau berbentuk CLI secara sembarang.- Jalur helper backend
gateway-clientdirect-loopback yang dicadangkan mempertahankan cakupan hanya untuk RPC control-plane lokal internal; ID backend kustom tidak menerima pengecualian ini. - Semua koneksi harus menandatangani nonce
connect.challengeyang disediakan server.
Diagnostik migrasi auth perangkat
Untuk klien lama yang masih menggunakan perilaku penandatanganan sebelum challenge, connect sekarang mengembalikan
kode detail DEVICE_AUTH_* di bawah error.details.code dengan error.details.reason yang stabil.
Kegagalan migrasi umum:
| Pesan | details.code | details.reason | Arti |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
Klien menghilangkan device.nonce (atau mengirim kosong). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Klien menandatangani dengan nonce yang basi/salah. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
Payload tanda tangan tidak cocok dengan payload v2. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Timestamp bertanda tangan berada di luar skew yang diizinkan. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id tidak cocok dengan fingerprint kunci publik. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Format/kanonisisasi kunci publik gagal. |
Target migrasi:
- Selalu tunggu
connect.challenge. - Tanda tangani payload v2 yang menyertakan nonce server.
- Kirim nonce yang sama di
connect.params.device.nonce. - Payload tanda tangan yang disukai adalah
v3, yang mengikatplatformdandeviceFamilyselain field perangkat/klien/peran/cakupan/token/nonce. - Tanda tangan
v2lama tetap diterima untuk kompatibilitas, tetapi pinning metadata perangkat yang dipairing tetap mengontrol kebijakan perintah saat reconnect.
TLS + pinning
- TLS didukung untuk koneksi WS.
- Klien dapat secara opsional mem-pin fingerprint sertifikat gateway (lihat konfigurasi
gateway.tlsplusgateway.remote.tlsFingerprintatau CLI--tls-fingerprint).
Cakupan
Protokol ini mengekspos API Gateway penuh (status, saluran, model, chat,
agen, sesi, node, persetujuan, dll.). Permukaan persisnya didefinisikan oleh
skema TypeBox di packages/gateway-protocol/src/schema.ts.