diff --git a/src/channels/discord/plugin-sdk-bridge.ts b/src/channels/discord/plugin-sdk-bridge.ts index 8db5b1c20fb..36fc40ab10f 100644 --- a/src/channels/discord/plugin-sdk-bridge.ts +++ b/src/channels/discord/plugin-sdk-bridge.ts @@ -7,7 +7,6 @@ export type { } from "../../../extensions/discord/api.js"; export { - collectDiscordStatusIssues, inspectDiscordAccount, listDiscordAccountIds, resolveDiscordAccount, @@ -16,14 +15,11 @@ export { resolveDiscordGroupToolPolicy, } from "../../../extensions/discord/api.js"; export { - DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, - DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, fetchVoiceStatusDiscord, getGateway, getPresence, hasAnyGuildPermissionDiscord, kickMemberDiscord, monitorDiscordProvider, - probeDiscord, unpinMessageDiscord, } from "../../../extensions/discord/runtime-api.js"; diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index 362be4e058d..24b7e091362 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -431,6 +431,19 @@ describe("channel import guardrails", () => { expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); }); + it("keeps Discord status ownership on extension public seams", () => { + const text = readSource("src/plugin-sdk/discord.ts"); + const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)] + .map((match) => match[0]) + .filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js")) + .join("\n"); + expect(bridgeImports).not.toMatch( + /\b(?:collectDiscordStatusIssues|probeDiscord|DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS|DISCORD_DEFAULT_LISTENER_TIMEOUT_MS)\b/, + ); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); + }); + it("keeps channel helper modules off their own SDK barrels", () => { for (const source of SAME_CHANNEL_SDK_GUARDS) { const text = readSource(source.path); diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index 7528cd6c989..2c3e7c7d27b 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -1,5 +1,6 @@ import { createDiscordActionGate, + collectDiscordStatusIssues, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, looksLikeDiscordTargetId, @@ -59,6 +60,9 @@ import { resolveThreadBindingInactivityExpiresAt, resolveThreadBindingMaxAgeExpiresAt, resolveThreadBindingMaxAgeMs, + DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, + DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, + probeDiscord, sendMessageDiscord, sendDiscordComponentMessage, sendPollDiscord, @@ -84,7 +88,6 @@ import type { ResolvedDiscordAccount, } from "../channels/discord/plugin-sdk-bridge.js"; import { - collectDiscordStatusIssues, inspectDiscordAccount, listDiscordAccountIds, resolveDefaultDiscordAccountId, @@ -92,11 +95,8 @@ import { resolveDiscordGroupToolPolicy, } from "../channels/discord/plugin-sdk-bridge.js"; import { - DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, - DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, hasAnyGuildPermissionDiscord, kickMemberDiscord, - probeDiscord, unpinMessageDiscord, } from "../channels/discord/plugin-sdk-bridge.js"; diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index 04ca82510f5..ae4f31fa188 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -279,6 +279,7 @@ describe("plugin-sdk subpath exports", () => { expect(typeof discordSdk.listThreadsDiscord).toBe("function"); expect(typeof discordSdk.monitorDiscordProvider).toBe("function"); expect(typeof discordSdk.normalizeDiscordOutboundTarget).toBe("function"); + expect(typeof discordSdk.probeDiscord).toBe("function"); expect(typeof discordSdk.readMessagesDiscord).toBe("function"); expect(typeof discordSdk.resolveDiscordChannelId).toBe("function"); expect(typeof discordSdk.sendMessageDiscord).toBe("function");