Skip to main content
TypeBox é uma biblioteca de esquemas voltada prioritariamente para TypeScript. O OpenClaw a utiliza para definir o protocolo WebSocket do Gateway (handshake, solicitação/resposta, eventos do servidor). Esses esquemas orientam a validação em tempo de execução (AJV), a exportação de JSON Schema e a geração de código Swift para o aplicativo macOS. Uma única fonte de verdade; todo o restante é gerado. Para obter o contexto de nível mais alto do protocolo, comece pela arquitetura do Gateway.

Modelo mental (30 segundos)

Cada mensagem WS do Gateway é um destes três quadros:
  • Solicitação: { type: "req", id, method, params }
  • Resposta: { type: "res", id, ok, payload | error }
  • Evento: { type: "event", event, payload, seq?, stateVersion? }
O primeiro quadro deve ser uma solicitação connect. Depois disso, os clientes chamam métodos (por exemplo, health, send, chat.send) e assinam eventos (por exemplo, presence, tick, agent). Fluxo de conexão (mínimo):
Métodos e eventos comuns: O inventário oficial anunciado de descoberta fica em src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).

Onde ficam os esquemas

  • Barrel de origem: packages/gateway-protocol/src/schema.ts reexporta módulos de domínio em packages/gateway-protocol/src/schema/*.ts (frames.ts para os envelopes de nível superior e o handshake, agent.ts, sessions.ts, cron.ts etc., por área funcional). protocol-schemas.ts é o registro central ProtocolSchemas que mapeia nomes de esquemas para suas definições TypeBox.
  • Validadores em tempo de execução (AJV): packages/gateway-protocol/src/index.ts
  • Registro anunciado de recursos/descoberta: src/gateway/server-methods-list.ts
  • Handshake do servidor e despacho de métodos: src/gateway/server.impl.ts
  • Cliente Node: src/gateway/client.ts
  • JSON Schema gerado: dist/protocol.schema.json (saída da compilação, não versionada)
  • Modelos Swift gerados: apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift

Pipeline atual

  • pnpm protocol:gen grava o JSON Schema (draft-07) em dist/protocol.schema.json.
  • pnpm protocol:gen:swift gera os modelos Swift do Gateway.
  • pnpm protocol:check executa ambos os geradores e verifica se a saída Swift está versionada (a saída JSON Schema é um artefato de compilação ignorado pelo Git).

Como os esquemas são usados em tempo de execução

  • No servidor: cada quadro recebido é validado com AJV. O handshake aceita apenas uma solicitação connect cujos parâmetros correspondam a ConnectParams.
  • No cliente: o cliente JS valida os quadros de evento e resposta antes de usá-los.
  • Descoberta de recursos: o Gateway envia uma lista conservadora de features.methods e features.events em hello-ok, proveniente de listGatewayMethods() e GATEWAY_EVENTS.
  • Essa lista de descoberta não é um despejo gerado de todos os auxiliares chamáveis em coreGatewayHandlers; alguns RPCs auxiliares são implementados em src/gateway/server-methods/*.ts sem serem enumerados na lista de recursos anunciados.

Exemplos de quadros

Conexão (primeira mensagem):
Resposta hello-ok:
Solicitação e resposta:
Evento:

Cliente mínimo (Node.js)

Menor fluxo útil: conexão + verificação de integridade.

Exemplo completo: adicionar um método de ponta a ponta

Exemplo: adicionar uma nova solicitação system.echo que retorna { ok: true, text }.
  1. Esquema (fonte de verdade)
Adicione a packages/gateway-protocol/src/schema/system.ts (ou ao módulo funcional correspondente mais próximo):
Importe ambos em packages/gateway-protocol/src/schema/protocol-schemas.ts, adicione-os ao registro ProtocolSchemas e exporte os tipos derivados:
  1. Validação
Em packages/gateway-protocol/src/index.ts, exporte um validador AJV:
  1. Comportamento do servidor
Adicione um manipulador em src/gateway/server-methods/system.ts:
Registre-o em src/gateway/server-methods.ts (que já combina systemHandlers) e, em seguida, adicione "system.echo" à entrada de listGatewayMethods em src/gateway/server-methods-list.ts. Se o método puder ser chamado por clientes operadores ou Node, classifique-o também em src/gateway/method-scopes.ts para manter alinhadas a aplicação de escopos e a divulgação de recursos em hello-ok.
  1. Gerar novamente
  1. Testes e documentação
Adicione um teste de servidor em src/gateway/server.*.test.ts e mencione o método na documentação.

Comportamento da geração de código Swift

O gerador Swift emite:
  • um enum GatewayFrame com os casos req, res, event e unknown
  • structs/enums de payload fortemente tipados
  • valores de ErrorCode, GATEWAY_PROTOCOL_VERSION e GATEWAY_MIN_PROTOCOL_VERSION
Tipos de quadro desconhecidos são preservados como payloads brutos para compatibilidade futura.

Versionamento e compatibilidade

  • PROTOCOL_VERSION fica em packages/gateway-protocol/src/version.ts (valor atual: 4).
  • Os clientes enviam minProtocol e maxProtocol; o servidor rejeita intervalos que não incluam seu protocolo atual.
  • Os modelos Swift mantêm tipos de quadro desconhecidos para evitar incompatibilidade com clientes mais antigos.

Padrões e convenções de esquema

  • A maioria dos objetos usa additionalProperties: false para payloads estritos.
  • NonEmptyString (Type.String({ minLength: 1 })) é o padrão para IDs e nomes de métodos/eventos.
  • O GatewayFrame de nível superior usa um discriminador em type.
  • Métodos com efeitos colaterais geralmente exigem um idempotencyKey nos parâmetros (exemplo: send, poll, agent, chat.send).
  • agent aceita internalEvents opcionais para contexto de orquestração gerado em tempo de execução (por exemplo, transferência da conclusão de uma tarefa de subagente/cron); trate isso como uma superfície de API interna.

JSON do esquema publicado

O JSON Schema gerado é um artefato de compilação e não é versionado no repositório. O arquivo bruto publicado geralmente está disponível em:

Ao alterar esquemas

  1. Atualize os esquemas TypeBox no módulo responsável em packages/gateway-protocol/src/schema/*.ts e registre-os em protocol-schemas.ts.
  2. Registre o método/evento em src/gateway/server-methods-list.ts.
  3. Atualize src/gateway/method-scopes.ts quando o novo RPC precisar de classificação de escopo de operador ou Node.
  4. Execute pnpm protocol:check.
  5. Faça commit dos modelos Swift gerados novamente.

Relacionado