refactor: migrate discord outbound ownership

This commit is contained in:
Tak Hoffman 2026-03-18 14:58:07 -05:00
parent 2ae1dcf32b
commit beab2a6d00
No known key found for this signature in database
4 changed files with 23 additions and 14 deletions

View File

@ -10,12 +10,8 @@ export {
collectDiscordStatusIssues,
inspectDiscordAccount,
listDiscordAccountIds,
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
resolveDiscordAccount,
resolveDefaultDiscordAccountId,
resolveDiscordChannelId,
resolveDiscordGroupRequireMention,
resolveDiscordGroupToolPolicy,
} from "../../../extensions/discord/api.js";
@ -37,8 +33,5 @@ export {
probeDiscord,
readMessagesDiscord,
searchMessagesDiscord,
sendMessageDiscord,
sendTypingDiscord,
sendVoiceMessageDiscord,
unpinMessageDiscord,
} from "../../../extensions/discord/runtime-api.js";

View File

@ -394,6 +394,19 @@ describe("channel import guardrails", () => {
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord outbound 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(?:looksLikeDiscordTargetId|normalizeDiscordMessagingTarget|normalizeDiscordOutboundTarget|resolveDiscordChannelId|sendMessageDiscord|sendTypingDiscord|sendVoiceMessageDiscord)\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);

View File

@ -2,7 +2,11 @@ import {
createDiscordActionGate,
listDiscordDirectoryGroupsFromConfig,
listDiscordDirectoryPeersFromConfig,
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
readDiscordComponentSpec,
resolveDiscordChannelId,
} from "../../extensions/discord/api.js";
import type {
ThreadBindingManager,
@ -45,9 +49,12 @@ import {
resolveThreadBindingInactivityExpiresAt,
resolveThreadBindingMaxAgeExpiresAt,
resolveThreadBindingMaxAgeMs,
sendMessageDiscord,
sendDiscordComponentMessage,
sendPollDiscord,
sendTypingDiscord,
sendStickerDiscord,
sendVoiceMessageDiscord,
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
setChannelPermissionDiscord,
@ -68,11 +75,7 @@ import {
collectDiscordStatusIssues,
inspectDiscordAccount,
listDiscordAccountIds,
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
resolveDefaultDiscordAccountId,
resolveDiscordChannelId,
resolveDiscordGroupRequireMention,
resolveDiscordGroupToolPolicy,
} from "../channels/discord/plugin-sdk-bridge.js";
@ -94,9 +97,6 @@ import {
probeDiscord,
readMessagesDiscord,
searchMessagesDiscord,
sendMessageDiscord,
sendTypingDiscord,
sendVoiceMessageDiscord,
unpinMessageDiscord,
} from "../channels/discord/plugin-sdk-bridge.js";

View File

@ -272,6 +272,9 @@ describe("plugin-sdk subpath exports", () => {
expect(typeof discordSdk.listDiscordDirectoryPeersFromConfig).toBe("function");
expect(typeof discordSdk.listDiscordDirectoryGroupsLive).toBe("function");
expect(typeof discordSdk.listDiscordDirectoryPeersLive).toBe("function");
expect(typeof discordSdk.normalizeDiscordOutboundTarget).toBe("function");
expect(typeof discordSdk.resolveDiscordChannelId).toBe("function");
expect(typeof discordSdk.sendMessageDiscord).toBe("function");
expect(typeof discordSdk.getThreadBindingManager).toBe("function");
expect(typeof discordSdk.listThreadBindingsBySessionKey).toBe("function");
expect(typeof discordSdk.normalizeExplicitDiscordSessionKey).toBe("function");