mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 22:08:26 +00:00
Discord: handle gateway 4014 close
This commit is contained in:
@@ -8,6 +8,7 @@ Docs: https://docs.openclaw.ai
|
|||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
- Discord/Gateway: handle close code 4014 (missing privileged gateway intents) without crashing the gateway. Thanks @thewilloftheshadow.
|
||||||
- Security/Net: strip sensitive headers (`Authorization`, `Proxy-Authorization`, `Cookie`, `Cookie2`) on cross-origin redirects in `fetchWithSsrFGuard` to prevent credential forwarding across origin boundaries. (#20313) Thanks @afurm.
|
- Security/Net: strip sensitive headers (`Authorization`, `Proxy-Authorization`, `Cookie`, `Cookie2`) on cross-origin redirects in `fetchWithSsrFGuard` to prevent credential forwarding across origin boundaries. (#20313) Thanks @afurm.
|
||||||
- Auto-reply/Runner: emit `onAgentRunStart` only after agent lifecycle or tool activity begins (and only once per run), so fallback preflight errors no longer mark runs as started. (#21165) Thanks @shakkernerd.
|
- Auto-reply/Runner: emit `onAgentRunStart` only after agent lifecycle or tool activity begins (and only once per run), so fallback preflight errors no longer mark runs as started. (#21165) Thanks @shakkernerd.
|
||||||
- Auto-reply/Prompt caching: restore prefix-cache stability by keeping inbound system metadata session-stable and moving per-message IDs (`message_id`, `message_id_full`, `reply_to_id`, `sender_id`) into untrusted conversation context. (#20597) Thanks @anisoptera.
|
- Auto-reply/Prompt caching: restore prefix-cache stability by keeping inbound system metadata session-stable and moving per-message IDs (`message_id`, `message_id_full`, `reply_to_id`, `sender_id`) into untrusted conversation context. (#20597) Thanks @anisoptera.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
type BaseMessageInteractiveComponent,
|
type BaseMessageInteractiveComponent,
|
||||||
type Modal,
|
type Modal,
|
||||||
} from "@buape/carbon";
|
} from "@buape/carbon";
|
||||||
import type { GatewayPlugin } from "@buape/carbon/gateway";
|
import { GatewayCloseCodes, type GatewayPlugin } from "@buape/carbon/gateway";
|
||||||
import { Routes } from "discord-api-types/v10";
|
import { Routes } from "discord-api-types/v10";
|
||||||
import { resolveTextChunkLimit } from "../../auto-reply/chunk.js";
|
import { resolveTextChunkLimit } from "../../auto-reply/chunk.js";
|
||||||
import { listNativeCommandSpecsForConfig } from "../../auto-reply/commands-registry.js";
|
import { listNativeCommandSpecsForConfig } from "../../auto-reply/commands-registry.js";
|
||||||
@@ -167,6 +167,16 @@ function formatDiscordDeployErrorDetails(err: unknown): string {
|
|||||||
return details.length > 0 ? ` (${details.join(", ")})` : "";
|
return details.length > 0 ? ` (${details.join(", ")})` : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DISCORD_DISALLOWED_INTENTS_CODE = GatewayCloseCodes.DisallowedIntents;
|
||||||
|
|
||||||
|
function isDiscordDisallowedIntentsError(err: unknown): boolean {
|
||||||
|
if (!err) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const message = formatErrorMessage(err);
|
||||||
|
return message.includes(String(DISCORD_DISALLOWED_INTENTS_CODE));
|
||||||
|
}
|
||||||
|
|
||||||
export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) {
|
export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) {
|
||||||
const cfg = opts.config ?? loadConfig();
|
const cfg = opts.config ?? loadConfig();
|
||||||
const account = resolveDiscordAccount({
|
const account = resolveDiscordAccount({
|
||||||
@@ -643,6 +653,8 @@ export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) {
|
|||||||
}, HELLO_TIMEOUT_MS);
|
}, HELLO_TIMEOUT_MS);
|
||||||
};
|
};
|
||||||
gatewayEmitter?.on("debug", onGatewayDebug);
|
gatewayEmitter?.on("debug", onGatewayDebug);
|
||||||
|
// Disallowed intents (4014) should stop the provider without crashing the gateway.
|
||||||
|
let sawDisallowedIntents = false;
|
||||||
try {
|
try {
|
||||||
await waitForDiscordGatewayStop({
|
await waitForDiscordGatewayStop({
|
||||||
gateway: gateway
|
gateway: gateway
|
||||||
@@ -653,15 +665,30 @@ export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) {
|
|||||||
: undefined,
|
: undefined,
|
||||||
abortSignal,
|
abortSignal,
|
||||||
onGatewayError: (err) => {
|
onGatewayError: (err) => {
|
||||||
|
if (isDiscordDisallowedIntentsError(err)) {
|
||||||
|
sawDisallowedIntents = true;
|
||||||
|
runtime.error?.(
|
||||||
|
danger(
|
||||||
|
"discord: gateway closed with code 4014 (missing privileged gateway intents). Enable the required intents in the Discord Developer Portal or disable them in config.",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
runtime.error?.(danger(`discord gateway error: ${String(err)}`));
|
runtime.error?.(danger(`discord gateway error: ${String(err)}`));
|
||||||
},
|
},
|
||||||
shouldStopOnError: (err) => {
|
shouldStopOnError: (err) => {
|
||||||
const message = String(err);
|
const message = String(err);
|
||||||
return (
|
return (
|
||||||
message.includes("Max reconnect attempts") || message.includes("Fatal Gateway error")
|
message.includes("Max reconnect attempts") ||
|
||||||
|
message.includes("Fatal Gateway error") ||
|
||||||
|
isDiscordDisallowedIntentsError(err)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
} catch (err) {
|
||||||
|
if (!sawDisallowedIntents && !isDiscordDisallowedIntentsError(err)) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
unregisterGateway(account.accountId);
|
unregisterGateway(account.accountId);
|
||||||
stopGatewayLogging();
|
stopGatewayLogging();
|
||||||
|
|||||||
Reference in New Issue
Block a user