Protocolo de Gateway (WebSocket)
El protocolo WS de Gateway es el único plano de control + transporte de nodos para OpenClaw. Todos los clientes (CLI, interfaz web, app de macOS, nodos iOS/Android, nodos headless) se conectan por WebSocket y declaran su rol + ámbito en el momento del handshake.Transporte
- WebSocket, frames de texto con cargas JSON.
- El primer frame debe ser una solicitud
connect.
Handshake (connect)
Gateway → Cliente (desafío previo a la conexión):hello-ok también incluye:
hello-ok.auth también puede incluir entradas
adicionales de rol acotado en deviceTokens:
scopes: [] y cualquier token de operador transferido permanece acotado a la lista de permitidos
del operador de bootstrap (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Las comprobaciones de ámbito del bootstrap siguen
con prefijo de rol: las entradas de operador solo satisfacen solicitudes de operador, y los roles que no son de operador
siguen necesitando ámbitos bajo su propio prefijo de rol.
Ejemplo de nodo
Encapsulado
- Solicitud:
{type:"req", id, method, params} - Respuesta:
{type:"res", id, ok, payload|error} - Evento:
{type:"event", event, payload, seq?, stateVersion?}
Roles + ámbitos
Roles
operator= cliente del plano de control (CLI/UI/automatización).node= host de capacidades (camera/screen/canvas/system.run).
Ámbitos (operator)
Ámbitos comunes:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config con includeSecrets: true requiere operator.talk.secrets
(o operator.admin).
Los métodos RPC de gateway registrados por plugins pueden solicitar su propio ámbito de operador, pero
los prefijos reservados del núcleo para administración (config.*, exec.approvals.*, wizard.*,
update.*) siempre se resuelven a operator.admin.
El ámbito del método es solo la primera puerta. Algunos comandos slash alcanzados mediante
chat.send aplican comprobaciones de nivel de comando más estrictas además. Por ejemplo, las
escrituras persistentes con /config set y /config unset requieren operator.admin.
node.pair.approve también tiene una comprobación adicional de ámbito en el momento de aprobación además del
ámbito base del método:
- solicitudes sin comando:
operator.pairing - solicitudes con comandos de nodo que no son exec:
operator.pairing+operator.write - solicitudes que incluyen
system.run,system.run.prepareosystem.which:operator.pairing+operator.admin
Caps/commands/permissions (node)
Los nodos declaran afirmaciones de capacidad al conectarse:caps: categorías de capacidad de alto nivel.commands: lista de permitidos de comandos para invoke.permissions: conmutadores granulares (por ejemploscreen.record,camera.capture).
Presencia
system-presencedevuelve entradas indexadas por identidad del dispositivo.- Las entradas de presencia incluyen
deviceId,rolesyscopespara que las interfaces puedan mostrar una única fila por dispositivo incluso cuando se conecta como operator y node a la vez.
Familias comunes de métodos RPC
Esta página no es un volcado completo generado, pero la superficie WS pública es más amplia que los ejemplos anteriores de handshake/autenticación. Estas son las principales familias de métodos que la Gateway expone hoy.hello-ok.features.methods es una lista conservadora de descubrimiento creada a partir de
src/gateway/server-methods-list.ts más los exports de métodos de plugins/canales cargados.
Trátala como descubrimiento de funciones, no como un volcado generado de todos los helpers invocables
implementados en src/gateway/server-methods/*.ts.
Sistema e identidad
healthdevuelve la instantánea de salud de la gateway en caché o sondeada recientemente.statusdevuelve el resumen de la gateway al estilo de/status; los campos sensibles se incluyen solo para clientes operator con ámbito de administración.gateway.identity.getdevuelve la identidad del dispositivo gateway usada por relay y los flujos de emparejamiento.system-presencedevuelve la instantánea actual de presencia para dispositivos operator/node conectados.system-eventagrega un evento del sistema y puede actualizar/difundir el contexto de presencia.last-heartbeatdevuelve el evento de heartbeat persistido más reciente.set-heartbeatsactiva o desactiva el procesamiento de heartbeat en la gateway.
Modelos y uso
models.listdevuelve el catálogo de modelos permitidos en runtime.usage.statusdevuelve ventanas de uso del proveedor/resúmenes de cuota restante.usage.costdevuelve resúmenes agregados de uso de costes para un intervalo de fechas.doctor.memory.statusdevuelve la preparación de memoria vectorial / embeddings para el espacio de trabajo activo del agente predeterminado.sessions.usagedevuelve resúmenes de uso por sesión.sessions.usage.timeseriesdevuelve una serie temporal de uso para una sesión.sessions.usage.logsdevuelve entradas del registro de uso para una sesión.
Canales y helpers de inicio de sesión
channels.statusdevuelve resúmenes de estado de canales/plugins integrados y empaquetados.channels.logoutcierra sesión en un canal/cuenta específico donde el canal admite logout.web.login.startinicia un flujo de inicio de sesión por QR/web para el proveedor actual de canal web compatible con QR.web.login.waitespera a que ese flujo de inicio de sesión por QR/web se complete y arranca el canal si tiene éxito.push.testenvía una notificación push APNs de prueba a un nodo iOS registrado.voicewake.getdevuelve los triggers almacenados de palabra de activación.voicewake.setactualiza los triggers de palabra de activación y difunde el cambio.
Mensajería y registros
sendes la RPC de entrega saliente directa para envíos dirigidos a canal/cuenta/hilo fuera del ejecutor de chat.logs.taildevuelve la cola configurada del registro de archivos de la gateway con cursor/límite y controles de bytes máximos.
Talk y TTS
talk.configdevuelve la carga de configuración efectiva de Talk;includeSecretsrequiereoperator.talk.secrets(ooperator.admin).talk.modeestablece/difunde el estado actual del modo Talk para clientes de WebChat/Control UI.talk.speaksintetiza voz mediante el proveedor de voz activo de Talk.tts.statusdevuelve el estado habilitado de TTS, proveedor activo, proveedores fallback, y estado de configuración del proveedor.tts.providersdevuelve el inventario visible de proveedores TTS.tts.enableytts.disableactivan o desactivan el estado de preferencias TTS.tts.setProvideractualiza el proveedor TTS preferido.tts.convertejecuta una conversión puntual de texto a voz.
Secrets, configuración, actualización y asistente
secrets.reloadvuelve a resolver los SecretRefs activos e intercambia el estado de secretos en runtime solo si todo tiene éxito.secrets.resolveresuelve asignaciones de secretos dirigidas a comandos para un conjunto específico de comando/destino.config.getdevuelve la instantánea y el hash de la configuración actual.config.setescribe una carga de configuración validada.config.patchfusiona una actualización parcial de configuración.config.applyvalida + reemplaza la carga completa de configuración.config.schemadevuelve la carga activa del esquema de configuración usada por Control UI y herramientas CLI: esquema,uiHints, versión y metadatos de generación, incluidos metadatos de esquemas de plugins + canales cuando el runtime puede cargarlos. El esquema incluye metadatos de campotitle/descriptionderivados de las mismas etiquetas y texto de ayuda usados por la interfaz, incluidas ramas de composición de objetos anidados, comodines, elementos de arreglo yanyOf/oneOf/allOfcuando existe documentación de campo coincidente.config.schema.lookupdevuelve una carga de búsqueda delimitada a una ruta para una ruta de configuración: ruta normalizada, un nodo superficial del esquema,hintcoincidente +hintPath, y resúmenes inmediatos de hijos para navegación detallada en UI/CLI.- Los nodos de esquema de búsqueda conservan la documentación orientada al usuario y campos comunes de validación:
title,description,type,enum,const,format,pattern, límites numéricos/de cadena/de arreglo/de objeto, y banderas booleanas comoadditionalProperties,deprecated,readOnly,writeOnly. - Los resúmenes de hijos exponen
key,pathnormalizada,type,required,hasChildren, máshint/hintPathcoincidentes.
- Los nodos de esquema de búsqueda conservan la documentación orientada al usuario y campos comunes de validación:
update.runejecuta el flujo de actualización de la gateway y programa un reinicio solo cuando la actualización en sí tuvo éxito.wizard.start,wizard.next,wizard.statusywizard.cancelexponen el asistente de onboarding mediante WS RPC.
Familias principales existentes
Helpers de agente y espacio de trabajo
agents.listdevuelve las entradas de agentes configuradas.agents.create,agents.updateyagents.deletegestionan registros de agentes y la conexión con el espacio de trabajo.agents.files.list,agents.files.getyagents.files.setgestionan los archivos bootstrap del espacio de trabajo expuestos para un agente.agent.identity.getdevuelve la identidad efectiva del asistente para un agente o sesión.agent.waitespera a que una ejecución termine y devuelve la instantánea terminal cuando está disponible.
Control de sesiones
sessions.listdevuelve el índice actual de sesiones.sessions.subscribeysessions.unsubscribeactivan o desactivan suscripciones a eventos de cambio de sesión para el cliente WS actual.sessions.messages.subscribeysessions.messages.unsubscribeactivan o desactivan suscripciones a eventos de transcripción/mensajes para una sesión.sessions.previewdevuelve vistas previas acotadas de transcripciones para claves de sesión específicas.sessions.resolveresuelve o canoniza un destino de sesión.sessions.createcrea una nueva entrada de sesión.sessions.sendenvía un mensaje a una sesión existente.sessions.steeres la variante de interrupción y redirección para una sesión activa.sessions.abortaborta trabajo activo para una sesión.sessions.patchactualiza metadatos/sobrescrituras de sesión.sessions.reset,sessions.deleteysessions.compactrealizan mantenimiento de sesiones.sessions.getdevuelve la fila completa almacenada de la sesión.- la ejecución de chat sigue usando
chat.history,chat.send,chat.abortychat.inject. chat.historyestá normalizado para visualización en clientes de UI: las etiquetas de directiva inline se eliminan del texto visible, las cargas XML de llamadas de herramientas en texto plano (incluidas<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, y bloques truncados de llamadas de herramientas) y los tokens de control del modelo filtrados en ASCII/ancho completo se eliminan, las filas de asistente compuestas solo por tokens silenciosos comoNO_REPLY/no_replyexactos se omiten, y las filas sobredimensionadas pueden reemplazarse con placeholders.
Emparejamiento de dispositivos y tokens de dispositivo
device.pair.listdevuelve dispositivos emparejados pendientes y aprobados.device.pair.approve,device.pair.rejectydevice.pair.removegestionan registros de emparejamiento de dispositivos.device.token.rotaterota un token de dispositivo emparejado dentro de sus límites aprobados de rol y ámbito.device.token.revokerevoca un token de dispositivo emparejado.
Emparejamiento de nodos, invoke y trabajo pendiente
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectynode.pair.verifycubren el emparejamiento de nodos y la verificación de bootstrap.node.listynode.describedevuelven el estado de nodos conocidos/conectados.node.renameactualiza la etiqueta de un nodo emparejado.node.invokereenvía un comando a un nodo conectado.node.invoke.resultdevuelve el resultado de una solicitud invoke.node.eventtransporta eventos originados en el nodo de vuelta a la gateway.node.canvas.capability.refreshactualiza tokens de capacidad de canvas delimitados.node.pending.pullynode.pending.ackson las APIs de cola para nodos conectados.node.pending.enqueueynode.pending.draingestionan trabajo pendiente duradero para nodos offline/desconectados.
Familias de aprobaciones
exec.approval.requestyexec.approval.resolvecubren solicitudes puntuales de aprobación de exec.exec.approval.waitDecisionespera una aprobación exec pendiente y devuelve la decisión final (onullpor timeout).exec.approvals.getyexec.approvals.setgestionan instantáneas de política de aprobación exec de la gateway.exec.approvals.node.getyexec.approvals.node.setgestionan políticas locales de aprobación exec del nodo mediante comandos relay del nodo.plugin.approval.request,plugin.approval.waitDecisionyplugin.approval.resolvecubren flujos de aprobación definidos por plugins.
Otras familias principales
- automatización:
wakeprograma una inyección de texto de activación inmediata o en el siguiente heartbeatcron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- Skills/herramientas:
skills.*,tools.catalog,tools.effective
Familias comunes de eventos
chat: actualizaciones de chat de la UI comochat.injecty otros eventos de chat solo de transcripción.session.messageysession.tool: actualizaciones de transcripción/flujo de eventos para una sesión suscrita.sessions.changed: cambió el índice de sesiones o sus metadatos.presence: actualizaciones de la instantánea de presencia del sistema.tick: evento periódico de keepalive / liveness.health: actualización de la instantánea de salud de la gateway.heartbeat: actualización del flujo de eventos de heartbeat.cron: evento de cambio de ejecución/trabajo cron.shutdown: notificación de apagado de la gateway.node.pair.requested/node.pair.resolved: ciclo de vida del emparejamiento de nodos.node.invoke.request: difusión de una solicitud invoke de nodo.device.pair.requested/device.pair.resolved: ciclo de vida de dispositivos emparejados.voicewake.changed: cambió la configuración de triggers de palabra de activación.exec.approval.requested/exec.approval.resolved: ciclo de vida de aprobación de exec.plugin.approval.requested/plugin.approval.resolved: ciclo de vida de aprobación de plugins.
Métodos helper para nodos
- Los nodos pueden llamar a
skills.binspara obtener la lista actual de ejecutables de Skills para comprobaciones automáticas de permitidos.
Métodos helper para operadores
- Los operadores pueden llamar a
tools.catalog(operator.read) para obtener el catálogo de herramientas en runtime para un agente. La respuesta incluye herramientas agrupadas y metadatos de procedencia:source:coreopluginpluginId: plugin propietario cuandosource="plugin"optional: si una herramienta de plugin es opcional
- Los operadores pueden llamar a
tools.effective(operator.read) para obtener el inventario efectivo de herramientas en runtime para una sesión.sessionKeyes obligatorio.- La gateway deriva el contexto confiable de runtime del lado del servidor a partir de la sesión en lugar de aceptar autenticación o contexto de entrega suministrados por quien llama.
- La respuesta está delimitada a la sesión y refleja lo que la conversación activa puede usar ahora mismo, incluidas herramientas del núcleo, de plugins y de canal.
- Los operadores pueden llamar a
skills.status(operator.read) para obtener el inventario visible de Skills para un agente.agentIdes opcional; omítelo para leer el espacio de trabajo del agente predeterminado.- La respuesta incluye aptitud, requisitos faltantes, comprobaciones de configuración y opciones de instalación saneadas sin exponer valores secretos sin procesar.
- Los operadores pueden llamar a
skills.searchyskills.detail(operator.read) para metadatos de descubrimiento de ClawHub. - Los operadores pueden llamar a
skills.install(operator.admin) en dos modos:- Modo ClawHub:
{ source: "clawhub", slug, version?, force? }instala una carpeta de Skill en el directorioskills/del espacio de trabajo del agente predeterminado. - Modo instalador de gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }ejecuta una acción declaradametadata.openclaw.installen el host de la gateway.
- Modo ClawHub:
- Los operadores pueden llamar a
skills.update(operator.admin) en dos modos:- El modo ClawHub actualiza un slug rastreado o todas las instalaciones rastreadas de ClawHub en el espacio de trabajo del agente predeterminado.
- El modo de configuración aplica parches a valores
skills.entries.<skillKey>comoenabled,apiKeyyenv.
Aprobaciones de exec
- Cuando una solicitud exec necesita aprobación, la gateway difunde
exec.approval.requested. - Los clientes operator resuelven llamando a
exec.approval.resolve(requiere el ámbitooperator.approvals). - Para
host=node,exec.approval.requestdebe incluirsystemRunPlan(metadatos canónicos deargv/cwd/rawCommand/sesión). Las solicitudes sinsystemRunPlanse rechazan. - Después de la aprobación, las llamadas reenviadas
node.invoke system.runreutilizan esesystemRunPlancanónico como contexto autorizado de comando/cwd/sesión. - Si quien llama modifica
command,rawCommand,cwd,agentIdosessionKeyentre prepare y el reenvío final aprobado desystem.run, la gateway rechaza la ejecución en lugar de confiar en la carga modificada.
Fallback de entrega del agente
- Las solicitudes
agentpueden incluirdeliver=truepara solicitar entrega saliente. bestEffortDeliver=falsemantiene el comportamiento estricto: los destinos de entrega no resueltos o solo internos devuelvenINVALID_REQUEST.bestEffortDeliver=truepermite fallback a ejecución solo en sesión cuando no puede resolverse ninguna ruta externa de entrega (por ejemplo, sesiones internas/webchat o configuraciones ambiguas de varios canales).
Control de versiones
PROTOCOL_VERSIONvive ensrc/gateway/protocol/schema.ts.- Los clientes envían
minProtocol+maxProtocol; el servidor rechaza incompatibilidades. - Los esquemas + modelos se generan a partir de definiciones TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Autenticación
- La autenticación de gateway con secreto compartido usa
connect.params.auth.tokenoconnect.params.auth.password, según el modo de autenticación configurado. - Los modos con identidad como Tailscale Serve
(
gateway.auth.allowTailscale: true) ogateway.auth.mode: "trusted-proxy"sin loopback satisfacen la comprobación de autenticación de connect a partir de encabezados de solicitud en lugar deconnect.params.auth.*. - El ingreso privado
gateway.auth.mode: "none"omite por completo la autenticación connect con secreto compartido; no expongas ese modo en ingresos públicos/no confiables. - Después del emparejamiento, la Gateway emite un token de dispositivo delimitado al rol + ámbitos
de la conexión. Se devuelve en
hello-ok.auth.deviceTokeny el cliente debe persistirlo para conexiones futuras. - Los clientes deben persistir el
hello-ok.auth.deviceTokenprincipal después de cualquier conexión exitosa. - Volver a conectar con ese token de dispositivo almacenado también debe reutilizar el conjunto de ámbitos aprobados almacenado para ese token. Esto conserva el acceso de lectura/sondeo/estado que ya se concedió y evita contraer silenciosamente las reconexiones a un ámbito implícito más estrecho solo de administración.
- La precedencia normal de autenticación connect es primero token/contraseña compartidos explícitos, luego
deviceTokenexplícito, luego token por dispositivo almacenado, y después token bootstrap. - Las entradas adicionales
hello-ok.auth.deviceTokensson tokens de transferencia bootstrap. Persístelos solo cuando la conexión usó autenticación bootstrap en un transporte de confianza comowss://o loopback/emparejamiento local. - Si un cliente proporciona un
deviceTokenexplícito oscopesexplícitos, ese conjunto de ámbitos solicitado por quien llama sigue siendo la autoridad; los ámbitos en caché solo se reutilizan cuando el cliente está reutilizando el token por dispositivo almacenado. - Los tokens de dispositivo pueden rotarse/revocarse mediante
device.token.rotateydevice.token.revoke(requiere el ámbitooperator.pairing). - La emisión/rotación de tokens permanece acotada al conjunto de roles aprobados registrado en la entrada de emparejamiento de ese dispositivo; rotar un token no puede ampliar el dispositivo a un rol que la aprobación de emparejamiento nunca concedió.
- Para sesiones de token de dispositivo emparejado, la gestión de dispositivos está delimitada al propio dispositivo salvo que la persona que llama también tenga
operator.admin: quienes no son administradores solo pueden eliminar/revocar/rotar su propia entrada de dispositivo. device.token.rotatetambién comprueba el conjunto de ámbitos operator solicitado frente a los ámbitos actuales de la sesión de quien llama. Quienes no son administradores no pueden rotar un token a un conjunto de ámbitos operator más amplio que el que ya tienen.- Los fallos de autenticación incluyen
error.details.codemás sugerencias de recuperación:error.details.canRetryWithDeviceToken(booleano)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Comportamiento del cliente para
AUTH_TOKEN_MISMATCH:- Los clientes de confianza pueden intentar un único reintento acotado con un token por dispositivo en caché.
- Si ese reintento falla, los clientes deben detener los bucles automáticos de reconexión y mostrar instrucciones de acción al operador.
Identidad del dispositivo + emparejamiento
- Los nodos deben incluir una identidad estable de dispositivo (
device.id) derivada de la huella digital de un par de claves. - Las gateways emiten tokens por dispositivo + rol.
- Se requieren aprobaciones de emparejamiento para nuevos IDs de dispositivo salvo que la autoaprobación local esté habilitada.
- La autoaprobación de emparejamiento está centrada en conexiones directas por loopback local.
- OpenClaw también tiene una ruta limitada de autoconexión backend/contenedor-local para flujos helper de secreto compartido de confianza.
- Las conexiones tailnet o LAN desde el mismo host siguen tratándose como remotas para el emparejamiento y requieren aprobación.
- Todos los clientes WS deben incluir identidad
deviceduranteconnect(operator + node). Control UI puede omitirla solo en estos modos:gateway.controlUi.allowInsecureAuth=truepara compatibilidad con HTTP inseguro solo en localhost.- autenticación exitosa de operator Control UI con
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(modo de emergencia, degradación grave de seguridad).
- Todas las conexiones deben firmar el nonce
connect.challengeproporcionado por el servidor.
Diagnósticos de migración de autenticación de dispositivos
Para clientes heredados que aún usan el comportamiento de firma previo al desafío,connect ahora devuelve
códigos de detalle DEVICE_AUTH_* en error.details.code con un error.details.reason estable.
Fallos comunes de migración:
| Mensaje | details.code | details.reason | Significado |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | El cliente omitió device.nonce (o lo envió vacío). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | El cliente firmó con un nonce obsoleto/incorrecto. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | La carga de la firma no coincide con la carga v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | La marca de tiempo firmada está fuera del desfase permitido. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id no coincide con la huella de la clave pública. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Falló el formato/canonicalización de la clave pública. |
- Espera siempre a
connect.challenge. - Firma la carga v2 que incluye el nonce del servidor.
- Envía el mismo nonce en
connect.params.device.nonce. - La carga de firma preferida es
v3, que vinculaplatformydeviceFamilyademás de campos de dispositivo/cliente/rol/ámbitos/token/nonce. - Las firmas heredadas
v2siguen aceptándose por compatibilidad, pero la fijación de metadatos del dispositivo emparejado sigue controlando la política de comandos en la reconexión.
TLS + pinning
- TLS es compatible para conexiones WS.
- Los clientes pueden fijar opcionalmente la huella del certificado de la gateway (consulta la configuración
gateway.tlsmásgateway.remote.tlsFingerprinto CLI--tls-fingerprint).
Alcance
Este protocolo expone la API completa de la gateway (status, channels, models, chat, agent, sessions, nodes, approvals, etc.). La superficie exacta está definida por los esquemas TypeBox ensrc/gateway/protocol/schema.ts.