From 82b4049744e948b9122a01d5299f10cf885dac66 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 27 Apr 2026 14:59:57 +0100 Subject: [PATCH] refactor: narrow discord slack runtime api barrels --- extensions/discord/runtime-api.ts | 218 ++++++++++++++++-- extensions/slack/runtime-api.ts | 47 +++- .../plugin-sdk-runtime-api-guardrails.test.ts | 47 ++-- 3 files changed, 264 insertions(+), 48 deletions(-) diff --git a/extensions/discord/runtime-api.ts b/extensions/discord/runtime-api.ts index f8bb04b3266..775127a620c 100644 --- a/extensions/discord/runtime-api.ts +++ b/extensions/discord/runtime-api.ts @@ -1,20 +1,200 @@ -export * from "./src/audit.js"; -export * from "./src/actions/runtime.js"; -export * from "./src/actions/runtime.moderation-shared.js"; -export * from "./src/actions/runtime.shared.js"; -export * from "./src/channel-actions.js"; -export * from "./src/directory-live.js"; -export * from "./src/monitor.js"; -export * from "./src/monitor/gateway-plugin.js"; -export * from "./src/monitor/gateway-registry.js"; -export * from "./src/monitor/presence-cache.js"; -export * from "./src/monitor/thread-bindings.js"; -export * from "./src/monitor/thread-bindings.manager.js"; -export * from "./src/monitor/timeouts.js"; -export * from "./src/probe.js"; -export * from "./src/resolve-channels.js"; -export * from "./src/resolve-users.js"; -export * from "./src/outbound-session-route.js"; -export * from "./src/send.js"; -export * from "./src/send.components.js"; +export { auditDiscordChannelPermissions, collectDiscordAuditChannelIds } from "./src/audit.js"; +export { handleDiscordAction } from "./src/actions/runtime.js"; +export { + isDiscordModerationAction, + readDiscordModerationCommand, + requiredGuildPermissionForModerationAction, + type DiscordModerationAction, + type DiscordModerationCommand, +} from "./src/actions/runtime.moderation-shared.js"; +export { + readDiscordChannelCreateParams, + readDiscordChannelEditParams, + readDiscordChannelMoveParams, + readDiscordParentIdParam, +} from "./src/actions/runtime.shared.js"; +export { discordMessageActions } from "./src/channel-actions.js"; +export { + listDiscordDirectoryGroupsLive, + listDiscordDirectoryPeersLive, +} from "./src/directory-live.js"; +export { + allowListMatches, + buildDiscordMediaPayload, + createDiscordMessageHandler, + createDiscordNativeCommand, + isDiscordGroupAllowedByPolicy, + monitorDiscordProvider, + normalizeDiscordAllowList, + normalizeDiscordSlug, + registerDiscordListener, + resolveDiscordChannelConfig, + resolveDiscordChannelConfigWithFallback, + resolveDiscordCommandAuthorized, + resolveDiscordGuildEntry, + resolveDiscordReplyTarget, + resolveDiscordShouldRequireMention, + resolveGroupDmAllow, + sanitizeDiscordThreadName, + shouldEmitDiscordReactionNotification, + type DiscordAllowList, + type DiscordChannelConfigResolved, + type DiscordGuildEntryResolved, + type DiscordMessageEvent, + type DiscordMessageHandler, + type MonitorDiscordOpts, +} from "./src/monitor.js"; +export { + createDiscordGatewayPlugin, + resolveDiscordGatewayIntents, + waitForDiscordGatewayPluginRegistration, +} from "./src/monitor/gateway-plugin.js"; +export { + clearGateways, + getGateway, + registerGateway, + unregisterGateway, +} from "./src/monitor/gateway-registry.js"; +export { + clearPresences, + getPresence, + presenceCacheSize, + setPresence, +} from "./src/monitor/presence-cache.js"; +export { + __testing, + autoBindSpawnedDiscordSubagent, + createNoopThreadBindingManager, + createThreadBindingManager, + formatThreadBindingDurationLabel, + getThreadBindingManager, + isRecentlyUnboundThreadWebhookMessage, + listThreadBindingsBySessionKey, + listThreadBindingsForAccount, + reconcileAcpThreadBindingsOnStartup, + resolveDiscordThreadBindingIdleTimeoutMs, + resolveDiscordThreadBindingMaxAgeMs, + resolveThreadBindingIdleTimeoutMs, + resolveThreadBindingInactivityExpiresAt, + resolveThreadBindingIntroText, + resolveThreadBindingMaxAgeExpiresAt, + resolveThreadBindingMaxAgeMs, + resolveThreadBindingPersona, + resolveThreadBindingPersonaFromRecord, + resolveThreadBindingsEnabled, + resolveThreadBindingThreadName, + setThreadBindingIdleTimeoutBySessionKey, + setThreadBindingMaxAgeBySessionKey, + unbindThreadBindingsBySessionKey, + type AcpThreadBindingReconciliationResult, + type ThreadBindingManager, + type ThreadBindingRecord, + type ThreadBindingTargetKind, +} from "./src/monitor/thread-bindings.js"; +export { + DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, + DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, + DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, + DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, + isAbortError, + mergeAbortSignals, + normalizeDiscordInboundWorkerTimeoutMs, + normalizeDiscordListenerTimeoutMs, + runDiscordTaskWithTimeout, +} from "./src/monitor/timeouts.js"; +export { + fetchDiscordApplicationId, + fetchDiscordApplicationSummary, + parseApplicationIdFromToken, + probeDiscord, + resolveDiscordPrivilegedIntentsFromFlags, + type DiscordApplicationSummary, + type DiscordPrivilegedIntentsSummary, + type DiscordPrivilegedIntentStatus, + type DiscordProbe, +} from "./src/probe.js"; +export { + resolveDiscordChannelAllowlist, + type DiscordChannelResolution, +} from "./src/resolve-channels.js"; +export { resolveDiscordUserAllowlist, type DiscordUserResolution } from "./src/resolve-users.js"; +export { + resolveDiscordOutboundSessionRoute, + type ResolveDiscordOutboundSessionRouteParams, +} from "./src/outbound-session-route.js"; +export { + addRoleDiscord, + banMemberDiscord, + createChannelDiscord, + createScheduledEventDiscord, + createThreadDiscord, + deleteChannelDiscord, + deleteMessageDiscord, + DiscordSendError, + editChannelDiscord, + editMessageDiscord, + fetchChannelInfoDiscord, + fetchChannelPermissionsDiscord, + fetchMemberGuildPermissionsDiscord, + fetchMemberInfoDiscord, + fetchMessageDiscord, + fetchReactionsDiscord, + fetchRoleInfoDiscord, + fetchVoiceStatusDiscord, + hasAllGuildPermissionsDiscord, + hasAnyGuildPermissionDiscord, + kickMemberDiscord, + listGuildChannelsDiscord, + listGuildEmojisDiscord, + listPinsDiscord, + listScheduledEventsDiscord, + listThreadsDiscord, + moveChannelDiscord, + pinMessageDiscord, + reactMessageDiscord, + readMessagesDiscord, + removeChannelPermissionDiscord, + removeOwnReactionsDiscord, + removeReactionDiscord, + removeRoleDiscord, + resolveEventCoverImage, + searchMessagesDiscord, + sendMessageDiscord, + sendPollDiscord, + sendStickerDiscord, + sendTypingDiscord, + sendVoiceMessageDiscord, + sendWebhookMessageDiscord, + setChannelPermissionDiscord, + timeoutMemberDiscord, + unpinMessageDiscord, + uploadEmojiDiscord, + uploadStickerDiscord, + type DiscordChannelCreate, + type DiscordChannelEdit, + type DiscordChannelMove, + type DiscordChannelPermissionSet, + type DiscordEmojiUpload, + type DiscordMessageEdit, + type DiscordMessageQuery, + type DiscordModerationTarget, + type DiscordPermissionsSummary, + type DiscordReactionRuntimeContext, + type DiscordReactionSummary, + type DiscordReactionUser, + type DiscordReactOpts, + type DiscordRoleChange, + type DiscordRuntimeAccountContext, + type DiscordSearchQuery, + type DiscordSendResult, + type DiscordStickerUpload, + type DiscordThreadCreate, + type DiscordThreadList, + type DiscordTimeoutTarget, +} from "./src/send.js"; +export { + editDiscordComponentMessage, + registerBuiltDiscordComponentMessage, + sendDiscordComponentMessage, +} from "./src/send.components.js"; export { setDiscordRuntime } from "./src/runtime.js"; diff --git a/extensions/slack/runtime-api.ts b/extensions/slack/runtime-api.ts index a2173294c20..3af49fb5fb4 100644 --- a/extensions/slack/runtime-api.ts +++ b/extensions/slack/runtime-api.ts @@ -1,7 +1,44 @@ -export * from "./src/action-runtime.js"; -export * from "./src/directory-live.js"; -export * from "./src/index.js"; -export * from "./src/resolve-channels.js"; -export * from "./src/resolve-users.js"; +export { + handleSlackAction, + slackActionRuntime, + type SlackActionContext, +} from "./src/action-runtime.js"; +export { listSlackDirectoryGroupsLive, listSlackDirectoryPeersLive } from "./src/directory-live.js"; +export { + deleteSlackMessage, + editSlackMessage, + getSlackMemberInfo, + listEnabledSlackAccounts, + listSlackAccountIds, + listSlackEmojis, + listSlackPins, + listSlackReactions, + monitorSlackProvider, + pinSlackMessage, + probeSlack, + reactSlackMessage, + readSlackMessages, + removeOwnSlackReactions, + removeSlackReaction, + resolveDefaultSlackAccountId, + resolveSlackAccount, + resolveSlackAppToken, + resolveSlackBotToken, + resolveSlackGroupRequireMention, + resolveSlackGroupToolPolicy, + sendMessageSlack, + sendSlackMessage, + unpinSlackMessage, +} from "./src/index.js"; +export { + resolveSlackChannelAllowlist, + type SlackChannelLookup, + type SlackChannelResolution, +} from "./src/resolve-channels.js"; +export { + resolveSlackUserAllowlist, + type SlackUserLookup, + type SlackUserResolution, +} from "./src/resolve-users.js"; export { registerSlackPluginHttpRoutes } from "./src/http/plugin-routes.js"; export { setSlackRuntime } from "./src/runtime.js"; diff --git a/src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts b/src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts index bce47c97a90..582d975baae 100644 --- a/src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts +++ b/src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts @@ -9,25 +9,24 @@ const ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); const RUNTIME_API_EXPORT_GUARDS: Record = { [bundledPluginFile({ rootDir: ROOT_DIR, pluginId: "discord", relativePath: "runtime-api.ts" })]: [ - 'export * from "./src/audit.js";', - 'export * from "./src/actions/runtime.js";', - 'export * from "./src/actions/runtime.moderation-shared.js";', - 'export * from "./src/actions/runtime.shared.js";', - 'export * from "./src/channel-actions.js";', - 'export * from "./src/directory-live.js";', - 'export * from "./src/monitor.js";', - 'export * from "./src/monitor/gateway-plugin.js";', - 'export * from "./src/monitor/gateway-registry.js";', - 'export * from "./src/monitor/presence-cache.js";', - 'export * from "./src/monitor/thread-bindings.js";', - 'export * from "./src/monitor/thread-bindings.manager.js";', - 'export * from "./src/monitor/timeouts.js";', - 'export * from "./src/probe.js";', - 'export * from "./src/resolve-channels.js";', - 'export * from "./src/resolve-users.js";', - 'export * from "./src/outbound-session-route.js";', - 'export * from "./src/send.js";', - 'export * from "./src/send.components.js";', + 'export { auditDiscordChannelPermissions, collectDiscordAuditChannelIds } from "./src/audit.js";', + 'export { handleDiscordAction } from "./src/actions/runtime.js";', + 'export { isDiscordModerationAction, readDiscordModerationCommand, requiredGuildPermissionForModerationAction, type DiscordModerationAction, type DiscordModerationCommand } from "./src/actions/runtime.moderation-shared.js";', + 'export { readDiscordChannelCreateParams, readDiscordChannelEditParams, readDiscordChannelMoveParams, readDiscordParentIdParam } from "./src/actions/runtime.shared.js";', + 'export { discordMessageActions } from "./src/channel-actions.js";', + 'export { listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive } from "./src/directory-live.js";', + 'export { allowListMatches, buildDiscordMediaPayload, createDiscordMessageHandler, createDiscordNativeCommand, isDiscordGroupAllowedByPolicy, monitorDiscordProvider, normalizeDiscordAllowList, normalizeDiscordSlug, registerDiscordListener, resolveDiscordChannelConfig, resolveDiscordChannelConfigWithFallback, resolveDiscordCommandAuthorized, resolveDiscordGuildEntry, resolveDiscordReplyTarget, resolveDiscordShouldRequireMention, resolveGroupDmAllow, sanitizeDiscordThreadName, shouldEmitDiscordReactionNotification, type DiscordAllowList, type DiscordChannelConfigResolved, type DiscordGuildEntryResolved, type DiscordMessageEvent, type DiscordMessageHandler, type MonitorDiscordOpts } from "./src/monitor.js";', + 'export { createDiscordGatewayPlugin, resolveDiscordGatewayIntents, waitForDiscordGatewayPluginRegistration } from "./src/monitor/gateway-plugin.js";', + 'export { clearGateways, getGateway, registerGateway, unregisterGateway } from "./src/monitor/gateway-registry.js";', + 'export { clearPresences, getPresence, presenceCacheSize, setPresence } from "./src/monitor/presence-cache.js";', + 'export { __testing, autoBindSpawnedDiscordSubagent, createNoopThreadBindingManager, createThreadBindingManager, formatThreadBindingDurationLabel, getThreadBindingManager, isRecentlyUnboundThreadWebhookMessage, listThreadBindingsBySessionKey, listThreadBindingsForAccount, reconcileAcpThreadBindingsOnStartup, resolveDiscordThreadBindingIdleTimeoutMs, resolveDiscordThreadBindingMaxAgeMs, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingInactivityExpiresAt, resolveThreadBindingIntroText, resolveThreadBindingMaxAgeExpiresAt, resolveThreadBindingMaxAgeMs, resolveThreadBindingPersona, resolveThreadBindingPersonaFromRecord, resolveThreadBindingsEnabled, resolveThreadBindingThreadName, setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey, type AcpThreadBindingReconciliationResult, type ThreadBindingManager, type ThreadBindingRecord, type ThreadBindingTargetKind } from "./src/monitor/thread-bindings.js";', + 'export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, isAbortError, mergeAbortSignals, normalizeDiscordInboundWorkerTimeoutMs, normalizeDiscordListenerTimeoutMs, runDiscordTaskWithTimeout } from "./src/monitor/timeouts.js";', + 'export { fetchDiscordApplicationId, fetchDiscordApplicationSummary, parseApplicationIdFromToken, probeDiscord, resolveDiscordPrivilegedIntentsFromFlags, type DiscordApplicationSummary, type DiscordPrivilegedIntentsSummary, type DiscordPrivilegedIntentStatus, type DiscordProbe } from "./src/probe.js";', + 'export { resolveDiscordChannelAllowlist, type DiscordChannelResolution } from "./src/resolve-channels.js";', + 'export { resolveDiscordUserAllowlist, type DiscordUserResolution } from "./src/resolve-users.js";', + 'export { resolveDiscordOutboundSessionRoute, type ResolveDiscordOutboundSessionRouteParams } from "./src/outbound-session-route.js";', + 'export { addRoleDiscord, banMemberDiscord, createChannelDiscord, createScheduledEventDiscord, createThreadDiscord, deleteChannelDiscord, deleteMessageDiscord, DiscordSendError, editChannelDiscord, editMessageDiscord, fetchChannelInfoDiscord, fetchChannelPermissionsDiscord, fetchMemberGuildPermissionsDiscord, fetchMemberInfoDiscord, fetchMessageDiscord, fetchReactionsDiscord, fetchRoleInfoDiscord, fetchVoiceStatusDiscord, hasAllGuildPermissionsDiscord, hasAnyGuildPermissionDiscord, kickMemberDiscord, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadsDiscord, moveChannelDiscord, pinMessageDiscord, reactMessageDiscord, readMessagesDiscord, removeChannelPermissionDiscord, removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, resolveEventCoverImage, searchMessagesDiscord, sendMessageDiscord, sendPollDiscord, sendStickerDiscord, sendTypingDiscord, sendVoiceMessageDiscord, sendWebhookMessageDiscord, setChannelPermissionDiscord, timeoutMemberDiscord, unpinMessageDiscord, uploadEmojiDiscord, uploadStickerDiscord, type DiscordChannelCreate, type DiscordChannelEdit, type DiscordChannelMove, type DiscordChannelPermissionSet, type DiscordEmojiUpload, type DiscordMessageEdit, type DiscordMessageQuery, type DiscordModerationTarget, type DiscordPermissionsSummary, type DiscordReactionRuntimeContext, type DiscordReactionSummary, type DiscordReactionUser, type DiscordReactOpts, type DiscordRoleChange, type DiscordRuntimeAccountContext, type DiscordSearchQuery, type DiscordSendResult, type DiscordStickerUpload, type DiscordThreadCreate, type DiscordThreadList, type DiscordTimeoutTarget } from "./src/send.js";', + 'export { editDiscordComponentMessage, registerBuiltDiscordComponentMessage, sendDiscordComponentMessage } from "./src/send.components.js";', 'export { setDiscordRuntime } from "./src/runtime.js";', ], [bundledPluginFile({ rootDir: ROOT_DIR, pluginId: "imessage", relativePath: "runtime-api.ts" })]: @@ -167,11 +166,11 @@ const RUNTIME_API_EXPORT_GUARDS: Record = { 'export { setSignalRuntime } from "./src/runtime.js";', ], [bundledPluginFile({ rootDir: ROOT_DIR, pluginId: "slack", relativePath: "runtime-api.ts" })]: [ - 'export * from "./src/action-runtime.js";', - 'export * from "./src/directory-live.js";', - 'export * from "./src/index.js";', - 'export * from "./src/resolve-channels.js";', - 'export * from "./src/resolve-users.js";', + 'export { handleSlackAction, slackActionRuntime, type SlackActionContext } from "./src/action-runtime.js";', + 'export { listSlackDirectoryGroupsLive, listSlackDirectoryPeersLive } from "./src/directory-live.js";', + 'export { deleteSlackMessage, editSlackMessage, getSlackMemberInfo, listEnabledSlackAccounts, listSlackAccountIds, listSlackEmojis, listSlackPins, listSlackReactions, monitorSlackProvider, pinSlackMessage, probeSlack, reactSlackMessage, readSlackMessages, removeOwnSlackReactions, removeSlackReaction, resolveDefaultSlackAccountId, resolveSlackAccount, resolveSlackAppToken, resolveSlackBotToken, resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy, sendMessageSlack, sendSlackMessage, unpinSlackMessage } from "./src/index.js";', + 'export { resolveSlackChannelAllowlist, type SlackChannelLookup, type SlackChannelResolution } from "./src/resolve-channels.js";', + 'export { resolveSlackUserAllowlist, type SlackUserLookup, type SlackUserResolution } from "./src/resolve-users.js";', 'export { registerSlackPluginHttpRoutes } from "./src/http/plugin-routes.js";', 'export { setSlackRuntime } from "./src/runtime.js";', ],