Modelo mental (30 segundos)
Cada mensaje WS del Gateway es uno de estos tres tipos de trama:- 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 llaman a métodos (por ejemplo, health, send, chat.send) y se suscriben a eventos (por ejemplo, presence, tick, agent).
Flujo de conexión (mínimo):
El inventario autoritativo de detección anunciado se encuentra en
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Ubicación de los esquemas
- Módulo de exportación de origen:
packages/gateway-protocol/src/schema.tsvuelve a exportar los módulos de dominio depackages/gateway-protocol/src/schema/*.ts(frames.tspara los envoltorios de nivel superior y la negociación inicial, yagent.ts,sessions.ts,cron.ts, etc., para cada área funcional).protocol-schemas.tses el registro centralProtocolSchemasque asigna los nombres de esquema a sus definiciones de TypeBox. - Validadores en tiempo de ejecución (AJV):
packages/gateway-protocol/src/index.ts - Registro anunciado de funciones y detección:
src/gateway/server-methods-list.ts - Negociación inicial del servidor y despacho de métodos:
src/gateway/server.impl.ts - Cliente de nodo:
src/gateway/client.ts - JSON Schema generado:
dist/protocol.schema.json(salida de compilación, no incluida en los commits) - Modelos Swift generados:
apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift
Pipeline actual
pnpm protocol:genescribe JSON Schema (borrador 07) endist/protocol.schema.json.pnpm protocol:gen:swiftgenera los modelos Swift del Gateway.pnpm protocol:checkejecuta ambos generadores y verifica que la salida de Swift esté incluida en los commits (la salida de JSON Schema es un artefacto de compilación ignorado por Git).
Uso de los esquemas en tiempo de ejecución
- En el servidor: cada trama entrante se valida con AJV. La negociación inicial solo acepta una solicitud
connectcuyos parámetros coincidan conConnectParams. - En el cliente: el cliente JS valida las tramas de eventos y respuestas antes de utilizarlas.
- Detección de funciones: el Gateway envía listas conservadoras
features.methodsyfeatures.eventsenhello-ok, provenientes delistGatewayMethods()yGATEWAY_EVENTS. - Esa lista de detección no es un volcado generado de todas las funciones auxiliares invocables de
coreGatewayHandlers; algunos RPC auxiliares están implementados ensrc/gateway/server-methods/*.tssin estar enumerados en la lista de funciones anunciadas.
Tramas de ejemplo
Conexión (primer mensaje):Cliente mínimo (Node.js)
Flujo útil más sencillo: conexión + estado.Ejemplo práctico: añadir un método de extremo a extremo
Ejemplo: añadir una nueva solicitudsystem.echo que devuelva { ok: true, text }.
- Esquema (fuente de verdad)
packages/gateway-protocol/src/schema/system.ts (o al módulo funcional que mejor corresponda):
packages/gateway-protocol/src/schema/protocol-schemas.ts, añádalos al registro ProtocolSchemas y exporte los tipos derivados:
- Validación
packages/gateway-protocol/src/index.ts, exporte un validador AJV:
- Comportamiento del servidor
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (que ya combina systemHandlers) y después añada "system.echo" a la entrada listGatewayMethods de src/gateway/server-methods-list.ts.
Si el método puede ser invocado por clientes operadores o nodos, clasifíquelo también en src/gateway/method-scopes.ts para que la aplicación de ámbitos y el anuncio de funciones hello-ok permanezcan alineados.
- Regeneración
- Pruebas y documentación
src/gateway/server.*.test.ts y mencione el método en la documentación.
Comportamiento de la generación de código Swift
El generador de Swift emite:- una enumeración
GatewayFramecon los casosreq,res,eventyunknown - estructuras y enumeraciones de carga útil con tipado fuerte
- valores
ErrorCode,GATEWAY_PROTOCOL_VERSIONyGATEWAY_MIN_PROTOCOL_VERSION
Control de versiones y compatibilidad
PROTOCOL_VERSIONse encuentra enpackages/gateway-protocol/src/version.ts(valor actual:4).- Los clientes envían
minProtocolymaxProtocol; el servidor rechaza los intervalos que no incluyen su protocolo actual. - Los modelos Swift conservan los tipos de trama desconocidos para evitar que los clientes antiguos dejen de funcionar.
Patrones y convenciones de los esquemas
- La mayoría de los objetos utilizan
additionalProperties: falsepara cargas útiles estrictas. NonEmptyString(Type.String({ minLength: 1 })) es el valor predeterminado para los identificadores y los nombres de métodos y eventos.- El
GatewayFramede nivel superior utiliza un discriminador entype. - Los métodos con efectos secundarios suelen requerir un
idempotencyKeyen sus parámetros (ejemplo:send,poll,agent,chat.send). agentacepta el parámetro opcionalinternalEventspara el contexto de orquestación generado en tiempo de ejecución (por ejemplo, la entrega al finalizar una tarea de subagente o cron); debe tratarse como una superficie de API interna.
JSON del esquema en directo
El JSON Schema generado es un artefacto de compilación y no se incluye en los commits del repositorio. El archivo sin procesar publicado suele estar disponible en:Al modificar los esquemas
- Actualice los esquemas de TypeBox en el módulo
packages/gateway-protocol/src/schema/*.tspropietario y regístrelos enprotocol-schemas.ts. - Registre el método o evento en
src/gateway/server-methods-list.ts. - Actualice
src/gateway/method-scopes.tscuando el nuevo RPC necesite una clasificación de ámbito de operador o nodo. - Ejecute
pnpm protocol:check. - Incluya los modelos Swift regenerados en el commit.