Matrix
Ejecuta ZeroClaw en salas de Matrix, incluidas las salas con cifrado de extremo a extremo (E2EE).
Quién puede hablar con el agente
Los remitentes entrantes se filtran contra el conjunto de pares resuelto para el agente vinculado, obtenido de la configuración peer_groups a la que pertenece el agente. La coincidencia elimina el @ inicial y no distingue mayúsculas de minúsculas frente al identificador nativo de remitente del canal. Un conjunto vacío deniega a todos; un conjunto que contiene "*" acepta a cualquiera; en caso contrario, solo se aceptan los pares externos listados (y los agentes pares). Esto es independiente del emparejamiento de la puerta de enlace (gateway.require_pairing), que autentica clientes HTTP/WebSocket, no remitentes de canales de chat.
Un grupo de pares para matrix establece channel en matrix, lista los remitentes permitidos en external_peers (para matrix, el ID de usuario completo de Matrix, @user:server.tld; ["*"] acepta a cualquiera), opcionalmente nombra agents pares para el despacho entre agentes, una lista de bloqueo ignore y un output_modality (mirror, voice o text). Consulte Peer Groups para la referencia de campos.
Dónde configurar esto:
Panel de control del gateway
Abra /config/peer_groups en el panel de control web.
zerocode
En el panel Config, en Peer groups.
Modo de fallo común que este guía aborda:
Matrix está configurado correctamente, las verificaciones pasan, pero el bot no responde.
Preguntas frecuentes rápidas
Si Matrix aparece conectado pero no hay respuesta, valida primero lo siguiente:
- El remitente está en el conjunto de pares del agente (para pruebas:
external_peers = ["*"]). - La cuenta del bot se ha unido a la sala objetivo exacta.
- Las credenciales pertenecen a la cuenta del bot (verificación
whoamien la ruta del token, ver §5C). - La sala cifrada puede descifrarse:
recovery_keyconfigurada (recomendado) o claves compartidas con el dispositivo del bot. - El demonio se reinició después de los cambios en la configuración.
1. Requisitos
Antes de probar el flujo de mensajes:
- La cuenta del bot está unida a la sala objetivo.
- Las credenciales autentican la cuenta del bot: ya sea
user_id+password(recomendado, consulte §2) o unaccess_token(vía token, §3). allowed_roomsincluye la sala de destino (o está vacío para permitir todas las salas a las que el bot se ha unido). Las entradas se comparan literalmente con el ID canónico de la sala (!room:server) de cada mensaje entrante, por lo que debe listar aquí los IDs canónicos de las salas: ZeroClaw no resuelve una entrada#alias:serverpara esta lista de permitidos. (Los alias se resuelven solo para destinos de entrega salientes, comodelivery.tode cron.) Encuentre el ID canónico de una sala en su cliente (en Element: Configuración de la sala → Avanzado → ID interno de la sala).- Un grupo de pares autoriza al remitente (
external_peers = ["*"]para pruebas abiertas, consulte §6). - Para salas E2EE, el bot puede descifrar: una
recovery_key(recomendado) restaura las claves automáticamente, o las claves se comparten manualmente con el dispositivo del bot.
2. Configuración
access_token 🔑
Token de acceso de Matrix para la cuenta del bot. Cuando no está configurado, el canal recurre al inicio de sesión con contraseña usando user_id + password.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.access_token.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.access_token.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.access_token # entrada enmascarada, almacenada cifrada
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__access_token=
ack_reactions
Anulación para el [channels].ack_reactions de nivel superior. Cuando es None, recurre al valor predeterminado de todos los canales. Cuando se establece explícitamente (true/false), tiene prioridad solo para esta instancia de Matrix.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.ack_reactions.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.ack_reactions.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.ack_reactions <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__ack_reactions=
allowed_rooms
IDs de salas de Matrix permitidas. Vacío = permitir todas las salas a las que el bot se ha unido. Las entradas se comparan literalmente con el ID canónico de sala (!abc:server) de cada mensaje entrante; los alias #room:server no se resuelven para esta lista de permitidos (solo se resuelven para destinos de entrega salientes como delivery.to de cron).
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.allowed_rooms.
zerocode
En el panel Config, configure el campo channels.matrix.<alias>.allowed_rooms.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.allowed_rooms <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__allowed_rooms=
approval_timeout_secs
Segundos de espera para la aprobación del operador en las herramientas always_ask antes de denegar automáticamente.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.approval_timeout_secs.
zerocode
En el panel Config, configure el campo channels.matrix.<alias>.approval_timeout_secs.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.approval_timeout_secs <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__approval_timeout_secs=
device_id
ID de dispositivo de Matrix opcional.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.device_id.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.device_id.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.device_id <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__device_id=
draft_update_interval_ms
Intervalo mínimo (ms) entre las ediciones de borrador de Matrix en modo Partial y las ediciones de progreso del pensamiento/razonamiento en modo SingleMessage.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.draft_update_interval_ms.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.draft_update_interval_ms.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.draft_update_interval_ms <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__draft_update_interval_ms=
excluded_tools
Herramientas excluidas de la especificación de herramientas de este canal. Cuando se establece, estas herramientas no se exponen al modelo al responder a través de este canal.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.excluded_tools.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.excluded_tools.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.excluded_tools <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__excluded_tools=
homeserver*
Nombre del servidor de Matrix o URL del servidor principal (p. ej., "matrix.org" o "https://matrix.example.org"). Los nombres de servidor utilizan el descubrimiento estándar de /.well-known/matrix/client.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.homeserver.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.homeserver.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.homeserver <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__homeserver=
interrupt_on_new_message
Si se debe interrumpir una respuesta del agente en curso cuando llega un mensaje nuevo.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.interrupt_on_new_message.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.interrupt_on_new_message.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.interrupt_on_new_message <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__interrupt_on_new_message=
mention_only
Cuando es true, solo responde a los mensajes que mencionan con @ al bot en grupos. Los mensajes directos siempre se procesan.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.mention_only.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.mention_only.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.mention_only <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__mention_only=
message_max_bytes
Presupuesto de bytes del contenido de eventos serializado de Matrix para las ediciones en streaming de borradores en un solo mensaje y la respuesta final independiente. El cuerpo Markdown renderizado, el HTML generado y la relación de respuesta/edición cuentan para este límite. Si el progreso supera el tamaño, se descartan por completo las entradas más antiguas; la respuesta final independiente conserva un prefijo seguro para UTF-8. Los valores inferiores a 512 usan ese mínimo, lo que deja espacio para un evento serializado no vacío.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abra /config/channels/matrix y establezca el campo channels.matrix.<alias>.message_max_bytes.
zerocode
En el panel Config, configura el campo channels.matrix.<alias>.message_max_bytes.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.message_max_bytes <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__message_max_bytes=
multi_message_delay_ms
Retraso (ms) entre el envío de cada párrafo en el modo MultiMessage.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.multi_message_delay_ms.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.multi_message_delay_ms.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.multi_message_delay_ms <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__multi_message_delay_ms=
password 🔑
Contraseña de inicio de sesión opcional para la cuenta de Matrix (utilizada para el flujo de inicio de sesión inicial).
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.password.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.password.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.password # entrada enmascarada, almacenada cifrada
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__password=
recovery_key 🔑
Clave de recuperación de Matrix opcional para la restauración automática de la copia de seguridad de claves E2EE. Cuando se establece, ZeroClaw recupera las claves de sala y los secretos de firma cruzada al iniciar.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.recovery_key.
zerocode
En el panel Config, configure el campo channels.matrix.<alias>.recovery_key.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.recovery_key # entrada enmascarada, almacenada cifrada
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__recovery_key=
reply_in_thread
Cuando es true (predeterminado), las respuestas se envían como respuestas en hilo. Inicia un nuevo hilo a partir del mensaje entrante cuando no existe ninguno. Cuando es false, solo continúa los hilos existentes.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.reply_in_thread.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.reply_in_thread.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.reply_in_thread <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__reply_in_thread=
reply_min_interval_secs
Límite mínimo de ritmo de salida por (canal, destinatario) en segundos. Rango: 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 lo desactiva).
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y establece el campo channels.matrix.<alias>.reply_min_interval_secs.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.reply_min_interval_secs.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.reply_min_interval_secs <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__reply_min_interval_secs=
reply_queue_depth_max
Profundidad de la cola de regulación de salida por (canal, destinatario). Rango: 0..=REPLY_QUEUE_DEPTH_CEILING. Cuando reply_min_interval_secs > 0 y este valor es 0, el envoltorio de regulación sustituye DEFAULT_REPLY_QUEUE_DEPTH (16). Cuando la cola está llena, se descarta el envío más reciente y se registra un WARN.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.reply_queue_depth_max.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.reply_queue_depth_max.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.reply_queue_depth_max <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__reply_queue_depth_max=
stream_draft_delete
Elimina el borrador de progreso de un solo mensaje de Matrix antes de enviar la respuesta final. Cuando es falso, el progreso persistente permanece como una transcripción visible; los borradores que solo contienen marcadores de posición se siguen eliminando antes de la respuesta final.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y establece el campo channels.matrix.<alias>.stream_draft_delete.
zerocode
En el panel Configuración, establezca el campo channels.matrix.<alias>.stream_draft_delete.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_draft_delete <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__stream_draft_delete=
stream_draft_lines
Número máximo de líneas de progreso conservadas en el borrador de streaming de un solo mensaje de Matrix. Establécelo en 0 para eliminar el límite de recuento de líneas; todas las líneas siguen compitiendo dentro de un único evento de borrador de Matrix limitado por bytes.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abra /config/channels/matrix y establezca el campo channels.matrix.<alias>.stream_draft_lines.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.stream_draft_lines.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_draft_lines <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__stream_draft_lines=
stream_mode
Modo de streaming para la entrega progresiva de respuestas. "off" (predeterminado): un único mensaje final. "partial": borrador editado en el mismo lugar. "single_message": borrador de progreso más un mensaje final independiente. "multi_message": entrega dividida por párrafos.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.stream_mode.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.stream_mode.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_mode <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__stream_mode=
stream_reasoning
Visibilidad del razonamiento de un solo mensaje de Matrix. "off" suprime las actualizaciones del borrador derivadas del razonamiento, "status" emite señales de actividad sin texto de razonamiento sin procesar y "full" emite el texto de razonamiento sin procesar del proveedor en el borrador de progreso.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abra /config/channels/matrix y establezca el campo channels.matrix.<alias>.stream_reasoning.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.stream_reasoning.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_reasoning <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__stream_reasoning=
stream_tool_arguments
Argumentos de herramientas mostrados en las líneas de progreso de un solo mensaje de Matrix. La ausencia o el valor vacío indican los valores predeterminados conservadores de safe. Use una entrada { default_base = "none" | "safe" | "all" } para la configuración heredada y, después, entradas de herramientas con nombres exactos y ajustes opcionales de base, include, exclude y argument_chars. argument_chars limita cada valor mostrado y tiene un valor predeterminado de 60; 0 deshabilita ese límite. Las herramientas desconocidas se resuelven sin argumentos con safe; todos los valores seleccionados se limpian para evitar filtraciones antes de mostrarlos.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y establece el campo channels.matrix.<alias>.stream_tool_arguments.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.stream_tool_arguments.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_tool_arguments <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__stream_tool_arguments=
user_id
ID de usuario de Matrix opcional (p. ej. "@bot:matrix.org").
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.user_id.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.user_id.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.user_id <value>
Variable de entorno
Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:
export ZEROCLAW_channels__matrix__<alias>__user_id=
Matrix se configura como un bloque [channels.matrix.<alias>]. Configúralo a través de cualquiera de estas superficies:
Panel de control del gateway
Abre /config/channels/matrix en el panel de control web.
zerocode
En el panel Config, en Channels.
Configuración recomendada: contraseña + clave de recuperación
La forma oficial y de menor fricción de ejecutar Matrix es dejar que ZeroClaw inicie sesión desde cero y gestione su propia identidad de dispositivo:
- Omita
device_id. Deje que el homeserver asigne uno al iniciar sesión. ZeroClaw guarda el id asignado ensession.jsony lo reutiliza en cada reinicio, por lo que no hay ningún valor que usted deba buscar, copiar ni mantener sincronizado. Fijar undevice_idmanualmente es la fuente más común de fallos en el intercambio de claves. - Omite
access_token. Cuando no está configurado, ZeroClaw recurre al inicio de sesión con contraseña. Un inicio de sesión nuevo es también lo que utiliza la ruta de recuperación automática (§8), por lo que el bot se autorrepara ante un estado local dañado sin intervención del operador. - Establece
password. Conaccess_tokenausente,user_id+passwordrealizan el inicio de sesión. - Configura
recovery_key. Esto restaura las claves de sala desde la copia de seguridad del lado del servidor y firma de forma cruzada el dispositivo recién registrado automáticamente en cada inicio: sin verificación con emojis, sin compartir claves manualmente, sin bootstrap. Consulta §5I para saber cómo obtenerla desde Element.
Así que un bloque completo recomendado establece homeserver, user_id, password y recovery_key, y deja access_token y device_id sin establecer.
La ruta access_token + device_id (§3) sigue funcionando y está documentada en su totalidad para operadores que necesiten reutilizar un token preexistente, pero requiere que usted mantenga un device_id estable por su cuenta, así que prefiera contraseña + clave de recuperación a menos que tenga una razón específica para no hacerlo.
channels.matrix.<alias>.passwordes un secreto. Se almacena cifrado, nunca enconfig.tomlen texto plano. Configúralo a través de uno de estos métodos, que cifran al escribir:
Panel de control del gateway
Abre /config/channels/matrix y configura allí el campo channels.matrix.<alias>.password.
zerocode
En el panel Config, configure el campo channels.matrix.<alias>.password (la entrada está enmascarada).
zeroclaw config
zeroclaw config set channels.matrix.<alias>.password # solicita entrada enmascarada, almacena cifrado
channels.matrix.<alias>.access_tokenes un secreto. Se almacena cifrado, nunca enconfig.tomlen texto plano. Configúrelo a través de una de estas opciones, que cifran al escribir:
Panel de control del gateway
Abre /config/channels/matrix y configura allí el campo channels.matrix.<alias>.access_token.
zerocode
En el panel Config, configure el campo channels.matrix.<alias>.access_token (la entrada está enmascarada).
zeroclaw config
zeroclaw config set channels.matrix.<alias>.access_token # solicita entrada enmascarada, almacena cifrado
homeserver es obligatorio. Para la configuración recomendada, establece también user_id, password y recovery_key. access_token y device_id solo son necesarios para la ruta basada en tokens en §3; allowed_rooms opcionalmente restringe en qué salas responde el bot. Autoriza a los remitentes con un grupo de pares. Índice completo de campos: referencia de configuración.
¿Aún no tienes una
recovery_key? Consulta §5I: explica paso a paso cómo generar una en Element. ¿Prefieres la ruta del token? Consulta §3 para la llamada a la API de inicio de sesión con contraseña que genera unaccess_tokenjunto con undevice_idestable de una sola vez. Para buscar eldevice_idde un token que ya tienes, consulta §5H.
Acerca de user_id y device_id
- Para la configuración recomendada de contraseña + clave de recuperación, establece
user_idy dejadevice_idsin definir: el homeserver lo asigna y ZeroClaw lo persiste. - ZeroClaw lee la identidad desde Matrix
/_matrix/client/v3/account/whoami. - Solo en la ruta de
access_tokense establecedevice_idmanualmente: un inicio de sesión con token lleva un dispositivo que el servidor ya generó, y ZeroClaw necesita ese id exacto para restaurar la sesión E2EE (consulta §5H para encontrarlo).
Hilos y contexto
Cuando una conversación de Matrix ocurre en un hilo, ese hilo es su propia conversación. ZeroClaw deriva una clave de sesión distinta por hilo, de modo que cada hilo lleva una ventana de contexto y un historial independientes: los mensajes de un hilo nunca se filtran a otro, y el agente no ve los turnos anteriores de un hilo hermano. Para Matrix esto se controla con reply_in_thread: cuando está activado, los mensajes de nivel superior abren un hilo y cada hilo es una conversación separada; cuando está desactivado, las respuestas se publican en la raíz del canal y el historial se indexa por remitente y destino en lugar de por hilo.
- El aislamiento es el objetivo. El contexto de cada hilo es autónomo: no se filtra fuera del hilo, y nada de fuera del hilo se filtra hacia dentro. Los hilos paralelos mantienen estados conversacionales separados, por lo que las tareas no relacionadas nunca se contaminan entre sí.
- Los hilos largos hacen crecer el contexto. Un hilo acumula historial mientras permanece activo, por lo que un hilo muy largo eventualmente llena la ventana de contexto del modelo como cualquier otra conversación larga. Inicia un nuevo hilo para restablecer.
- El trabajo en curso está delimitado por hilo. Un mensaje nuevo en un hilo no cancela una respuesta en curso en otro; la tarea de cada hilo es independiente.
Establece el comportamiento del hilo en cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y activa o desactiva el campo channels.matrix.<alias>.reply_in_thread.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.reply_in_thread.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.reply_in_thread true # respuestas de hilo activadas
zeroclaw config set channels.matrix.<alias>.reply_in_thread false # de respuestas en la raíz del canal
3. Ruta de token (alternativa): obtención de access_token y device_id
[!IMPORTANT] Esta sección es solo para la ruta de
access_token. Si seguiste la configuración recomendada de contraseña + clave de recuperación en §2, puedes omitirla: no necesitas un token de acceso ni undevice_idgestionado manualmente.
Use esta ruta cuando deba reutilizar un token preexistente (por ejemplo, uno copiado de otro despliegue). Element no expone el token directamente, por lo que la forma canónica de generar uno es una llamada única a la API de inicio de sesión con contraseña que devuelve juntos el token de acceso y un ID de dispositivo estable. El inicio de sesión con token lleva asociado un dispositivo, por lo que en esta ruta device_id es obligatorio y debe permanecer estable.
Si su cuenta de operador ya tiene un token, pase a la §4. Si solo necesita consultar el device_id de un token existente, consulte la §5H, Opción 1 (whoami) u Opción 2 (Element).
Paso 1: Genere un token mediante inicio de sesión con contraseña
Ejecuta esto una vez. Reemplaza your.homeserver, el nombre de usuario del bot, la contraseña, y elige cualquier cadena corta de device_id (alfanumérica, sin espacios; esta es la etiqueta de dispositivo del lado del servidor que ZeroClaw reutilizará en cada reinicio):
sh
curl -sS -X POST https://your.homeserver/_matrix/client/v3/login \
-H "Content-Type: application/json" \
-d '{"type":"m.login.password","identifier":{"type":"m.id.user","user":"YOUR_BOT_USERNAME"},"password":"YOUR_PASSWORD","device_id":"NEW_DEVICE_ID"}'
Respuesta:
{`user_id`: "@bot:example.com", "access_token": "syt_...", `device_id`: "NUEVODISPOSITIVO"}
Paso 2: Aplica ambos valores a ZeroClaw
Coloca access_token, device_id y user_id de la respuesta en tu bloque [channels.matrix.<alias>] (consulta §2 para saber dónde configurarlos) y luego reinicia: zeroclaw service restart.
Notas
- Conserva una copia del token cuando lo pegues por primera vez. Los secretos se cifran en reposo y
zeroclaw config getimprimirá[masked]para el campo del token; no podrás recuperarlo más tarde. Guárdalo en una nota temporal si lo necesitarás para los fragmentos de validación con curl en §5C. - Reutilice el mismo
device_iden cada reinicio: cambiarlo fuerza un nuevo registro del dispositivo en el servidor, lo que rompe el intercambio de claves y la verificación en salas cifradas. La ruta de recuperación automática en §8 gestiona los casos raros en los que borrar los datos es realmente la opción correcta. - Rotar el token de acceso más adelante sin volver a ejecutar el asistente: actualice el campo
access_tokenen su configuración (consulte §2) y luego ejecutezeroclaw service restart. - El token aparece como expirado o no válido al iniciar: genera uno nuevo con el mismo curl, repite el Paso 2.
4. Validación rápida
Aplica el conjunto de campos de la §2 si aún no lo has hecho, luego reinicia con zeroclaw service restart (segundo plano) o zeroclaw daemon (primer plano). Envía un mensaje de texto sin formato en la sala de Matrix configurada. Confirma:
- Los registros de ZeroClaw muestran que el oyente de Matrix se inicia sin errores repetidos de sincronización o autenticación.
- En una sala cifrada, el bot puede leer y responder a mensajes cifrados de usuarios permitidos.
5. Solución de problemas de “no response”
Proceda en orden.
A. Sala y membresía
- Confirma que la cuenta del bot se haya unido a la sala.
- Si agregas una sala en
allowed_rooms, debe ser el ID canónico de la sala (!room:server), no un#alias:server. Los alias no se resuelven para la lista de permitidos, por lo que una entrada de alias silenciosamente no coincide con nada. Encuentra el ID canónico en Element a través de Configuración de la sala → Avanzado → Internal room ID.
B. Lista de remitentes permitidos (grupos de pares)
El remitente debe estar en el conjunto de pares del agente, consulte Quién puede comunicarse con el agente en la parte superior de esta página. Para diagnosticar, establezca temporalmente external_peers = ["*"] y reinicie el daemon.
C. Token e identidad
Los secretos se cifran en reposo y no son recuperables: zeroclaw config get imprime [masked] para cualquier campo secreto. Para ejecutar las comprobaciones a continuación, usa el token de acceso que generaste en §3 (o genera uno nuevo) y la URL de tu propio homeserver.
Valida el token del lado del servidor:
sh
curl -sS -H "Authorization: Bearer <access_token>" \
"https://your.homeserver/_matrix/client/v3/account/whoami"
- El
user_iddevuelto debe coincidir con la cuenta del bot. - Si
device_idfalta en la respuesta, configúrelo manualmente (consulte §5H). - Rota el token de acceso: actualiza el campo
access_tokenen tu configuración (consulta la §2) y luego ejecutazeroclaw service restart.
D. Verificaciones específicas de E2EE
- El dispositivo del bot debe haber recibido las claves de sala desde dispositivos de confianza.
- Si las claves no se han compartido con este dispositivo, los eventos cifrados no se pueden descifrar.
- Verifica la confianza del dispositivo y el intercambio de claves desde una sesión de Matrix de confianza.
matrix_sdk_crypto::backups: Trying to backup room keys but no backup key was found: la recuperación de copia de seguridad de claves aún no está habilitada en este dispositivo. No es fatal para el flujo de mensajes; aun así vale la pena completarla (ver §5I).- Si los destinatarios ven los mensajes del bot como “no verificados”, verifica/firma el dispositivo del bot desde una sesión de Matrix confiable y mantén el
device_idestable entre reinicios.
E. Niveles de registro
ZeroClaw suprime matrix_sdk, matrix_sdk_base y matrix_sdk_crypto a warn de forma predeterminada; generan demasiado ruido en info. Restaura la salida del SDK para depuración:
sh
RUST_LOG=info,matrix_sdk=info,matrix_sdk_base=info,matrix_sdk_crypto=info zeroclaw daemon
F. Formato de mensajes (Markdown)
- ZeroClaw envía respuestas de Matrix como contenido de texto
m.room.messagecon capacidad de markdown. - Los clientes de Matrix que admiten
formatted_bodyrenderizan énfasis, listas y bloques de código. - Si el formato aparece como texto sin formato: verifica primero la capacidad del cliente y luego confirma que ZeroClaw esté ejecutando una versión con salida de Matrix habilitada para markdown.
G. Prueba de reinicio
Después de realizar cambios en la configuración, reinicia el daemon y envía un nuevo mensaje. El historial de la línea de tiempo anterior no se volverá a reproducir.
H. Buscar device_id para un token existente
Solo necesitas esto en la ruta de access_token (§3). La configuración recomendada de contraseña + clave de recuperación omite device_id por completo: el homeserver asigna uno y ZeroClaw lo persiste, por lo que no hay nada que buscar. Si ya has cambiado a la configuración recomendada, omite esta sección.
Si realmente debes fijar un device_id (porque estás reutilizando un token de acceso existente en lugar de iniciar sesión con una contraseña), usa esto para encontrar el que está vinculado a ese token. Para bots completamente nuevos en la ruta del token, consulta §3: el flujo de inicio de sesión con contraseña descrito allí devuelve ambos valores juntos.
ZeroClaw necesita un device_id estable para la restauración de sesiones E2EE en la ruta del token. Sin él, se registra un dispositivo nuevo en cada reinicio, lo que rompe el intercambio de claves y la verificación de dispositivos.
Opción 1: whoami (la más fácil)
sh
curl -sS -H "Authorization: Bearer <access_token>" \
"https://your.homeserver/_matrix/client/v3/account/whoami"
La respuesta incluye device_id si el token está vinculado a una sesión de dispositivo:
{`user_id`: "@bot:example.com", `device_id`: "ABCDEF1234"}
Si falta device_id, el token se creó sin un inicio de sesión de dispositivo (p. ej., a través de la API de administración). Genera un nuevo token + device_id juntos a través de §3.
Opción 2: Desde Element u otro cliente de Matrix
- Iniciar sesión como la cuenta del bot en Element.
- Configuración → Sesiones.
- Copia el ID del dispositivo para la sesión activa.
- Establece
device_iden tu configuración (ver §2), luego ejecutazeroclaw service restart. Manténdevice_idestable: cambiarlo fuerza un nuevo registro de dispositivo, lo que rompe el intercambio de claves y la verificación existentes.
H (continuación). Recuperación de la eliminación de la tienda de criptografía
Síntoma: Se ha detectado un conflicto en la carga de la clave de un solo uso de Matrix; se detiene la sincronización para evitar un bucle infinito de reintento y el canal queda no disponible.
Causa: El almacén de criptografía local se eliminó mientras el dispositivo antiguo aún tenía claves de un solo uso registradas en el servidor. El SDK no puede cargar nuevas claves porque las claves antiguas aún existen en el servidor, lo que provoca un bucle infinito de conflicto de claves de un solo uso (OTK).
Corrección: inicio de sesión nuevo
Un inicio de sesión nuevo crea un nuevo dispositivo con un device_id nuevo, evitando por completo el conflicto de OTK (no se requiere eliminación de dispositivos con UIA).
-
Detener ZeroClaw.
sh
zeroclaw service stop -
Obtén un nuevo token de acceso y
device_id:sh
curl -sS -X POST "https://matrix.org/_matrix/client/v3/login" \ -H "Content-Type: application/json" \ -d '{"type":"m.login.password","identifier":{"type":"m.id.user","user":"YOUR_BOT_USERNAME"},"password":"YOUR_PASSWORD","device_id":"NEW_DEVICE_ID"}'Guarde el
access_tokeny eldevice_iddevueltos. -
Eliminar la tienda de criptografía local:
sh
rm -rf ~/.zeroclaw/state/matrix/ -
Aplica las nuevas credenciales: configura
access_token(secreto, consulta la §2) ydevice_iden tu configuración. -
Reiniciar:
sh
zeroclaw service start
Qué esperar en el primer reinicio
Our own device might have been deleted: inofensivo; el dispositivo antiguo ya no existe.Failed to decrypt a room event: mensajes antiguos anteriores al restablecimiento; irrecuperables.Matrix E2EE recovery successful: claves de sala restauradas desde la copia de seguridad del servidor (solo sirecovery_keyestá configurada; consulte §5I).- Los nuevos mensajes se descifran y funcionan normalmente.
Prevención: No elimine el directorio de estado local sin planificar un nuevo inicio de sesión. Si necesita un reinicio completo, obtenga nuevas credenciales primero, luego elimine el almacén y, por último, actualice la configuración.
I. Clave de recuperación (recomendada para E2EE)
Una clave de recuperación permite que ZeroClaw restaure automáticamente las claves de sala y los secretos de firma cruzada desde la copia de seguridad del lado del servidor. Los restablecimientos de dispositivos, las eliminaciones del almacén criptográfico y las instalaciones nuevas se recuperan todas automáticamente: sin verificación por emojis, sin compartir claves manualmente.
Paso 1: Obtén tu clave de recuperación de Element
- Inicia sesión en la cuenta del bot en Element (web o escritorio).
- Configuración → Seguridad y privacidad → Cifrado → Copia de seguridad segura.
- Si la copia de seguridad ya está configurada, tu clave de recuperación se mostró cuando la habilitaste por primera vez. Si la guardaste, úsala.
- Si la copia de seguridad no está configurada, haz clic en “Set up Secure Backup” → “Generate a Security Key”. Element muestra la clave (tiene un aspecto como
EsTj 3yST y93F SLpB ...); cópiala en un lugar seguro. - Continúe después de la pantalla de la clave: Element luego le pide volver a introducir la clave en un cuadro de confirmación para demostrar que la guardó. Péguela y continúe para finalizar la configuración. Este es el mismo valor que puso en
recovery_key. - (Opcional) Cierra la sesión del bot en Element una vez guardada la clave: haz clic en el menú de cuenta → All settings → Account, luego Remove this device. Dejar la sesión iniciada está bien; eliminarla solo mantiene ordenada la lista de dispositivos.
Paso 2: Agrega la clave de recuperación a ZeroClaw
Aplica la clave de recuperación a ZeroClaw:
channels.matrix.<alias>.recovery_keyes un secreto. Se almacena cifrado, nunca en texto plano enconfig.toml. Configúralo mediante una de estas opciones, que cifran al escribir:
Panel de control del gateway
Abra /config/channels/matrix y configure allí el campo channels.matrix.<alias>.recovery_key.
zerocode
En el panel Config, configura el campo channels.matrix.<alias>.recovery_key (la entrada está enmascarada).
zeroclaw config
zeroclaw config set channels.matrix.<alias>.recovery_key # solicita entrada enmascarada, almacena cifrado
Luego zeroclaw service restart. La clave de recuperación se cifra en reposo inmediatamente.
Paso 3: Reiniciar
sh
zeroclaw service restart
Al iniciar, deberías ver:
Matrix E2EE recovery successful — room keys and cross-signing secrets restored from server backup.
A partir de ahora, incluso si se elimina la tienda de criptografía local, ZeroClaw se recupera automáticamente en el próximo inicio.
6. Registro de depuración
Diagnósticos específicos del canal de Matrix:
sh
RUST_LOG=zeroclaw::channels::matrix=debug zeroclaw daemon
Superficies:
- Confirmación de restauración de sesión
- Cada ciclo de sincronización completado
- Estado de la bandera de conflicto OTK
- Resultados de la verificación de salud
- Clasificación de errores de sincronización transitorios frente a errores fatales
Para detalles a nivel de SDK:
sh
RUST_LOG=zeroclaw::channels::matrix=debug,matrix_sdk_crypto=debug zeroclaw daemon
7. Notas operativas
- Mantén los tokens de Matrix fuera de los registros y capturas de pantalla.
- Comienza con
external_peers = ["*"]permisivo, restríngelo a IDs de usuario explícitos una vez verificado. - Usa siempre IDs canónicos de sala en
allowed_rooms: los alias no se resuelven para la lista de permitidos de entrada (solo se resuelven paradelivery.tode salida). - Hilos: cuando
channels.matrix.reply_in_threadestrue(predeterminado), cada respuesta del bot vive en un hilo cuya raíz es el mensaje del usuario. Los mensajes de usuario de nivel superior abren un hilo nuevo; los hilos existentes se continúan. La línea de tiempo principal de la sala solo contiene los mensajes iniciados por el usuario. - Contexto de la raíz del hilo: el primer mensaje entrante que ZeroClaw ve en cualquier hilo dado lleva el prefijo
[Thread root from @sender]: <root body>para que el agente tenga la conversación que originó la respuesta. Los hilos que el propio bot inició omiten el preámbulo. El seguimiento es solo en memoria; después de un reinicio del daemon, el siguiente mensaje en cada hilo activo vuelve a inyectar el preámbulo exactamente una vez. - Medios en respuestas inline:
channels.matrix.mention_only = truehace que el bot ignore las subidas de medios sin texto (no hay cuerpo de texto contra el cual hacer la mención). Cuando el usuario responde inline a un evento descartado de este tipo con una pregunta (@bot can you see this?), ZeroClaw recorre elm.relates_to.m.in_reply_to.event_idde la respuesta, obtiene el evento padre e incorpora sus medios al mensaje actual: el pipeline de visión del agente ve la imagen aunque la subida original haya sido filtrada. - Los archivos adjuntos se encadenan junto al texto: las llamadas a
room.send_attachmentincluyen unAttachmentConfig::reply(...)conEnforceThread::Threadedcuando hay un ancla de hilo presente, de modo que los PDF, las imágenes y las notas de voz aterrizan dentro del hilo del bot en lugar de en la línea de tiempo principal. - Marcadores de medios salientes: el agente emite
[image:url|path],[file:url|path],[voice:url|path],[video:...],[audio:...](y alias en mayúsculas /[document:...]) dentro del texto de su respuesta; ZeroClaw obtiene los bytes (HTTP parahttp(s)://, lectura local en caso contrario) y los sube como el evento de mensaje de Matrix correspondiente. Los destinos ausentes o ilegibles no son fatales: el canal registra una advertencia, descarta únicamente ese marcador y añade una línea(note: I couldn't deliver the file at <path>.)para que el operador vea lo que se intentó en lugar de una respuesta descartada silenciosamente. - Mensajes de voz (MSC3245): los eventos
m.audioentrantes que contienen el campoorg.matrix.msc3245.voicese guardan en{workspace_dir}/matrix_files/y se procesan a través del proveedor de transcripción configurado del agente, de modo que el agente obtiene tanto el texto de la transcripción como la ruta de origen. Las notas de voz salientes usan el marcador[voice:<url|path>]; ZeroClaw las sube comom.audiocon el indicador de voz + forma de onda cero establecidos para que Element muestre la burbuja como una nota de voz. Consulta Model Providers para la configuración del proveedor de transcripción. - Reacciones de confirmación: controladas por
channels.matrix.ack_reactions(por defectotrue). Cuando está activado, el bot reacciona con 👀 mientras procesa y con ✅ al terminar. Establézcalo enfalsepara mantener las salas sin reacciones. - Sesiones persistentes: en el primer inicio de sesión exitoso, ZeroClaw escribe
~/.zeroclaw/state/matrix/session.json(user_id + device_id + access_token + refresh_token opcional). Los reinicios posteriores llaman arestore_session()desde ese blob: no hay nuevo inicio de sesión. El almacén criptográfico SQLite de matrix-rust-sdk reside junto a él en~/.zeroclaw/state/matrix/store/. Una vez quesession.jsonexiste, rotaraccess_tokenen la configuración no tiene efecto hasta que el archivo sea eliminado: el token guardado prevalece. Eliminasession.jsonpara forzar un nuevo inicio de sesión a partir de los valores de configuración. - Firma cruzada: cuando
recovery_keycoincide con lo que está sellado en el almacenamiento secreto del lado del servidor de tu cuenta, ZeroClaw ejecutarecovery().recover(key)en cada inicio, el SDK importa tus claves existentes maestra / de autofirma / de firma de usuario, y el dispositivo recién registrado se firma automáticamente. Sin bootstrap, sin UIA, sin rotación de claves. Si tu cuenta aún no tiene configurada la firma cruzada, genera la clave de recuperación en Element (Settings → Security & Privacy → Secure Backup) antes de configurarrecovery_key. - Entrega de cron:
delivery.todebe ser un id de sala simple (!abc:server) o un alias (#room:server). Las configuraciones antiguas que escribían<sender>||<room>se toleran: ZeroClaw extrae el último segmento con prefijo!/#y advierte sobre el valor malformado.
Transmisión
Matrix transmite respuestas en streaming mediante la configuración stream_mode:
off(predeterminado): toda la respuesta se publica como un solo mensaje una vez que el agente termina. Es lo más simple, y nunca muestra una respuesta a medio escribir.partial: el bot publica un borrador inmediatamente y lo edita en el lugar a medida que la respuesta se transmite.draft_update_interval_msregula el ritmo de las ediciones; auméntalo si Matrix les aplica límites de velocidad.multi_message: cada párrafo se publica como un mensaje independiente, separados pormulti_message_delay_ms. Útil para respuestas largas que de otro modo serían un solo bloque de texto.
Colócalo sobre cualquier superficie:
Panel de control del gateway
Abre /config/channels/matrix y configura el campo channels.matrix.<alias>.stream_mode.
zerocode
En el panel Config, establece el campo channels.matrix.<alias>.stream_mode.
zeroclaw config
zeroclaw config set channels.matrix.<alias>.stream_mode <value>
Detalles específicos de Matrix: en el modo partial, el estado de ejecución de las herramientas se muestra mediante el mismo flujo de edición que el texto de la respuesta. En el modo single_message, las actualizaciones del estado de las herramientas y del progreso se incorporan mediante ediciones a un único borrador deslizante, mientras que la respuesta final se envía como un mensaje de Matrix separado. stream_draft_lines controla las líneas de progreso visibles: 0 elimina únicamente el límite de cantidad de líneas; nunca crea un segundo mensaje de progreso. message_max_bytes limita el contenido de los eventos de borrador y final, contando el Markdown renderizado (incluido el HTML generado) y los metadatos de relación de respuesta y edición de Matrix, en lugar de contar solo el código fuente Markdown. Cuando el progreso excede el tamaño, se descartan líneas o entradas completas, empezando por las más antiguas, para que la ventana conserve la actividad más reciente; un elemento individual que exceda el tamaño se sustituye por una alerta visible. La respuesta final separada conserva un prefijo seguro para UTF-8. El contenido del progreso se escapa antes de renderizar Markdown, por lo que el razonamiento sigue siendo legible en varias líneas, mientras que el contenido del usuario, del modelo y de las herramientas no puede introducir formato Markdown ni HTML. Los valores inferiores a 512 usan este mínimo efectivo para que pueda caber un evento de Matrix serializado que no esté vacío. El presupuesto no se aplica a las solicitudes de aprobación, los avisos del sistema, la entrega programada ni otros envíos ordinarios. Elija un presupuesto inferior al límite de eventos de Matrix. stream_reasoning controla la visibilidad del razonamiento del proveedor en ese borrador de progreso: off suprime las actualizaciones del borrador derivadas del razonamiento, status emite indicaciones de actividad sin texto de razonamiento sin procesar y full emite texto de razonamiento sin procesar del proveedor en el borrador de progreso. stream_draft_delete controla si las transcripciones persistentes del progreso se eliminan antes de publicar la respuesta final; los errores de eliminación se registran y la entrega de la respuesta final continúa. Los borradores que solo contienen marcadores de posición se eliminan antes de la respuesta final, incluso cuando la conservación de transcripciones está habilitada. En el modo multi_message, cada párrafo se publica como su propio mensaje en el hilo, y la división tiene en cuenta los delimitadores de bloques de código, por lo que las líneas en blanco dentro de bloques delimitados no dividen un bloque de código entre mensajes.
stream_tool_arguments controla qué argumentos de herramienta aparecen en las líneas de progreso de single_message. La configuración ausente o vacía usa valores predeterminados conservadores por herramienta; los wrappers de skills, plugins, herramientas MCP y nombres no resueltos muestran solo sus nombres. Una única entrada de default_base selecciona none, safe o all, mientras que las reglas de herramientas con nombre exacto pueden reemplazar esa base o agregar y quitar campos:
stream_tool_arguments = [
{ default_base = "safe", argument_chars = 60 },
{ tool = "delegate", base = "none", include = ["agent", "background", "prompt"], argument_chars = 0 },
{ tool = "mock_tool", base = "all", exclude = ["token"] },
]
El orden de las reglas no es relevante, se rechazan las entradas de herramienta/predeterminadas duplicadas y una regla base omitida hereda default_base. include añade campos después de seleccionar la base; exclude los elimina. Los campos exclusivos del tiempo de ejecución nunca se muestran, los campos cuyos nombres son credenciales se redactan recursivamente dentro de cada valor seleccionado y cada valor renderizado pasa por la detección de filtraciones de credenciales y la normalización a una sola línea antes de llegar a Matrix. Incluir un valor compuesto sigue siendo una decisión explícita de divulgación por parte del operador, pero no omite la redacción de credenciales. En el modo safe, solo se renderizan los argumentos escalares de nivel superior recomendados; se omiten los valores nulos, las matrices y los objetos. Seleccionar all o nombrar un argumento en include es una aceptación explícita del operador para el renderizado de un valor compuesto como JSON compacto. argument_chars en la entrada predeterminada cambia el límite heredado por valor de 60; el mismo campo en una regla de herramienta lo anula para esa herramienta. 0 conserva los valores completos, mientras message_max_bytes sigue limitando el borrador renderizado. all explícito se aplica a herramientas desconocidas; usa una regla con el nombre exacto al habilitar argumentos solo para una herramienta de extensión.
8. Recuperación automática desde un estado local dañado
El almacén SQLite predeterminado de matrix-rust-sdk es de un solo dispositivo y asume que la vista local se mantiene sincronizada con el homeserver. Dos modos de fallo rompen esa suposición de forma irrecuperable; ZeroClaw detecta cada uno al inicio y (cuando password y user_id están ambos configurados) borra automáticamente ~/.zeroclaw/state/matrix/ y vuelve a autenticarse para que se cree un dispositivo nuevo en el lado del servidor.
- Estado de cifrado huérfano. Existe un directorio
store/perosession.jsonno (limpieza manual, instalación previa interrumpida, etc.). Iniciar sesión desde cero sobre un estado de cifrado huérfano reproduce conflictosDuplicate one-time keys/SigningKeyChangedque no se reparan automáticamente. - Indicador
StateStoreDataKey::OneTimeKeyAlreadyUploadedactivado. El SDK persiste esta clave en el almacén de estado la primera vez que detecta una carga de OTK duplicada (según el propio comentario del SDK: “we forgot about some of our one-time keys. This will lead to UTDs.”). Sobrevive a los reinicios; la única solución es borrar y volver a registrar.
Se detecta la desviación de device_id, pero se tolera, no se borra. Si channels.matrix.device_id difiere del id de dispositivo almacenado en session.json, el canal registra una advertencia y respeta el id guardado (que es el valor que el homeserver realmente asignó al iniciar sesión). Borrar ante una desviación crearía un bucle de recuperación porque la auto-recuperación en sí misma genera un nuevo id, dejando la configuración y la sesión permanentemente desincronizadas.
Cuando recover() falla en sí mismo (típicamente MAC check for the secret storage key failed), el canal registra el id de la clave de almacenamiento secreto predeterminada del homeserver, si el evento de la clave tiene información de frase de contraseña, la longitud de la entrada sin espacios en blanco, y la cadena completa de errores: estos indican qué capa rechazó la clave de recuperación sin filtrar el valor. Los fallos de recuperación son no fatales (no activan el borrado automático); el bot continúa, simplemente el nuevo dispositivo no tendrá firma cruzada.
Si password + user_id no están configurados, la recuperación automática no puede ejecutarse: el canal aborta con un error accionable que señala las dos opciones: configurarlos, o ejecutar rm -rf ~/.zeroclaw/state/matrix/ manualmente.
Ver también
- Despliegue de red
- Referencia de configuración: generada a partir del esquema activo
- Visión general de los canales