Discord (API de bot)
Estado: listo para mensajes directos y canales de servidor mediante la gateway oficial de Discord.Emparejamiento
Comandos de barra inclinada
Solución de problemas del canal
Configuración rápida
Necesitarás crear una aplicación nueva con un bot, añadir el bot a tu servidor y emparejarlo con OpenClaw. Recomendamos añadir tu bot a tu propio servidor privado. Si todavía no tienes uno, crea uno primero (elige Create My Own > For me and my friends).Crear una aplicación de Discord y un bot
Habilitar intents privilegiados
- Message Content Intent (obligatorio)
- Server Members Intent (recomendado; obligatorio para listas de permitidos por rol y coincidencia de nombre a ID)
- Presence Intent (opcional; solo se necesita para actualizaciones de presencia)
Copiar el token de tu bot
Generar una URL de invitación y añadir el bot a tu servidor
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Habilitar el modo desarrollador y recopilar tus ID
- Haz clic en User Settings (icono de engranaje junto a tu avatar) → Advanced → activa Developer Mode
- Haz clic derecho en el icono de tu servidor en la barra lateral → Copy Server ID
- Haz clic derecho en tu propio avatar → Copy User ID
Permitir mensajes directos de miembros del servidor
Establecer el token de tu bot de forma segura (no lo envíes en el chat)
openclaw gateway run.Configurar OpenClaw y emparejar
- Pregúntale a tu agente
- CLI / config
“Ya configuré el token de mi bot de Discord en la configuración. Completa la configuración de Discord con User ID<user_id>y Server ID<server_id>.”
Aprobar el primer emparejamiento por mensaje directo
- Pregúntale a tu agente
- CLI
“Aprueba este código de emparejamiento de Discord: <CODE>”
DISCORD_BOT_TOKEN solo se usa para la cuenta predeterminada.
Para llamadas salientes avanzadas (acciones de canal/herramienta de mensajes), se usa un token explícito por llamada para esa llamada. Esto se aplica a acciones de envío y de lectura/sondeo (por ejemplo read/search/fetch/thread/pins/permissions). La política de cuenta y la configuración de reintentos siguen viniendo de la cuenta seleccionada en la instantánea activa del runtime.Recomendado: configurar un espacio de trabajo de servidor
Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Discord como un espacio de trabajo completo donde cada canal obtiene su propia sesión de agente con su propio contexto. Esto se recomienda para servidores privados donde solo estáis tú y tu bot.Añadir tu servidor a la lista de permitidos de servidores
- Pregúntale a tu agente
- Config
“Añade mi Server ID de Discord <server_id> a la lista de permitidos de servidores”
Permitir respuestas sin @mention
- Pregúntale a tu agente
- Config
“Permite que mi agente responda en este servidor sin necesidad de que se le mencione con @”
Planificar la memoria en canales de servidor
- Pregúntale a tu agente
- Manual
“Cuando haga preguntas en canales de Discord, usa memory_search o memory_get si necesitas contexto a largo plazo de MEMORY.md.”
#coding, #home, #research o lo que mejor se adapte a tu flujo de trabajo.
Modelo de runtime
- La gateway es propietaria de la conexión de Discord.
- El enrutamiento de respuestas es determinista: las respuestas entrantes de Discord vuelven a Discord.
- De forma predeterminada (
session.dmScope=main), los chats directos comparten la sesión principal del agente (agent:main:main). - Los canales de servidor usan claves de sesión aisladas (
agent:<agentId>:discord:channel:<channelId>). - Los mensajes directos de grupo se ignoran de forma predeterminada (
channels.discord.dm.groupEnabled=false). - Los comandos nativos de barra inclinada se ejecutan en sesiones de comando aisladas (
agent:<agentId>:discord:slash:<userId>), mientras siguen llevandoCommandTargetSessionKeya la sesión de conversación enrutada.
Canales de foro
Los canales de foro y multimedia de Discord solo aceptan publicaciones en hilos. OpenClaw admite dos formas de crearlos:- Envía un mensaje al padre del foro (
channel:<forumId>) para crear automáticamente un hilo. El título del hilo usa la primera línea no vacía de tu mensaje. - Usa
openclaw message thread createpara crear un hilo directamente. No pases--message-idpara canales de foro.
channel:<threadId>).
Componentes interactivos
OpenClaw admite contenedores de componentes v2 de Discord para mensajes del agente. Usa la herramienta de mensajes con una carga útilcomponents. Los resultados de interacción se enrutan de vuelta al agente como mensajes entrantes normales y siguen la configuración existente de replyToMode de Discord.
Bloques compatibles:
text,section,separator,actions,media-gallery,file- Las filas de acciones permiten hasta 5 botones o un único menú de selección
- Tipos de selección:
string,user,role,mentionable,channel
components.reusable=true para permitir que botones, selectores y formularios se usen varias veces hasta que caduquen.
Para restringir quién puede hacer clic en un botón, establece allowedUsers en ese botón (IDs de usuario de Discord, etiquetas o *). Cuando está configurado, los usuarios que no coincidan reciben una denegación efímera.
Los comandos de barra inclinada /model y /models abren un selector interactivo de modelo con menús desplegables de proveedor y modelo, además de un paso Submit. La respuesta del selector es efímera y solo el usuario que lo invocó puede usarla.
Archivos adjuntos:
- Los bloques
filedeben apuntar a una referencia de adjunto (attachment://<filename>) - Proporciona el adjunto mediante
media/path/filePath(archivo único); usamedia-gallerypara varios archivos - Usa
filenamepara reemplazar el nombre de carga cuando deba coincidir con la referencia del adjunto
- Añade
components.modalcon hasta 5 campos - Tipos de campo:
text,checkbox,radio,select,role-select,user-select - OpenClaw añade un botón disparador automáticamente
Control de acceso y enrutamiento
- Política de mensajes directos
- Política de servidor
- Menciones y mensajes directos de grupo
channels.discord.dmPolicy controla el acceso a mensajes directos (heredado: channels.discord.dm.policy):pairing(predeterminado)allowlistopen(requiere quechannels.discord.allowFromincluya"*"; heredado:channels.discord.dm.allowFrom)disabled
pairing).Precedencia en múltiples cuentas:channels.discord.accounts.default.allowFromse aplica solo a la cuentadefault.- Las cuentas con nombre heredan
channels.discord.allowFromcuando su propioallowFromno está definido. - Las cuentas con nombre no heredan
channels.discord.accounts.default.allowFrom.
user:<id>- mención
<@id>
Enrutamiento de agentes basado en roles
Usabindings[].match.roles para enrutar miembros de servidores de Discord a distintos agentes por ID de rol. Las vinculaciones basadas en rol aceptan solo IDs de rol y se evalúan después de las vinculaciones de par o par padre y antes de las vinculaciones solo de servidor. Si una vinculación también establece otros campos de coincidencia (por ejemplo peer + guildId + roles), todos los campos configurados deben coincidir.
Configuración del portal para desarrolladores
Crear app y bot
Crear app y bot
- Discord Developer Portal -> Applications -> New Application
- Bot -> Add Bot
- Copia el token del bot
Intents privilegiados
Intents privilegiados
- Message Content Intent
- Server Members Intent (recomendado)
setPresence) no requiere habilitar actualizaciones de presencia para los miembros.Scopes de OAuth y permisos base
Scopes de OAuth y permisos base
- scopes:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Administrator salvo que sea explícitamente necesario.Copiar IDs
Copiar IDs
- ID del servidor
- ID del canal
- ID del usuario
Comandos nativos y autenticación de comandos
commands.nativeusa"auto"de forma predeterminada y está habilitado para Discord.- Reemplazo por canal:
channels.discord.commands.native. commands.native=falseborra explícitamente comandos nativos de Discord registrados anteriormente.- La autenticación de comandos nativos usa las mismas listas de permitidos/políticas de Discord que el manejo normal de mensajes.
- Los comandos pueden seguir siendo visibles en la interfaz de Discord para usuarios que no están autorizados; la ejecución sigue aplicando la autenticación de OpenClaw y devuelve “no autorizado”.
ephemeral: true
Detalles de funciones
Etiquetas de respuesta y respuestas nativas
Etiquetas de respuesta y respuestas nativas
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(predeterminado)firstallbatched
off desactiva el encadenamiento implícito de respuestas. Las etiquetas explícitas [[reply_to_*]] siguen respetándose.
first siempre adjunta la referencia implícita de respuesta nativa al primer mensaje saliente de Discord del turno.
batched solo adjunta la referencia implícita de respuesta nativa de Discord cuando el
turno entrante fue un lote con antirrebote de varios mensajes. Esto es útil
cuando quieres respuestas nativas principalmente para chats ambiguos con ráfagas, no para cada
turno de un solo mensaje.Los IDs de mensaje se muestran en el contexto/historial para que los agentes puedan dirigirse a mensajes concretos.Vista previa de transmisión en vivo
Vista previa de transmisión en vivo
channels.discord.streamingcontrola la transmisión de vista previa (off|partial|block|progress, predeterminado:off).- El valor predeterminado sigue siendo
offporque las ediciones de vista previa de Discord pueden alcanzar rápidamente los límites de tasa, especialmente cuando varios bots o gateways comparten la misma cuenta o tráfico de servidor. progressse acepta por consistencia entre canales y se asigna apartialen Discord.channels.discord.streamModees un alias heredado y se migra automáticamente.partialedita un único mensaje de vista previa a medida que llegan los tokens.blockemite fragmentos del tamaño del borrador (usadraftChunkpara ajustar tamaño y puntos de corte).
block (limitados a channels.discord.textChunkLimit):Historial, contexto y comportamiento de hilos
Historial, contexto y comportamiento de hilos
channels.discord.historyLimitpredeterminado20- respaldo:
messages.groupChat.historyLimit 0desactiva
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- los hilos de Discord se enrutan como sesiones de canal
- los metadatos del hilo padre pueden usarse para el enlace de sesión padre
- la configuración del hilo hereda la configuración del canal padre, salvo que exista una entrada específica para el hilo
Sesiones vinculadas a hilos para subagentes
Sesiones vinculadas a hilos para subagentes
/focus <target>vincula el hilo actual/nuevo a un destino de subagente/sesión/unfocuselimina la vinculación del hilo actual/agentsmuestra ejecuciones activas y estado de la vinculación/session idle <duration|off>inspecciona/actualiza el desenfoque automático por inactividad para vinculaciones enfocadas/session max-age <duration|off>inspecciona/actualiza la antigüedad máxima estricta para vinculaciones enfocadas
session.threadBindings.*establece los valores predeterminados globales.channels.discord.threadBindings.*reemplaza el comportamiento de Discord.spawnSubagentSessionsdebe ser true para crear/vincular automáticamente hilos parasessions_spawn({ thread: true }).spawnAcpSessionsdebe ser true para crear/vincular automáticamente hilos para ACP (/acp spawn ... --thread ...osessions_spawn({ runtime: "acp", thread: true })).- Si las vinculaciones de hilos están deshabilitadas para una cuenta,
/focusy las operaciones relacionadas no están disponibles.
Vinculaciones persistentes de canal ACP
Vinculaciones persistentes de canal ACP
bindings[]contype: "acp"ymatch.channel: "discord"
/acp spawn codex --bind herevincula el canal o hilo actual de Discord en el lugar y mantiene los mensajes futuros enrutados a la misma sesión ACP.- Esto todavía puede significar “iniciar una sesión ACP nueva de Codex”, pero no crea por sí solo un hilo nuevo de Discord. El canal existente sigue siendo la superficie de chat.
- Codex puede seguir ejecutándose en su propio
cwdo espacio de trabajo de backend en disco. Ese espacio de trabajo es estado de runtime, no un hilo de Discord. - Los mensajes del hilo pueden heredar la vinculación ACP del canal padre.
- En un canal o hilo vinculado,
/newy/resetrestablecen la misma sesión ACP en el lugar. - Las vinculaciones temporales de hilos siguen funcionando y pueden reemplazar la resolución de destino mientras estén activas.
spawnAcpSessionssolo es obligatorio cuando OpenClaw necesita crear/vincular un hilo hijo mediante--thread auto|here. No es obligatorio para/acp spawn ... --bind hereen el canal actual.
Notificaciones de reacciones
Notificaciones de reacciones
offown(predeterminado)allallowlist(usaguilds.<id>.users)
Reacciones de confirmación
Reacciones de confirmación
ackReaction envía un emoji de confirmación mientras OpenClaw procesa un mensaje entrante.Orden de resolución:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- respaldo al emoji de identidad del agente (
agents.list[].identity.emoji, o ”👀” si no existe)
- Discord acepta emoji unicode o nombres de emoji personalizados.
- Usa
""para desactivar la reacción para un canal o cuenta.
Escrituras de configuración
Escrituras de configuración
/config set|unset (cuando las funciones de comandos están habilitadas).Desactivar:Proxy de gateway
Proxy de gateway
channels.discord.proxy.Soporte para PluralKit
Soporte para PluralKit
- las listas de permitidos pueden usar
pk:<memberId> - los nombres visibles de miembro coinciden por nombre/slug solo cuando
channels.discord.dangerouslyAllowNameMatching: true - las búsquedas usan el ID del mensaje original y están limitadas por una ventana temporal
- si la búsqueda falla, los mensajes proxificados se tratan como mensajes de bot y se descartan salvo que
allowBots=true
Configuración de presencia
Configuración de presencia
- 0: Playing
- 1: Streaming (requiere
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom (usa el texto de actividad como estado; el emoji es opcional)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(admite el marcador{reason})
Aprobaciones en Discord
Aprobaciones en Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opcional; usacommands.ownerAllowFromcomo respaldo cuando es posible)channels.discord.execApprovals.target(dm|channel|both, predeterminado:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled no está definido o es "auto" y al menos un aprobador puede resolverse, ya sea desde execApprovals.approvers o desde commands.ownerAllowFrom. Discord no infiere aprobadores de ejecución desde allowFrom del canal, dm.allowFrom heredado ni defaultTo de mensajes directos. Establece enabled: false para desactivar Discord explícitamente como cliente de aprobación nativo.Cuando target es channel o both, la solicitud de aprobación es visible en el canal. Solo los aprobadores resueltos pueden usar los botones; otros usuarios reciben una denegación efímera. Las solicitudes de aprobación incluyen el texto del comando, así que habilita la entrega en canal solo en canales de confianza. Si el ID del canal no puede derivarse de la clave de sesión, OpenClaw vuelve a la entrega por mensaje directo.Discord también renderiza los botones de aprobación compartidos usados por otros canales de chat. El adaptador nativo de Discord añade principalmente enrutamiento por mensaje directo para aprobadores y difusión al canal.
Cuando esos botones están presentes, son la experiencia principal de aprobación; OpenClaw
solo debería incluir un comando manual /approve cuando el resultado de la herramienta indique
que las aprobaciones por chat no están disponibles o que la aprobación manual es la única vía.La autenticación de gateway para este manejador usa el mismo contrato compartido de resolución de credenciales que otros clientes de Gateway:- autenticación local con prioridad a entorno (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDy luegogateway.auth.*) - en modo local,
gateway.remote.*puede usarse como respaldo solo cuandogateway.auth.*no está configurado; los SecretRef locales configurados pero no resueltos fallan en modo cerrado - soporte de modo remoto mediante
gateway.remote.*cuando corresponda - los reemplazos de URL son seguros para reemplazo: los reemplazos de CLI no reutilizan credenciales implícitas, y los reemplazos de entorno usan solo credenciales del entorno
- Los IDs con prefijo
plugin:se resuelven medianteplugin.approval.resolve. - Otros IDs se resuelven mediante
exec.approval.resolve. - Discord no realiza aquí un salto adicional de respaldo de exec a plugin; el prefijo del ID decide qué método de gateway llama.
Herramientas y controles de acciones
Las acciones de mensajes de Discord incluyen mensajería, administración de canales, moderación, presencia y acciones de metadatos. Ejemplos principales:- mensajería:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reacciones:
react,reactions,emojiList - moderación:
timeout,kick,ban - presencia:
setPresence
event-create acepta un parámetro image opcional (URL o ruta de archivo local) para establecer la imagen de portada del evento programado.
Los controles de acciones están en channels.discord.actions.*.
Comportamiento predeterminado de los controles:
| Grupo de acciones | Predeterminado |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | habilitado |
| roles | deshabilitado |
| moderation | deshabilitado |
| presence | deshabilitado |
Interfaz Components v2
OpenClaw usa Discord components v2 para aprobaciones de ejecución y marcadores entre contextos. Las acciones de mensajes de Discord también pueden aceptarcomponents para una interfaz personalizada (avanzado; requiere construir una carga útil de componentes mediante la herramienta de Discord), mientras que los embeds heredados siguen estando disponibles, pero no se recomiendan.
channels.discord.ui.components.accentColorestablece el color de acento usado por los contenedores de componentes de Discord (hex).- Establécelo por cuenta con
channels.discord.accounts.<id>.ui.components.accentColor. embedsse ignoran cuando hay components v2 presentes.
Canales de voz
OpenClaw puede unirse a canales de voz de Discord para conversaciones continuas en tiempo real. Esto es independiente de los adjuntos de mensajes de voz. Requisitos:- Habilita comandos nativos (
commands.nativeochannels.discord.commands.native). - Configura
channels.discord.voice. - El bot necesita permisos Connect + Speak en el canal de voz de destino.
/vc join|leave|status para controlar sesiones. El comando usa el agente predeterminado de la cuenta y sigue las mismas reglas de lista de permitidos y política de grupo que otros comandos de Discord.
Ejemplo de unión automática:
voice.ttsreemplazamessages.ttssolo para la reproducción de voz.- Los turnos de transcripción de voz derivan el estado de propietario desde
allowFromde Discord (odm.allowFrom); los hablantes que no son propietarios no pueden acceder a herramientas exclusivas del propietario (por ejemplogatewayycron). - La voz está habilitada de forma predeterminada; establece
channels.discord.voice.enabled=falsepara desactivarla. voice.daveEncryptionyvoice.decryptionFailureTolerancese pasan directamente a las opciones de unión de@discordjs/voice.- Los valores predeterminados de
@discordjs/voicesondaveEncryption=trueydecryptionFailureTolerance=24si no se establecen. - OpenClaw también supervisa los fallos de descifrado de recepción y se recupera automáticamente saliendo y volviendo a unirse al canal de voz después de fallos repetidos en una ventana corta.
- Si los registros de recepción muestran repetidamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled), esto puede ser el error upstream de recepción de@discordjs/voicerastreado en discord.js #11419.
Mensajes de voz
Los mensajes de voz de Discord muestran una vista previa de forma de onda y requieren audio OGG/Opus más metadatos. OpenClaw genera la forma de onda automáticamente, pero necesita queffmpeg y ffprobe estén disponibles en el host de la gateway para inspeccionar y convertir archivos de audio.
Requisitos y restricciones:
- Proporciona una ruta de archivo local (las URLs se rechazan).
- Omite el contenido de texto (Discord no permite texto + mensaje de voz en la misma carga útil).
- Se acepta cualquier formato de audio; OpenClaw convierte a OGG/Opus cuando es necesario.
Solución de problemas
Se usaron intents no permitidos o el bot no ve mensajes de servidor
Se usaron intents no permitidos o el bot no ve mensajes de servidor
- habilita Message Content Intent
- habilita Server Members Intent cuando dependas de la resolución de usuario/miembro
- reinicia la gateway después de cambiar intents
Los mensajes de servidor se bloquean inesperadamente
Los mensajes de servidor se bloquean inesperadamente
- verifica
groupPolicy - verifica la lista de permitidos del servidor en
channels.discord.guilds - si existe el mapa
guild.channels, solo se permiten los canales listados - verifica el comportamiento de
requireMentiony los patrones de mención
Require mention false pero sigue bloqueado
Require mention false pero sigue bloqueado
groupPolicy="allowlist"sin una lista de permitidos de servidor/canal que coincidarequireMentionconfigurado en el lugar equivocado (debe estar enchannels.discord.guildso en la entrada del canal)- remitente bloqueado por la lista de permitidos
usersdel servidor/canal
Los manejadores de larga duración agotan el tiempo o duplican respuestas
Los manejadores de larga duración agotan el tiempo o duplican respuestas
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- cuenta única:
channels.discord.eventQueue.listenerTimeout - múltiples cuentas:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- cuenta única:
channels.discord.inboundWorker.runTimeoutMs - múltiples cuentas:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - predeterminado:
1800000(30 minutos); establece0para desactivar
eventQueue.listenerTimeout para una configuración lenta del listener y inboundWorker.runTimeoutMs
solo si quieres una válvula de seguridad independiente para turnos del agente en cola.Desajustes en la auditoría de permisos
Desajustes en la auditoría de permisos
channels status --probe solo funcionan con IDs numéricos de canal.Si usas claves slug, la coincidencia en runtime aún puede funcionar, pero el sondeo no puede verificar completamente los permisos.Problemas de mensajes directos y emparejamiento
Problemas de mensajes directos y emparejamiento
- mensajes directos deshabilitados:
channels.discord.dm.enabled=false - política de mensajes directos deshabilitada:
channels.discord.dmPolicy="disabled"(heredado:channels.discord.dm.policy) - esperando aprobación de emparejamiento en modo
pairing
Bucles de bot a bot
Bucles de bot a bot
channels.discord.allowBots=true, usa reglas estrictas de mención y lista de permitidos para evitar comportamientos en bucle.
Prefiere channels.discord.allowBots="mentions" para aceptar solo mensajes de bot que mencionen al bot.Las transcripciones de voz STT se pierden con DecryptionFailed(...)
Las transcripciones de voz STT se pierden con DecryptionFailed(...)
- mantén OpenClaw actualizado (
openclaw update) para que esté presente la lógica de recuperación de recepción de voz de Discord - confirma
channels.discord.voice.daveEncryption=true(predeterminado) - empieza con
channels.discord.voice.decryptionFailureTolerance=24(valor predeterminado upstream) y ajústalo solo si es necesario - observa los registros para:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- si los fallos continúan después de volver a unirse automáticamente, recopila registros y compáralos con discord.js #11419
Punteros de referencia de configuración
Referencia principal: Campos de Discord de alta señal:- inicio/autenticación:
enabled,token,accounts.*,allowBots - política:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - comandos:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - cola de eventos:
eventQueue.listenerTimeout(presupuesto del listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - worker entrante:
inboundWorker.runTimeoutMs - respuesta/historial:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,maxLinesPerMessage - transmisión:
streaming(alias heredado:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - multimedia/reintentos:
mediaMaxMb,retrymediaMaxMblimita las subidas salientes a Discord (predeterminado:100MB)
- acciones:
actions.* - presencia:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - funciones:
threadBindings,bindings[]de nivel superior (type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Seguridad y operaciones
- Trata los tokens de bot como secretos (
DISCORD_BOT_TOKENes lo preferido en entornos supervisados). - Otorga permisos de Discord con privilegios mínimos.
- Si el despliegue/estado de comandos está desactualizado, reinicia la gateway y vuelve a comprobar con
openclaw channels status --probe.