From 63fe2e12d78000225a65cb6781a83eddabcedff4 Mon Sep 17 00:00:00 2001 From: "openclaw-clawsweeper[bot]" <280122609+openclaw-clawsweeper[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:53:50 +0000 Subject: [PATCH] fix(clawsweeper): address review for clawsweeper-commit-openclaw-openclaw-587b537b4745 (1) --- extensions/discord/api.ts | 59 +++++++++- extensions/discord/src/public-api.test.ts | 133 +++++++++++++++++++--- 2 files changed, 176 insertions(+), 16 deletions(-) diff --git a/extensions/discord/api.ts b/extensions/discord/api.ts index ca4ec4995b2..50c30a14230 100644 --- a/extensions/discord/api.ts +++ b/extensions/discord/api.ts @@ -1,11 +1,27 @@ export { discordPlugin } from "./src/channel.js"; export { discordSetupPlugin } from "./src/channel.setup.js"; -export { inspectDiscordAccount } from "./src/account-inspect.js"; export { + handleDiscordSubagentDeliveryTarget, + handleDiscordSubagentEnded, + handleDiscordSubagentSpawning, +} from "./src/subagent-hooks.js"; +export { + type DiscordCredentialStatus, + inspectDiscordAccount, + type InspectedDiscordAccount, +} from "./src/account-inspect.js"; +export { + createDiscordActionGate, listDiscordAccountIds, + listEnabledDiscordAccounts, + mergeDiscordAccountConfig, + type ResolvedDiscordAccount, resolveDefaultDiscordAccountId, resolveDiscordAccount, + resolveDiscordAccountConfig, + resolveDiscordMaxLinesPerMessage, } from "./src/accounts.js"; +export { tryHandleDiscordMessageActionGuildAdmin } from "./src/actions/handle-action.guild-admin.js"; export { buildDiscordComponentMessage } from "./src/components.js"; export { listDiscordDirectoryGroupsFromConfig, @@ -33,16 +49,38 @@ export const handleDiscordMessageAction: HandleDiscordMessageAction = (async (.. }) as HandleDiscordMessageAction; export { - buildDiscordInteractiveComponents, buildDiscordComponentCustomId, + buildDiscordComponentMessageFlags, + buildDiscordInteractiveComponents, buildDiscordModalCustomId, + createDiscordFormModal, + DISCORD_COMPONENT_ATTACHMENT_PREFIX, + DISCORD_COMPONENT_CUSTOM_ID_KEY, + DISCORD_MODAL_CUSTOM_ID_KEY, + DiscordFormModal, + formatDiscordComponentEventText, parseDiscordComponentCustomId, parseDiscordComponentCustomIdForInteraction, parseDiscordModalCustomId, parseDiscordModalCustomIdForInteraction, + readDiscordComponentSpec, + resolveDiscordComponentAttachmentName, type ComponentData, + type DiscordComponentBlock, type DiscordComponentBuildResult, + type DiscordComponentButtonSpec, + type DiscordComponentButtonStyle, + type DiscordComponentEntry, type DiscordComponentMessageSpec, + type DiscordComponentModalFieldType, + type DiscordComponentSectionAccessory, + type DiscordComponentSelectOption, + type DiscordComponentSelectSpec, + type DiscordComponentSelectType, + type DiscordModalEntry, + type DiscordModalFieldDefinition, + type DiscordModalFieldSpec, + type DiscordModalSpec, } from "./src/components.js"; export { parseDiscordComponentCustomIdForInteraction as parseDiscordComponentCustomIdForCarbon, @@ -54,6 +92,17 @@ export { isDiscordExecApprovalClientEnabled, shouldSuppressLocalDiscordExecApprovalPrompt, } from "./src/exec-approvals.js"; +export type { + DiscordInteractiveHandlerContext, + DiscordInteractiveHandlerRegistration, +} from "./src/interactive-dispatch.js"; +export { + type DiscordPluralKitConfig, + fetchPluralKitMessageInfo, + type PluralKitMemberInfo, + type PluralKitMessageInfo, + type PluralKitSystemInfo, +} from "./src/pluralkit.js"; export { fetchDiscordApplicationId, fetchDiscordApplicationSummary, @@ -65,6 +114,7 @@ export { type DiscordPrivilegedIntentStatus, type DiscordProbe, } from "./src/probe.js"; +export { normalizeExplicitDiscordSessionKey } from "./src/session-key-normalization.js"; export { parseDiscordSendTarget, type SendDiscordTarget } from "./src/send-target-parsing.js"; export { parseDiscordTarget, @@ -74,6 +124,8 @@ export { type DiscordTargetKind, type DiscordTargetParseOptions, } from "./src/targets.js"; +export { collectDiscordSecurityAuditFindings } from "./src/security-audit.js"; +export { resolveDiscordRuntimeGroupPolicy } from "./src/runtime-group-policy.js"; export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, @@ -81,3 +133,6 @@ export { DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, mergeAbortSignals, } from "./src/monitor/timeouts.js"; +export type { DiscordSendComponents, DiscordSendEmbeds } from "./src/send.shared.js"; +export type { DiscordSendResult } from "./src/send.types.js"; +export type { DiscordTokenResolution } from "./src/token.js"; diff --git a/extensions/discord/src/public-api.test.ts b/extensions/discord/src/public-api.test.ts index b5d040ab869..c90d2451d85 100644 --- a/extensions/discord/src/public-api.test.ts +++ b/extensions/discord/src/public-api.test.ts @@ -9,6 +9,108 @@ import { } from "./component-custom-id.js"; const API_SOURCE_PATH = resolve(dirname(fileURLToPath(import.meta.url)), "../api.ts"); +const itOnSupportedNode = Number(process.versions.node.split(".")[0]) >= 22 ? it : it.skip; + +const FORMER_PUBLIC_API_EXPORTS = [ + "DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS", + "DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS", + "DISCORD_COMPONENT_ATTACHMENT_PREFIX", + "DISCORD_COMPONENT_CUSTOM_ID_KEY", + "DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS", + "DISCORD_DEFAULT_LISTENER_TIMEOUT_MS", + "DISCORD_MODAL_CUSTOM_ID_KEY", + "DiscordApplicationSummary", + "DiscordComponentBlock", + "DiscordComponentBuildResult", + "DiscordComponentButtonSpec", + "DiscordComponentButtonStyle", + "DiscordComponentEntry", + "DiscordComponentMessageSpec", + "DiscordComponentModalFieldType", + "DiscordComponentSectionAccessory", + "DiscordComponentSelectOption", + "DiscordComponentSelectSpec", + "DiscordComponentSelectType", + "DiscordCredentialStatus", + "DiscordFormModal", + "DiscordInteractiveHandlerContext", + "DiscordInteractiveHandlerRegistration", + "DiscordModalEntry", + "DiscordModalFieldDefinition", + "DiscordModalFieldSpec", + "DiscordModalSpec", + "DiscordPluralKitConfig", + "DiscordPrivilegedIntentStatus", + "DiscordPrivilegedIntentsSummary", + "DiscordProbe", + "DiscordSendComponents", + "DiscordSendEmbeds", + "DiscordSendResult", + "DiscordTarget", + "DiscordTargetKind", + "DiscordTargetParseOptions", + "DiscordTokenResolution", + "InspectedDiscordAccount", + "PluralKitMemberInfo", + "PluralKitMessageInfo", + "PluralKitSystemInfo", + "ResolvedDiscordAccount", + "buildDiscordComponentCustomId", + "buildDiscordComponentMessage", + "buildDiscordComponentMessageFlags", + "buildDiscordInteractiveComponents", + "buildDiscordModalCustomId", + "collectDiscordSecurityAuditFindings", + "collectDiscordStatusIssues", + "createDiscordActionGate", + "createDiscordFormModal", + "discordPlugin", + "discordSetupPlugin", + "fetchDiscordApplicationId", + "fetchDiscordApplicationSummary", + "fetchPluralKitMessageInfo", + "formatDiscordComponentEventText", + "getDiscordExecApprovalApprovers", + "handleDiscordMessageAction", + "handleDiscordSubagentDeliveryTarget", + "handleDiscordSubagentEnded", + "handleDiscordSubagentSpawning", + "inspectDiscordAccount", + "isDiscordExecApprovalApprover", + "isDiscordExecApprovalClientEnabled", + "listDiscordAccountIds", + "listDiscordDirectoryGroupsFromConfig", + "listDiscordDirectoryPeersFromConfig", + "listEnabledDiscordAccounts", + "looksLikeDiscordTargetId", + "mergeDiscordAccountConfig", + "normalizeDiscordMessagingTarget", + "normalizeDiscordOutboundTarget", + "normalizeExplicitDiscordSessionKey", + "parseApplicationIdFromToken", + "parseDiscordComponentCustomId", + "parseDiscordComponentCustomIdForCarbon", + "parseDiscordComponentCustomIdForInteraction", + "parseDiscordModalCustomId", + "parseDiscordModalCustomIdForCarbon", + "parseDiscordModalCustomIdForInteraction", + "parseDiscordTarget", + "probeDiscord", + "readDiscordComponentSpec", + "resolveDefaultDiscordAccountId", + "resolveDiscordAccount", + "resolveDiscordAccountConfig", + "resolveDiscordChannelId", + "resolveDiscordComponentAttachmentName", + "resolveDiscordGroupRequireMention", + "resolveDiscordGroupToolPolicy", + "resolveDiscordMaxLinesPerMessage", + "resolveDiscordPrivilegedIntentsFromFlags", + "resolveDiscordRuntimeGroupPolicy", + "resolveDiscordTarget", + "shouldSuppressLocalDiscordExecApprovalPrompt", + "tryHandleDiscordMessageActionGuildAdmin", +] as const; function collectExportedNames(): Set { const source = ts.createSourceFile( @@ -46,24 +148,27 @@ describe("discord public API barrel", () => { it("keeps compatibility exports for existing @openclaw/discord/api.js consumers", () => { const exportedNames = collectExportedNames(); - for (const exportName of [ - "DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS", - "buildDiscordInteractiveComponents", - "handleDiscordMessageAction", - "isDiscordExecApprovalApprover", - "isDiscordExecApprovalClientEnabled", - "parseApplicationIdFromToken", - "parseDiscordComponentCustomIdForCarbon", - "parseDiscordSendTarget", - "parseDiscordTarget", - "probeDiscord", - "resolveDiscordChannelId", - "resolveDiscordPrivilegedIntentsFromFlags", - ]) { + for (const exportName of FORMER_PUBLIC_API_EXPORTS) { expect(exportedNames).toContain(exportName); } }); + itOnSupportedNode("links restored runtime compatibility exports", async () => { + const api = await import("../api.js"); + + for (const exportName of [ + "DISCORD_COMPONENT_CUSTOM_ID_KEY", + "buildDiscordComponentMessageFlags", + "createDiscordFormModal", + "handleDiscordSubagentSpawning", + "listEnabledDiscordAccounts", + "resolveDiscordRuntimeGroupPolicy", + "tryHandleDiscordMessageActionGuildAdmin", + ]) { + expect(api).toHaveProperty(exportName); + } + }); + it("keeps legacy Carbon component parser aliases aligned with interaction parsers", () => { const exportedNames = collectExportedNames(); const customId = buildDiscordComponentCustomId({