perf(test): lazy-load discord preflight runtimes

This commit is contained in:
Vincent Koc 2026-04-01 23:37:06 +09:00
parent 3a7d0938c6
commit 3d647f14d0
1 changed files with 49 additions and 7 deletions

View File

@ -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<typeof import("openclaw/plugin-sdk/conversation-runtime")>
| undefined;
let pluralkitRuntimePromise: Promise<typeof import("../pluralkit.js")> | undefined;
let discordSendRuntimePromise: Promise<typeof import("../send.js")> | undefined;
let preflightAudioRuntimePromise: Promise<typeof import("./preflight-audio.js")> | undefined;
let systemEventsRuntimePromise: Promise<typeof import("./system-events.js")> | undefined;
let discordThreadingRuntimePromise: Promise<typeof import("./threading.js")> | 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<ReturnType<typeof fetchPluralKitMessageInfo>> = null;
let pluralkitInfo: Awaited<ReturnType<typeof import("../pluralkit.js").fetchPluralKitMessageInfo>> =
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`);