Node
Sebuah node adalah perangkat pendamping (macOS/iOS/Android/headless) yang terhubung ke Gateway WebSocket (port yang sama dengan operator) denganrole: "node" dan mengekspos permukaan perintah (misalnya canvas.*, camera.*, device.*, notifications.*, system.*) melalui node.invoke. Detail protokol: Protokol Gateway.
Transport lama: Protokol Bridge (TCP JSONL;
hanya historis untuk node saat ini).
macOS juga dapat berjalan dalam mode node: aplikasi menubar terhubung ke server WS Gateway dan mengekspos perintah canvas/kamera lokalnya sebagai node (sehingga openclaw nodes … berfungsi terhadap Mac ini).
Catatan:
- Node adalah periferal, bukan gateway. Node tidak menjalankan layanan gateway.
- Pesan Telegram/WhatsApp/dll. masuk ke gateway, bukan ke node.
- Runbook pemecahan masalah: /nodes/troubleshooting
Pairing + status
Node WS menggunakan pairing perangkat. Node menyajikan identitas perangkat saatconnect; Gateway
membuat permintaan pairing perangkat untuk role: node. Setujui melalui CLI perangkat (atau UI).
CLI cepat:
requestId baru akan dibuat. Jalankan ulang
openclaw devices list sebelum menyetujui.
Catatan:
nodes statusmenandai node sebagai paired ketika role pairing perangkatnya mencakupnode.- Rekam pairing perangkat adalah kontrak role-yang-disetujui yang tahan lama. Rotasi token tetap berada di dalam kontrak itu; token tidak dapat meningkatkan node yang sudah dipairing menjadi role berbeda yang tidak pernah diberikan oleh persetujuan pairing.
node.pair.*(CLI:openclaw nodes pending/approve/reject/rename) adalah penyimpanan pairing node terpisah yang dimiliki gateway; ini tidak menjadi gate untuk handshake WSconnect.- Cakupan persetujuan mengikuti perintah yang dideklarasikan pada permintaan pending:
- permintaan tanpa perintah:
operator.pairing - perintah node non-exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- permintaan tanpa perintah:
Host node jarak jauh (system.run)
Gunakan host node saat Gateway Anda berjalan di satu mesin dan Anda ingin perintah
dieksekusi di mesin lain. Model tetap berbicara dengan gateway; gateway
meneruskan pemanggilan exec ke host node saat host=node dipilih.
Apa yang berjalan di mana
- Host gateway: menerima pesan, menjalankan model, merutekan pemanggilan alat.
- Host node: mengeksekusi
system.run/system.whichpada mesin node. - Persetujuan: diterapkan pada host node melalui
~/.openclaw/exec-approvals.json.
- Eksekusi node berbasis persetujuan mengikat konteks permintaan yang persis sama.
- Untuk eksekusi file shell/runtime langsung, OpenClaw juga sebisa mungkin mengikat satu operand file lokal konkret dan menolak eksekusi jika file tersebut berubah sebelum dijalankan.
- Jika OpenClaw tidak dapat mengidentifikasi tepat satu file lokal konkret untuk perintah interpreter/runtime, eksekusi berbasis persetujuan ditolak alih-alih berpura-pura mencakup runtime penuh. Gunakan sandboxing, host terpisah, atau allowlist/alur kerja tepercaya eksplisit untuk semantik interpreter yang lebih luas.
Memulai host node (foreground)
Di mesin node:Gateway jarak jauh melalui tunnel SSH (bind loopback)
Jika Gateway melakukan bind ke loopback (gateway.bind=loopback, default dalam mode lokal),
host node jarak jauh tidak dapat terhubung langsung. Buat tunnel SSH dan arahkan
host node ke ujung lokal tunnel tersebut.
Contoh (host node -> host gateway):
openclaw node runmendukung auth token atau kata sandi.- Variabel env lebih disukai:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Fallback konfigurasi adalah
gateway.auth.token/gateway.auth.password. - Dalam mode lokal, host node dengan sengaja mengabaikan
gateway.remote.token/gateway.remote.password. - Dalam mode jarak jauh,
gateway.remote.token/gateway.remote.passwordmemenuhi syarat sesuai aturan prioritas jarak jauh. - Jika
gateway.auth.*SecretRef lokal aktif dikonfigurasi tetapi tidak terselesaikan, auth host-node gagal secara fail-closed. - Resolusi auth host-node hanya menghormati variabel env
OPENCLAW_GATEWAY_*.
Memulai host node (layanan)
Pair + beri nama
Di host gateway:openclaw devices list
dan setujui requestId saat ini.
Opsi penamaan:
--display-namepadaopenclaw node run/openclaw node install(disimpan di~/.openclaw/node.jsonpada node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(override gateway).
Masukkan perintah ke allowlist
Persetujuan exec bersifat per host node. Tambahkan entri allowlist dari gateway:~/.openclaw/exec-approvals.json.
Arahkan exec ke node
Konfigurasikan default (konfigurasi gateway):exec apa pun dengan host=node akan berjalan pada host node (sesuai
allowlist/persetujuan node).
host=auto tidak akan secara implisit memilih node dengan sendirinya, tetapi permintaan host=node per pemanggilan yang eksplisit tetap diperbolehkan dari auto. Jika Anda ingin exec node menjadi default untuk sesi tersebut, tetapkan tools.exec.host=node atau /exec host=node ... secara eksplisit.
Terkait:
Memanggil perintah
Level rendah (RPC mentah):Tangkapan layar (snapshot canvas)
Jika node sedang menampilkan Canvas (WebView),canvas.snapshot mengembalikan { format, base64 }.
Helper CLI (menulis ke file temp dan mencetak MEDIA:<path>):
Kontrol Canvas
canvas presentmenerima URL atau path file lokal (--target), ditambah--x/--y/--width/--heightopsional untuk penempatan.canvas evalmenerima JS inline (--js) atau argumen posisi.
A2UI (Canvas)
- Hanya A2UI v0.8 JSONL yang didukung (v0.9/createSurface ditolak).
Foto + video (kamera node)
Foto (jpg):
mp4):
- Node harus berada di foreground untuk
canvas.*dancamera.*(pemanggilan di background mengembalikanNODE_BACKGROUND_UNAVAILABLE). - Durasi klip dibatasi (saat ini
<= 60s) untuk menghindari payload base64 yang terlalu besar. - Android akan meminta izin
CAMERA/RECORD_AUDIObila memungkinkan; izin yang ditolak akan gagal dengan*_PERMISSION_REQUIRED.
Rekaman layar (node)
Node yang didukung mengeksposscreen.record (mp4). Contoh:
- Ketersediaan
screen.recordbergantung pada platform node. - Rekaman layar dibatasi hingga
<= 60s. --no-audiomenonaktifkan perekaman mikrofon pada platform yang didukung.- Gunakan
--screen <index>untuk memilih layar saat beberapa layar tersedia.
Lokasi (node)
Node mengeksposlocation.get saat Lokasi diaktifkan di pengaturan.
Helper CLI:
- Lokasi nonaktif secara default.
- “Always” memerlukan izin sistem; pengambilan di background bersifat best-effort.
- Respons mencakup lat/lon, akurasi (meter), dan timestamp.
SMS (node Android)
Node Android dapat mengekspossms.send saat pengguna memberikan izin SMS dan perangkat mendukung telepon seluler.
Pemanggilan level rendah:
- Prompt izin harus diterima di perangkat Android sebelum kapabilitas ini diiklankan.
- Perangkat khusus Wi-Fi tanpa telepon seluler tidak akan mengiklankan
sms.send.
Perintah perangkat Android + data pribadi
Node Android dapat mengiklankan keluarga perintah tambahan saat kapabilitas terkait diaktifkan. Keluarga yang tersedia:device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- Perintah motion digating oleh kapabilitas sensor yang tersedia.
Perintah sistem (host node / node Mac)
Node macOS mengekspossystem.run, system.notify, dan system.execApprovals.get/set.
Host node headless mengekspos system.run, system.which, dan system.execApprovals.get/set.
Contoh:
system.runmengembalikan stdout/stderr/exit code dalam payload.- Eksekusi shell sekarang melalui alat
execdenganhost=node;nodestetap menjadi permukaan RPC langsung untuk perintah node yang eksplisit. nodes invoketidak mengekspossystem.runatausystem.run.prepare; keduanya tetap hanya berada pada jalur exec.- Jalur exec menyiapkan
systemRunPlankanonis sebelum persetujuan. Setelah sebuah persetujuan diberikan, gateway meneruskan rencana tersimpan tersebut, bukan field command/cwd/session yang diedit pemanggil kemudian. system.notifymematuhi status izin notifikasi di aplikasi macOS.- Metadata
platform/deviceFamilynode yang tidak dikenali menggunakan allowlist default yang konservatif yang mengecualikansystem.rundansystem.which. Jika Anda memang memerlukan perintah tersebut untuk platform yang tidak dikenal, tambahkan secara eksplisit melaluigateway.nodes.allowCommands. system.runmendukung--cwd,--env KEY=VAL,--command-timeout, dan--needs-screen-recording.- Untuk wrapper shell (
bash|sh|zsh ... -c/-lc), nilai--envyang dicakup permintaan dipersempit ke allowlist eksplisit (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Untuk keputusan allow-always dalam mode allowlist, wrapper dispatch yang dikenal (
env,nice,nohup,stdbuf,timeout) akan menyimpan path executable bagian dalam, bukan path wrapper. Jika proses unwrapping tidak aman, tidak ada entri allowlist yang disimpan secara otomatis. - Pada host node Windows dalam mode allowlist, eksekusi shell-wrapper melalui
cmd.exe /cmemerlukan persetujuan (entri allowlist saja tidak otomatis mengizinkan bentuk wrapper tersebut). system.notifymendukung--priority <passive|active|timeSensitive>dan--delivery <system|overlay|auto>.- Host node mengabaikan override
PATHdan menghapus kunci startup/shell berbahaya (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Jika Anda memerlukan entri PATH tambahan, konfigurasikan lingkungan layanan host node (atau instal alat di lokasi standar) alih-alih meneruskanPATHmelalui--env. - Dalam mode node macOS,
system.rundigating oleh persetujuan exec di aplikasi macOS (Pengaturan → Persetujuan exec). Ask/allowlist/full berperilaku sama seperti host node headless; prompt yang ditolak mengembalikanSYSTEM_RUN_DENIED. - Pada host node headless,
system.rundigating oleh persetujuan exec (~/.openclaw/exec-approvals.json).
Pengikatan exec node
Saat beberapa node tersedia, Anda dapat mengikat exec ke node tertentu. Ini menetapkan node default untukexec host=node (dan dapat dioverride per agen).
Default global:
Peta izin
Node dapat menyertakan petapermissions dalam node.list / node.describe, dengan kunci nama izin (misalnya screenRecording, accessibility) dan nilai boolean (true = diberikan).
Host node headless (lintas platform)
OpenClaw dapat menjalankan host node headless (tanpa UI) yang terhubung ke Gateway WebSocket dan mengekspossystem.run / system.which. Ini berguna di Linux/Windows
atau untuk menjalankan node minimal di samping server.
Mulai dengan:
- Pairing tetap diperlukan (Gateway akan menampilkan prompt pairing perangkat).
- Host node menyimpan id node, token, display name, dan info koneksi gateway di
~/.openclaw/node.json. - Persetujuan exec diterapkan secara lokal melalui
~/.openclaw/exec-approvals.json(lihat Persetujuan exec). - Di macOS, host node headless menjalankan
system.runsecara lokal secara default. TetapkanOPENCLAW_NODE_EXEC_HOST=appuntuk merutekansystem.runmelalui host exec aplikasi pendamping; tambahkanOPENCLAW_NODE_EXEC_FALLBACK=0untuk mewajibkan host aplikasi dan gagal secara fail-closed jika tidak tersedia. - Tambahkan
--tls/--tls-fingerprintsaat WS Gateway menggunakan TLS.
Mode node Mac
- Aplikasi menubar macOS terhubung ke server WS Gateway sebagai node (sehingga
openclaw nodes …berfungsi terhadap Mac ini). - Dalam mode jarak jauh, aplikasi membuka tunnel SSH untuk port Gateway dan terhubung ke
localhost.