Discord (API Bot)
Statut : prêt pour les DM et les canaux de serveur via la passerelle Discord officielle.Appairage
Commandes slash
Dépannage du canal
Configuration rapide
Vous devrez créer une nouvelle application avec un bot, ajouter le bot à votre serveur, puis l’appairer à OpenClaw. Nous vous recommandons d’ajouter votre bot à votre propre serveur privé. Si vous n’en avez pas encore, créez-en un d’abord (choisissez Create My Own > For me and my friends).Créer une application Discord et un bot
Activer les intents privilégiés
- Message Content Intent (requis)
- Server Members Intent (recommandé ; requis pour les listes d’autorisation par rôle et la correspondance nom-vers-ID)
- Presence Intent (facultatif ; nécessaire uniquement pour les mises à jour de présence)
Copier votre jeton de bot
Générer une URL d’invitation et ajouter le bot à votre serveur
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (facultatif)
Activer le mode développeur et récupérer vos ID
- Cliquez sur User Settings (icône d’engrenage à côté de votre avatar) → Advanced → activez Developer Mode
- Faites un clic droit sur l’icône de votre serveur dans la barre latérale → Copy Server ID
- Faites un clic droit sur votre propre avatar → Copy User ID
Autoriser les DM des membres du serveur
Définir votre jeton de bot de manière sécurisée (ne l’envoyez pas dans le chat)
openclaw gateway run.Configurer OpenClaw et appairer
- Demander à votre agent
- CLI / configuration
« J’ai déjà défini mon jeton de bot Discord dans la configuration. Veuillez terminer la configuration de Discord avec l’ID utilisateur<user_id>et l’ID serveur<server_id>. »
Approuver le premier appairage DM
- Demander à votre agent
- CLI
« Approuve ce code d’appairage Discord : <CODE> »
DISCORD_BOT_TOKEN n’est utilisé que pour le compte par défaut.
Pour les appels sortants avancés (outil de message/actions de canal), un token explicite par appel est utilisé pour cet appel. Cela s’applique aux actions de type envoi et lecture/probe (par exemple read/search/fetch/thread/pins/permissions). Les paramètres de stratégie de compte et de nouvelle tentative proviennent toujours du compte sélectionné dans l’instantané d’exécution actif.Recommandé : configurer un espace de travail de serveur
Une fois que les DM fonctionnent, vous pouvez configurer votre serveur Discord comme un espace de travail complet où chaque canal obtient sa propre session d’agent avec son propre contexte. Cela est recommandé pour les serveurs privés où il n’y a que vous et votre bot.Ajouter votre serveur à la liste d’autorisation des serveurs
- Demander à votre agent
- Configuration
« Ajoute mon ID de serveur Discord <server_id> à la liste d’autorisation des serveurs »
Autoriser les réponses sans @mention
- Demander à votre agent
- Configuration
« Autorise mon agent à répondre sur ce serveur sans avoir besoin d’être @mentionné »
Prévoir la mémoire dans les canaux de serveur
- Demander à votre agent
- Manuel
« Quand je pose des questions dans les canaux Discord, utilisememory_searchoumemory_getsi tu as besoin du contexte à long terme de MEMORY.md. »
#coding, #home, #research ou tout autre canal adapté à votre flux de travail.
Modèle d’exécution
- La passerelle possède la connexion Discord.
- Le routage des réponses est déterministe : les réponses entrantes Discord retournent vers Discord.
- Par défaut (
session.dmScope=main), les conversations directes partagent la session principale de l’agent (agent:main:main). - Les canaux de serveur sont des clés de session isolées (
agent:<agentId>:discord:channel:<channelId>). - Les DM de groupe sont ignorés par défaut (
channels.discord.dm.groupEnabled=false). - Les commandes slash natives s’exécutent dans des sessions de commande isolées (
agent:<agentId>:discord:slash:<userId>), tout en portantCommandTargetSessionKeyvers la session de conversation routée.
Canaux de forum
Les canaux de forum et de médias Discord n’acceptent que les publications de fils. OpenClaw prend en charge deux façons de les créer :- Envoyer un message au parent du forum (
channel:<forumId>) pour créer automatiquement un fil. Le titre du fil utilise la première ligne non vide de votre message. - Utiliser
openclaw message thread createpour créer un fil directement. Ne passez pas--message-idpour les canaux de forum.
channel:<threadId>).
Composants interactifs
OpenClaw prend en charge les conteneurs Discord components v2 pour les messages d’agent. Utilisez l’outil de message avec une charge utilecomponents. Les résultats d’interaction sont renvoyés à l’agent comme des messages entrants normaux et suivent les paramètres Discord replyToMode existants.
Blocs pris en charge :
text,section,separator,actions,media-gallery,file- Les rangées d’actions autorisent jusqu’à 5 boutons ou un seul menu de sélection
- Types de sélection :
string,user,role,mentionable,channel
components.reusable=true pour permettre l’utilisation multiple des boutons, sélecteurs et formulaires jusqu’à leur expiration.
Pour restreindre qui peut cliquer sur un bouton, définissez allowedUsers sur ce bouton (ID utilisateur Discord, tags ou *). Lorsqu’il est configuré, les utilisateurs sans correspondance reçoivent un refus éphémère.
Les commandes slash /model et /models ouvrent un sélecteur de modèle interactif avec des menus déroulants de fournisseur et de modèle, ainsi qu’une étape de soumission. La réponse du sélecteur est éphémère et seul l’utilisateur qui l’a invoqué peut l’utiliser.
Pièces jointes de fichiers :
- les blocs
filedoivent pointer vers une référence de pièce jointe (attachment://<filename>) - fournissez la pièce jointe via
media/path/filePath(fichier unique) ; utilisezmedia-gallerypour plusieurs fichiers - utilisez
filenamepour remplacer le nom de téléversement lorsqu’il doit correspondre à la référence de pièce jointe
- ajoutez
components.modalavec jusqu’à 5 champs - types de champ :
text,checkbox,radio,select,role-select,user-select - OpenClaw ajoute automatiquement un bouton déclencheur
Contrôle d’accès et routage
- Politique DM
- Politique de serveur
- Mentions et DM de groupe
channels.discord.dmPolicy contrôle l’accès DM (hérité : channels.discord.dm.policy) :pairing(par défaut)allowlistopen(nécessite quechannels.discord.allowFrominclue"*"; hérité :channels.discord.dm.allowFrom)disabled
pairing).Priorité multi-comptes :channels.discord.accounts.default.allowFroms’applique uniquement au comptedefault.- Les comptes nommés héritent de
channels.discord.allowFromlorsque leur propreallowFromn’est pas défini. - Les comptes nommés n’héritent pas de
channels.discord.accounts.default.allowFrom.
user:<id>- mention
<@id>
Routage d’agent basé sur les rôles
Utilisezbindings[].match.roles pour router les membres de serveurs Discord vers différents agents selon l’ID de rôle. Les liaisons basées sur les rôles n’acceptent que les ID de rôle et sont évaluées après les liaisons pair ou parent-pair et avant les liaisons serveur seules. Si une liaison définit aussi d’autres champs de correspondance (par exemple peer + guildId + roles), tous les champs configurés doivent correspondre.
Configuration du Portail développeur
Créer une application et un bot
Créer une application et un bot
- Portail développeur Discord -> Applications -> New Application
- Bot -> Add Bot
- Copiez le jeton du bot
Intents privilégiés
Intents privilégiés
- Message Content Intent
- Server Members Intent (recommandé)
setPresence) ne nécessite pas d’activer les mises à jour de présence pour les membres.Portées OAuth et autorisations de base
Portées OAuth et autorisations de base
- portées :
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (facultatif)
Administrator sauf nécessité explicite.Copier les ID
Copier les ID
- l’ID du serveur
- l’ID du canal
- l’ID de l’utilisateur
Commandes natives et authentification des commandes
commands.nativevaut par défaut"auto"et est activé pour Discord.- Remplacement par canal :
channels.discord.commands.native. commands.native=falseefface explicitement les commandes natives Discord précédemment enregistrées.- L’authentification des commandes natives utilise les mêmes listes d’autorisation/politiques Discord que la gestion normale des messages.
- Les commandes peuvent toujours être visibles dans l’interface Discord pour les utilisateurs non autorisés ; l’exécution applique quand même l’authentification OpenClaw et renvoie « non autorisé ».
ephemeral: true
Détails des fonctionnalités
Balises de réponse et réponses natives
Balises de réponse et réponses natives
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode :off(par défaut)firstall
off désactive le fil de réponse implicite. Les balises explicites [[reply_to_*]] restent honorées.Les ID de message sont exposés dans le contexte/l’historique afin que les agents puissent cibler des messages spécifiques.Aperçu du flux en direct
Aperçu du flux en direct
channels.discord.streamingcontrôle la diffusion d’aperçu (off|partial|block|progress, par défaut :off).- La valeur par défaut reste
offcar les modifications d’aperçu Discord peuvent atteindre rapidement les limites de débit, en particulier lorsque plusieurs bots ou passerelles partagent le même compte ou trafic de serveur. progressest accepté pour la cohérence inter-canaux et est mappé àpartialsur Discord.channels.discord.streamModeest un alias hérité et est migré automatiquement.partialmodifie un seul message d’aperçu au fil de l’arrivée des jetons.blockémet des morceaux de taille brouillon (utilisezdraftChunkpour ajuster la taille et les points de coupure).
block (bornées par channels.discord.textChunkLimit) :Historique, contexte et comportement des fils
Historique, contexte et comportement des fils
channels.discord.historyLimitpar défaut20- solution de repli :
messages.groupChat.historyLimit 0désactive
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- les fils Discord sont routés comme des sessions de canal
- les métadonnées du fil parent peuvent être utilisées pour la liaison à la session parente
- la configuration du fil hérite de celle du canal parent sauf si une entrée spécifique au fil existe
Sessions liées à un fil pour les sous-agents
Sessions liées à un fil pour les sous-agents
/focus <target>lie le fil actuel/nouveau à une cible de sous-agent/session/unfocussupprime la liaison du fil actuel/agentsaffiche les exécutions actives et l’état de liaison/session idle <duration|off>inspecte/met à jour la suppression automatique du focus par inactivité pour les liaisons ciblées/session max-age <duration|off>inspecte/met à jour l’âge maximal strict pour les liaisons ciblées
session.threadBindings.*définit les valeurs par défaut globales.channels.discord.threadBindings.*remplace le comportement Discord.spawnSubagentSessionsdoit être à true pour créer/lier automatiquement des fils poursessions_spawn({ thread: true }).spawnAcpSessionsdoit être à true pour créer/lier automatiquement des fils pour ACP (/acp spawn ... --thread ...ousessions_spawn({ runtime: "acp", thread: true })).- Si les liaisons de fil sont désactivées pour un compte,
/focuset les opérations associées ne sont pas disponibles.
Liaisons persistantes de canal ACP
Liaisons persistantes de canal ACP
bindings[]avectype: "acp"etmatch.channel: "discord"
/acp spawn codex --bind herelie le canal ou le fil Discord actuel sur place et maintient le routage des messages futurs vers la même session ACP.- Cela peut toujours vouloir dire « démarrer une nouvelle session ACP Codex », mais cela ne crée pas en soi un nouveau fil Discord. Le canal existant reste la surface de discussion.
- Codex peut toujours s’exécuter dans son propre
cwdou espace de travail backend sur disque. Cet espace de travail est un état d’exécution, pas un fil Discord. - Les messages de fil peuvent hériter de la liaison ACP du canal parent.
- Dans un canal ou fil lié,
/newet/resetréinitialisent la même session ACP sur place. - Les liaisons de fil temporaires continuent de fonctionner et peuvent remplacer la résolution de cible tant qu’elles sont actives.
spawnAcpSessionsn’est requis que lorsque OpenClaw doit créer/lier un fil enfant via--thread auto|here. Il n’est pas requis pour/acp spawn ... --bind heredans le canal actuel.
Notifications de réaction
Notifications de réaction
offown(par défaut)allallowlist(utiliseguilds.<id>.users)
Réactions d’accusé de réception
Réactions d’accusé de réception
ackReaction envoie un emoji d’accusé de réception pendant qu’OpenClaw traite un message entrant.Ordre de résolution :channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- solution de repli sur l’emoji d’identité de l’agent (
agents.list[].identity.emoji, sinon ”👀”)
- Discord accepte les emoji unicode ou les noms d’emoji personnalisés.
- Utilisez
""pour désactiver la réaction pour un canal ou un compte.
Écritures de configuration
Écritures de configuration
/config set|unset (lorsque les fonctionnalités de commande sont activées).Désactiver :Proxy Gateway
Proxy Gateway
channels.discord.proxy.Prise en charge de PluralKit
Prise en charge de PluralKit
- les listes d’autorisation peuvent utiliser
pk:<memberId> - les noms d’affichage des membres ne sont mis en correspondance par nom/slug que lorsque
channels.discord.dangerouslyAllowNameMatching: true - les recherches utilisent l’ID de message d’origine et sont limitées à une fenêtre temporelle
- si la recherche échoue, les messages proxifiés sont traités comme des messages de bot et ignorés sauf si
allowBots=true
Configuration de la présence
Configuration de la présence
- 0 : Playing
- 1 : Streaming (nécessite
activityUrl) - 2 : Listening
- 3 : Watching
- 4 : Custom (utilise le texte d’activité comme état du statut ; l’emoji est facultatif)
- 5 : Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(prend en charge l’espace réservé{reason})
Approbations dans Discord
Approbations dans Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(facultatif ; revient àcommands.ownerAllowFromlorsque possible)channels.discord.execApprovals.target(dm|channel|both, par défaut :dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled n’est pas défini ou vaut "auto" et qu’au moins un approbateur peut être résolu, soit depuis execApprovals.approvers, soit depuis commands.ownerAllowFrom. Discord ne déduit pas les approbateurs d’exécution à partir de allowFrom du canal, de l’ancien dm.allowFrom ou de defaultTo en message direct. Définissez enabled: false pour désactiver explicitement Discord comme client d’approbation natif.Lorsque target vaut channel ou both, l’invite d’approbation est visible dans le canal. Seuls les approbateurs résolus peuvent utiliser les boutons ; les autres utilisateurs reçoivent un refus éphémère. Les invites d’approbation incluent le texte de la commande ; n’activez donc la livraison dans le canal que dans des canaux de confiance. Si l’ID du canal ne peut pas être dérivé de la clé de session, OpenClaw revient à une livraison par DM.Discord rend également les boutons d’approbation partagés utilisés par d’autres canaux de discussion. L’adaptateur Discord natif ajoute principalement le routage DM des approbateurs et la diffusion au canal.
Lorsque ces boutons sont présents, ils constituent l’expérience d’approbation principale ; OpenClaw
ne doit inclure une commande manuelle /approve que lorsque le résultat de l’outil indique
que les approbations de chat ne sont pas disponibles ou que l’approbation manuelle est la seule voie.L’authentification Gateway pour ce gestionnaire utilise le même contrat partagé de résolution des informations d’identification que les autres clients Gateway :- authentification locale prioritaire via env (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDpuisgateway.auth.*) - en mode local,
gateway.remote.*peut être utilisé en solution de repli uniquement lorsquegateway.auth.*n’est pas défini ; les SecretRef locaux configurés mais non résolus échouent en mode fermé - prise en charge du mode distant via
gateway.remote.*lorsque applicable - les remplacements d’URL sont sûrs vis-à-vis des remplacements : les remplacements CLI ne réutilisent pas les identifiants implicites, et les remplacements env utilisent uniquement les identifiants env
- les ID préfixés par
plugin:sont résolus viaplugin.approval.resolve. - les autres ID sont résolus via
exec.approval.resolve. - Discord n’effectue pas ici de saut supplémentaire de repli exec-vers-plugin ; le préfixe de l’ID décide de la méthode Gateway appelée.
Outils et barrières d’action
Les actions de message Discord incluent la messagerie, l’administration de canaux, la modération, la présence et les actions de métadonnées. Exemples principaux :- messagerie :
sendMessage,readMessages,editMessage,deleteMessage,threadReply - réactions :
react,reactions,emojiList - modération :
timeout,kick,ban - présence :
setPresence
channels.discord.actions.*.
Comportement par défaut des barrières :
| Groupe d’actions | Par défaut |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | activé |
| roles | désactivé |
| moderation | désactivé |
| presence | désactivé |
UI components v2
OpenClaw utilise Discord components v2 pour les approbations d’exécution et les marqueurs inter-contextes. Les actions de message Discord peuvent également acceptercomponents pour une UI personnalisée (avancé ; nécessite la construction d’une charge utile de composant via l’outil Discord), tandis que les anciens embeds restent disponibles mais ne sont pas recommandés.
channels.discord.ui.components.accentColordéfinit la couleur d’accent utilisée par les conteneurs de composants Discord (hexadécimal).- Définissez-la par compte avec
channels.discord.accounts.<id>.ui.components.accentColor. embedssont ignorés lorsque des components v2 sont présents.
Canaux vocaux
OpenClaw peut rejoindre des canaux vocaux Discord pour des conversations continues en temps réel. Cela est distinct des pièces jointes de message vocal. Exigences :- Activez les commandes natives (
commands.nativeouchannels.discord.commands.native). - Configurez
channels.discord.voice. - Le bot doit disposer des autorisations Connect + Speak dans le canal vocal cible.
/vc join|leave|status pour contrôler les sessions. La commande utilise l’agent par défaut du compte et suit les mêmes règles de liste d’autorisation et de politique de groupe que les autres commandes Discord.
Exemple de jonction automatique :
voice.ttsremplacemessages.ttsuniquement pour la lecture vocale.- Les tours de transcription vocale dérivent le statut de propriétaire à partir de Discord
allowFrom(oudm.allowFrom) ; les locuteurs non propriétaires ne peuvent pas accéder aux outils réservés au propriétaire (par exemplegatewayetcron). - La voix est activée par défaut ; définissez
channels.discord.voice.enabled=falsepour la désactiver. voice.daveEncryptionetvoice.decryptionFailureTolerancesont transmis aux options de jonction de@discordjs/voice.- Les valeurs par défaut de
@discordjs/voicesontdaveEncryption=trueetdecryptionFailureTolerance=24si elles ne sont pas définies. - OpenClaw surveille également les échecs de déchiffrement en réception et récupère automatiquement en quittant puis en rejoignant à nouveau le canal vocal après des échecs répétés dans une courte fenêtre.
- Si les journaux de réception affichent de façon répétée
DecryptionFailed(UnencryptedWhenPassthroughDisabled), cela peut correspondre au bug de réception amont@discordjs/voicesuivi dans discord.js #11419.
Messages vocaux
Les messages vocaux Discord affichent un aperçu de forme d’onde et nécessitent de l’audio OGG/Opus ainsi que des métadonnées. OpenClaw génère automatiquement la forme d’onde, mais il a besoin deffmpeg et ffprobe disponibles sur l’hôte Gateway pour inspecter et convertir les fichiers audio.
Exigences et contraintes :
- Fournissez un chemin de fichier local (les URL sont rejetées).
- Omettez le contenu texte (Discord n’autorise pas texte + message vocal dans la même charge utile).
- Tout format audio est accepté ; OpenClaw convertit en OGG/Opus si nécessaire.
Dépannage
Intents interdits utilisés ou le bot ne voit aucun message de serveur
Intents interdits utilisés ou le bot ne voit aucun message de serveur
- activez Message Content Intent
- activez Server Members Intent lorsque vous dépendez de la résolution utilisateur/membre
- redémarrez la passerelle après avoir modifié les intents
Messages de serveur bloqués de manière inattendue
Messages de serveur bloqués de manière inattendue
- vérifiez
groupPolicy - vérifiez la liste d’autorisation du serveur sous
channels.discord.guilds - si la map
channelsdu serveur existe, seuls les canaux listés sont autorisés - vérifiez le comportement
requireMentionet les motifs de mention
Require mention false mais toujours bloqué
Require mention false mais toujours bloqué
groupPolicy="allowlist"sans liste d’autorisation serveur/canal correspondanterequireMentionconfiguré au mauvais endroit (doit être souschannels.discord.guildsou dans l’entrée de canal)- expéditeur bloqué par la liste d’autorisation
usersdu serveur/canal
Les gestionnaires de longue durée expirent ou les réponses sont dupliquées
Les gestionnaires de longue durée expirent ou les réponses sont dupliquées
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- compte unique :
channels.discord.eventQueue.listenerTimeout - multi-comptes :
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- compte unique :
channels.discord.inboundWorker.runTimeoutMs - multi-comptes :
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - par défaut :
1800000(30 minutes) ; définissez0pour désactiver
eventQueue.listenerTimeout pour une initialisation lente du listener et inboundWorker.runTimeoutMs
uniquement si vous souhaitez une soupape de sécurité distincte pour les tours d’agent en file d’attente.Incohérences dans l’audit des autorisations
Incohérences dans l’audit des autorisations
channels status --probe ne fonctionnent que pour les ID de canal numériques.Si vous utilisez des clés slug, la correspondance d’exécution peut toujours fonctionner, mais la probe ne peut pas vérifier complètement les autorisations.Problèmes de DM et d’appairage
Problèmes de DM et d’appairage
- DM désactivé :
channels.discord.dm.enabled=false - politique DM désactivée :
channels.discord.dmPolicy="disabled"(hérité :channels.discord.dm.policy) - en attente d’approbation d’appairage en mode
pairing
Boucles bot à bot
Boucles bot à bot
channels.discord.allowBots=true, utilisez des règles strictes de mention et de liste d’autorisation pour éviter les boucles.
Préférez channels.discord.allowBots="mentions" pour n’accepter que les messages de bot qui mentionnent le bot.La STT vocale chute avec DecryptionFailed(...)
La STT vocale chute avec DecryptionFailed(...)
- gardez OpenClaw à jour (
openclaw update) afin que la logique de récupération de réception vocale Discord soit présente - confirmez
channels.discord.voice.daveEncryption=true(par défaut) - partez de
channels.discord.voice.decryptionFailureTolerance=24(valeur par défaut amont) et ajustez uniquement si nécessaire - surveillez les journaux pour :
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- si les échecs persistent après la reconnexion automatique, collectez les journaux et comparez-les à discord.js #11419
Pointeurs de référence de configuration
Référence principale : Champs Discord à fort signal :- démarrage/authentification :
enabled,token,accounts.*,allowBots - politique :
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - commande :
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - file d’événements :
eventQueue.listenerTimeout(budget du listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - worker entrant :
inboundWorker.runTimeoutMs - réponse/historique :
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - livraison :
textChunkLimit,chunkMode,maxLinesPerMessage - streaming :
streaming(alias hérité :streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - média/nouvelle tentative :
mediaMaxMb,retrymediaMaxMblimite les téléversements Discord sortants (par défaut :8MB)
- actions :
actions.* - présence :
activity,status,activityType,activityUrl - UI :
ui.components.accentColor - fonctionnalités :
threadBindings,bindings[]de niveau supérieur (type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Sécurité et opérations
- Traitez les jetons de bot comme des secrets (
DISCORD_BOT_TOKENde préférence dans les environnements supervisés). - Accordez les autorisations Discord minimales nécessaires.
- Si le déploiement/l’état des commandes est obsolète, redémarrez la passerelle et revérifiez avec
openclaw channels status --probe.