TypeBox como fuente de verdad del protocolo
Última actualización: 2026-01-10 TypeBox es una biblioteca de esquemas orientada a TypeScript. La usamos para definir el protocolo WebSocket del Gateway (handshake, solicitud/respuesta, eventos del servidor). Esos esquemas impulsan la validación en tiempo de ejecución, la exportación a JSON Schema y la generación de código Swift para la app de macOS. Una sola fuente de verdad; todo lo demás se genera. Si desea el contexto de protocolo de mayor nivel, comience con Arquitectura del Gateway.Modelo mental (30 segundos)
Cada mensaje WS del Gateway es uno de tres marcos:- Solicitud:
{ type: "req", id, method, params } - Respuesta:
{ type: "res", id, ok, payload | error } - Evento:
{ type: "event", event, payload, seq?, stateVersion? }
connect. Después de eso, los clientes pueden llamar
métodos (p. ej., health, send, chat.send) y suscribirse a eventos (p. ej.,
presence, tick, agent).
Flujo de conexión (mínimo):
| Categoría | Ejemplos | Notas |
|---|---|---|
| Núcleo | connect, health, status | connect debe ser primero |
| Mensajería | send, poll, agent, agent.wait | los efectos secundarios requieren idempotencyKey |
| Chat | chat.history, chat.send, chat.abort, chat.inject | WebChat usa estos |
| Sesiones | sessions.list, sessions.patch, sessions.delete | administración de sesiones |
| Nodos | node.list, node.invoke, node.pair.* | WS del Gateway + acciones de nodos |
| Events | tick, presence, agent, chat, health, shutdown | push del servidor |
src/gateway/server.ts (METHODS, EVENTS).
Dónde viven los esquemas
- Fuente:
src/gateway/protocol/schema.ts - Validadores en tiempo de ejecución (AJV):
src/gateway/protocol/index.ts - Handshake del servidor + despacho de métodos:
src/gateway/server.ts - Cliente de nodo:
src/gateway/client.ts - JSON Schema generado:
dist/protocol.schema.json - Modelos Swift generados:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Pipeline actual
pnpm protocol:gen- escribe JSON Schema (draft‑07) en
dist/protocol.schema.json
- escribe JSON Schema (draft‑07) en
pnpm protocol:gen:swift- genera modelos del Gateway en Swift
pnpm protocol:check- ejecuta ambos generadores y verifica que la salida esté confirmada
Cómo se usan los esquemas en tiempo de ejecución
- Lado del servidor: cada marco entrante se valida con AJV. El handshake solo
acepta una solicitud
connectcuyos parámetros coincidan conConnectParams. - Lado del cliente: el cliente JS valida los marcos de eventos y respuestas antes de usarlos.
- Superficie de métodos: el Gateway anuncia los
methodsyeventscompatibles enhello-ok.
Marcos de ejemplo
Conectar (primer mensaje):Cliente mínimo (Node.js)
Flujo útil más pequeño: conectar + health.Ejemplo trabajado: agregar un método de extremo a extremo
Ejemplo: agregar una nueva solicitudsystem.echo que devuelva { ok: true, text }.
- Esquema (fuente de verdad)
src/gateway/protocol/schema.ts:
ProtocolSchemas y exportar tipos:
- Validación
src/gateway/protocol/index.ts, exportar un validador AJV:
- Comportamiento del servidor
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (ya fusiona systemHandlers),
luego agregar "system.echo" a METHODS en src/gateway/server.ts.
- Regenerar
- Pruebas + docs
src/gateway/server.*.test.ts y anotar el método en la documentación.
Comportamiento de la generación de código Swift
El generador Swift emite:- Enum
GatewayFramecon los casosreq,res,eventyunknown - Structs/enums de payload fuertemente tipados
- Valores
ErrorCodeyGATEWAY_PROTOCOL_VERSION
Versionado + compatibilidad
PROTOCOL_VERSIONvive ensrc/gateway/protocol/schema.ts.- Los clientes envían
minProtocol+maxProtocol; el servidor rechaza discrepancias. - Los modelos Swift conservan tipos de marco desconocidos para evitar romper clientes antiguos.
Patrones y convenciones de esquemas
- La mayoría de los objetos usan
additionalProperties: falsepara payloads estrictos. NonEmptyStringes el valor predeterminado para IDs y nombres de métodos/eventos.- El
GatewayFramede nivel superior usa un discriminador entype. - Los métodos con efectos secundarios suelen requerir un
idempotencyKeyen los parámetros (ejemplo:send,poll,agent,chat.send).
JSON de esquemas en vivo
El JSON Schema generado está en el repositorio endist/protocol.schema.json. El
archivo raw publicado suele estar disponible en:
Cuando cambie los esquemas
- Actualice los esquemas TypeBox.
- Ejecute
pnpm protocol:check. - Confirme el esquema regenerado + los modelos Swift.