Nodes and media
Węzły
Node to urządzenie towarzyszące (macOS/iOS/Android/headless), które łączy się z WebSocket Gateway (ten sam port co operatorzy) z role: "node" i udostępnia interfejs poleceń (np. canvas.*, camera.*, device.*, notifications.*, system.*) przez node.invoke. Szczegóły protokołu: Protokół Gateway.
Starszy transport: Protokół Bridge (TCP JSONL; historyczny wyłącznie dla bieżących urządzeń Node).
macOS może też działać w trybie Node: aplikacja na pasku menu łączy się z
serwerem WS Gateway i udostępnia swoje lokalne polecenia canvas/camera jako Node (więc
openclaw nodes … działa wobec tego Maca). W trybie zdalnego Gateway
automatyzacją przeglądarki zajmuje się host Node CLI (openclaw node run lub
zainstalowana usługa Node), a nie Node aplikacji natywnej.
Uwagi:
- Urządzenia Node są urządzeniami peryferyjnymi, nie instancjami Gateway. Nie uruchamiają usługi Gateway.
- Wiadomości Telegram/WhatsApp/itp. trafiają do Gateway, nie do urządzeń Node.
- Procedura rozwiązywania problemów: /nodes/troubleshooting
Parowanie + status
Urządzenia Node WS używają parowania urządzeń. Urządzenia Node przedstawiają tożsamość urządzenia podczas connect; Gateway
tworzy żądanie parowania urządzenia dla role: node. Zatwierdź przez CLI urządzeń (lub UI).
Szybkie użycie CLI:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
Jeśli Node ponawia próbę ze zmienionymi danymi uwierzytelniania (rola/zakresy/klucz publiczny), poprzednie
oczekujące żądanie zostaje zastąpione i tworzony jest nowy requestId. Uruchom ponownie
openclaw devices list przed zatwierdzeniem.
Uwagi:
nodes statusoznacza Node jako paired, gdy jego rola parowania urządzenia obejmujenode.- Rekord parowania urządzenia jest trwałym kontraktem zatwierdzonych ról. Rotacja tokenów pozostaje w tym kontrakcie; nie może podnieść sparowanego Node do innej roli, której zatwierdzenie parowania nigdy nie przyznało.
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) to osobny, należący do Gateway magazyn parowania Node; nie kontroluje uzgadniania WSconnect.openclaw nodes remove --node <id|name|ip>usuwa nieaktualne wpisy z tego osobnego, należącego do Gateway magazynu parowania Node.- Zakres zatwierdzenia wynika z poleceń zadeklarowanych przez oczekujące żądanie:
- żądanie bez poleceń:
operator.pairing - polecenia Node inne niż exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- żądanie bez poleceń:
Zdalny host Node (system.run)
Użyj hosta Node, gdy Gateway działa na jednej maszynie, a polecenia mają
wykonywać się na innej. Model nadal komunikuje się z Gateway; Gateway
przekazuje wywołania exec do hosta Node, gdy wybrane jest host=node.
Co działa gdzie
- Host Gateway: odbiera wiadomości, uruchamia model, kieruje wywołania narzędzi.
- Host Node: wykonuje
system.run/system.whichna maszynie Node. - Zatwierdzenia: egzekwowane na hoście Node przez
~/.openclaw/exec-approvals.json.
Uwaga o zatwierdzeniach:
- Uruchomienia Node oparte na zatwierdzeniach wiążą dokładny kontekst żądania.
- Dla bezpośrednich wykonań plików przez powłokę/środowisko uruchomieniowe OpenClaw w miarę możliwości wiąże też jeden konkretny lokalny operand pliku i odrzuca uruchomienie, jeśli ten plik zmieni się przed wykonaniem.
- Jeśli OpenClaw nie może zidentyfikować dokładnie jednego konkretnego lokalnego pliku dla polecenia interpretera/środowiska uruchomieniowego, wykonanie oparte na zatwierdzeniu jest odrzucane zamiast udawać pełne pokrycie środowiska uruchomieniowego. Użyj sandboxingu, osobnych hostów albo jawnej zaufanej listy dozwolonych/pełnego przepływu pracy dla szerszej semantyki interpreterów.
Uruchamianie hosta Node (pierwszy plan)
Na maszynie Node:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"
Zdalny Gateway przez tunel SSH (wiązanie loopback)
Jeśli Gateway wiąże się z loopback (gateway.bind=loopback, domyślnie w trybie lokalnym),
zdalne hosty Node nie mogą połączyć się bezpośrednio. Utwórz tunel SSH i skieruj
host Node na lokalny koniec tunelu.
Przykład (host Node -> host Gateway):
# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: export the gateway token and connect through the tunnel
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
Uwagi:
openclaw node runobsługuje uwierzytelnianie tokenem lub hasłem.- Preferowane są zmienne środowiskowe:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Zapasowa konfiguracja to
gateway.auth.token/gateway.auth.password. - W trybie lokalnym host Node celowo ignoruje
gateway.remote.token/gateway.remote.password. - W trybie zdalnym
gateway.remote.token/gateway.remote.passwordmogą być użyte zgodnie z regułami priorytetu zdalnego. - Jeśli skonfigurowane są aktywne lokalne SecretRefs
gateway.auth.*, ale nie da się ich rozwiązać, uwierzytelnianie hosta Node odmawia dostępu. - Rozwiązywanie uwierzytelniania hosta Node uwzględnia wyłącznie zmienne środowiskowe
OPENCLAW_GATEWAY_*.
Uruchamianie hosta Node (usługa)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node start
openclaw node restart
Parowanie + nazwa
Na hoście Gateway:
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
Jeśli Node ponawia próbę ze zmienionymi danymi uwierzytelniania, uruchom ponownie openclaw devices list
i zatwierdź bieżący requestId.
Opcje nazewnictwa:
--display-namewopenclaw node run/openclaw node install(utrwala się w~/.openclaw/node.jsonna Node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(nadpisanie po stronie Gateway).
Dodaj polecenia do listy dozwolonych
Zatwierdzenia exec są dla każdego hosta Node. Dodaj wpisy listy dozwolonych z Gateway:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
Zatwierdzenia znajdują się na hoście Node w ~/.openclaw/exec-approvals.json.
Skieruj exec na Node
Skonfiguruj wartości domyślne (konfiguracja Gateway):
openclaw config set tools.exec.host node
openclaw config set tools.exec.security allowlist
openclaw config set tools.exec.node "<id-or-name>"
Lub dla sesji:
/exec host=node security=allowlist node=<id-or-name>
Po ustawieniu każde wywołanie exec z host=node działa na hoście Node (zgodnie z
listą dozwolonych/zatwierdzeniami Node).
host=auto nie wybierze niejawnie Node samodzielnie, ale jawne żądanie host=node dla pojedynczego wywołania jest dozwolone z auto. Jeśli chcesz, aby exec Node był domyślny dla sesji, ustaw jawnie tools.exec.host=node albo /exec host=node ....
Powiązane:
Wywoływanie poleceń
Niski poziom (surowe RPC):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
Istnieją funkcje pomocnicze wyższego poziomu dla typowych przepływów pracy „przekaż agentowi załącznik MEDIA”.
Zasady poleceń
Polecenia Node muszą przejść przez dwa etapy kontroli, zanim mogą zostać wywołane:
- Node musi zadeklarować polecenie na swojej liście WebSocket
connect.commands. - Polityka platformy Gateway musi zezwalać na zadeklarowane polecenie.
Urządzenia towarzyszące Node na Windows i macOS domyślnie zezwalają na bezpieczne zadeklarowane polecenia, takie jak
canvas.*, camera.list, location.get i screen.snapshot.
Zaufane urządzenia Node, które ogłaszają możliwość talk albo deklarują polecenia talk.*,
domyślnie zezwalają też na zadeklarowane polecenia trybu „naciśnij, aby mówić” (talk.ptt.start, talk.ptt.stop,
talk.ptt.cancel, talk.ptt.once), niezależnie od etykiety platformy.
Niebezpieczne lub mocno ingerujące w prywatność polecenia, takie jak camera.snap, camera.clip i
screen.record, nadal wymagają jawnego włączenia przez
gateway.nodes.allowCommands. gateway.nodes.denyCommands zawsze ma pierwszeństwo przed
wartościami domyślnymi i dodatkowymi wpisami listy dozwolonych.
Polecenia Node należące do Plugin mogą dodać politykę Gateway dla wywołań Node. Ta polityka
działa po sprawdzeniu listy dozwolonych i przed przekazaniem do Node, więc surowe
node.invoke, funkcje pomocnicze CLI i dedykowane narzędzia agentów współdzielą tę samą granicę
uprawnień Plugin. Niebezpieczne polecenia Node Plugin nadal wymagają jawnego
włączenia przez gateway.nodes.allowCommands.
Po zmianie zadeklarowanej listy poleceń przez Node odrzuć stare parowanie urządzenia i zatwierdź nowe żądanie, aby Gateway zapisał zaktualizowaną migawkę poleceń.
Zrzuty ekranu (migawki Canvas)
Jeśli Node pokazuje Canvas (WebView), canvas.snapshot zwraca { format, base64 }.
Funkcja pomocnicza CLI (zapisuje do pliku tymczasowego i wypisuje MEDIA:<path>):
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format png
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
Sterowanie Canvas
openclaw nodes canvas present --node <idOrNameOrIp> --target https://example.com
openclaw nodes canvas hide --node <idOrNameOrIp>
openclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>
openclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"
Uwagi:
canvas presentprzyjmuje adresy URL lub lokalne ścieżki plików (--target) oraz opcjonalnie--x/--y/--width/--heightdo pozycjonowania.canvas evalprzyjmuje wbudowany JS (--js) lub argument pozycyjny.
A2UI (Canvas)
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
openclaw nodes canvas a2ui reset --node <idOrNameOrIp>
Uwagi:
- Obsługiwane jest tylko A2UI v0.8 JSONL (v0.9/createSurface jest odrzucane).
Zdjęcia + filmy (kamera Node)
Zdjęcia (jpg):
openclaw nodes camera list --node <idOrNameOrIp>
openclaw nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
openclaw nodes camera snap --node <idOrNameOrIp> --facing front
Klipy wideo (mp4):
openclaw nodes camera clip --node <idOrNameOrIp> --duration 10s
openclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
Uwagi:
- Node musi być na pierwszym planie dla
canvas.*icamera.*(wywołania w tle zwracająNODE_BACKGROUND_UNAVAILABLE). - Czas trwania klipu jest ograniczany (obecnie
<= 60s), aby uniknąć zbyt dużych ładunków base64. - Android poprosi o uprawnienia
CAMERA/RECORD_AUDIO, gdy to możliwe; odmowa uprawnień powoduje błąd*_PERMISSION_REQUIRED.
Nagrania ekranu (urządzenia Node)
Obsługiwane urządzenia Node udostępniają screen.record (mp4). Przykład:
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
Uwagi:
- Dostępność
screen.recordzależy od platformy Node. - Nagrania ekranu są ograniczane do
<= 60s. --no-audiowyłącza przechwytywanie mikrofonu na obsługiwanych platformach.- Użyj
--screen <index>, aby wybrać ekran, gdy dostępnych jest wiele ekranów.
Lokalizacja (urządzenia Node)
Urządzenia Node udostępniają location.get, gdy Lokalizacja jest włączona w ustawieniach.
Funkcja pomocnicza CLI:
openclaw nodes location get --node <idOrNameOrIp>
openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
Uwagi:
- Lokalizacja jest domyślnie wyłączona.
- „Zawsze” wymaga uprawnienia systemowego; pobieranie w tle jest wykonywane w miarę możliwości.
- Odpowiedź zawiera lat/lon, dokładność (metry) i znacznik czasu.
SMS (urządzenia Node Android)
Urządzenia Node Android mogą udostępniać sms.send, gdy użytkownik przyzna uprawnienie SMS, a urządzenie obsługuje telefonię.
Wywołanie niskiego poziomu:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'
Uwagi:
- Monit o uprawnienie musi zostać zaakceptowany na urządzeniu Android, zanim możliwość zostanie ogłoszona.
- Urządzenia tylko z Wi-Fi bez telefonii nie będą ogłaszać
sms.send.
Polecenia urządzenia Android + danych osobowych
Urządzenia Node Android mogą ogłaszać dodatkowe rodziny poleceń, gdy odpowiednie możliwości są włączone.
Dostępne rodziny:
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Przykładowe wywołania:
openclaw nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'
Uwagi:
- Polecenia ruchu są ograniczone możliwościami dostępnymi przez dostępne czujniki.
Polecenia systemowe (host węzła / węzeł Mac)
Węzeł macOS udostępnia system.run, system.notify oraz system.execApprovals.get/set.
Bezgłowy host węzła udostępnia system.run, system.which oraz system.execApprovals.get/set.
Przykłady:
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
openclaw nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'
Uwagi:
system.runzwraca stdout/stderr/kod wyjścia w ładunku.- Wykonywanie powłoki przechodzi teraz przez narzędzie
execzhost=node;nodespozostaje bezpośrednią powierzchnią RPC dla jawnych poleceń węzła. nodes invokenie udostępniasystem.runanisystem.run.prepare; pozostają one tylko na ścieżce exec.- Ścieżka exec przygotowuje kanoniczny
systemRunPlanprzed zatwierdzeniem. Po udzieleniu zatwierdzenia gateway przekazuje ten zapisany plan, a nie później zmodyfikowane przez wywołującego pola command/cwd/session. system.notifyrespektuje stan uprawnień do powiadomień w aplikacji macOS.- Nierozpoznane metadane węzła
platform/deviceFamilyużywają konserwatywnej domyślnej listy dozwolonych poleceń, która wykluczasystem.runisystem.which. Jeśli celowo potrzebujesz tych poleceń dla nieznanej platformy, dodaj je jawnie przezgateway.nodes.allowCommands. system.runobsługuje--cwd,--env KEY=VAL,--command-timeoutoraz--needs-screen-recording.- Dla opakowań powłoki (
bash|sh|zsh ... -c/-lc) wartości--envo zakresie żądania są redukowane do jawnej listy dozwolonych (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - W przypadku decyzji zawsze zezwalaj w trybie listy dozwolonych znane opakowania dispatch (
env,nice,nohup,stdbuf,timeout) utrwalają ścieżki wewnętrznych plików wykonywalnych zamiast ścieżek opakowań. Jeśli odpakowanie nie jest bezpieczne, żaden wpis listy dozwolonych nie jest automatycznie utrwalany. - Na hostach węzła Windows w trybie listy dozwolonych uruchomienia opakowania powłoki przez
cmd.exe /cwymagają zatwierdzenia (sam wpis listy dozwolonych nie zezwala automatycznie na formę opakowania). system.notifyobsługuje--priority <passive|active|timeSensitive>oraz--delivery <system|overlay|auto>.- Hosty węzła ignorują nadpisania
PATHi usuwają niebezpieczne klucze startowe/powłoki (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Jeśli potrzebujesz dodatkowych wpisów PATH, skonfiguruj środowisko usługi hosta węzła (albo zainstaluj narzędzia w standardowych lokalizacjach) zamiast przekazywaćPATHprzez--env. - W trybie węzła macOS
system.runjest kontrolowane przez zatwierdzenia exec w aplikacji macOS (Ustawienia → Zatwierdzenia exec). Tryby ask/allowlist/full działają tak samo jak w bezgłowym hoście węzła; odrzucone monity zwracająSYSTEM_RUN_DENIED. - W bezgłowym hoście węzła
system.runjest kontrolowane przez zatwierdzenia exec (~/.openclaw/exec-approvals.json).
Powiązanie węzła exec
Gdy dostępnych jest wiele węzłów, możesz powiązać exec z konkretnym węzłem.
Ustawia to domyślny węzeł dla exec host=node (i może zostać zastąpione dla pojedynczego agenta).
Domyślne globalne:
openclaw config set tools.exec.node "node-id-or-name"
Nadpisanie dla agenta:
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Usuń ustawienie, aby zezwolić na dowolny węzeł:
openclaw config unset tools.exec.node
openclaw config unset agents.list[0].tools.exec.node
Mapa uprawnień
Węzły mogą zawierać mapę permissions w node.list / node.describe, indeksowaną według nazwy uprawnienia (np. screenRecording, accessibility) z wartościami logicznymi (true = przyznane).
Bezgłowy host węzła (wieloplatformowy)
OpenClaw może uruchamiać bezgłowy host węzła (bez UI), który łączy się z WebSocket
Gateway i udostępnia system.run / system.which. Jest to przydatne na Linux/Windows
lub do uruchamiania minimalnego węzła obok serwera.
Uruchom go:
openclaw node run --host <gateway-host> --port 18789
Uwagi:
- Parowanie nadal jest wymagane (Gateway pokaże monit parowania urządzenia).
- Host węzła przechowuje identyfikator węzła, token, nazwę wyświetlaną i informacje o połączeniu z gateway w
~/.openclaw/node.json. - Zatwierdzenia exec są wymuszane lokalnie przez
~/.openclaw/exec-approvals.json(zobacz Zatwierdzenia exec). - Na macOS bezgłowy host węzła domyślnie wykonuje
system.runlokalnie. UstawOPENCLAW_NODE_EXEC_HOST=app, aby kierowaćsystem.runprzez host exec aplikacji towarzyszącej; dodajOPENCLAW_NODE_EXEC_FALLBACK=0, aby wymagać hosta aplikacji i bezpiecznie zakończyć niepowodzeniem, jeśli jest niedostępny. - Dodaj
--tls/--tls-fingerprint, gdy Gateway WS używa TLS.
Tryb węzła Mac
- Aplikacja paska menu macOS łączy się z serwerem Gateway WS jako węzeł (więc
openclaw nodes …działa względem tego Maca). - W trybie zdalnym aplikacja otwiera tunel SSH dla portu Gateway i łączy się z
localhost.