Protocolo do Gateway (WebSocket)
O protocolo WS do Gateway é o plano de controle único + transporte de Node para o OpenClaw. Todos os clientes (CLI, interface web, app macOS, Nodes iOS/Android, Nodes headless) se conectam por WebSocket e declaram seu papel + escopo no momento do handshake.Transporte
- WebSocket, frames de texto com payloads JSON.
- O primeiro frame deve ser uma requisição
connect.
Handshake (connect)
Gateway → Cliente (desafio pré-conexão):
server, features, snapshot e policy são todos obrigatórios pelo schema
(src/gateway/protocol/schema/frames.ts). canvasHostUrl é opcional. auth
informa o papel/escopos negociados quando disponíveis, e inclui deviceToken
quando o gateway emite um.
Quando nenhum token de dispositivo é emitido, hello-ok.auth ainda pode informar as
permissões negociadas:
hello-ok também inclui:
hello-ok.auth também pode incluir
entradas de papel adicionais limitadas em deviceTokens:
scopes: [] e qualquer token de operador transferido continua limitado à allowlist do
operador de bootstrap (operator.approvals, operator.read,
operator.talk.secrets, operator.write). As verificações de escopo de bootstrap continuam
com prefixo por papel: entradas de operador só satisfazem requisições de operador, e
papéis que não são operador ainda precisam de escopos sob o prefixo do próprio papel.
Exemplo de Node
Enquadramento
- Requisição:
{type:"req", id, method, params} - Resposta:
{type:"res", id, ok, payload|error} - Evento:
{type:"event", event, payload, seq?, stateVersion?}
Papéis + escopos
Papéis
operator= cliente do plano de controle (CLI/UI/automação).node= host de capacidades (camera/screen/canvas/system.run).
Escopos (operator)
Escopos comuns:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config com includeSecrets: true exige operator.talk.secrets
(ou operator.admin).
Métodos RPC do gateway registrados por Plugin podem solicitar seu próprio escopo de operador, mas
os prefixos admin centrais reservados (config.*, exec.approvals.*, wizard.*,
update.*) sempre são resolvidos para operator.admin.
O escopo do método é apenas a primeira barreira. Alguns comandos slash acessados por
chat.send aplicam verificações em nível de comando mais rígidas por cima. Por exemplo,
gravações persistentes com /config set e /config unset exigem operator.admin.
node.pair.approve também tem uma verificação extra de escopo no momento da aprovação,
além do escopo base do método:
- requisições sem comando:
operator.pairing - requisições com comandos de node que não são exec:
operator.pairing+operator.write - requisições que incluem
system.run,system.run.prepareousystem.which:operator.pairing+operator.admin
Caps/commands/permissions (node)
Nodes declaram claims de capacidade no momento da conexão:caps: categorias de capacidade de alto nível.commands: allowlist de comandos para invoke.permissions: toggles granulares (por exemplo,screen.record,camera.capture).
Presença
system-presenceretorna entradas indexadas pela identidade do dispositivo.- As entradas de presença incluem
deviceId,rolesescopes, para que as UIs possam mostrar uma única linha por dispositivo mesmo quando ele se conecta tanto como operator quanto como node.
Famílias comuns de métodos RPC
Esta página não é um dump completo gerado, mas a superfície WS pública é mais ampla do que os exemplos de handshake/autenticação acima. Estas são as principais famílias de métodos que o Gateway expõe hoje.hello-ok.features.methods é uma lista de descoberta conservadora construída a partir de
src/gateway/server-methods-list.ts mais exportações de métodos de plugins/canais carregados.
Trate-a como descoberta de recursos, não como um dump gerado de todos os helpers chamáveis
implementados em src/gateway/server-methods/*.ts.
Sistema e identidade
healthretorna o snapshot de integridade do gateway em cache ou recém-verificado.statusretorna o resumo do gateway no estilo/status; campos sensíveis são incluídos apenas para clientes operator com escopo admin.gateway.identity.getretorna a identidade de dispositivo do gateway usada por fluxos de relay e emparelhamento.system-presenceretorna o snapshot atual de presença dos dispositivos operator/node conectados.system-eventanexa um evento de sistema e pode atualizar/transmitir o contexto de presença.last-heartbeatretorna o evento Heartbeat persistido mais recente.set-heartbeatsalterna o processamento de Heartbeat no gateway.
Modelos e uso
models.listretorna o catálogo de modelos permitido em runtime.usage.statusretorna resumos de janelas de uso de provider/cota restante.usage.costretorna resumos agregados de uso de custo para um intervalo de datas.doctor.memory.statusretorna a prontidão de memória vetorial / embeddings para o workspace do agente padrão ativo.sessions.usageretorna resumos de uso por sessão.sessions.usage.timeseriesretorna séries temporais de uso para uma sessão.sessions.usage.logsretorna entradas de log de uso para uma sessão.
Canais e helpers de login
channels.statusretorna resumos de status de canais/plugins integrados + empacotados.channels.logoutfaz logout de um canal/conta específico quando o canal oferece suporte a logout.web.login.startinicia um fluxo de login QR/web para o provider de canal web com suporte a QR atual.web.login.waitaguarda a conclusão desse fluxo de login QR/web e inicia o canal em caso de sucesso.push.testenvia um push APNs de teste para um node iOS registrado.voicewake.getretorna os triggers de wake-word armazenados.voicewake.setatualiza os triggers de wake-word e transmite a alteração.
Mensagens e logs
sendé o RPC direto de entrega de saída para envios direcionados a canal/conta/thread fora do executor de chat.logs.tailretorna o tail configurado do log de arquivo do gateway com cursor/limite e controles de bytes máximos.
Talk e TTS
talk.configretorna o payload efetivo de configuração de Talk;includeSecretsexigeoperator.talk.secrets(ouoperator.admin).talk.modedefine/transmite o estado atual do modo Talk para clientes WebChat/Control UI.talk.speaksintetiza fala por meio do provider de fala de Talk ativo.tts.statusretorna o estado habilitado de TTS, provider ativo, providers de fallback e o estado de configuração do provider.tts.providersretorna o inventário visível de providers de TTS.tts.enableetts.disablealternam o estado das preferências de TTS.tts.setProvideratualiza o provider de TTS preferido.tts.convertexecuta uma conversão avulsa de texto para fala.
Segredos, configuração, update e wizard
secrets.reloadresolve novamente SecretRefs ativas e substitui o estado de segredo em runtime apenas em caso de sucesso completo.secrets.resolveresolve atribuições de segredos de destino de comando para um conjunto específico de comando/destino.config.getretorna o snapshot e o hash da configuração atual.config.setgrava um payload de configuração validado.config.patchmescla uma atualização parcial de configuração.config.applyvalida + substitui o payload completo de configuração.config.schemaretorna o payload do schema de configuração ativo usado pela Control UI e por ferramentas de CLI: schema,uiHints, versão e metadados de geração, incluindo metadados de schema de plugin + canal quando o runtime consegue carregá-los. O schema inclui metadados de campotitle/descriptionderivados dos mesmos rótulos e textos de ajuda usados pela UI, incluindo objeto aninhado, curinga, item de array e ramificações de composiçãoanyOf/oneOf/allOfquando existe documentação de campo correspondente.config.schema.lookupretorna um payload de lookup com escopo de caminho para um caminho de configuração: caminho normalizado, um nó de schema raso, a dica correspondente +hintPath, e resumos imediatos dos filhos para drill-down de UI/CLI.- Os nós de schema do lookup mantêm a documentação voltada ao usuário e os campos comuns de validação:
title,description,type,enum,const,format,pattern, limites numéricos/de string/de array/de objeto e flags booleanas comoadditionalProperties,deprecated,readOnly,writeOnly. - Os resumos de filhos expõem
key,pathnormalizado,type,required,hasChildren, além dahint/hintPathcorrespondente.
- Os nós de schema do lookup mantêm a documentação voltada ao usuário e os campos comuns de validação:
update.runexecuta o fluxo de update do gateway e agenda um reinício apenas quando o próprio update foi bem-sucedido.wizard.start,wizard.next,wizard.statusewizard.cancelexpõem o wizard de onboarding por RPC WS.
Famílias principais existentes
Helpers de agente e workspace
agents.listretorna entradas de agentes configurados.agents.create,agents.updateeagents.deletegerenciam registros de agente e o wiring do workspace.agents.files.list,agents.files.geteagents.files.setgerenciam os arquivos de workspace de bootstrap expostos para um agente.agent.identity.getretorna a identidade efetiva do assistente para um agente ou sessão.agent.waitaguarda a conclusão de uma execução e retorna o snapshot terminal quando disponível.
Controle de sessão
sessions.listretorna o índice atual de sessões.sessions.subscribeesessions.unsubscribealternam inscrições em eventos de alteração de sessão para o cliente WS atual.sessions.messages.subscribeesessions.messages.unsubscribealternam inscrições em eventos de transcrição/mensagem para uma sessão.sessions.previewretorna prévias de transcrição limitadas para chaves de sessão específicas.sessions.resolveresolve ou canonicaliza um alvo de sessão.sessions.createcria uma nova entrada de sessão.sessions.sendenvia uma mensagem para uma sessão existente.sessions.steeré a variante de interromper e redirecionar para uma sessão ativa.sessions.abortaborta o trabalho ativo de uma sessão.sessions.patchatualiza metadados/substituições de sessão.sessions.reset,sessions.deleteesessions.compactexecutam manutenção de sessão.sessions.getretorna a linha completa da sessão armazenada.- a execução de chat ainda usa
chat.history,chat.send,chat.abortechat.inject. chat.historyé normalizado para exibição para clientes de UI: tags de diretiva inline são removidas do texto visível, payloads XML de chamada de ferramenta em texto simples (incluindo<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>e blocos truncados de chamada de ferramenta) e tokens de controle do modelo em ASCII/largura total que vazaram são removidos, linhas do assistente compostas apenas por tokens silenciosos, comoNO_REPLY/no_replyexatos, são omitidas, e linhas grandes demais podem ser substituídas por placeholders.
Emparelhamento de dispositivo e tokens de dispositivo
device.pair.listretorna dispositivos emparelhados pendentes e aprovados.device.pair.approve,device.pair.rejectedevice.pair.removegerenciam registros de emparelhamento de dispositivo.device.token.rotaterotaciona um token de dispositivo emparelhado dentro dos limites aprovados de papel e escopo.device.token.revokerevoga um token de dispositivo emparelhado.
Emparelhamento de node, invoke e trabalho pendente
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectenode.pair.verifycobrem o emparelhamento de node e a verificação de bootstrap.node.listenode.describeretornam o estado conhecido/conectado de nodes.node.renameatualiza um rótulo de node emparelhado.node.invokeencaminha um comando para um node conectado.node.invoke.resultretorna o resultado de uma requisição invoke.node.eventcarrega eventos originados no node de volta para o gateway.node.canvas.capability.refreshatualiza tokens de capacidade de canvas com escopo.node.pending.pullenode.pending.acksão as APIs de fila de node conectado.node.pending.enqueueenode.pending.draingerenciam trabalho pendente durável para nodes offline/desconectados.
Famílias de aprovação
exec.approval.request,exec.approval.get,exec.approval.listeexec.approval.resolvecobrem requisições avulsas de aprovação de exec mais lookup/replay de aprovação pendente.exec.approval.waitDecisionaguarda uma aprovação pendente de exec e retorna a decisão final (ounullem caso de timeout).exec.approvals.geteexec.approvals.setgerenciam snapshots da política de aprovação de exec do gateway.exec.approvals.node.geteexec.approvals.node.setgerenciam a política local de exec do node por meio de comandos de relay do node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisioneplugin.approval.resolvecobrem fluxos de aprovação definidos por Plugin.
Outras famílias principais
- automação:
wakeagenda uma injeção de texto de wake imediata ou no próximo Heartbeatcron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- skills/ferramentas:
commands.list,skills.*,tools.catalog,tools.effective
Famílias comuns de eventos
chat: atualizações de chat da UI, comochat.injecte outros eventos de chat apenas de transcrição.session.messageesession.tool: atualizações de transcrição/fluxo de eventos para uma sessão inscrita.sessions.changed: o índice de sessões ou metadados mudaram.presence: atualizações do snapshot de presença do sistema.tick: evento periódico de keepalive / vivacidade.health: atualização do snapshot de integridade do gateway.heartbeat: atualização do fluxo de eventos de Heartbeat.cron: evento de alteração de execução/job do Cron.shutdown: notificação de desligamento do gateway.node.pair.requested/node.pair.resolved: ciclo de vida do emparelhamento de node.node.invoke.request: transmissão da requisição invoke do node.device.pair.requested/device.pair.resolved: ciclo de vida do dispositivo emparelhado.voicewake.changed: a configuração de triggers de wake-word mudou.exec.approval.requested/exec.approval.resolved: ciclo de vida da aprovação de exec.plugin.approval.requested/plugin.approval.resolved: ciclo de vida da aprovação de Plugin.
Métodos helper de node
- Nodes podem chamar
skills.binspara buscar a lista atual de executáveis de skill para verificações de auto-allow.
Métodos helper de operator
- Operators podem chamar
commands.list(operator.read) para buscar o inventário de comandos em runtime para um agente.agentIdé opcional; omita-o para ler o workspace do agente padrão.scopecontrola qual superfície onameprimário segmenta:textretorna o token primário do comando de texto sem a/inicialnativee o caminho padrãobothretornam nomes nativos sensíveis ao provider quando disponíveis
textAliasescarrega aliases slash exatos, como/modele/m.nativeNamecarrega o nome nativo sensível ao provider quando ele existe.provideré opcional e afeta apenas a nomenclatura nativa mais a disponibilidade de comandos nativos de Plugin.includeArgs=falseomite metadados de argumentos serializados da resposta.
- Operators podem chamar
tools.catalog(operator.read) para buscar o catálogo de ferramentas em runtime de um agente. A resposta inclui ferramentas agrupadas e metadados de proveniência:source:coreoupluginpluginId: owner do plugin quandosource="plugin"optional: se uma ferramenta de plugin é opcional
- Operators podem chamar
tools.effective(operator.read) para buscar o inventário efetivo de ferramentas em runtime para uma sessão.sessionKeyé obrigatório.- O gateway deriva contexto confiável de runtime do lado do servidor a partir da sessão, em vez de aceitar autenticação ou contexto de entrega fornecidos pelo chamador.
- A resposta tem escopo de sessão e reflete o que a conversa ativa pode usar neste momento, incluindo ferramentas de core, plugin e canal.
- Operators podem chamar
skills.status(operator.read) para buscar o inventário visível de Skills para um agente.agentIdé opcional; omita-o para ler o workspace do agente padrão.- A resposta inclui elegibilidade, requisitos ausentes, verificações de configuração e opções de instalação sanitizadas, sem expor valores brutos de segredos.
- Operators podem chamar
skills.searcheskills.detail(operator.read) para metadados de descoberta do ClawHub. - Operators podem chamar
skills.install(operator.admin) em dois modos:- Modo ClawHub:
{ source: "clawhub", slug, version?, force? }instala uma pasta de skill no diretórioskills/do workspace do agente padrão. - Modo instalador do gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }executa uma ação declaradametadata.openclaw.installno host do gateway.
- Modo ClawHub:
- Operators podem chamar
skills.update(operator.admin) em dois modos:- O modo ClawHub atualiza um slug rastreado ou todas as instalações rastreadas do ClawHub no workspace do agente padrão.
- O modo Config aplica patch em valores
skills.entries.<skillKey>, comoenabled,apiKeyeenv.
Aprovações de exec
- Quando uma requisição exec precisa de aprovação, o gateway transmite
exec.approval.requested. - Clientes operator resolvem chamando
exec.approval.resolve(exige o escopooperator.approvals). - Para
host=node,exec.approval.requestdeve incluirsystemRunPlan(argv/cwd/rawCommand/metadados de sessão canônicos). Requisições semsystemRunPlansão rejeitadas. - Após a aprovação, chamadas encaminhadas
node.invoke system.runreutilizam essesystemRunPlancanônico como contexto autoritativo de comando/cwd/sessão. - Se um chamador alterar
command,rawCommand,cwd,agentIdousessionKeyentre o prepare e o encaminhamento final aprovado desystem.run, o gateway rejeita a execução em vez de confiar no payload alterado.
Fallback de entrega do agente
- Requisições
agentpodem incluirdeliver=truepara solicitar entrega de saída. bestEffortDeliver=falsemantém o comportamento estrito: alvos de entrega não resolvidos ou apenas internos retornamINVALID_REQUEST.bestEffortDeliver=truepermite fallback para execução somente em sessão quando nenhuma rota externa entregável pode ser resolvida (por exemplo, sessões internas/webchat ou configurações multicanal ambíguas).
Versionamento
PROTOCOL_VERSIONfica emsrc/gateway/protocol/schema/protocol-schemas.ts.- Clientes enviam
minProtocol+maxProtocol; o servidor rejeita incompatibilidades. - Schemas + modelos são gerados a partir de definições TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Constantes do cliente
O cliente de referência emsrc/gateway/client.ts usa estes valores padrão. Os valores são
estáveis em todo o protocolo v3 e são a linha de base esperada para clientes de terceiros.
| Constante | Padrão | Fonte |
|---|---|---|
PROTOCOL_VERSION | 3 | src/gateway/protocol/schema/protocol-schemas.ts |
| Timeout de requisição (por RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Timeout de pré-autenticação / desafio de conexão | 10_000 ms | src/gateway/handshake-timeouts.ts (clamp 250–10_000) |
| Backoff inicial de reconexão | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Backoff máximo de reconexão | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Clamp de tentativa rápida após fechamento por token de dispositivo | 250 ms | src/gateway/client.ts |
Grace de parada forçada antes de terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Timeout padrão de stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Intervalo padrão de tick (pré hello-ok) | 30_000 ms | src/gateway/client.ts |
| Fechamento por timeout de tick | código 4000 quando o silêncio excede tickIntervalMs * 2 | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload e
policy.maxBufferedBytes efetivos em hello-ok; os clientes devem respeitar esses valores,
em vez dos padrões de pré-handshake.
Autenticação
- A autenticação do gateway com segredo compartilhado usa
connect.params.auth.tokenouconnect.params.auth.password, dependendo do modo de autenticação configurado. - Modos com identidade, como Tailscale Serve
(
gateway.auth.allowTailscale: true) ougateway.auth.mode: "trusted-proxy"fora de loopback, satisfazem a verificação de autenticação do connect a partir dos headers da requisição em vez deconnect.params.auth.*. - O modo de ingresso privado
gateway.auth.mode: "none"ignora completamente a autenticação de connect com segredo compartilhado; não exponha esse modo em ingressos públicos/não confiáveis. - Após o emparelhamento, o Gateway emite um token de dispositivo com escopo para o
papel + escopos da conexão. Ele é retornado em
hello-ok.auth.deviceTokene deve ser persistido pelo cliente para conexões futuras. - Os clientes devem persistir o
hello-ok.auth.deviceTokenprimário após qualquer conexão bem-sucedida. - Ao reconectar com esse token de dispositivo armazenado, também deve ser reutilizado o conjunto de escopos aprovados armazenado para esse token. Isso preserva o acesso de leitura/probe/status que já foi concedido e evita reduzir silenciosamente as reconexões para um escopo implícito mais estreito, apenas de admin.
- Montagem da autenticação de connect no lado do cliente (
selectConnectAuthemsrc/gateway/client.ts):auth.passwordé ortogonal e sempre é encaminhado quando definido.auth.tokené preenchido em ordem de prioridade: primeiro token compartilhado explícito, depois umdeviceTokenexplícito, depois um token armazenado por dispositivo (indexado pordeviceId+role).auth.bootstrapTokené enviado apenas quando nenhum dos itens acima resolve umauth.token. Um token compartilhado ou qualquer token de dispositivo resolvido o suprime.- A autopromoção de um token de dispositivo armazenado na tentativa única de retry
AUTH_TOKEN_MISMATCHé restrita a endpoints confiáveis apenas — loopback, ouwss://comtlsFingerprintfixado.wss://público sem pinning não se qualifica.
- Entradas adicionais em
hello-ok.auth.deviceTokenssão tokens de handoff de bootstrap. Persista-as apenas quando a conexão usou autenticação de bootstrap em um transporte confiável, comowss://ou loopback/emparelhamento local. - Se um cliente fornecer um
deviceTokenexplícito ouscopesexplícitos, esse conjunto de escopos solicitado pelo chamador permanece autoritativo; escopos em cache só são reutilizados quando o cliente está reutilizando o token armazenado por dispositivo. - Tokens de dispositivo podem ser rotacionados/revogados via
device.token.rotateedevice.token.revoke(exige escopooperator.pairing). - A emissão/rotação de token permanece limitada ao conjunto aprovado de papéis registrado na entrada de emparelhamento daquele dispositivo; rotacionar um token não pode expandir o dispositivo para um papel que a aprovação de emparelhamento nunca concedeu.
- Para sessões de token de dispositivo emparelhado, o gerenciamento de dispositivo é autoescopado, a menos que o
chamador também tenha
operator.admin: chamadores sem admin só podem remover/revogar/rotacionar a entrada do próprio dispositivo. device.token.rotatetambém verifica o conjunto de escopos de operador solicitado em relação aos escopos atuais da sessão do chamador. Chamadores sem admin não podem rotacionar um token para um conjunto de escopos de operador mais amplo do que já possuem.- Falhas de autenticação incluem
error.details.codemais dicas de recuperação:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Comportamento do cliente para
AUTH_TOKEN_MISMATCH:- Clientes confiáveis podem tentar um único retry limitado com um token armazenado por dispositivo em cache.
- Se esse retry falhar, os clientes devem interromper loops automáticos de reconexão e exibir orientação para ação do operador.
Identidade do dispositivo + emparelhamento
- Nodes devem incluir uma identidade de dispositivo estável (
device.id) derivada da impressão digital de um par de chaves. - Gateways emitem tokens por dispositivo + papel.
- Aprovações de emparelhamento são necessárias para novos IDs de dispositivo, a menos que a autoaprovação local esteja habilitada.
- A autoaprovação de emparelhamento é centrada em conexões diretas de loopback local.
- O OpenClaw também tem um caminho estreito de autoconexão local ao backend/container para fluxos helper confiáveis com segredo compartilhado.
- Conexões tailnet ou LAN no mesmo host ainda são tratadas como remotas para fins de emparelhamento e exigem aprovação.
- Todos os clientes WS devem incluir a identidade
deviceduranteconnect(operator + node). A Control UI só pode omiti-la nestes modos:gateway.controlUi.allowInsecureAuth=truepara compatibilidade com HTTP inseguro apenas em localhost.- autenticação operator bem-sucedida da Control UI com
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, downgrade grave de segurança).
- Todas as conexões devem assinar o nonce
connect.challengefornecido pelo servidor.
Diagnósticos de migração de autenticação de dispositivo
Para clientes legados que ainda usam o comportamento de assinatura anterior ao challenge,connect agora retorna
códigos de detalhe DEVICE_AUTH_* em error.details.code com um error.details.reason estável.
Falhas comuns de migração:
| Mensagem | details.code | details.reason | Significado |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | O cliente omitiu device.nonce (ou enviou vazio). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | O cliente assinou com um nonce antigo/incorreto. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | O payload da assinatura não corresponde ao payload v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | O timestamp assinado está fora da tolerância permitida. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id não corresponde à impressão digital da chave pública. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | O formato/canonicalização da chave pública falhou. |
- Sempre aguarde
connect.challenge. - Assine o payload v2 que inclui o nonce do servidor.
- Envie o mesmo nonce em
connect.params.device.nonce. - O payload de assinatura preferido é
v3, que vinculaplatformedeviceFamilyalém dos campos de dispositivo/cliente/papel/escopos/token/nonce. - Assinaturas legadas
v2continuam sendo aceitas por compatibilidade, mas o pinning de metadados de dispositivo emparelhado ainda controla a política de comandos na reconexão.
TLS + pinning
- TLS é compatível com conexões WS.
- Os clientes podem opcionalmente fixar a impressão digital do certificado do gateway (veja a configuração
gateway.tlsmaisgateway.remote.tlsFingerprintou a CLI--tls-fingerprint).
Escopo
Este protocolo expõe a API completa do gateway (status, canais, modelos, chat, agent, sessões, nodes, aprovações etc.). A superfície exata é definida pelos schemas TypeBox emsrc/gateway/protocol/schema.ts.