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 única fuente de verdad; todo lo demás se genera. Si quieres el contexto de protocolo de más alto nivel, empieza con Arquitectura del Gateway.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.
Modelo mental (30 segundos)
Cada mensaje WS del Gateway es uno de tres frames:- 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 a
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 |
| Nodes | node.list, node.invoke, node.pair.* | WS del Gateway + acciones de Node |
| Eventos | tick, presence, agent, chat, health, shutdown | push del servidor |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Dónde viven los esquemas
- Fuente:
src/gateway/protocol/schema.ts - Validadores en tiempo de ejecución (AJV):
src/gateway/protocol/index.ts - Registro de características/descubrimiento anunciados:
src/gateway/server-methods-list.ts - Handshake del servidor + despacho de métodos:
src/gateway/server.impl.ts - Cliente de Node:
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 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 frame entrante se valida con AJV. El handshake solo
acepta una solicitud
connectcuyos parámetros coincidan conConnectParams. - Lado del cliente: el cliente JS valida los frames de eventos y respuestas antes de usarlos.
- Descubrimiento de características: el Gateway envía una lista conservadora
features.methodsyfeatures.eventsenhello-okdesdelistGatewayMethods()yGATEWAY_EVENTS. - Esa lista de descubrimiento no es un volcado generado de todos los helpers invocables en
coreGatewayHandlers; algunos RPC helpers se implementan ensrc/gateway/server-methods/*.tssin enumerarse en la lista de características anunciada.
Frames de ejemplo
Connect (primer mensaje):Cliente mínimo (Node.js)
El flujo útil más pequeño: connect + health.Ejemplo completo: añadir un método de extremo a extremo
Ejemplo: añadir una nueva solicitudsystem.echo que devuelve { ok: true, text }.
- Esquema (fuente de verdad)
src/gateway/protocol/schema.ts:
ProtocolSchemas y exporta los 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 Node, clasifícalo también en
src/gateway/method-scopes.ts para que la aplicación de alcances y el anuncio de características
de hello-ok permanezcan alineados.
- Regenerar
- Pruebas + documentación
src/gateway/server.*.test.ts y documenta el método.
Comportamiento de la generación de código Swift
El generador Swift emite:- enum
GatewayFramecon casosreq,res,eventyunknown - structs/enums de payload fuertemente tipados
- valores
ErrorCode,GATEWAY_PROTOCOL_VERSIONyGATEWAY_MIN_PROTOCOL_VERSION
Versionado + compatibilidad
PROTOCOL_VERSIONvive ensrc/gateway/protocol/version.ts.- Los clientes envían
minProtocol+maxProtocol; el servidor rechaza rangos que no incluyan su protocolo actual. - Los modelos Swift conservan los tipos de frame 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 params (ejemplo:send,poll,agent,chat.send). agentaceptainternalEventsopcionales para contexto de orquestación generado en tiempo de ejecución (por ejemplo, traspaso de finalización de subagent/tarea cron); trata esto como superficie de API interna.
JSON de esquema en vivo
El JSON Schema generado está en el repositorio endist/protocol.schema.json. El
archivo sin procesar publicado suele estar disponible en:
Cuando cambias 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 Node. - Ejecuta
pnpm protocol:check. - Confirma el esquema regenerado + los modelos Swift.