diff --git a/docs/channels/discord.md b/docs/channels/discord.md
index 392c734be94..ccf0d7dc282 100644
--- a/docs/channels/discord.md
+++ b/docs/channels/discord.md
@@ -1003,6 +1003,40 @@ openclaw logs --follow
+
+
+ Typical logs:
+
+ - `Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE`
+ - `Slow listener detected ...`
+
+ Canonical knob:
+
+ - single-account: `channels.discord.eventQueue.listenerTimeout`
+ - multi-account: `channels.discord.accounts..eventQueue.listenerTimeout`
+
+ Recommended baseline:
+
+```json5
+{
+ channels: {
+ discord: {
+ accounts: {
+ default: {
+ eventQueue: {
+ listenerTimeout: 120000,
+ },
+ },
+ },
+ },
+ },
+}
+```
+
+ Tune this first before adding alternate timeout controls elsewhere.
+
+
+
`channels status --probe` permission checks only work for numeric channel IDs.
@@ -1049,6 +1083,7 @@ High-signal Discord fields:
- startup/auth: `enabled`, `token`, `accounts.*`, `allowBots`
- policy: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*`
- command: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*`
+- event queue: `eventQueue.listenerTimeout` (canonical), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency`
- reply/history: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- delivery: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage`
- streaming: `streaming` (legacy alias: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce`
diff --git a/src/config/schema.help.ts b/src/config/schema.help.ts
index 22c50336188..0c44947a4bf 100644
--- a/src/config/schema.help.ts
+++ b/src/config/schema.help.ts
@@ -1417,6 +1417,12 @@ export const FIELD_HELP: Record = {
"channels.discord.retry.maxDelayMs": "Maximum retry delay cap in ms for Discord outbound calls.",
"channels.discord.retry.jitter": "Jitter factor (0-1) applied to Discord retry delays.",
"channels.discord.maxLinesPerMessage": "Soft max line count per Discord message (default: 17).",
+ "channels.discord.eventQueue.listenerTimeout":
+ "Canonical Discord listener timeout control in ms for gateway event handlers. Default is 120000 in OpenClaw; set per account via channels.discord.accounts..eventQueue.listenerTimeout.",
+ "channels.discord.eventQueue.maxQueueSize":
+ "Optional Discord EventQueue capacity override (max queued events before backpressure). Set per account via channels.discord.accounts..eventQueue.maxQueueSize.",
+ "channels.discord.eventQueue.maxConcurrency":
+ "Optional Discord EventQueue concurrency override (max concurrent handler executions). Set per account via channels.discord.accounts..eventQueue.maxConcurrency.",
"channels.discord.threadBindings.enabled":
"Enable Discord thread binding features (/focus, bound-thread routing/delivery, and thread-bound subagent sessions). Overrides session.threadBindings.enabled when set.",
"channels.discord.threadBindings.idleHours":
diff --git a/src/config/schema.labels.ts b/src/config/schema.labels.ts
index de1bcbed3eb..a8a83ecc1b0 100644
--- a/src/config/schema.labels.ts
+++ b/src/config/schema.labels.ts
@@ -703,6 +703,9 @@ export const FIELD_LABELS: Record = {
"channels.discord.retry.maxDelayMs": "Discord Retry Max Delay (ms)",
"channels.discord.retry.jitter": "Discord Retry Jitter",
"channels.discord.maxLinesPerMessage": "Discord Max Lines Per Message",
+ "channels.discord.eventQueue.listenerTimeout": "Discord EventQueue Listener Timeout (ms)",
+ "channels.discord.eventQueue.maxQueueSize": "Discord EventQueue Max Queue Size",
+ "channels.discord.eventQueue.maxConcurrency": "Discord EventQueue Max Concurrency",
"channels.discord.threadBindings.enabled": "Discord Thread Binding Enabled",
"channels.discord.threadBindings.idleHours": "Discord Thread Binding Idle Timeout (hours)",
"channels.discord.threadBindings.maxAgeHours": "Discord Thread Binding Max Age (hours)",