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)",