From 6964e4acf7c11104657a2fde11084d037e3d95a0 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 4 Apr 2026 12:30:59 +0900 Subject: [PATCH] refactor(discord): lazy-load action and audit runtimes --- extensions/discord/src/channel-actions.runtime.ts | 1 + extensions/discord/src/channel-actions.ts | 14 ++++++++++++-- extensions/discord/src/channel.ts | 7 +++++-- extensions/discord/src/security-audit.runtime.ts | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 extensions/discord/src/channel-actions.runtime.ts create mode 100644 extensions/discord/src/security-audit.runtime.ts diff --git a/extensions/discord/src/channel-actions.runtime.ts b/extensions/discord/src/channel-actions.runtime.ts new file mode 100644 index 00000000000..093a90b1e1b --- /dev/null +++ b/extensions/discord/src/channel-actions.runtime.ts @@ -0,0 +1 @@ +export { handleDiscordMessageAction } from "./actions/handle-action.js"; diff --git a/extensions/discord/src/channel-actions.ts b/extensions/discord/src/channel-actions.ts index 559c8acaf77..d943b661cdb 100644 --- a/extensions/discord/src/channel-actions.ts +++ b/extensions/discord/src/channel-actions.ts @@ -14,9 +14,17 @@ import { listEnabledDiscordAccounts, resolveDiscordAccount, } from "./accounts.js"; -import { handleDiscordMessageAction } from "./actions/handle-action.js"; import { createDiscordMessageToolComponentsSchema } from "./message-tool-schema.js"; +let discordChannelActionsRuntimePromise: + | Promise + | undefined; + +async function loadDiscordChannelActionsRuntime() { + discordChannelActionsRuntimePromise ??= import("./channel-actions.runtime.js"); + return await discordChannelActionsRuntimePromise; +} + function resolveDiscordActionDiscovery(cfg: Parameters[0]) { const accounts = listTokenSourcedAccounts(listEnabledDiscordAccounts(cfg)); if (accounts.length === 0) { @@ -179,7 +187,9 @@ export const discordMessageActions: ChannelMessageActionAdapter = { toolContext, mediaLocalRoots, }) => { - return await handleDiscordMessageAction({ + return await ( + await loadDiscordChannelActionsRuntime() + ).handleDiscordMessageAction({ action, params, cfg, diff --git a/extensions/discord/src/channel.ts b/extensions/discord/src/channel.ts index fa77cae8c27..768e29b4f24 100644 --- a/extensions/discord/src/channel.ts +++ b/extensions/discord/src/channel.ts @@ -63,7 +63,6 @@ import { import { resolveDiscordOutboundSessionRoute } from "./outbound-session-route.js"; import type { DiscordProbe } from "./probe.js"; import { getDiscordRuntime } from "./runtime.js"; -import { collectDiscordSecurityAuditFindings } from "./security-audit.js"; import { normalizeExplicitDiscordSessionKey } from "./session-key-normalization.js"; import { discordSetupAdapter } from "./setup-core.js"; import { createDiscordPluginBase, discordConfigAdapter } from "./shared.js"; @@ -88,6 +87,9 @@ let discordCarbonModuleCache: DiscordCarbonModule | null = null; const loadDiscordDirectoryConfigModule = createLazyRuntimeModule( () => import("./directory-config.js"), ); +const loadDiscordSecurityAuditModule = createLazyRuntimeModule( + () => import("./security-audit.runtime.js"), +); const loadDiscordResolveChannelsModule = createLazyRuntimeModule( () => import("./resolve-channels.js"), ); @@ -793,7 +795,8 @@ export const discordPlugin: ChannelPlugin security: { resolveDmPolicy: resolveDiscordDmPolicy, collectWarnings: collectDiscordSecurityWarnings, - collectAuditFindings: collectDiscordSecurityAuditFindings, + collectAuditFindings: async (params) => + (await loadDiscordSecurityAuditModule()).collectDiscordSecurityAuditFindings(params), }, threading: { scopedAccountReplyToMode: { diff --git a/extensions/discord/src/security-audit.runtime.ts b/extensions/discord/src/security-audit.runtime.ts new file mode 100644 index 00000000000..b98f6c09304 --- /dev/null +++ b/extensions/discord/src/security-audit.runtime.ts @@ -0,0 +1 @@ +export { collectDiscordSecurityAuditFindings } from "./security-audit.js";