diff --git a/extensions/discord/src/channel.ts b/extensions/discord/src/channel.ts index 5f1d1903d01..5f4f50ef5be 100644 --- a/extensions/discord/src/channel.ts +++ b/extensions/discord/src/channel.ts @@ -38,7 +38,6 @@ import { listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, } from "./directory-config.js"; -import { listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive } from "./directory-live.js"; import { shouldSuppressLocalDiscordExecApprovalPrompt } from "./exec-approvals.js"; import { resolveDiscordGroupRequireMention, @@ -70,7 +69,6 @@ import { } from "./runtime-api.js"; import { getDiscordRuntime } from "./runtime.js"; import { collectDiscordSecurityAuditFindings } from "./security-audit.js"; -import { fetchChannelPermissionsDiscord, sendMessageDiscord, sendPollDiscord } from "./send.js"; import { normalizeExplicitDiscordSessionKey } from "./session-key-normalization.js"; import { discordSetupAdapter } from "./setup-core.js"; import { createDiscordPluginBase, discordConfigAdapter } from "./shared.js"; @@ -78,7 +76,7 @@ import { collectDiscordStatusIssues } from "./status-issues.js"; import { parseDiscordTarget } from "./targets.js"; import { DiscordUiContainer } from "./ui.js"; -type DiscordSendFn = typeof sendMessageDiscord; +type DiscordSendFn = typeof import("./send.js").sendMessageDiscord; type DiscordCarbonModule = typeof import("@buape/carbon"); type DiscordTextDisplay = InstanceType; type DiscordSeparator = InstanceType; @@ -88,6 +86,8 @@ let discordProviderRuntimePromise: | undefined; let discordProbeRuntimePromise: Promise | undefined; let discordAuditModulePromise: Promise | undefined; +let discordSendModulePromise: Promise | undefined; +let discordDirectoryLiveModulePromise: Promise | undefined; let discordCarbonModuleCache: DiscordCarbonModule | null = null; const require = createRequire(import.meta.url); @@ -107,6 +107,16 @@ async function loadDiscordAuditModule() { return await discordAuditModulePromise; } +async function loadDiscordSendModule() { + discordSendModulePromise ??= import("./send.js"); + return await discordSendModulePromise; +} + +async function loadDiscordDirectoryLiveModule() { + discordDirectoryLiveModulePromise ??= import("./directory-live.js"); + return await discordDirectoryLiveModulePromise; +} + function loadDiscordCarbonModule() { discordCarbonModuleCache ??= require("@buape/carbon") as DiscordCarbonModule; return discordCarbonModuleCache; @@ -132,11 +142,11 @@ function resolveOptionalDiscordRuntime() { } } -function resolveDiscordSend(deps?: { [channelId: string]: unknown }): DiscordSendFn { +async function resolveDiscordSend(deps?: { [channelId: string]: unknown }): Promise { return ( resolveOutboundSendDep(deps, "discord") ?? resolveOptionalDiscordRuntime()?.channel?.discord?.sendMessageDiscord ?? - sendMessageDiscord + (await loadDiscordSendModule()).sendMessageDiscord ); } @@ -447,10 +457,7 @@ export const discordPlugin: ChannelPlugin listPeers: async (params) => listDiscordDirectoryPeersFromConfig(params), listGroups: async (params) => listDiscordDirectoryGroupsFromConfig(params), ...createRuntimeDirectoryLiveAdapter({ - getRuntime: () => ({ - listDirectoryGroupsLive: listDiscordDirectoryGroupsLive, - listDirectoryPeersLive: listDiscordDirectoryPeersLive, - }), + getRuntime: loadDiscordDirectoryLiveModule, listPeersLive: (runtime) => runtime.listDirectoryPeersLive, listGroupsLive: (runtime) => runtime.listDirectoryGroupsLive, }), @@ -609,7 +616,9 @@ export const discordPlugin: ChannelPlugin }; } try { - const perms = await fetchChannelPermissionsDiscord(parsedTarget.id, { + const perms = await ( + await loadDiscordSendModule() + ).fetchChannelPermissionsDiscord(parsedTarget.id, { token, accountId: account.accountId ?? undefined, }); @@ -763,7 +772,7 @@ export const discordPlugin: ChannelPlugin message: PAIRING_APPROVED_MESSAGE, normalizeAllowEntry: createPairingPrefixStripper(/^(discord|user):/i), notify: async ({ id, message }) => { - await sendMessageDiscord(`user:${id}`, message); + await (await loadDiscordSendModule()).sendMessageDiscord(`user:${id}`, message); }, }, }, @@ -796,7 +805,7 @@ export const discordPlugin: ChannelPlugin attachedResults: { channel: "discord", sendText: async ({ cfg, to, text, accountId, deps, replyToId, silent }) => { - const send = resolveDiscordSend(deps); + const send = await resolveDiscordSend(deps); return await send(to, text, { verbose: false, cfg, @@ -816,7 +825,7 @@ export const discordPlugin: ChannelPlugin replyToId, silent, }) => { - const send = resolveDiscordSend(deps); + const send = await resolveDiscordSend(deps); return await send(to, text, { verbose: false, cfg, @@ -828,7 +837,9 @@ export const discordPlugin: ChannelPlugin }); }, sendPoll: async ({ cfg, to, poll, accountId, silent }) => - await sendPollDiscord(to, poll, { + await ( + await loadDiscordSendModule() + ).sendPollDiscord(to, poll, { cfg, accountId: accountId ?? undefined, silent: silent ?? undefined,