From e249a852ae3b1b2f1c6496aa50eba1de8c4ee2d1 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 4 Apr 2026 11:38:56 +0900 Subject: [PATCH] refactor(slack): lazy-load async channel seams --- extensions/slack/src/channel.ts | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/extensions/slack/src/channel.ts b/extensions/slack/src/channel.ts index 21096817291..d0f1f6e5d11 100644 --- a/extensions/slack/src/channel.ts +++ b/extensions/slack/src/channel.ts @@ -46,14 +46,12 @@ import { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, } from "./directory-config.js"; -import { listSlackDirectoryGroupsLive, listSlackDirectoryPeersLive } from "./directory-live.js"; import { shouldSuppressLocalSlackExecApprovalPrompt } from "./exec-approvals.js"; import { resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy } from "./group-policy.js"; import { isSlackInteractiveRepliesEnabled } from "./interactive-replies.js"; import { SLACK_TEXT_LIMIT } from "./limits.js"; -import { monitorSlackProvider } from "./monitor.js"; import { slackOutbound } from "./outbound-adapter.js"; -import { probeSlack, type SlackProbe } from "./probe.js"; +import type { SlackProbe } from "./probe.js"; import { resolveSlackReplyBlocks } from "./reply-blocks.js"; import { resolveSlackChannelAllowlist } from "./resolve-channels.js"; import { resolveSlackUserAllowlist } from "./resolve-users.js"; @@ -93,10 +91,6 @@ const resolveSlackDmPolicy = createScopedDmSecurityResolver | undefined; let slackSendRuntimePromise: Promise | undefined; +let slackProbeModulePromise: Promise | undefined; +let slackMonitorModulePromise: Promise | undefined; +let slackDirectoryLiveModulePromise: Promise | undefined; async function loadSlackActionRuntime() { slackActionRuntimePromise ??= import("./action-runtime.runtime.js"); @@ -136,6 +133,21 @@ async function loadSlackSendRuntime() { return await slackSendRuntimePromise; } +async function loadSlackProbeModule() { + slackProbeModulePromise ??= import("./probe.js"); + return await slackProbeModulePromise; +} + +async function loadSlackMonitorModule() { + slackMonitorModulePromise ??= import("./monitor.js"); + return await slackMonitorModulePromise; +} + +async function loadSlackDirectoryLiveModule() { + slackDirectoryLiveModulePromise ??= import("./directory-live.js"); + return await slackDirectoryLiveModulePromise; +} + async function resolveSlackSendContext(params: { cfg: Parameters[0]["cfg"]; accountId?: string; @@ -341,10 +353,7 @@ export const slackPlugin: ChannelPlugin = crea listPeers: async (params) => listSlackDirectoryPeersFromConfig(params), listGroups: async (params) => listSlackDirectoryGroupsFromConfig(params), ...createRuntimeDirectoryLiveAdapter({ - getRuntime: () => ({ - listDirectoryGroupsLive: listSlackDirectoryGroupsLive, - listDirectoryPeersLive: listSlackDirectoryPeersLive, - }), + getRuntime: loadSlackDirectoryLiveModule, listPeersLive: (runtime) => runtime.listDirectoryPeersLive, listGroupsLive: (runtime) => runtime.listDirectoryGroupsLive, }), @@ -403,7 +412,7 @@ export const slackPlugin: ChannelPlugin = crea if (!token) { return { ok: false, error: "missing token" }; } - return await resolveSlackProbe()(token, timeoutMs); + return await (await loadSlackProbeModule()).probeSlack(token, timeoutMs); }, formatCapabilitiesProbe: ({ probe }) => { const slackProbe = probe as SlackProbe | undefined; @@ -463,7 +472,7 @@ export const slackPlugin: ChannelPlugin = crea const botToken = account.botToken?.trim(); const appToken = account.appToken?.trim(); ctx.log?.info(`[${account.accountId}] starting provider`); - return monitorSlackProvider({ + return (await loadSlackMonitorModule()).monitorSlackProvider({ botToken: botToken ?? "", appToken: appToken ?? "", accountId: account.accountId,