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 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):
| Categoría | Ejemplos | Notas |
|---|---|---|
| Núcleo | connect, health, status | connect debe ir primero |
| Mensajería | send, agent, agent.wait, system-event, logs.tail | los métodos con 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 y cron |
| Nodos | node.list, node.invoke, node.pair.* | WS del Gateway más acciones de nodo |
| Eventos | tick, presence, agent, chat, health, shutdown | push del servidor |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Dónde viven los esquemas
- Barrel de origen:
packages/gateway-protocol/src/schema.tsreexporta módulos de dominio bajopackages/gateway-protocol/src/schema/*.ts(frames.tspara los envoltorios de nivel superior y el handshake,agent.ts,sessions.ts,cron.ts, etc. por área de funcionalidad).protocol-schemas.tses el registro centralProtocolSchemasque asigna nombres de esquema a sus definiciones TypeBox. - Validadores en tiempo de ejecución (AJV):
packages/gateway-protocol/src/index.ts - Registro de funcionalidades/discovery anunciado:
src/gateway/server-methods-list.ts - Handshake del servidor y despacho de métodos:
src/gateway/server.impl.ts - Cliente de Node:
src/gateway/client.ts - JSON Schema generado:
dist/protocol.schema.json(salida de build, no comprometida) - Modelos Swift generados:
apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift
Pipeline actual
pnpm protocol:genescribe JSON Schema (draft-07) endist/protocol.schema.json.pnpm protocol:gen:swiftgenera los modelos Swift del Gateway.pnpm protocol:checkejecuta ambos generadores y verifica que la salida Swift esté comprometida (la salida JSON Schema es un artefacto de build ignorado por git).
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 evento y respuesta antes de usarlos.
- Discovery de funcionalidades: el Gateway envía una lista conservadora
features.methodsyfeatures.eventsenhello-ok, desdelistGatewayMethods()yGATEWAY_EVENTS. - Esa lista de discovery no es un volcado generado de cada helper invocable en
coreGatewayHandlers; algunos RPC helper se implementan ensrc/gateway/server-methods/*.tssin enumerarse en la lista de funcionalidades anunciada.
Marcos de ejemplo
Connect (primer mensaje):Cliente mínimo (Node.js)
Flujo útil más pequeño: connect + health.Ejemplo desarrollado: 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)
packages/gateway-protocol/src/schema/system.ts (o al módulo de funcionalidad más cercano):
packages/gateway-protocol/src/schema/protocol-schemas.ts, añádelos al registro ProtocolSchemas y exporta los tipos derivados:
- Validación
packages/gateway-protocol/src/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 es invocable por clientes operador o nodo, clasifícalo también en src/gateway/method-scopes.ts para mantener alineados el cumplimiento de alcances y el anuncio de funcionalidades de hello-ok.
- Regenerar
- Pruebas y documentación
src/gateway/server.*.test.ts y anota el método en la documentación.
Comportamiento de generación de código Swift
El generador Swift emite:- un enum
GatewayFramecon casosreq,res,eventyunknown - structs/enums de payload con tipos fuertes
- valores
ErrorCode,GATEWAY_PROTOCOL_VERSIONyGATEWAY_MIN_PROTOCOL_VERSION
Versionado y compatibilidad
PROTOCOL_VERSIONvive enpackages/gateway-protocol/src/version.ts(valor actual:4).- Los clientes envían
minProtocolymaxProtocol; el servidor rechaza rangos que no incluyan su protocolo actual. - Los modelos Swift conservan los tipos de marco desconocidos para evitar romper clientes antiguos.
Patrones y convenciones de esquema
- La mayoría de los objetos usan
additionalProperties: falsepara payloads estrictos. NonEmptyString(Type.String({ minLength: 1 })) es el valor predeterminado para ID y nombres de método/evento.- 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, entrega de finalización de tarea de subagente/cron); trata esto como superficie de API interna.
JSON de esquema en vivo
El JSON Schema generado es un artefacto de build, no se compromete al repo. El archivo raw publicado normalmente está disponible en:Cuando cambies esquemas
- Actualiza los esquemas TypeBox en el módulo propietario
packages/gateway-protocol/src/schema/*.tsy regístralos enprotocol-schemas.ts. - 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. - Compromete los modelos Swift regenerados.