April 23, 2026 • Versión: 2026.4.5

[Error de tipo en notifyActiveTaskWaiters bloquea el gateway de Discord] - OpenClaw 4.5 notifyActiveTaskWaiters TypeError crashes Discord gateway

Un TypeError en command-queue.ts notifyActiveTaskWaiters bloquea el handler del gateway de Discord al procesar mensajes entrantes, provocando que todos los mensajes se descarten silenciosamente.

🔍 Síntomas

Manifestación Principal

La puerta de enlace de Discord falla con un TypeError al recibir cualquier mensaje entrante. El bot deja de responder completamente sin enviar respuestas.

Salida del Error

TypeError: undefined is not iterable (cannot read property 'length' of undefined)
  at notifyActiveTaskWaiters (command-queue.ts)
  → Gateway handler crashes before any reply can be sent
  → All Discord messages silently dropped

Síntomas de Comportamiento

  • El bot acepta la conexión WebSocket exitosamente
  • Sin confirmación de mensajes recibidos en los logs
  • Discord no muestra respuesta del bot a los mensajes de usuario
  • La conexión de la puerta de enlace permanece activa pero inactiva
  • Otra funcionalidad de plugins puede verse afectada dependiendo del uso de la cola de comandos

Entorno

  • Versión de OpenClaw: 2026.4.5
  • Node.js: v22.22.1
  • SO: Linux (Ubuntu)
  • Canal: Discord

🧠 Causa Raíz

Causa Directa

La función notifyActiveTaskWaiters en command-queue.ts recibe un valor undefined donde espera un array iterable. La función intenta acceder a la propiedad .length o iterar sobre este valor sin una cláusula de protección, lo que activa el TypeError.

Secuencia de Falla

  1. El usuario envía un mensaje al bot de Discord
  2. La puerta de enlace recibe la carga útil del mensaje a través de WebSocket
  3. El handler de la puerta de enlace invoca notifyActiveTaskWaiters
  4. notifyActiveTaskWaiters recibe undefined en lugar de un array
  5. La iteración interna o verificación de longitud falla en undefined
  6. El TypeError se propaga por la pila de llamadas
  7. El handler de la puerta de enlace falla sin procesar el mensaje

Problemas de Configuración Contribuyentes

Durante el diagnóstico, se identificaron problemas de configuración secundarios que agravan el problema:

  • Anidamiento de configuración incorrecto: La configuración estaba anidada/duplicada dentro de sí misma con una clave "cha" mal formada, indicando config.yml corrupto
  • Clave legacy eliminada: channels.discord.guilds.<id>.channels.<id>.allow fue eliminada en OpenClaw 4.5 pero aún está presente en la configuración
  • Declaraciones de plugins faltantes: Los plugins discord y anthropic estaban ausentes en plugins.allow
  • Referencia de plugin obsoleta: browser existía en plugins.allow referenciando un plugin eliminado en una versión anterior

Contexto Arquitectónico

El sistema de cola de comandos gestiona la coordinación de tareas asíncronas entre la puerta de enlace y la ejecución de plugins. En la versión 4.5, un cambio de código introdujo una dependencia de un array que puede no estar siempre poblado bajo ciertos estados de configuración, particularmente cuando las declaraciones de plugins están incompletas o las claves legacy conflictúan con el nuevo esquema.

🛠️ Solución Paso a Paso

Solución Alternativa Inmediata: Rollback (Recomendado para Producción)

Si se requiere funcionalidad inmediata de Discord:

# Roll back to last known stable version
npm install openclaw@2026.4.2

# Restart the gateway
openclaw restart

Solución Permanente: Remediación de Configuración

Ejecuta la herramienta integrada de diagnóstico y reparación:

openclaw doctor --fix

Este comando aborda automáticamente:

  • Estructuras de configuración corruptas o anidadas
  • Claves legacy eliminadas en la versión 4.5
  • Declaraciones de plugins faltantes
  • Referencias de plugins obsoletas

Reparación Manual de Configuración (si doctor falla)

Paso 1: Respaldar la configuración actual

cp config.yml config.yml.backup-$(date +%Y%m%d)

Paso 2: Eliminar claves legacy de allow de canales

Localiza y elimina todas las instancias de:

channels:
  discord:
    guilds:
      <guild-id>:
        channels:
          <channel-id>:
            allow: [...]  # REMOVE THIS KEY COMPLETELY

Paso 3: Corregir la sección plugins.allow

Reemplaza tu bloque plugins.allow con la lista correcta de plugins:

# Before (broken)
plugins:
  allow:
    - browser  # STALE - remove this
    # Missing: discord, anthropic

# After (correct)
plugins:
  allow:
    - discord
    - anthropic
    # Add other active plugins as needed

Paso 4: Validar la estructura de configuración

openclaw config validate

Paso 5: Reiniciar la puerta de enlace

openclaw restart

Después de la Corrección: Verificar Declaración de Plugins

openclaw plugins list --enabled

Confirma que discord aparece en la lista de plugins habilitados.

🧪 Verificación

Paso 1: Confirmar Validez de Configuración

openclaw config validate

Salida esperada:

✓ Configuration schema validated
✓ No legacy keys detected
✓ Plugin declarations complete

Paso 2: Ejecutar Herramienta de Diagnóstico

openclaw doctor

Salida esperada (sin errores):

Checking configuration... OK
Checking plugin declarations... OK
Checking Discord gateway connectivity... OK
No issues found.

Paso 3: Verificar Conexión de Puerta de Enlace

openclaw status --channel discord

Salida esperada:

Discord Gateway: CONNECTED
Bot User: <your-bot-name>
Latency: <value>ms

Paso 4: Prueba Funcional

Envía un mensaje de prueba al bot en Discord. Verifica:

  • El mensaje es recibido y registrado en la salida de la puerta de enlace
  • El bot responde dentro de la latencia esperada
  • No aparece TypeError en los logs de la puerta de enlace

Paso 5: Verificar Logs en Busca de Errores

openclaw logs --tail 100 --level error

Esperado: Sin entradas de TypeError: undefined is not iterable.

Paso 6: Verificar Estabilidad de la Cola de Comandos

Envía múltiples mensajes rápidos para confirmar que la cola de comandos maneja solicitudes concurrentes:

# Send 5 messages in rapid succession
for i in {1..5}; do
  echo "Test message $i" | openclaw send --channel test-channel
done

Todos los mensajes deben procesarse sin fallos.

⚠️ Errores Comunes

Corrupción de Configuración

  • Configuración duplicada/anidada: Editar manualmente config.yml puede introducir copias anidadas. Siempre usa openclaw config set para actualizaciones programáticas.
  • Indentación YAML: La indentación incorrecta rompe el análisis. Usa espacios (no tabuladores) para la indentación.
  • Caracteres especiales: Las cadenas sin comillas que contienen :, #, {, } pueden causar errores de análisis.

Gestión de Plugins

  • Plugin no en lista de allow: Incluso si está instalado, un plugin no cargará a menos que esté explícitamente listado en plugins.allow.
  • Plugins eliminados: Los plugins eliminados en versiones anteriores (como browser) pueden persistir en la configuración y causar fallos de validación.
  • Sensibilidad al orden: Algunos plugins tienen dependencias. Asegúrate de que los plugins dependientes estén declarados después de sus dependencias.

Trampas Específicas de Versión

  • Saltar versiones: Actualizar directamente de 4.3 a 4.5 puede omitir pasos de migración. Usa actualizaciones secuenciales para saltos de versión complejos.
  • Deriva del archivo de bloqueo: package-lock.json puede almacenar en caché la versión rota. Elimina el archivo de bloqueo antes de reinstalar.

Problemas Específicos del Entorno

  • Docker: Asegúrate de que los montajes de volumen persistan la configuración entre reinicios del contenedor. Verifica que openclaw doctor --fix escriba en el volumen montado correcto.
  • pm2/systemd: Los gestores de servicios pueden almacenar en caché el estado antiguo del proceso. Reinicia el servicio, no solo el proceso.
  • Windows: Las diferencias de finales de línea (\r\n vs \n) pueden corromper el YAML. Asegura finales de línea consistentes en config.yml.

Trampas de Migración

  • Claves de allow de canales: La versión 4.5 eliminó las reglas de allow por canal. Migra cualquier regla existente al nuevo sistema de permisos antes de actualizar.
  • Claves de configuración de plugins: Algunas claves específicas de plugins fueron renombradas. Consulta el changelog de 4.5 para mapeos de claves obsoletas.

🔗 Errores Relacionados

TypeError: undefined is not iterable (cannot read property ’length’ of undefined)

  • Ubicación: notifyActiveTaskWaiters en command-queue.ts
  • Disparador: La puerta de enlace procesa un mensaje entrante de Discord
  • Relacionado: Issue #4521 - La cola de comandos asume entrada siempre-array

Fallos de Validación del Esquema de Configuración

  • Error: ConfigValidationError: Unknown key 'channels.*.channels.*.allow'
  • Disparador: Cargar configuración con claves legacy de allow de canales
  • Relacionado: Cambios significativos en el sistema de plugins de OpenClaw 4.5

Fallos de Carga de Plugins

  • Error: PluginNotFoundError: Plugin 'browser' not found in registry
  • Disparador: Referencia de plugin obsoleta en plugins.allow
  • Relacionado: Limpieza del registro de plugins en v4.4+

Desconexión de WebSocket de la Puerta de Enlace

  • Error: GatewayError: WebSocket closed with code 1006
  • Disparador: Excepción no manejada en el handler de la puerta de enlace
  • Relacionado: Falla en cascada desde TypeError en el procesamiento de mensajes

Corrupción por Anidamiento de Configuración

  • Error: YAMLSyntaxError: Nested mappings are not allowed
  • Disparador: YAML mal formado con claves duplicadas o anidamiento incorrecto
  • Relacionado: Errores de edición manual de config, actualizaciones programáticas fallidas

Evidencia y fuentes

Esta guía de solución de problemas fue sintetizada automáticamente por la tubería de inteligencia de FixClaw a partir de las discusiones de la comunidad.