From abb21d91637b86907d8c7edfbb883ae3470c028f Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 16 Mar 2026 02:05:10 -0700 Subject: [PATCH] Runtime: lazy-load Discord channel ops --- .../runtime/runtime-discord-ops.runtime.ts | 21 +++ src/plugins/runtime/runtime-discord.ts | 169 ++++++++++++++---- 2 files changed, 151 insertions(+), 39 deletions(-) create mode 100644 src/plugins/runtime/runtime-discord-ops.runtime.ts diff --git a/src/plugins/runtime/runtime-discord-ops.runtime.ts b/src/plugins/runtime/runtime-discord-ops.runtime.ts new file mode 100644 index 00000000000..d10daac5a35 --- /dev/null +++ b/src/plugins/runtime/runtime-discord-ops.runtime.ts @@ -0,0 +1,21 @@ +export { auditDiscordChannelPermissions } from "../../../extensions/discord/src/audit.js"; +export { + listDiscordDirectoryGroupsLive, + listDiscordDirectoryPeersLive, +} from "../../../extensions/discord/src/directory-live.js"; +export { monitorDiscordProvider } from "../../../extensions/discord/src/monitor.js"; +export { probeDiscord } from "../../../extensions/discord/src/probe.js"; +export { resolveDiscordChannelAllowlist } from "../../../extensions/discord/src/resolve-channels.js"; +export { resolveDiscordUserAllowlist } from "../../../extensions/discord/src/resolve-users.js"; +export { + createThreadDiscord, + deleteMessageDiscord, + editChannelDiscord, + editMessageDiscord, + pinMessageDiscord, + sendDiscordComponentMessage, + sendMessageDiscord, + sendPollDiscord, + sendTypingDiscord, + unpinMessageDiscord, +} from "../../../extensions/discord/src/send.js"; diff --git a/src/plugins/runtime/runtime-discord.ts b/src/plugins/runtime/runtime-discord.ts index 6aadba32a9a..ae302ad0e5f 100644 --- a/src/plugins/runtime/runtime-discord.ts +++ b/src/plugins/runtime/runtime-discord.ts @@ -1,10 +1,4 @@ -import { auditDiscordChannelPermissions } from "../../../extensions/discord/src/audit.js"; import { discordMessageActions } from "../../../extensions/discord/src/channel-actions.js"; -import { - listDiscordDirectoryGroupsLive, - listDiscordDirectoryPeersLive, -} from "../../../extensions/discord/src/directory-live.js"; -import { monitorDiscordProvider } from "../../../extensions/discord/src/monitor.js"; import { getThreadBindingManager, resolveThreadBindingIdleTimeoutMs, @@ -15,37 +9,134 @@ import { setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey, } from "../../../extensions/discord/src/monitor/thread-bindings.js"; -import { probeDiscord } from "../../../extensions/discord/src/probe.js"; -import { resolveDiscordChannelAllowlist } from "../../../extensions/discord/src/resolve-channels.js"; -import { resolveDiscordUserAllowlist } from "../../../extensions/discord/src/resolve-users.js"; -import { - createThreadDiscord, - deleteMessageDiscord, - editChannelDiscord, - editMessageDiscord, - pinMessageDiscord, - sendDiscordComponentMessage, - sendMessageDiscord, - sendPollDiscord, - sendTypingDiscord, - unpinMessageDiscord, -} from "../../../extensions/discord/src/send.js"; import { createDiscordTypingLease } from "./runtime-discord-typing.js"; import type { PluginRuntimeChannel } from "./types-channel.js"; +let runtimeDiscordOpsPromise: Promise | null = + null; + +function loadRuntimeDiscordOps() { + runtimeDiscordOpsPromise ??= import("./runtime-discord-ops.runtime.js"); + return runtimeDiscordOpsPromise; +} + +const auditChannelPermissionsLazy: PluginRuntimeChannel["discord"]["auditChannelPermissions"] = + async (...args) => { + const { auditDiscordChannelPermissions } = await loadRuntimeDiscordOps(); + return auditDiscordChannelPermissions(...args); + }; + +const listDirectoryGroupsLiveLazy: PluginRuntimeChannel["discord"]["listDirectoryGroupsLive"] = + async (...args) => { + const { listDiscordDirectoryGroupsLive } = await loadRuntimeDiscordOps(); + return listDiscordDirectoryGroupsLive(...args); + }; + +const listDirectoryPeersLiveLazy: PluginRuntimeChannel["discord"]["listDirectoryPeersLive"] = + async (...args) => { + const { listDiscordDirectoryPeersLive } = await loadRuntimeDiscordOps(); + return listDiscordDirectoryPeersLive(...args); + }; + +const probeDiscordLazy: PluginRuntimeChannel["discord"]["probeDiscord"] = async (...args) => { + const { probeDiscord } = await loadRuntimeDiscordOps(); + return probeDiscord(...args); +}; + +const resolveChannelAllowlistLazy: PluginRuntimeChannel["discord"]["resolveChannelAllowlist"] = + async (...args) => { + const { resolveDiscordChannelAllowlist } = await loadRuntimeDiscordOps(); + return resolveDiscordChannelAllowlist(...args); + }; + +const resolveUserAllowlistLazy: PluginRuntimeChannel["discord"]["resolveUserAllowlist"] = async ( + ...args +) => { + const { resolveDiscordUserAllowlist } = await loadRuntimeDiscordOps(); + return resolveDiscordUserAllowlist(...args); +}; + +const sendComponentMessageLazy: PluginRuntimeChannel["discord"]["sendComponentMessage"] = async ( + ...args +) => { + const { sendDiscordComponentMessage } = await loadRuntimeDiscordOps(); + return sendDiscordComponentMessage(...args); +}; + +const sendMessageDiscordLazy: PluginRuntimeChannel["discord"]["sendMessageDiscord"] = async ( + ...args +) => { + const { sendMessageDiscord } = await loadRuntimeDiscordOps(); + return sendMessageDiscord(...args); +}; + +const sendPollDiscordLazy: PluginRuntimeChannel["discord"]["sendPollDiscord"] = async (...args) => { + const { sendPollDiscord } = await loadRuntimeDiscordOps(); + return sendPollDiscord(...args); +}; + +const monitorDiscordProviderLazy: PluginRuntimeChannel["discord"]["monitorDiscordProvider"] = + async (...args) => { + const { monitorDiscordProvider } = await loadRuntimeDiscordOps(); + return monitorDiscordProvider(...args); + }; + +const sendTypingDiscordLazy: PluginRuntimeChannel["discord"]["typing"]["pulse"] = async ( + ...args +) => { + const { sendTypingDiscord } = await loadRuntimeDiscordOps(); + return sendTypingDiscord(...args); +}; + +const editMessageDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["editMessage"] = + async (...args) => { + const { editMessageDiscord } = await loadRuntimeDiscordOps(); + return editMessageDiscord(...args); + }; + +const deleteMessageDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["deleteMessage"] = + async (...args) => { + const { deleteMessageDiscord } = await loadRuntimeDiscordOps(); + return deleteMessageDiscord(...args); + }; + +const pinMessageDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["pinMessage"] = + async (...args) => { + const { pinMessageDiscord } = await loadRuntimeDiscordOps(); + return pinMessageDiscord(...args); + }; + +const unpinMessageDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["unpinMessage"] = + async (...args) => { + const { unpinMessageDiscord } = await loadRuntimeDiscordOps(); + return unpinMessageDiscord(...args); + }; + +const createThreadDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["createThread"] = + async (...args) => { + const { createThreadDiscord } = await loadRuntimeDiscordOps(); + return createThreadDiscord(...args); + }; + +const editChannelDiscordLazy: PluginRuntimeChannel["discord"]["conversationActions"]["editChannel"] = + async (...args) => { + const { editChannelDiscord } = await loadRuntimeDiscordOps(); + return editChannelDiscord(...args); + }; + export function createRuntimeDiscord(): PluginRuntimeChannel["discord"] { return { messageActions: discordMessageActions, - auditChannelPermissions: auditDiscordChannelPermissions, - listDirectoryGroupsLive: listDiscordDirectoryGroupsLive, - listDirectoryPeersLive: listDiscordDirectoryPeersLive, - probeDiscord, - resolveChannelAllowlist: resolveDiscordChannelAllowlist, - resolveUserAllowlist: resolveDiscordUserAllowlist, - sendComponentMessage: sendDiscordComponentMessage, - sendMessageDiscord, - sendPollDiscord, - monitorDiscordProvider, + auditChannelPermissions: auditChannelPermissionsLazy, + listDirectoryGroupsLive: listDirectoryGroupsLiveLazy, + listDirectoryPeersLive: listDirectoryPeersLiveLazy, + probeDiscord: probeDiscordLazy, + resolveChannelAllowlist: resolveChannelAllowlistLazy, + resolveUserAllowlist: resolveUserAllowlistLazy, + sendComponentMessage: sendComponentMessageLazy, + sendMessageDiscord: sendMessageDiscordLazy, + sendPollDiscord: sendPollDiscordLazy, + monitorDiscordProvider: monitorDiscordProviderLazy, threadBindings: { getManager: getThreadBindingManager, resolveIdleTimeoutMs: resolveThreadBindingIdleTimeoutMs, @@ -57,7 +148,7 @@ export function createRuntimeDiscord(): PluginRuntimeChannel["discord"] { unbindBySessionKey: unbindThreadBindingsBySessionKey, }, typing: { - pulse: sendTypingDiscord, + pulse: sendTypingDiscordLazy, start: async ({ channelId, accountId, cfg, intervalMs }) => await createDiscordTypingLease({ channelId, @@ -65,16 +156,16 @@ export function createRuntimeDiscord(): PluginRuntimeChannel["discord"] { cfg, intervalMs, pulse: async ({ channelId, accountId, cfg }) => - void (await sendTypingDiscord(channelId, { accountId, cfg })), + void (await sendTypingDiscordLazy(channelId, { accountId, cfg })), }), }, conversationActions: { - editMessage: editMessageDiscord, - deleteMessage: deleteMessageDiscord, - pinMessage: pinMessageDiscord, - unpinMessage: unpinMessageDiscord, - createThread: createThreadDiscord, - editChannel: editChannelDiscord, + editMessage: editMessageDiscordLazy, + deleteMessage: deleteMessageDiscordLazy, + pinMessage: pinMessageDiscordLazy, + unpinMessage: unpinMessageDiscordLazy, + createThread: createThreadDiscordLazy, + editChannel: editChannelDiscordLazy, }, }; }