Protokół Gateway (WebSocket)
Protokół Gateway WS to pojedyncza płaszczyzna sterowania + transport węzłów dla OpenClaw. Wszyscy klienci (CLI, web UI, aplikacja macOS, węzły iOS/Android, bezgłowe węzły) łączą się przez WebSocket i deklarują swoją rolę + zakres w momencie handshake.Transport
- WebSocket, ramki tekstowe z ładunkami JSON.
- Pierwsza ramka musi być żądaniem
connect.
Handshake (connect)
Gateway → klient (wyzwanie przed połączeniem):
hello-ok zawiera także:
hello-ok.auth może również zawierać dodatkowe
ograniczone wpisy ról w deviceTokens:
scopes: [], a każdy przekazany token operatora pozostaje ograniczony do bootstrapowej
listy dozwolonych operatora (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Kontrole zakresu bootstrap pozostają
prefiksowane rolą: wpisy operatora spełniają tylko żądania operatora, a role inne niż operator
nadal wymagają zakresów z własnym prefiksem roli.
Przykład węzła
Ramki
- Żądanie:
{type:"req", id, method, params} - Odpowiedź:
{type:"res", id, ok, payload|error} - Zdarzenie:
{type:"event", event, payload, seq?, stateVersion?}
Role + zakresy
Role
operator= klient płaszczyzny sterowania (CLI/UI/automatyzacja).node= host możliwości (camera/screen/canvas/system.run).
Zakresy (operator)
Typowe zakresy:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config z includeSecrets: true wymaga operator.talk.secrets
(lub operator.admin).
Metody Gateway RPC zarejestrowane przez pluginy mogą żądać własnego zakresu operatora, ale
zastrzeżone prefiksy administracyjne rdzenia (config.*, exec.approvals.*, wizard.*,
update.*) zawsze są rozwiązywane do operator.admin.
Zakres metody jest tylko pierwszą bramką. Niektóre polecenia slash osiągane przez
chat.send stosują na dodatek bardziej rygorystyczne kontrole na poziomie polecenia. Na przykład trwałe
zapisy /config set i /config unset wymagają operator.admin.
node.pair.approve ma także dodatkową kontrolę zakresu w momencie zatwierdzania ponad
podstawowy zakres metody:
- żądania bez polecenia:
operator.pairing - żądania z poleceniami węzła innymi niż exec:
operator.pairing+operator.write - żądania zawierające
system.run,system.run.preparelubsystem.which:operator.pairing+operator.admin
caps/commands/permissions (node)
Węzły deklarują roszczenia możliwości w momencie połączenia:
caps: kategorie możliwości wysokiego poziomu.commands: lista dozwolonych poleceń dla invoke.permissions: szczegółowe przełączniki (np.screen.record,camera.capture).
Presence
system-presencezwraca wpisy kluczowane tożsamością urządzenia.- Wpisy presence zawierają
deviceId,rolesiscopes, dzięki czemu UI może pokazywać jeden wiersz na urządzenie nawet wtedy, gdy łączy się ono zarówno jako operator, jak i node.
Typowe rodziny metod RPC
Ta strona nie jest wygenerowanym pełnym zrzutem, ale publiczna powierzchnia WS jest szersza niż powyższe przykłady handshake/auth. To główne rodziny metod, które Gateway udostępnia obecnie.hello-ok.features.methods to zachowawcza lista wykrywania zbudowana z
src/gateway/server-methods-list.ts oraz załadowanych eksportów metod pluginów/kanałów.
Traktuj ją jako wykrywanie funkcji, a nie jako wygenerowany zrzut każdej wywoływalnej funkcji pomocniczej
zaimplementowanej w src/gateway/server-methods/*.ts.
System i tożsamość
healthzwraca buforowaną lub świeżo sprawdzoną migawkę stanu gateway.statuszwraca podsumowanie gateway w stylu/status; pola wrażliwe są uwzględniane tylko dla klientów operatora o zakresie admin.gateway.identity.getzwraca tożsamość urządzenia gateway używaną przez przepływy relay i parowania.system-presencezwraca bieżącą migawkę presence dla połączonych urządzeń operator/node.system-eventdopisuje zdarzenie systemowe i może aktualizować/rozgłaszać kontekst presence.last-heartbeatzwraca najnowsze utrwalone zdarzenie heartbeat.set-heartbeatsprzełącza przetwarzanie heartbeat na gateway.
Models i użycie
models.listzwraca katalog modeli dozwolonych w runtime.usage.statuszwraca okna użycia dostawców/podsumowania pozostałego limitu.usage.costzwraca zagregowane podsumowania użycia kosztów dla zakresu dat.doctor.memory.statuszwraca gotowość pamięci wektorowej / osadzeń dla aktywnego domyślnego workspace agenta.sessions.usagezwraca podsumowania użycia dla poszczególnych sesji.sessions.usage.timeserieszwraca szereg czasowy użycia dla jednej sesji.sessions.usage.logszwraca wpisy logu użycia dla jednej sesji.
Kanały i pomocniki logowania
channels.statuszwraca podsumowania stanu wbudowanych + dołączonych kanałów/pluginów.channels.logoutwylogowuje konkretne konto kanału, jeśli kanał obsługuje wylogowanie.web.login.starturuchamia przepływ logowania QR/web dla bieżącego dostawcy kanału web obsługującego QR.web.login.waitczeka na zakończenie tego przepływu logowania QR/web i uruchamia kanał po powodzeniu.push.testwysyła testowy push APNs do zarejestrowanego węzła iOS.voicewake.getzwraca zapisane wyzwalacze wake word.voicewake.setaktualizuje wyzwalacze wake word i rozgłasza zmianę.
Wiadomości i logi
sendto bezpośrednie RPC dostarczania wychodzącego dla wysyłek kierowanych do kanału/konta/wątku poza runnerem czatu.logs.tailzwraca ogon skonfigurowanego logu plikowego gateway z kontrolą kursora/limitu i maksymalnej liczby bajtów.
Talk i TTS
talk.configzwraca efektywny ładunek konfiguracji Talk;includeSecretswymagaoperator.talk.secrets(luboperator.admin).talk.modeustawia/rozgłasza bieżący stan trybu Talk dla klientów WebChat/Control UI.talk.speaksyntezuje mowę przez aktywnego dostawcę mowy Talk.tts.statuszwraca stan włączenia TTS, aktywnego dostawcę, dostawców zapasowych oraz stan konfiguracji dostawcy.tts.providerszwraca widoczny inwentarz dostawców TTS.tts.enableitts.disableprzełączają stan preferencji TTS.tts.setProvideraktualizuje preferowanego dostawcę TTS.tts.converturuchamia jednorazową konwersję text-to-speech.
Secrets, config, update i wizard
secrets.reloadponownie rozwiązuje aktywne SecretRef i podmienia stan sekretów runtime tylko przy pełnym powodzeniu.secrets.resolverozwiązuje przypisania sekretów docelowych dla poleceń dla konkretnego zestawu poleceń/celów.config.getzwraca bieżącą migawkę konfiguracji i hash.config.setzapisuje zwalidowany ładunek konfiguracji.config.patchscala częściową aktualizację konfiguracji.config.applywaliduje + zastępuje pełny ładunek konfiguracji.config.schemazwraca aktywny ładunek schematu konfiguracji używany przez Control UI i narzędzia CLI: schemat,uiHints, wersję i metadane generowania, w tym metadane schematów pluginów + kanałów, gdy runtime może je załadować. Schemat zawiera metadane póltitle/descriptionwyprowadzone z tych samych etykiet i tekstu pomocy używanych przez UI, w tym dla zagnieżdżonych obiektów, wildcard, elementów tablic i gałęzi kompozycjianyOf/oneOf/allOf, gdy istnieje pasująca dokumentacja pól.config.schema.lookupzwraca ładunek wyszukiwania o zakresie ścieżki dla jednej ścieżki konfiguracji: znormalizowaną ścieżkę, płytki węzeł schematu, dopasowaną podpowiedź +hintPathoraz podsumowania bezpośrednich elementów potomnych dla UI/CLI drill-down.- Węzły schematu lookup zachowują dokumentację widoczną dla użytkownika i typowe pola walidacji:
title,description,type,enum,const,format,pattern, ograniczenia liczb/stringów/tablic/obiektów oraz flagi boolowskie, takie jakadditionalProperties,deprecated,readOnly,writeOnly. - Podsumowania dzieci ujawniają
key, znormalizowanąpath,type,required,hasChildren, a także dopasowanehint/hintPath.
- Węzły schematu lookup zachowują dokumentację widoczną dla użytkownika i typowe pola walidacji:
update.runuruchamia przepływ aktualizacji gateway i planuje restart tylko wtedy, gdy sama aktualizacja zakończyła się powodzeniem.wizard.start,wizard.next,wizard.statusiwizard.canceludostępniają kreator onboardingu przez WS RPC.
Istniejące główne rodziny
Pomocniki agentów i workspace
agents.listzwraca skonfigurowane wpisy agentów.agents.create,agents.updateiagents.deletezarządzają rekordami agentów i połączeniem workspace.agents.files.list,agents.files.getiagents.files.setzarządzają plikami bootstrapowego workspace udostępnianymi dla agenta.agent.identity.getzwraca efektywną tożsamość asystenta dla agenta lub sesji.agent.waitczeka na zakończenie uruchomienia i zwraca końcową migawkę, gdy jest dostępna.
Sterowanie sesją
sessions.listzwraca bieżący indeks sesji.sessions.subscribeisessions.unsubscribeprzełączają subskrypcje zdarzeń zmian sesji dla bieżącego klienta WS.sessions.messages.subscribeisessions.messages.unsubscribeprzełączają subskrypcje zdarzeń transkryptu/wiadomości dla jednej sesji.sessions.previewzwraca ograniczone podglądy transkryptu dla określonych kluczy sesji.sessions.resolverozwiązuje lub kanonizuje cel sesji.sessions.createtworzy nowy wpis sesji.sessions.sendwysyła wiadomość do istniejącej sesji.sessions.steerto wariant przerwania i sterowania dla aktywnej sesji.sessions.abortprzerywa aktywną pracę dla sesji.sessions.patchaktualizuje metadane/nadpisania sesji.sessions.reset,sessions.deleteisessions.compactwykonują konserwację sesji.sessions.getzwraca pełny zapisany wiersz sesji.- wykonywanie czatu nadal używa
chat.history,chat.send,chat.abortichat.inject. chat.historyjest znormalizowane do wyświetlania dla klientów UI: inline tagi dyrektyw są usuwane z widocznego tekstu, ładunki XML wywołań narzędzi w czystym tekście (w tym<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>oraz obcięte bloki wywołań narzędzi) i wyciekające tokeny sterujące modelu ASCII/full-width są usuwane, czyste wiersze asystenta ze znacznikami silent-token, takie jak dokładneNO_REPLY/no_reply, są pomijane, a zbyt duże wiersze mogą być zastępowane placeholderami.
Parowanie urządzeń i tokeny urządzeń
device.pair.listzwraca oczekujące i zatwierdzone sparowane urządzenia.device.pair.approve,device.pair.rejectidevice.pair.removezarządzają rekordami parowania urządzeń.device.token.rotateobraca token sparowanego urządzenia w granicach jego zatwierdzonej roli i zakresów.device.token.revokeunieważnia token sparowanego urządzenia.
Parowanie węzłów, invoke i oczekująca praca
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectinode.pair.verifyobejmują parowanie węzłów i weryfikację bootstrap.node.listinode.describezwracają stan znanych/połączonych węzłów.node.renameaktualizuje etykietę sparowanego węzła.node.invokeprzekazuje polecenie do połączonego węzła.node.invoke.resultzwraca wynik żądania invoke.node.eventprzenosi zdarzenia pochodzące z węzła z powrotem do gateway.node.canvas.capability.refreshodświeża tokeny możliwości canvas o określonym zakresie.node.pending.pullinode.pending.ackto API kolejki dla połączonych węzłów.node.pending.enqueueinode.pending.drainzarządzają trwałą oczekującą pracą dla węzłów offline/rozłączonych.
Rodziny zatwierdzeń
exec.approval.requestiexec.approval.resolveobejmują jednorazowe żądania zatwierdzenia exec.exec.approval.waitDecisionczeka na jedną oczekującą decyzję zatwierdzenia exec i zwraca ostateczną decyzję (lubnullprzy limicie czasu).exec.approvals.getiexec.approvals.setzarządzają migawkami polityki zatwierdzeń exec gateway.exec.approvals.node.getiexec.approvals.node.setzarządzają lokalną polityką exec węzła przez polecenia relay węzła.plugin.approval.request,plugin.approval.waitDecisioniplugin.approval.resolveobejmują przepływy zatwierdzeń definiowane przez pluginy.
Inne główne rodziny
- automatyzacja:
wakeplanuje natychmiastowe lub najbliższe wstrzyknięcie tekstu wake przy heartbeatcron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- Skills/narzędzia:
skills.*,tools.catalog,tools.effective
Typowe rodziny zdarzeń
chat: aktualizacje czatu UI, takie jakchat.injecti inne zdarzenia czatu dotyczące wyłącznie transkryptu.session.messageisession.tool: aktualizacje transkryptu/strumienia zdarzeń dla subskrybowanej sesji.sessions.changed: indeks sesji lub metadane uległy zmianie.presence: aktualizacje migawki presence systemu.tick: okresowe zdarzenie keepalive / liveness.health: aktualizacja migawki stanu gateway.heartbeat: aktualizacja strumienia zdarzeń heartbeat.cron: zdarzenie zmiany uruchomienia/zadania cron.shutdown: powiadomienie o zamknięciu gateway.node.pair.requested/node.pair.resolved: cykl życia parowania węzła.node.invoke.request: rozgłoszenie żądania invoke węzła.device.pair.requested/device.pair.resolved: cykl życia sparowanego urządzenia.voicewake.changed: zmieniono konfigurację wyzwalaczy wake word.exec.approval.requested/exec.approval.resolved: cykl życia zatwierdzenia exec.plugin.approval.requested/plugin.approval.resolved: cykl życia zatwierdzenia pluginu.
Metody pomocnicze węzła
- Węzły mogą wywoływać
skills.bins, aby pobrać bieżącą listę wykonywalnych plików Skill do kontroli auto-allow.
Metody pomocnicze operatora
- Operatorzy mogą wywoływać
tools.catalog(operator.read), aby pobrać katalog narzędzi runtime dla agenta. Odpowiedź zawiera pogrupowane narzędzia i metadane pochodzenia:source:corelubpluginpluginId: właściciel pluginu, gdysource="plugin"optional: czy narzędzie pluginu jest opcjonalne
- Operatorzy mogą wywoływać
tools.effective(operator.read), aby pobrać efektywny inwentarz narzędzi runtime dla sesji.sessionKeyjest wymagane.- Gateway wyprowadza zaufany kontekst runtime po stronie serwera z sesji zamiast akceptować auth lub kontekst dostarczenia dostarczony przez wywołującego.
- Odpowiedź ma zakres sesji i odzwierciedla to, czego aktywna rozmowa może używać w tej chwili, w tym narzędzi rdzenia, pluginów i kanałów.
- Operatorzy mogą wywoływać
skills.status(operator.read), aby pobrać widoczny inwentarz Skill dla agenta.agentIdjest opcjonalne; pomiń je, aby odczytać domyślny workspace agenta.- Odpowiedź zawiera kwalifikowalność, brakujące wymagania, kontrole konfiguracji i oczyszczone opcje instalacji bez ujawniania surowych wartości sekretów.
- Operatorzy mogą wywoływać
skills.searchiskills.detail(operator.read) dla metadanych wykrywania ClawHub. - Operatorzy mogą wywoływać
skills.install(operator.admin) w dwóch trybach:- Tryb ClawHub:
{ source: "clawhub", slug, version?, force? }instaluje folder Skill do kataloguskills/domyślnego workspace agenta. - Tryb instalatora Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }uruchamia zadeklarowaną akcjęmetadata.openclaw.installna hoście gateway.
- Tryb ClawHub:
- Operatorzy mogą wywoływać
skills.update(operator.admin) w dwóch trybach:- Tryb ClawHub aktualizuje jeden śledzony slug lub wszystkie śledzone instalacje ClawHub w domyślnym workspace agenta.
- Tryb config łata wartości
skills.entries.<skillKey>, takie jakenabled,apiKeyienv.
Zatwierdzenia exec
- Gdy żądanie exec wymaga zatwierdzenia, gateway rozgłasza
exec.approval.requested. - Klienci operatora rozwiązują to przez wywołanie
exec.approval.resolve(wymaga zakresuoperator.approvals). - Dla
host=node,exec.approval.requestmusi zawieraćsystemRunPlan(kanoniczneargv/cwd/rawCommand/metadane sesji). Żądania bezsystemRunPlansą odrzucane. - Po zatwierdzeniu przekazane wywołania
node.invoke system.runużywają ponownie tego kanonicznegosystemRunPlanjako autorytatywnego kontekstu polecenia/cwd/sesji. - Jeśli wywołujący zmieni
command,rawCommand,cwd,agentIdlubsessionKeymiędzy prepare a końcowym zatwierdzonym przekazaniemsystem.run, gateway odrzuci uruchomienie zamiast ufać zmodyfikowanemu ładunkowi.
Zapasowe dostarczenie agenta
- Żądania
agentmogą zawieraćdeliver=true, aby zażądać dostarczenia wychodzącego. bestEffortDeliver=falsezachowuje ścisłe działanie: nierozwiązane lub wyłącznie wewnętrzne cele dostarczenia zwracająINVALID_REQUEST.bestEffortDeliver=truepozwala na przejście do wykonania wyłącznie w sesji, gdy nie można rozwiązać zewnętrznej trasy dostarczalnej (na przykład sesje internal/webchat lub niejednoznaczne konfiguracje wielokanałowe).
Wersjonowanie
PROTOCOL_VERSIONznajduje się wsrc/gateway/protocol/schema.ts.- Klienci wysyłają
minProtocol+maxProtocol; serwer odrzuca niezgodności. - Schematy + modele są generowane z definicji TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth
- Uwierzytelnianie gateway przy użyciu współdzielonego sekretu używa
connect.params.auth.tokenlubconnect.params.auth.password, zależnie od skonfigurowanego trybu auth. - Tryby przenoszące tożsamość, takie jak Tailscale Serve
(
gateway.auth.allowTailscale: true) lubgateway.auth.mode: "trusted-proxy"poza loopback, spełniają kontrolę auth dla connect na podstawie nagłówków żądania zamiastconnect.params.auth.*. - Prywatny ingress
gateway.auth.mode: "none"całkowicie pomija uwierzytelnianie connect współdzielonym sekretem; nie wystawiaj tego trybu na publiczny/niezaufany ingress. - Po sparowaniu Gateway wydaje token urządzenia o zakresie zgodnym z rolą + zakresami połączenia.
Jest on zwracany w
hello-ok.auth.deviceTokeni powinien zostać utrwalony przez klienta do przyszłych połączeń. - Klienci powinni utrwalać podstawowy
hello-ok.auth.deviceTokenpo każdym udanym połączeniu. - Ponowne połączenie z tym zapisanym tokenem urządzenia powinno również ponownie używać zapisanego zestawu zatwierdzonych zakresów dla tego tokena. Pozwala to zachować już przyznany dostęp do odczytu/sond/statusu i unika cichego zawężania ponownych połączeń do węższego domyślnego zakresu wyłącznie admin.
- Normalna kolejność auth dla connect to najpierw jawny współdzielony token/hasło, potem
jawne
deviceToken, potem zapisany token per urządzenie, a następnie token bootstrap. - Dodatkowe wpisy
hello-ok.auth.deviceTokensto tokeny przekazania bootstrap. Utrwalaj je tylko wtedy, gdy połączenie używało auth bootstrap na zaufanym transporcie, takim jakwss://lub loopback/local pairing. - Jeśli klient dostarcza jawne
deviceTokenlub jawnescopes, ten zestaw zakresów żądany przez wywołującego pozostaje autorytatywny; buforowane zakresy są ponownie używane tylko wtedy, gdy klient używa zapisanego tokena per urządzenie. - Tokeny urządzeń mogą być obracane/unieważniane przez
device.token.rotateidevice.token.revoke(wymaga zakresuoperator.pairing). - Wydawanie/obracanie tokenów pozostaje ograniczone do zatwierdzonego zestawu ról zapisanego we wpisie parowania tego urządzenia; obrót tokena nie może rozszerzyć urządzenia do roli, której zatwierdzenie parowania nigdy nie przyznało.
- Dla sesji tokenów sparowanych urządzeń zarządzanie urządzeniem ma zakres własny, chyba że
wywołujący ma również
operator.admin: wywołujący bez admin może usuwać/unieważniać/obracać tylko własny wpis urządzenia. device.token.rotatesprawdza także żądany zestaw zakresów operatora względem bieżących zakresów sesji wywołującego. Wywołujący bez admin nie może obrócić tokena do szerszego zestawu zakresów operatora, niż już posiada.- Błędy auth zawierają
error.details.codeoraz podpowiedzi naprawcze:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Zachowanie klienta dla
AUTH_TOKEN_MISMATCH:- Zaufani klienci mogą podjąć jedną ograniczoną próbę ponowną z buforowanym tokenem per urządzenie.
- Jeśli ta próba się nie powiedzie, klienci powinni zatrzymać automatyczne pętle ponownego łączenia i wyświetlić operatorowi wskazówki wymagające działania.
Tożsamość urządzenia + parowanie
- Węzły powinny zawierać stabilną tożsamość urządzenia (
device.id) wyprowadzoną z fingerprintu pary kluczy. - Gateway wydaje tokeny per urządzenie + rola.
- Dla nowych
deviceIdwymagane są zatwierdzenia parowania, chyba że włączono lokalne auto-zatwierdzanie. - Auto-zatwierdzanie parowania jest skoncentrowane na bezpośrednich lokalnych połączeniach loopback.
- OpenClaw ma także wąską ścieżkę backend/container-local self-connect dla zaufanych przepływów pomocniczych ze współdzielonym sekretem.
- Połączenia tailnet lub LAN z tego samego hosta nadal są traktowane jako zdalne w kontekście parowania i wymagają zatwierdzenia.
- Wszyscy klienci WS muszą zawierać tożsamość
devicepodczasconnect(operator + node). Control UI może ją pominąć tylko w tych trybach:gateway.controlUi.allowInsecureAuth=truedla zgodności z niezabezpieczonym HTTP tylko dla localhost.- udane auth operatora
gateway.auth.mode: "trusted-proxy"dla Control UI. gateway.controlUi.dangerouslyDisableDeviceAuth=true(tryb awaryjny, poważne obniżenie bezpieczeństwa).
- Wszystkie połączenia muszą podpisywać dostarczony przez serwer nonce
connect.challenge.
Diagnostyka migracji auth urządzeń
Dla starszych klientów, którzy nadal używają zachowania podpisywania sprzed wyzwania,connect zwraca teraz
kody szczegółów DEVICE_AUTH_* pod error.details.code ze stabilnym error.details.reason.
Typowe błędy migracji:
| Komunikat | details.code | details.reason | Znaczenie |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Klient pominął device.nonce (lub wysłał pusty). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Klient podpisał przy użyciu nieaktualnego/błędnego nonce. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Ładunek podpisu nie odpowiada ładunkowi v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Podpisany znacznik czasu jest poza dozwolonym odchyleniem. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id nie pasuje do fingerprintu klucza publicznego. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Format/kanonizacja klucza publicznego nie powiodły się. |
- Zawsze czekaj na
connect.challenge. - Podpisuj ładunek v2, który zawiera nonce serwera.
- Wysyłaj ten sam nonce w
connect.params.device.nonce. - Preferowany ładunek podpisu to
v3, który wiążeplatformideviceFamilyoprócz pól device/client/role/scopes/token/nonce. - Starsze podpisy
v2pozostają akceptowane dla zgodności, ale przypinanie metadanych sparowanych urządzeń nadal steruje polityką poleceń przy ponownym połączeniu.
TLS + pinning
- TLS jest obsługiwany dla połączeń WS.
- Klienci mogą opcjonalnie przypinać fingerprint certyfikatu gateway (zobacz konfigurację
gateway.tlsorazgateway.remote.tlsFingerprintlub flagę CLI--tls-fingerprint).
Zakres
Ten protokół udostępnia pełne API gateway (status, kanały, models, chat, agent, sessions, nodes, approvals itd.). Dokładna powierzchnia jest definiowana przez schematy TypeBox wsrc/gateway/protocol/schema.ts.