From 3d647f14d0da0398ca5c1858ae04dc6cf7af33e6 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 1 Apr 2026 23:37:06 +0900 Subject: [PATCH] perf(test): lazy-load discord preflight runtimes --- .../src/monitor/message-handler.preflight.ts | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/extensions/discord/src/monitor/message-handler.preflight.ts b/extensions/discord/src/monitor/message-handler.preflight.ts index 9abfd9c2e37..c71842e0162 100644 --- a/extensions/discord/src/monitor/message-handler.preflight.ts +++ b/extensions/discord/src/monitor/message-handler.preflight.ts @@ -14,7 +14,6 @@ import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-surface"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/config-runtime"; import type { SessionBindingRecord } from "openclaw/plugin-sdk/conversation-runtime"; -import * as conversationRuntime from "openclaw/plugin-sdk/conversation-runtime"; import { recordPendingHistoryEntryIfEnabled, type HistoryEntry, @@ -23,8 +22,6 @@ import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; import { logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env"; import { getChildLogger } from "openclaw/plugin-sdk/runtime-env"; import { logDebug } from "openclaw/plugin-sdk/text-runtime"; -import { fetchPluralKitMessageInfo } from "../pluralkit.js"; -import { sendMessageDiscord } from "../send.js"; import { isDiscordGroupAllowedByPolicy, normalizeDiscordSlug, @@ -51,16 +48,13 @@ import { resolveDiscordMessageChannelId, resolveDiscordMessageText, } from "./message-utils.js"; -import { resolveDiscordPreflightAudioMentionContext } from "./preflight-audio.js"; import { buildDiscordRoutePeer, resolveDiscordConversationRoute, resolveDiscordEffectiveRoute, } from "./route-resolution.js"; import { resolveDiscordSenderIdentity, resolveDiscordWebhookId } from "./sender-identity.js"; -import { resolveDiscordSystemEvent } from "./system-events.js"; import { isRecentlyUnboundThreadWebhookMessage } from "./thread-bindings.js"; -import { resolveDiscordThreadChannel, resolveDiscordThreadParentInfo } from "./threading.js"; export type { DiscordMessagePreflightContext, @@ -69,6 +63,45 @@ export type { const DISCORD_BOUND_THREAD_SYSTEM_PREFIXES = ["⚙️", "🤖", "🧰"]; +let conversationRuntimePromise: + | Promise + | undefined; +let pluralkitRuntimePromise: Promise | undefined; +let discordSendRuntimePromise: Promise | undefined; +let preflightAudioRuntimePromise: Promise | undefined; +let systemEventsRuntimePromise: Promise | undefined; +let discordThreadingRuntimePromise: Promise | undefined; + +async function loadConversationRuntime() { + conversationRuntimePromise ??= import("openclaw/plugin-sdk/conversation-runtime"); + return await conversationRuntimePromise; +} + +async function loadPluralKitRuntime() { + pluralkitRuntimePromise ??= import("../pluralkit.js"); + return await pluralkitRuntimePromise; +} + +async function loadDiscordSendRuntime() { + discordSendRuntimePromise ??= import("../send.js"); + return await discordSendRuntimePromise; +} + +async function loadPreflightAudioRuntime() { + preflightAudioRuntimePromise ??= import("./preflight-audio.js"); + return await preflightAudioRuntimePromise; +} + +async function loadSystemEventsRuntime() { + systemEventsRuntimePromise ??= import("./system-events.js"); + return await systemEventsRuntimePromise; +} + +async function loadDiscordThreadingRuntime() { + discordThreadingRuntimePromise ??= import("./threading.js"); + return await discordThreadingRuntimePromise; +} + function isPreflightAborted(abortSignal?: AbortSignal): boolean { return Boolean(abortSignal?.aborted); } @@ -256,9 +289,11 @@ export async function preflightDiscordMessage( const pluralkitConfig = params.discordConfig?.pluralkit; const webhookId = resolveDiscordWebhookId(message); const shouldCheckPluralKit = Boolean(pluralkitConfig?.enabled) && !webhookId; - let pluralkitInfo: Awaited> = null; + let pluralkitInfo: Awaited> = + null; if (shouldCheckPluralKit) { try { + const { fetchPluralKitMessageInfo } = await loadPluralKitRuntime(); pluralkitInfo = await fetchPluralKitMessageInfo({ messageId: message.id, config: pluralkitConfig, @@ -347,6 +382,8 @@ export async function preflightDiscordMessage( `discord pairing request sender=${author.id} tag=${formatDiscordUserTag(author)} (${allowMatchMeta})`, ); try { + const conversationRuntime = await loadConversationRuntime(); + const { sendMessageDiscord } = await loadDiscordSendRuntime(); await sendMessageDiscord( `user:${author.id}`, conversationRuntime.buildPairingReply({ @@ -401,6 +438,8 @@ export async function preflightDiscordMessage( ((isGuildMessage || isGroupDm) && message.channel && "name" in message.channel ? message.channel.name : undefined); + const { resolveDiscordThreadChannel, resolveDiscordThreadParentInfo } = + await loadDiscordThreadingRuntime(); const earlyThreadChannel = resolveDiscordThreadChannel({ isGuildMessage, message, @@ -430,6 +469,7 @@ export async function preflightDiscordMessage( ? params.data.rawMember.roles.map((roleId: string) => String(roleId)) : []; const freshCfg = loadConfig(); + const conversationRuntime = await loadConversationRuntime(); const route = resolveDiscordConversationRoute({ cfg: freshCfg, accountId: params.accountId, @@ -695,6 +735,7 @@ export async function preflightDiscordMessage( } // Only authorized guild senders should reach the expensive transcription path. + const { resolveDiscordPreflightAudioMentionContext } = await loadPreflightAudioRuntime(); const { hasTypedText, transcript: preflightTranscript } = await resolveDiscordPreflightAudioMentionContext({ message, @@ -846,6 +887,7 @@ export async function preflightDiscordMessage( guild: params.data.guild ?? undefined, channelName: channelName ?? messageChannelId, }); + const { resolveDiscordSystemEvent } = await loadSystemEventsRuntime(); const systemText = resolveDiscordSystemEvent(message, systemLocation); if (systemText) { logDebug(`[discord-preflight] drop: system event`);