O protocolo WS do Gateway é o plano de controle único + transporte de nós para OpenClaw. Todos os clientes (CLI, interface web, app macOS, nós iOS/Android, nós headless) conectam-se por WebSocket e declaram seu papel + escopo no momento do handshake.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Transporte
- WebSocket, quadros de texto com cargas JSON.
- O primeiro quadro deve ser uma requisição
connect. - Quadros antes da conexão são limitados a 64 KiB. Após um handshake bem-sucedido, os clientes
devem seguir os limites
hello-ok.policy.maxPayloadehello-ok.policy.maxBufferedBytes. Com diagnósticos ativados, quadros de entrada grandes demais e buffers de saída lentos emitem eventospayload.largeantes que o gateway feche ou descarte o quadro afetado. Esses eventos mantêm tamanhos, limites, superfícies e códigos de motivo seguros. Eles não mantêm o corpo da mensagem, conteúdos de anexos, corpo bruto do quadro, tokens, cookies ou valores secretos.
Handshake (connect)
Gateway → Cliente (desafio antes da conexão):connect pode
retornar um erro UNAVAILABLE retentável com details.reason definido como
"startup-sidecars" e retryAfterMs. Os clientes devem tentar novamente essa resposta
dentro do orçamento geral de conexão em vez de exibi-la como uma falha terminal de
handshake.
server, features, snapshot e policy são todos exigidos pelo schema
(src/gateway/protocol/schema/frames.ts). auth também é obrigatório e relata
o papel/escopos negociados. pluginSurfaceUrls é opcional e mapeia nomes de
superfícies de plugin, como canvas, para URLs hospedadas com escopo.
URLs de superfície de plugin com escopo podem expirar. Nós podem chamar
node.pluginSurface.refresh com { "surface": "canvas" } para receber uma nova
entrada em pluginSurfaceUrls. A refatoração experimental do Plugin Canvas não
oferece suporte ao caminho de compatibilidade obsoleto canvasHostUrl, canvasCapability ou
node.canvas.capability.refresh; clientes nativos e gateways atuais devem usar superfícies de plugin.
Quando nenhum token de dispositivo é emitido, hello-ok.auth relata as permissões
negociadas sem campos de token:
client.id: "gateway-client",
client.mode: "backend") podem omitir device em conexões de loopback direto quando
se autenticam com o token/senha compartilhado do gateway. Esse caminho é reservado
para RPCs internos do plano de controle e impede que baselines obsoletas de pareamento CLI/dispositivo
bloqueiem trabalho local de backend, como atualizações de sessão de subagentes. Clientes remotos,
clientes de origem de navegador, clientes de nó e clientes explícitos de token de dispositivo/identidade de dispositivo
ainda usam as verificações normais de pareamento e upgrade de escopo.
Quando um token de dispositivo é emitido, hello-ok também inclui:
hello-ok.auth também pode incluir entradas adicionais
de papel delimitado em deviceTokens:
scopes: [] e qualquer token de operador repassado permanece delimitado à allowlist
de operador de bootstrap (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Verificações de escopo de bootstrap permanecem
prefixadas por papel: entradas de operador satisfazem apenas solicitações de operador, e papéis
não operadores ainda precisam de escopos sob seu próprio prefixo de papel.
Exemplo de nó
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
Para o modelo completo de escopo de operador, verificações no momento da aprovação e semântica de segredo compartilhado, veja Escopos de operador.Papéis
operator= cliente do plano de controle (CLI/UI/automação).node= host de capacidade (camera/screen/canvas/system.run).
Escopos (operador)
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 de gateway registrados por plugin podem solicitar seu próprio escopo de operador, mas
prefixos administrativos principais reservados (config.*, exec.approvals.*, wizard.*,
update.*) sempre resolvem para operator.admin.
O escopo do método é apenas o primeiro bloqueio. Alguns comandos slash acessados por meio de
chat.send aplicam verificações mais estritas no nível do comando além disso. Por exemplo, gravações persistentes
de /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 nó 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/comandos/permissões (nó)
Nós declaram reivindicações de capacidade no momento da conexão:caps: categorias de capacidade de alto nível, comocamera,canvas,screen,location,voiceetalk.commands: allowlist de comandos para invocação.permissions: alternâncias granulares (por exemplo,screen.record,camera.capture).
Presença
system-presenceretorna entradas indexadas por identidade de dispositivo.- Entradas de presença incluem
deviceId,rolesescopespara que UIs possam mostrar uma única linha por dispositivo mesmo quando ele se conecta como operator e node. node.listinclui campos opcionaislastSeenAtMselastSeenReason. Nós conectados relatam o horário da conexão atual comolastSeenAtMscom motivoconnect; nós pareados também podem relatar presença durável em segundo plano quando um evento de nó confiável atualiza seus metadados de pareamento.
Evento de nó ativo em segundo plano
Nós podem chamarnode.event com event: "node.presence.alive" para registrar que um nó pareado estava
ativo durante um despertar em segundo plano sem marcá-lo como conectado.
trigger é uma enumeração fechada: background, silent_push, bg_app_refresh,
significant_location, manual ou connect. Strings de gatilho desconhecidas são normalizadas para
background pelo gateway antes da persistência. O evento só é durável para sessões de dispositivo de nó
autenticadas; sessões sem dispositivo ou não pareadas retornam handled: false.
Gateways bem-sucedidos retornam um resultado estruturado:
{ "ok": true } para node.event; clientes devem tratar isso como uma
RPC confirmada, não como persistência durável de presença.
Escopo de eventos de broadcast
Eventos de broadcast WebSocket enviados pelo servidor são controlados por escopo para que sessões com escopo de pareamento ou somente de nó não recebam passivamente conteúdo de sessão.- Quadros de chat, agente e resultado de ferramenta (incluindo eventos
agentem streaming e resultados de chamadas de ferramenta) exigem pelo menosoperator.read. Sessões semoperator.readignoram esses quadros completamente. - Broadcasts
plugin.*definidos por plugin são bloqueados paraoperator.writeouoperator.admin, dependendo de como o plugin os registrou. - Eventos de status e transporte (
heartbeat,presence,tick, ciclo de vida de conexão/desconexão etc.) permanecem sem restrição para que a integridade do transporte permaneça observável para toda sessão autenticada. - Famílias de eventos de broadcast desconhecidas são bloqueadas por escopo por padrão (falha fechada), a menos que um handler registrado as relaxe explicitamente.
Famílias comuns de métodos RPC
A superfície WS pública é mais ampla que os exemplos de handshake/auth acima. Esta não é uma listagem gerada —hello-ok.features.methods é uma lista conservadora
de descoberta criada a partir de src/gateway/server-methods-list.ts mais exportações de métodos de
plugin/canal carregadas. Trate-a como descoberta de recursos, não como uma
enumeração completa de src/gateway/server-methods/*.ts.
Sistema e identidade
Sistema e identidade
healthretorna o snapshot de integridade do gateway em cache ou recém-sondado.diagnostics.stabilityretorna o registrador recente e delimitado de estabilidade diagnóstica. Ele mantém metadados operacionais, como nomes de eventos, contagens, tamanhos em bytes, leituras de memória, estado de fila/sessão, nomes de canal/plugin e ids de sessão. Ele não mantém texto de chat, corpos de webhook, saídas de ferramentas, corpos brutos de requisição ou resposta, tokens, cookies ou valores secretos. Escopo de leitura de operador é exigido.statusretorna o resumo do gateway no estilo/status; campos sensíveis são incluídos apenas para clientes operadores com escopo de administrador.gateway.identity.getretorna a identidade de dispositivo do gateway usada por fluxos de relay e pareamento.system-presenceretorna o snapshot de presença atual para dispositivos operador/nó conectados.system-eventanexa um evento de sistema e pode atualizar/transmitir contexto de presença.last-heartbeatretorna o evento de Heartbeat persistido mais recente.set-heartbeatsalterna o processamento de Heartbeat no gateway.
Modelos e uso
Modelos e uso
models.listretorna o catálogo de modelos permitido em runtime. Passe{ "view": "configured" }para modelos configurados em tamanho de seletor (agents.defaults.modelsprimeiro, depoismodels.providers.*.models), ou{ "view": "all" }para o catálogo completo.usage.statusretorna janelas de uso do provedor/resumos de cota restante.usage.costretorna resumos agregados de custo de uso para um intervalo de datas.doctor.memory.statusretorna a prontidão da memória vetorial / embeddings em cache para o workspace ativo do agente padrão. Passe{ "probe": true }ou{ "deep": true }somente quando o chamador quiser explicitamente um ping ao vivo do provedor de embeddings.doctor.memory.remHarnessretorna uma prévia limitada e somente leitura do harness REM para clientes remotos do plano de controle. Ele pode incluir caminhos de workspace, trechos de memória, markdown fundamentado renderizado e candidatos a promoção profunda, então os chamadores precisam deoperator.read.sessions.usageretorna resumos de uso por sessão.sessions.usage.timeseriesretorna uso em série temporal para uma sessão.sessions.usage.logsretorna entradas de log de uso para uma sessão.
Canais e auxiliares de login
Canais e auxiliares 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 por QR/web para o provedor de canal web atual compatível com QR.web.login.waitaguarda a conclusão desse fluxo de login por QR/web e inicia o canal em caso de sucesso.push.testenvia uma notificação push APNs de teste para um nó iOS registrado.voicewake.getretorna os acionadores de palavra de ativação armazenados.voicewake.setatualiza os acionadores de palavra de ativação e transmite a alteração.
Mensagens e logs
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 trecho final configurado do log de arquivo do Gateway com controles de cursor/limite e máximo de bytes.
Talk e TTS
Talk e TTS
talk.catalogretorna o catálogo somente leitura de provedores Talk para fala, transcrição em streaming e voz em tempo real. Ele inclui ids de provedores, rótulos, estado configurado, ids de modelos/vozes expostos, modos canônicos, transportes, estratégias de cérebro e flags de áudio/capacidade em tempo real sem retornar segredos do provedor nem alterar a configuração global.talk.configretorna o payload efetivo de configuração do Talk;includeSecretsexigeoperator.talk.secrets(ouoperator.admin).talk.session.createcria uma sessão Talk de propriedade do Gateway pararealtime/gateway-relay,transcription/gateway-relayoustt-tts/managed-room.brain: "direct-tools"exigeoperator.admin.talk.session.joinvalida um token de sessão de sala gerenciada, emite eventossession.readyousession.replacedconforme necessário e retorna metadados de sala/sessão mais eventos recentes do Talk sem o token em texto claro nem o hash de token armazenado.talk.session.appendAudioanexa áudio de entrada PCM em base64 a sessões de relay em tempo real e transcrição de propriedade do Gateway.talk.session.startTurn,talk.session.endTurnetalk.session.cancelTurncontrolam o ciclo de vida de turnos de sala gerenciada com rejeição de turno obsoleto antes que o estado seja limpo.talk.session.cancelOutputinterrompe a saída de áudio do assistente, principalmente para interrupção controlada por VAD em sessões de relay do Gateway.talk.session.submitToolResultconclui uma chamada de ferramenta do provedor emitida por uma sessão de relay em tempo real de propriedade do Gateway. Passeoptions: { willContinue: true }para saída provisória de ferramenta quando um resultado final vier depois, ouoptions: { suppressResponse: true }quando o resultado da ferramenta deve satisfazer a chamada do provedor sem iniciar outra resposta de assistente em tempo real.talk.session.closefecha uma sessão de relay, transcrição ou sala gerenciada de propriedade do Gateway e emite eventos Talk terminais.talk.modedefine/transmite o estado atual do modo Talk para clientes WebChat/Control UI.talk.client.createcria uma sessão de provedor em tempo real de propriedade do cliente usandowebrtcouprovider-websocket, enquanto o Gateway é proprietário da configuração, credenciais, instruções e política de ferramentas.talk.client.toolCallpermite que transportes em tempo real de propriedade do cliente encaminhem chamadas de ferramentas do provedor para a política do Gateway. A primeira ferramenta compatível éopenclaw_agent_consult; clientes recebem um id de execução e aguardam eventos normais do ciclo de vida do chat antes de enviar o resultado de ferramenta específico do provedor.talk.eventé o canal único de eventos Talk para adaptadores em tempo real, transcrição, STT/TTS, sala gerenciada, telefonia e reuniões.talk.speaksintetiza fala por meio do provedor de fala Talk ativo.tts.statusretorna estado habilitado do TTS, provedor ativo, provedores de fallback e estado de configuração do provedor.tts.providersretorna o inventário visível de provedores TTS.tts.enableetts.disablealternam o estado de preferências do TTS.tts.setProvideratualiza o provedor TTS preferido.tts.convertexecuta conversão avulsa de texto em fala.
Segredos, configuração, atualização e assistente
Segredos, configuração, atualização e assistente
secrets.reloadresolve novamente SecretRefs ativos e troca o estado de segredos em runtime somente em caso de sucesso completo.secrets.resolveresolve atribuições de segredos direcionadas a comando para um conjunto específico de comandos/alvos.config.getretorna o snapshot e 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 esquema de configuração ativo usado pela Control UI e ferramentas CLI: esquema,uiHints, versão e metadados de geração, incluindo metadados de esquema de Plugin + canal quando o runtime consegue carregá-los. O esquema inclui metadados de campotitle/descriptionderivados dos mesmos rótulos e texto de ajuda usados pela UI, incluindo ramificações de composição de objeto aninhado, curinga, item de array eanyOf/oneOf/allOfquando existe documentação de campo correspondente.config.schema.lookupretorna um payload de consulta com escopo de caminho para um caminho de configuração: caminho normalizado, um nó de esquema raso, dica correspondente +hintPathe resumos de filhos imediatos para detalhamento na UI/CLI. Nós de esquema de consulta mantêm a documentação voltada ao usuário e campos comuns de validação (title,description,type,enum,const,format,pattern, limites numéricos/de string/de array/de objeto e flags comoadditionalProperties,deprecated,readOnly,writeOnly). Resumos de filhos expõemkey,pathnormalizado,type,required,hasChildren, além dehint/hintPathcorrespondentes.update.runexecuta o fluxo de atualização do Gateway e agenda uma reinicialização somente quando a atualização em si tiver sido bem-sucedida; chamadores com uma sessão podem incluircontinuationMessagepara que a inicialização retome um turno subsequente do agente pela fila de continuação de reinicialização. Atualizações do gerenciador de pacotes forçam uma reinicialização de atualização sem adiamento e sem cooldown após a troca do pacote para que o processo antigo do Gateway não continue carregando sob demanda de uma árvoredistsubstituída.update.statusretorna o sentinela de reinicialização de atualização mais recente em cache, incluindo a versão em execução após a reinicialização quando disponível.wizard.start,wizard.next,wizard.statusewizard.cancelexpõem o assistente de onboarding por WS RPC.
Auxiliares de agente e workspace
Auxiliares de agente e workspace
agents.listretorna entradas de agentes configurados, incluindo modelo efetivo e metadados de runtime.agents.create,agents.updateeagents.deletegerenciam registros de agentes e ligação de workspace.agents.files.list,agents.files.geteagents.files.setgerenciam os arquivos de workspace de bootstrap expostos para um agente.tasks.list,tasks.getetasks.cancelexpõem o ledger de tarefas do Gateway para clientes SDK e operadores.artifacts.list,artifacts.geteartifacts.downloadexpõem resumos de artefatos derivados de transcritos e downloads para um escopo explícito desessionKey,runIdoutaskId. Consultas de execução e tarefa resolvem a sessão proprietária no lado do servidor e retornam apenas mídias de transcrito com proveniência correspondente; fontes de URL inseguras ou locais retornam downloads não compatíveis em vez de fazer busca no lado do servidor.environments.listeenvironments.statusexpõem descoberta somente leitura de ambientes locais do Gateway e de nós para clientes SDK.agent.identity.getretorna a identidade efetiva do assistente para um agente ou sessão.agent.waitaguarda uma execução terminar e retorna o snapshot terminal quando disponível.
Controle de sessão
Controle de sessão
sessions.listretorna o índice de sessões atual, incluindo metadados deagentRuntimepor linha quando um backend de runtime de agente está configurado.sessions.subscribeesessions.unsubscribealternam assinaturas de eventos de alteração de sessão para o cliente WS atual.sessions.messages.subscribeesessions.messages.unsubscribealternam assinaturas de eventos de transcrito/mensagem para uma sessão.sessions.previewretorna prévias limitadas de transcritos para chaves de sessão específicas.sessions.describeretorna uma linha de sessão do Gateway para uma chave de sessão exata.sessions.resolveresolve ou canoniza 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 interrupção e direcionamento para uma sessão ativa.sessions.abortaborta trabalho ativo para uma sessão. Um chamador pode passarkeymaisrunIdopcional, ou passar apenasrunIdpara execuções ativas que o Gateway consegue resolver para uma sessão.sessions.patchatualiza metadados/sobrescritas de sessão e relata o modelo canônico resolvido mais oagentRuntimeefetivo.sessions.reset,sessions.deleteesessions.compactexecutam manutenção de sessão.sessions.getretorna a linha de sessão armazenada completa.- 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 chamadas de ferramenta em texto puro (incluindo<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>e blocos de chamadas de ferramenta truncados) e tokens de controle de modelo ASCII/largura total vazados são removidos, linhas de assistente compostas apenas por tokens silenciosos, comoNO_REPLY/no_replyexatos, são omitidas, e linhas grandes demais podem ser substituídas por placeholders.
Pareamento de dispositivos e tokens de dispositivo
Pareamento de dispositivos e tokens de dispositivo
device.pair.listretorna dispositivos pareados pendentes e aprovados.device.pair.approve,device.pair.rejectedevice.pair.removegerenciam registros de pareamento de dispositivos.device.token.rotaterotaciona um token de dispositivo pareado dentro dos limites de função aprovada e escopo do chamador.device.token.revokerevoga um token de dispositivo pareado dentro dos limites de função aprovada e escopo do chamador.
Pareamento de nós, invocação e trabalho pendente
Pareamento de nós, invocação e trabalho pendente
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.removeenode.pair.verifycobrem pareamento de nós e verificação de bootstrap.node.listenode.describeretornam estado de nós conhecidos/conectados.node.renameatualiza o rótulo de um nó pareado.node.invokeencaminha um comando para um nó conectado.node.invoke.resultretorna o resultado de uma solicitação de invocação.node.eventtransporta eventos originados por nós de volta para o Gateway.node.pending.pullenode.pending.acksão as APIs de fila de nós conectados.node.pending.enqueueenode.pending.draingerenciam trabalho pendente durável para nós offline/desconectados.
Famílias de aprovação
Famílias de aprovação
exec.approval.request,exec.approval.get,exec.approval.listeexec.approval.resolvecobrem solicitações de aprovação de execução pontuais, além de consulta/reprodução de aprovações pendentes.exec.approval.waitDecisionaguarda uma aprovação de execução pendente e retorna a decisão final (ounullem caso de tempo limite).exec.approvals.geteexec.approvals.setgerenciam snapshots da política de aprovação de execução do Gateway.exec.approvals.node.geteexec.approvals.node.setgerenciam a política de aprovação de execução local do Node por meio de comandos de retransmissão do Node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisioneplugin.approval.resolvecobrem fluxos de aprovação definidos por Plugin.
Automação, Skills e ferramentas
Automação, Skills e ferramentas
- Automação:
wakeagenda uma injeção imediata ou no próximo Heartbeat de texto de ativação;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsgerenciam trabalho agendado. - Skills e ferramentas:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
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 assinada.sessions.changed: índice ou metadados da sessão alterados.presence: atualizações de snapshot de presença do sistema.tick: evento periódico de keepalive / vivacidade.health: atualização de snapshot de integridade do Gateway.heartbeat: atualização do fluxo de eventos de Heartbeat.cron: evento de alteração de execução/tarefa de Cron.shutdown: notificação de encerramento do Gateway.node.pair.requested/node.pair.resolved: ciclo de vida de pareamento de Node.node.invoke.request: transmissão de solicitação de invocação de Node.device.pair.requested/device.pair.resolved: ciclo de vida de dispositivo pareado.voicewake.changed: configuração de disparo por palavra de ativação alterada.exec.approval.requested/exec.approval.resolved: ciclo de vida de aprovação de execução.plugin.approval.requested/plugin.approval.resolved: ciclo de vida de aprovação de Plugin.
Métodos auxiliares de Node
- Nodes podem chamar
skills.binspara buscar a lista atual de executáveis de Skills para verificações de permissão automática.
RPCs do livro-razão de tarefas
Clientes operadores podem inspecionar e cancelar registros de tarefas em segundo plano do Gateway por meio dos RPCs do livro-razão de tarefas. Esses métodos retornam resumos de tarefas sanitizados, não o estado bruto de runtime.tasks.listrequeroperator.read.- Parâmetros:
statusopcional ("queued","running","completed","failed","cancelled"ou"timed_out") ou uma matriz desses status,agentIdopcional,sessionKeyopcional,limitopcional de1a500e stringcursoropcional. - Resultado:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Parâmetros:
tasks.getrequeroperator.read.- Parâmetros:
{ "taskId": string }. - Resultado:
{ "task": TaskSummary }. - IDs de tarefa ausentes retornam o formato de erro de não encontrado do Gateway.
- Parâmetros:
tasks.cancelrequeroperator.write.- Parâmetros:
{ "taskId": string, "reason"?: string }. - Resultado:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundinforma se o livro-razão tinha uma tarefa correspondente.cancelledinforma se o runtime aceitou ou registrou o cancelamento.
- Parâmetros:
TaskSummary inclui id, status e metadados opcionais, como kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, timestamps, progresso,
resumo terminal e texto de erro sanitizado.
Métodos auxiliares de operador
- Operadores podem chamar
commands.list(operator.read) para buscar o inventário de comandos de runtime de um agente.agentIdé opcional; omita-o para ler o workspace padrão do agente.scopecontrola qual superfície onameprimário mira:textretorna o token de comando de texto primário sem a/inicialnativee o caminho padrãobothretornam nomes nativos cientes do provedor quando disponíveis
textAliasescarrega aliases de barra exatos, como/modele/m.nativeNamecarrega o nome de comando nativo ciente do provedor quando existe.provideré opcional e afeta apenas a nomeação nativa, além da disponibilidade de comandos nativos de Plugin.includeArgs=falseomite metadados de argumentos serializados da resposta.
- Operadores podem chamar
tools.catalog(operator.read) para buscar o catálogo de ferramentas de runtime para um agente. A resposta inclui ferramentas agrupadas e metadados de proveniência:source:coreoupluginpluginId: proprietário do Plugin quandosource="plugin"optional: se uma ferramenta de Plugin é opcional
- Operadores podem chamar
tools.effective(operator.read) para buscar o inventário de ferramentas efetivo em runtime para uma sessão.sessionKeyé obrigatório.- O gateway deriva o contexto de runtime confiável da sessão no lado do servidor, em vez de aceitar autenticação ou contexto de entrega fornecidos pelo chamador.
- A resposta é escopada à sessão e reflete o que a conversa ativa pode usar agora, incluindo ferramentas de core, Plugin e canal.
- Operadores podem chamar
tools.invoke(operator.write) para invocar uma ferramenta disponível por meio do mesmo caminho de política do Gateway que/tools/invoke.nameé obrigatório.args,sessionKey,agentId,confirmeidempotencyKeysão opcionais.- Se
sessionKeyeagentIdestiverem presentes, o agente resolvido da sessão deve corresponder aagentId. - A resposta é um envelope voltado ao SDK com
ok,toolName,outputopcional e camposerrortipados. Recusas por aprovação ou política retornamok:falseno payload, em vez de contornar o pipeline de política de ferramentas do Gateway.
- Operadores podem chamar
skills.status(operator.read) para buscar o inventário visível de Skills de um agente.agentIdé opcional; omita-o para ler o workspace padrão do agente.- A resposta inclui elegibilidade, requisitos ausentes, verificações de configuração e opções de instalação sanitizadas sem expor valores secretos brutos.
- Operadores podem chamar
skills.searcheskills.detail(operator.read) para metadados de descoberta do ClawHub. - Operadores podem chamar
skills.upload.begin,skills.upload.chunkeskills.upload.commit(operator.admin) para preparar um arquivo privado de Skill antes de instalá-lo. Este é um caminho separado de upload administrativo para clientes confiáveis, não o fluxo normal de instalação de Skills do ClawHub, e fica desabilitado por padrão, a menos queskills.install.allowUploadedArchivesesteja habilitado.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })cria um upload vinculado a esse slug e valor de force.skills.upload.chunk({ uploadId, offset, dataBase64 })anexa bytes no offset decodificado exato.skills.upload.commit({ uploadId, sha256? })verifica o tamanho final e o SHA-256. O commit apenas finaliza o upload; ele não instala a Skill.- Arquivos de Skill enviados são arquivos zip que contêm uma raiz
SKILL.md. O nome do diretório interno do arquivo nunca seleciona o destino de instalação.
- Operadores podem chamar
skills.install(operator.admin) em três modos:- Modo ClawHub:
{ source: "clawhub", slug, version?, force? }instala uma pasta de Skill no diretórioskills/do workspace padrão do agente. - Modo upload:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }instala um upload confirmado no diretórioskills/<slug>do workspace padrão do agente. O slug e o valor de force devem corresponder à solicitação originalskills.upload.begin. Este modo é rejeitado, a menos queskills.install.allowUploadedArchivesesteja habilitado. A configuração não afeta instalações do ClawHub. - Modo instalador do Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }executa uma açãometadata.openclaw.installdeclarada no host do Gateway.
- Modo ClawHub:
- Operadores 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 padrão do agente.
- O modo de configuração aplica patches a valores
skills.entries.<skillKey>, comoenabled,apiKeyeenv.
Visualizações de models.list
models.list aceita um parâmetro opcional view:
- Omitido ou
"default": comportamento atual de runtime. Seagents.defaults.modelsestiver configurado, a resposta será o catálogo permitido, incluindo modelos descobertos dinamicamente para entradasprovider/*. Caso contrário, a resposta será o catálogo completo do Gateway. "configured": comportamento em tamanho de seletor. Seagents.defaults.modelsestiver configurado, ele ainda prevalece, incluindo descoberta escopada por provedor para entradasprovider/*. Sem uma allowlist, a resposta usa entradas explícitasmodels.providers.*.models, recorrendo ao catálogo completo somente quando não há linhas de modelo configuradas."all": catálogo completo do Gateway, contornandoagents.defaults.models. Use isso para diagnósticos e UIs de descoberta, não para seletores normais de modelo.
Aprovações de execução
- Quando uma solicitação de execução precisa de aprovação, o gateway transmite
exec.approval.requested. - Clientes operadores resolvem chamando
exec.approval.resolve(requer o escopooperator.approvals). - Para
host=node,exec.approval.requestdeve incluirsystemRunPlan(argv/cwd/rawCommand/metadados de sessão canônicos). Solicitações semsystemRunPlansão rejeitadas. - Após a aprovação, chamadas encaminhadas
node.invoke system.runreutilizam essesystemRunPlancanônico como o contexto autoritativo de comando/cwd/sessão. - Se um chamador mutar
command,rawCommand,cwd,agentIdousessionKeyentre a preparação e o encaminhamento final aprovado desystem.run, o gateway rejeitará a execução em vez de confiar no payload mutado.
Fallback de entrega do agente
- Solicitações
agentpodem incluirdeliver=truepara solicitar entrega de saída. bestEffortDeliver=falsemantém o comportamento estrito: destinos de entrega não resolvidos ou somente internos retornamINVALID_REQUEST.bestEffortDeliver=truepermite fallback para execução somente na sessão quando nenhuma rota entregável externa pode ser resolvida (por exemplo, sessões internas/webchat ou configurações multicanal ambíguas).- Resultados finais de
agentpodem incluirresult.deliveryStatusquando a entrega foi solicitada, usando os mesmos statussent,suppressed,partial_failedefaileddocumentados paraopenclaw agent --json --deliver.
Versionamento
PROTOCOL_VERSIONfica emsrc/gateway/protocol/version.ts.- Clientes enviam
minProtocol+maxProtocol; o servidor rejeita intervalos que não incluem seu protocolo atual. Clientes nativos usam um limite inferior v3 para que clientes v4 aditivos ainda possam alcançar gateways v3. - Esquemas + modelos são gerados a partir de definições TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Constantes de cliente
O cliente de referência emsrc/gateway/client.ts usa estes padrões. Os valores são
estáveis no protocolo v4 e são a linha de base esperada para clientes de terceiros.
| Constante | Padrão | Origem |
|---|---|---|
PROTOCOL_VERSION | 4 | src/gateway/protocol/version.ts |
MIN_CLIENT_PROTOCOL_VERSION | 3 | src/gateway/protocol/version.ts |
| Tempo limite da solicitação (por RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Tempo limite de pré-autenticação / desafio de conexão | 15_000 ms | src/gateway/handshake-timeouts.ts (config/env pode aumentar o orçamento pareado servidor/cliente) |
| Backoff de reconexão inicial | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Backoff máximo de reconexão | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Limite de nova tentativa rápida após fechamento por token de dispositivo | 250 ms | src/gateway/client.ts |
Período de tolerância de parada forçada antes de terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Tempo limite padrão de stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Intervalo padrão de tick (antes de hello-ok) | 30_000 ms | src/gateway/client.ts |
| Fechamento por tempo limite 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 em hello-ok; os clientes devem respeitar esses valores
em vez dos padrões anteriores ao handshake.
Autenticação
- A autenticação de Gateway por 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 atendem à verificação de autenticação de conexão a partir dos cabeçalhos da solicitação em vez deconnect.params.auth.*. gateway.auth.mode: "none"em ingresso privado ignora totalmente a autenticação de conexão por segredo compartilhado; não exponha esse modo em ingresso público/não confiável.- Após o pareamento, o Gateway emite um token de dispositivo com escopo limitado ao 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. - Reconectar com esse token de dispositivo armazenado também deve reutilizar o conjunto de escopos aprovado armazenado para esse token. Isso preserva acesso de leitura/sondagem/status que já foi concedido e evita reduzir silenciosamente as reconexões a um escopo implícito mais restrito, apenas de administrador.
- Montagem de autenticação de conexão no lado do cliente (
selectConnectAuthemsrc/gateway/client.ts):auth.passwordé ortogonal e sempre é encaminhado quando definido.auth.tokené preenchido em ordem de prioridade: primeiro o token compartilhado explícito, depois umdeviceTokenexplícito, depois um token por dispositivo armazenado (chaveado pordeviceId+role).auth.bootstrapTokené enviado somente quando nenhuma das opções acima resolveu umauth.token. Um token compartilhado ou qualquer token de dispositivo resolvido o suprime.- A promoção automática de um token de dispositivo armazenado na nova tentativa única de
AUTH_TOKEN_MISMATCHé restrita a endpoints confiáveis — loopback, ouwss://com umtlsFingerprintfixado.wss://público sem fixação não se qualifica.
- Entradas adicionais de
hello-ok.auth.deviceTokenssão tokens de repasse de bootstrap. Persista-as somente quando a conexão usar autenticação de bootstrap em um transporte confiável comowss://ou pareamento local/loopback. - 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 por dispositivo armazenado. - Tokens de dispositivo podem ser rotacionados/revogados via
device.token.rotateedevice.token.revoke(requer escopooperator.pairing). device.token.rotateretorna metadados de rotação. Ele ecoa o token portador substituto somente para chamadas do mesmo dispositivo que já estão autenticadas com esse token de dispositivo, para que clientes apenas com token possam persistir o substituto antes de reconectar. Rotações compartilhadas/de administrador não ecoam o token portador.- Emissão, rotação e revogação de tokens permanecem limitadas ao conjunto de papéis aprovado registrado na entrada de pareamento desse dispositivo; a mutação de token não pode expandir nem mirar um papel de dispositivo que a aprovação de pareamento nunca concedeu.
- Para sessões de token de dispositivo pareado, o gerenciamento de dispositivos é autoescopado, a menos que o
chamador também tenha
operator.admin: chamadores não administradores podem remover/revogar/rotacionar somente sua própria entrada de dispositivo. device.token.rotateedevice.token.revoketambém verificam o conjunto de escopos do token de operador de destino contra os escopos da sessão atual do chamador. Chamadores não administradores não podem rotacionar nem revogar um token de operador mais amplo do que já possuem.- Falhas de autenticação incluem
error.details.codemais dicas de recuperação:error.details.canRetryWithDeviceToken(booleano)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 uma nova tentativa limitada com um token por dispositivo em cache.
- Se essa nova tentativa falhar, os clientes devem parar loops de reconexão automática e apresentar orientação de ação ao operador.
AUTH_SCOPE_MISMATCHsignifica que o token de dispositivo foi reconhecido, mas não cobre o papel/escopos solicitados. Os clientes não devem apresentar isso como um token inválido; solicite que o operador faça novo pareamento ou aprove o contrato de escopo mais restrito/mais amplo.
Identidade do dispositivo + pareamento
- Nós devem incluir uma identidade de dispositivo estável (
device.id) derivada de uma impressão digital de par de chaves. - Gateways emitem tokens por dispositivo + papel.
- Aprovações de pareamento são necessárias para novos IDs de dispositivo, a menos que a aprovação automática local esteja habilitada.
- A aprovação automática de pareamento é centrada em conexões diretas de local loopback.
- OpenClaw também tem um caminho restrito de autoconexão local de backend/contêiner para fluxos auxiliares confiáveis com segredo compartilhado.
- Conexões de tailnet ou LAN no mesmo host ainda são tratadas como remotas para pareamento e exigem aprovação.
- Clientes WS normalmente incluem identidade
deviceduranteconnect(operador + nó). As únicas exceções de operador sem dispositivo são caminhos de confiança explícitos:gateway.controlUi.allowInsecureAuth=truepara compatibilidade HTTP insegura apenas em localhost.- autenticação de operador bem-sucedida da UI de controle com
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(recurso de emergência, rebaixamento severo de segurança).- RPCs de backend
gateway-clientpor loopback direto autenticados com o token/senha compartilhado do Gateway.
- 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 desafio,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 | Cliente omitiu device.nonce (ou enviou em branco). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Cliente assinou com um nonce obsoleto/incorreto. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Payload de assinatura não corresponde ao payload v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Timestamp assinado está fora da distorção 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 | 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 preferencial é
v3, que vinculaplatformedeviceFamilyalém dos campos de dispositivo/cliente/papel/escopos/token/nonce. - Assinaturas legadas
v2continuam aceitas por compatibilidade, mas a fixação de metadados de dispositivo pareado ainda controla a política de comandos na reconexão.
TLS + fixação
- TLS é compatível com conexões WS.
- 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, agente, sessões, nós, aprovações etc.). A superfície exata é definida pelos schemas TypeBox emsrc/gateway/protocol/schema.ts.