[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
- El usuario envía un mensaje al bot de Discord
- La puerta de enlace recibe la carga útil del mensaje a través de WebSocket
- El handler de la puerta de enlace invoca
notifyActiveTaskWaiters notifyActiveTaskWaitersrecibeundefineden lugar de un array- La iteración interna o verificación de longitud falla en
undefined - El TypeError se propaga por la pila de llamadas
- 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, indicandoconfig.ymlcorrupto - Clave legacy eliminada:
channels.discord.guilds.<id>.channels.<id>.allowfue eliminada en OpenClaw 4.5 pero aún está presente en la configuración - Declaraciones de plugins faltantes: Los plugins
discordyanthropicestaban ausentes enplugins.allow - Referencia de plugin obsoleta:
browserexistía enplugins.allowreferenciando 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 restartSolución Permanente: Remediación de Configuración
Ejecuta la herramienta integrada de diagnóstico y reparación:
openclaw doctor --fixEste 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 COMPLETELYPaso 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 neededPaso 4: Validar la estructura de configuración
openclaw config validatePaso 5: Reiniciar la puerta de enlace
openclaw restartDespués de la Corrección: Verificar Declaración de Plugins
openclaw plugins list --enabledConfirma que discord aparece en la lista de plugins habilitados.
🧪 Verificación
Paso 1: Confirmar Validez de Configuración
openclaw config validateSalida esperada:
✓ Configuration schema validated
✓ No legacy keys detected
✓ Plugin declarations completePaso 2: Ejecutar Herramienta de Diagnóstico
openclaw doctorSalida 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 discordSalida esperada:
Discord Gateway: CONNECTED
Bot User: <your-bot-name>
Latency: <value>msPaso 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 errorEsperado: 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
doneTodos los mensajes deben procesarse sin fallos.
⚠️ Errores Comunes
Corrupción de Configuración
- Configuración duplicada/anidada: Editar manualmente
config.ymlpuede introducir copias anidadas. Siempre usaopenclaw config setpara 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.jsonpuede 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 --fixescriba 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\nvs\n) pueden corromper el YAML. Asegura finales de línea consistentes enconfig.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:
notifyActiveTaskWaitersencommand-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