TypeBox como fuente de verdad del protocolo
Última actualización: 2026-01-10 TypeBox es una biblioteca de esquemas orientada primero 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 de 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 quieres el contexto de protocolo de nivel superior, empieza con Arquitectura del Gateway.Modelo mental (30 segundos)
Cada mensaje WS del Gateway es uno de estos 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, los clientes pueden llamar
métodos (por ejemplo, health, send, chat.send) y suscribirse a eventos (por ejemplo,
presence, tick, agent).
Flujo de conexión (mínimo):
| Categoría | Ejemplos | Notas |
|---|---|---|
| Núcleo | connect, health, status | connect debe ir primero |
| Mensajería | send, agent, agent.wait, system-event, logs.tail | los efectos secundarios necesitan idempotencyKey |
| Chat | chat.history, chat.send, chat.abort | WebChat usa estos |
| Sesiones | sessions.list, sessions.patch, sessions.delete | administración de sesiones |
| Automatización | wake, cron.list, cron.run, cron.runs | control de wake + cron |
| Nodos | node.list, node.invoke, node.pair.* | Gateway WS + acciones de nodo |
| Eventos | tick, presence, agent, chat, health, shutdown | envío del servidor |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Dónde viven los esquemas
- Origen:
src/gateway/protocol/schema.ts - Validadores en tiempo de ejecución (AJV):
src/gateway/protocol/index.ts - Registro anunciado de funciones/discovery:
src/gateway/server-methods-list.ts - Handshake del servidor + despacho de métodos:
src/gateway/server.impl.ts - Cliente de nodo:
src/gateway/client.ts - JSON Schema generado:
dist/protocol.schema.json - Modelos Swift generados:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Canalización 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 Swift del gateway
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 marcos de evento y respuesta antes de usarlos.
- Discovery de funciones: el Gateway envía una lista conservadora
features.methodsyfeatures.eventsenhello-okdesdelistGatewayMethods()yGATEWAY_EVENTS. - Esa lista de discovery no es un volcado generado de cada helper invocable en
coreGatewayHandlers; algunos RPC auxiliares están implementados ensrc/gateway/server-methods/*.tssin estar enumerados en la lista anunciada de funciones.
Marcos de ejemplo
Connect (primer mensaje):Cliente mínimo (Node.js)
El flujo útil más pequeño: connect + health.Ejemplo trabajado: añadir un método de extremo a extremo
Ejemplo: añade una nueva solicitudsystem.echo que devuelva { ok: true, text }.
- Esquema (fuente de verdad)
src/gateway/protocol/schema.ts:
ProtocolSchemas y exporta tipos:
- Validación
src/gateway/protocol/index.ts, exporta un validador AJV:
- Comportamiento del servidor
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (ya fusiona systemHandlers),
luego añade "system.echo" a la entrada de listGatewayMethods en
src/gateway/server-methods-list.ts.
Si el método puede ser llamado por clientes operador o nodo, clasifícalo también en
src/gateway/method-scopes.ts para que la aplicación de alcance y la
publicidad de funciones de hello-ok sigan alineadas.
- Regenerar
- Pruebas + documentación
src/gateway/server.*.test.ts y menciona el método en la documentación.
Comportamiento de la generación de código Swift
El generador de Swift emite:GatewayFrameenum con casosreq,res,eventyunknown- Structs/enums de carga útil con tipado fuerte
- Valores
ErrorCodeyGATEWAY_PROTOCOL_VERSION
Versionado + compatibilidad
PROTOCOL_VERSIONvive ensrc/gateway/protocol/schema.ts.- Los clientes envían
minProtocol+maxProtocol; el servidor rechaza incompatibilidades. - Los modelos Swift conservan tipos de marco desconocidos para evitar romper clientes más antiguos.
Patrones y convenciones de esquemas
- La mayoría de objetos usan
additionalProperties: falsepara cargas útiles estrictas. NonEmptyStringes el valor predeterminado para IDs y nombres de método/evento.- El
GatewayFramede nivel superior usa un discriminador entype. - Los métodos con efectos secundarios normalmente requieren un
idempotencyKeyen los parámetros (ejemplo:send,poll,agent,chat.send). agentaceptainternalEventsopcionales para contexto de orquestación generado por el entorno de ejecución (por ejemplo, transferencia de finalización de tareas de subagente/cron); trátalo como una superficie de API interna.
JSON Schema activo
El JSON Schema generado está en el repositorio endist/protocol.schema.json. El
archivo raw publicado suele estar disponible en:
Cuando cambies esquemas
- Actualiza los esquemas TypeBox.
- Registra el método/evento en
src/gateway/server-methods-list.ts. - Actualiza
src/gateway/method-scopes.tscuando el nuevo RPC necesite clasificación de alcance de operador o nodo. - Ejecuta
pnpm protocol:check. - Confirma el esquema regenerado + los modelos Swift.