@openclaw/discord 2026.10.5 → 2026.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/.setup/{approval-handler.runtime-D88-QVlO.mjs → approval-handler.runtime-CMaAL3nb.mjs} +2 -2
  2. package/dist/.setup/{audit-TGIPL0f_.mjs → audit-Bpu7xst9.mjs} +2 -2
  3. package/dist/.setup/{channel-C24afwHP.mjs → channel-1Z1mnB_P.mjs} +8 -8
  4. package/dist/.setup/{conversation-binding-route-r4XyytCE.mjs → conversation-binding-route-Dhxicw2Z.mjs} +1 -1
  5. package/dist/.setup/{handle-action-CsQmpfGZ.mjs → handle-action-B4l4tVxj.mjs} +3 -3
  6. package/dist/.setup/{handle-action.guild-admin-Aw-vutu3.mjs → handle-action.guild-admin-CdwwzmP_.mjs} +2 -2
  7. package/dist/.setup/{message-handler-C_BQFYCW.mjs → message-handler-BbwzASGH.mjs} +3 -3
  8. package/dist/.setup/{message-handler.preflight-C_xFOxPN.mjs → message-handler.preflight-CdJ-nZdG.mjs} +4 -4
  9. package/dist/.setup/{message-handler.process-_np9if7z.mjs → message-handler.process-DOszdJgB.mjs} +5 -5
  10. package/dist/.setup/{outbound-adapter-L3UDoMOG.mjs → outbound-adapter-D1hxbwq3.mjs} +4 -4
  11. package/dist/.setup/{outbound-session-route-iwnu6IK8.mjs → outbound-session-route-CM6i691P.mjs} +2 -2
  12. package/dist/.setup/{provider-CbmXLYrW.mjs → provider-B9drnVwM.mjs} +7 -7
  13. package/dist/.setup/{provider-session.runtime-BMOuDbod.mjs → provider-session.runtime-1LmRZB68.mjs} +3 -3
  14. package/dist/.setup/provider.runtime-D2zD5EbM.mjs +1 -0
  15. package/dist/.setup/{realtime-session.runtime-YCumnRSE.mjs → realtime-session.runtime-DcPHqGQM.mjs} +17 -6
  16. package/dist/.setup/{runtime-CRTkKU1G.mjs → runtime-C665qrc0.mjs} +3 -3
  17. package/dist/.setup/{send-DbILKgcm.mjs → send-DXma62sY.mjs} +1 -1
  18. package/dist/.setup/{send.components-FxOS3CeP.mjs → send.components-DdUmsN5C.mjs} +1 -1
  19. package/dist/.setup/{send.outbound-_jx4Xpd3.mjs → send.outbound-D_ctMh-S.mjs} +7 -1
  20. package/dist/.setup/{subagent-hooks-CME7dSGf.mjs → subagent-hooks-D2QDvcXg.mjs} +1 -1
  21. package/dist/.setup/{thread-bindings-0hPTSK14.mjs → thread-bindings-Blhv7XV8.mjs} +1 -1
  22. package/dist/.setup/{thread-bindings.manager-CdNa6UIs.mjs → thread-bindings.manager-Cqml5pUh.mjs} +2 -2
  23. package/dist/.setup/{voice-runtime-BFEBhf2B.mjs → voice-runtime-CI7JBfeA.mjs} +35 -10
  24. package/dist/action-runtime-api.js +1 -1
  25. package/dist/activities-api.js +1 -1
  26. package/dist/api.js +5 -5
  27. package/dist/channel-plugin-api.js +1 -1
  28. package/dist/runtime-api.js +10 -10
  29. package/dist/subagent-hooks-api.js +1 -1
  30. package/package.json +4 -4
  31. package/dist/.setup/provider.runtime-1yN_05AK.mjs +0 -1
@@ -2,8 +2,8 @@ import { D as createDiscordMessageNonce, N as createDiscordClient } from "./send
2
2
  import { D as Row, K as serializePayload, bt as stripUndefinedFields, j as TextDisplay, k as Separator, lt as deleteChannelMessage, nt as createUserDmChannel, st as createChannelMessage, ut as editChannelMessage, x as Container, y as Button } from "./discord-BGqgx-yd.mjs";
3
3
  import { y as findGraphemeChunkEnd } from "./send.receipt-BAlzXd8e.mjs";
4
4
  import { s as buildExecApprovalCustomId } from "./components-HN9052L1.mjs";
5
- import { D as isDiscordExecApprovalClientEnabled, c as formatDiscordApprovalDisplayValue, s as DISCORD_APPROVAL_ALLOWED_MENTIONS } from "./outbound-session-route-iwnu6IK8.mjs";
6
- import { a as shouldHandleDiscordApprovalRequest } from "./channel-C24afwHP.mjs";
5
+ import { D as isDiscordExecApprovalClientEnabled, c as formatDiscordApprovalDisplayValue, s as DISCORD_APPROVAL_ALLOWED_MENTIONS } from "./outbound-session-route-CM6i691P.mjs";
6
+ import { a as shouldHandleDiscordApprovalRequest } from "./channel-1Z1mnB_P.mjs";
7
7
  import { t as discordApprovalMessageUpdates } from "./approval-message-updates-CIGByUcE.mjs";
8
8
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { ButtonStyle } from "discord-api-types/v10";
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
2
  import { t as inspectDiscordAccount } from "./account-inspect-8cCu6uPG.mjs";
3
3
  import { b as fetchChannelPermissionsDiscord } from "./send.shared-CjQ4jbMA.mjs";
4
- import "./send-DbILKgcm.mjs";
5
- import { C as collectDiscordAuditChannelIdsForAccount, S as auditDiscordChannelPermissionsWithFetcher } from "./outbound-session-route-iwnu6IK8.mjs";
4
+ import "./send-DXma62sY.mjs";
5
+ import { C as collectDiscordAuditChannelIdsForAccount, S as auditDiscordChannelPermissionsWithFetcher } from "./outbound-session-route-CM6i691P.mjs";
6
6
  //#region extensions/discord/src/audit.ts
7
7
  var audit_exports = /* @__PURE__ */ __exportAll({
8
8
  auditDiscordChannelPermissions: () => auditDiscordChannelPermissions,
@@ -4,10 +4,10 @@ import { d as normalizeDiscordMessagingTarget, l as looksLikeDiscordTargetId, u
4
4
  import { t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
5
5
  import { l as withAbortTimeout } from "./timeouts-CuNARfyw.mjs";
6
6
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.mjs";
7
- import { D as isDiscordExecApprovalClientEnabled, E as isDiscordExecApprovalApprover, O as shouldSuppressLocalDiscordExecApprovalPrompt, T as getDiscordExecApprovalApprovers, _ as resolveDiscordRuntimeBindingConversationId, f as resolveDiscordConversationRoute, t as resolveDiscordOutboundSessionRoute, v as discordMessageActions, w as resolveRequiredDiscordChannelPermissions } from "./outbound-session-route-iwnu6IK8.mjs";
8
- import { a as normalizeDiscordAcpConversationId, c as resolveDiscordInboundConversation, i as matchDiscordAcpConversation, n as discordOutbound, o as resolveDiscordAttachedOutboundTarget, r as buildDiscordCrossContextPresentation, s as resolveDiscordCommandConversation } from "./outbound-adapter-L3UDoMOG.mjs";
7
+ import { D as isDiscordExecApprovalClientEnabled, E as isDiscordExecApprovalApprover, O as shouldSuppressLocalDiscordExecApprovalPrompt, T as getDiscordExecApprovalApprovers, _ as resolveDiscordRuntimeBindingConversationId, f as resolveDiscordConversationRoute, t as resolveDiscordOutboundSessionRoute, v as discordMessageActions, w as resolveRequiredDiscordChannelPermissions } from "./outbound-session-route-CM6i691P.mjs";
8
+ import { a as normalizeDiscordAcpConversationId, c as resolveDiscordInboundConversation, i as matchDiscordAcpConversation, n as discordOutbound, o as resolveDiscordAttachedOutboundTarget, r as buildDiscordCrossContextPresentation, s as resolveDiscordCommandConversation } from "./outbound-adapter-D1hxbwq3.mjs";
9
9
  import { r as openDiscordCommandDeployHashStore } from "./command-deploy-store-DFkBTViB.mjs";
10
- import { t as resolveDiscordConversationBindingRoute } from "./conversation-binding-route-r4XyytCE.mjs";
10
+ import { t as resolveDiscordConversationBindingRoute } from "./conversation-binding-route-Dhxicw2Z.mjs";
11
11
  import { a as discordSecurityAdapter, i as discordSetupContract, n as discordConfigAdapter, t as createDiscordPluginBase } from "./shared-C027f-lL.mjs";
12
12
  import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-CCHGNSQw.mjs";
13
13
  import { i as setThreadBindingMaxAgeBySessionKeyAsync, n as setThreadBindingIdleTimeoutBySessionKeyAsync, r as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-DGSljVf6.mjs";
@@ -171,7 +171,7 @@ function createDiscordApprovalCapability() {
171
171
  accountId
172
172
  }),
173
173
  shouldHandle: shouldHandleCapabilityRequest,
174
- load: async () => (await import("./approval-handler.runtime-D88-QVlO.mjs")).discordApprovalNativeRuntime
174
+ load: async () => (await import("./approval-handler.runtime-CMaAL3nb.mjs")).discordApprovalNativeRuntime
175
175
  })
176
176
  });
177
177
  }
@@ -185,9 +185,9 @@ function getDiscordApprovalCapability() {
185
185
  const loadDiscordDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-3iVub-3m.mjs").then((n) => n.t));
186
186
  const loadDiscordResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-UdT38DzU.mjs").then((n) => n.n));
187
187
  const loadDiscordResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-DnCsrXZ_.mjs").then((n) => n.n));
188
- const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-CdNa6UIs.mjs").then((n) => n.r));
188
+ const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-Cqml5pUh.mjs").then((n) => n.r));
189
189
  const loadDiscordTargetResolverModule = createLazyRuntimeModule(() => import("./target-resolver-Bse8fuTi.mjs").then((n) => n.r));
190
- const loadDiscordProviderRuntime = createLazyRuntimeModule(() => import("./provider.runtime-1yN_05AK.mjs"));
190
+ const loadDiscordProviderRuntime = createLazyRuntimeModule(() => import("./provider.runtime-D2zD5EbM.mjs"));
191
191
  const loadDiscordProbeRuntime = createLazyRuntimeModule(() => import("./probe-D3P1x4aN.mjs").then((n) => n.o));
192
192
  async function probeDiscordStatusAccount(params) {
193
193
  const startedAtMs = Date.now();
@@ -195,8 +195,8 @@ async function probeDiscordStatusAccount(params) {
195
195
  const remainingMs = Math.max(1, params.timeoutMs - Math.max(0, Date.now() - startedAtMs));
196
196
  return await runtime.probeDiscord(params.token, remainingMs, { includeApplication: true });
197
197
  }
198
- const loadDiscordAuditModule = createLazyRuntimeModule(() => import("./audit-TGIPL0f_.mjs").then((n) => n.n));
199
- const loadDiscordSendModule = createLazyRuntimeModule(() => import("./send-DbILKgcm.mjs").then((n) => n.t));
198
+ const loadDiscordAuditModule = createLazyRuntimeModule(() => import("./audit-Bpu7xst9.mjs").then((n) => n.n));
199
+ const loadDiscordSendModule = createLazyRuntimeModule(() => import("./send-DXma62sY.mjs").then((n) => n.t));
200
200
  const loadDiscordDirectoryLiveModule = createLazyRuntimeModule(() => import("./directory-live-DLygQVtW.mjs").then((n) => n.t));
201
201
  //#endregion
202
202
  //#region extensions/discord/src/conversation-route-owner.ts
@@ -1,4 +1,4 @@
1
- import { m as shouldIgnoreStaleDiscordRouteBinding } from "./outbound-session-route-iwnu6IK8.mjs";
1
+ import { m as shouldIgnoreStaleDiscordRouteBinding } from "./outbound-session-route-CM6i691P.mjs";
2
2
  import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
3
3
  import { resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-binding-runtime";
4
4
  //#region extensions/discord/src/monitor/conversation-binding-route.ts
@@ -2,11 +2,11 @@ import { W as withDiscordRequestAuthority } from "./discord-BGqgx-yd.mjs";
2
2
  import { u as matchesDiscordToolContextTarget } from "./send.receipt-BAlzXd8e.mjs";
3
3
  import { n as resolveDiscordChannelId, t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
4
4
  import "./targets-DZJjkzwv.mjs";
5
- import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-CRTkKU1G.mjs";
5
+ import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-C665qrc0.mjs";
6
6
  import { i as buildDiscordPresentationComponents, m as coerceDiscordComponentParam, r as buildDiscordInteractiveComponents } from "./components-HN9052L1.mjs";
7
7
  import "../action-runtime-api.js";
8
- import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-iwnu6IK8.mjs";
9
- import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-Aw-vutu3.mjs";
8
+ import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-CM6i691P.mjs";
9
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-CdwwzmP_.mjs";
10
10
  import { n as notifyDiscordActiveTurnThreadCreated, r as notifyDiscordActiveTurnThreadReplyDelivered } from "./active-turn-thread-route-C4tp9noA.mjs";
11
11
  import { asOptionalRecord, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
12
12
  import { resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
@@ -1,6 +1,6 @@
1
- import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-CRTkKU1G.mjs";
1
+ import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-C665qrc0.mjs";
2
2
  import "../action-runtime-api.js";
3
- import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-iwnu6IK8.mjs";
3
+ import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-CM6i691P.mjs";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
6
6
  import { readNonNegativeIntegerParam, readPositiveIntegerParam, readStringArrayParam, readStringParam } from "openclaw/plugin-sdk/param-readers";
@@ -1,6 +1,6 @@
1
1
  import { D as getDiscordEndpointRuntime, k as resolveDiscordEndpointMediaGuard } from "./allow-list-B_ToXtew.mjs";
2
2
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.mjs";
3
- import { D as createDiscordLivePolicyReader, O as mapGatewayDispatchData } from "./provider-CbmXLYrW.mjs";
3
+ import { D as createDiscordLivePolicyReader, O as mapGatewayDispatchData } from "./provider-B9drnVwM.mjs";
4
4
  import { E as hasDiscordMessageStickers, T as resolveDiscordCdnPolicy, b as resolveDiscordMessageText, j as resolveDiscordMessageChannelId, k as resolveDiscordReferencedReplyMessageId } from "./transcripts-source-EMrQb132.mjs";
5
5
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
6
6
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
@@ -195,7 +195,7 @@ function createDiscordAvatarResolver() {
195
195
  }
196
196
  //#endregion
197
197
  //#region extensions/discord/src/monitor/message-run-queue.ts
198
- const loadMessageProcessRuntime = createLazyRuntimeModule(() => import("./message-handler.process-_np9if7z.mjs"));
198
+ const loadMessageProcessRuntime = createLazyRuntimeModule(() => import("./message-handler.process-DOszdJgB.mjs"));
199
199
  async function processDiscordQueuedMessage(params) {
200
200
  const abortSignal = params.job.context.abortSignal && params.lifecycleSignal ? AbortSignal.any([params.job.context.abortSignal, params.lifecycleSignal]) : params.job.context.abortSignal ?? params.lifecycleSignal;
201
201
  try {
@@ -279,7 +279,7 @@ function createDiscordMessageRunQueue(params) {
279
279
  }
280
280
  //#endregion
281
281
  //#region extensions/discord/src/monitor/message-dispatcher.ts
282
- const loadMessagePreflightRuntime = createLazyRuntimeModule(() => import("./message-handler.preflight-C_xFOxPN.mjs"));
282
+ const loadMessagePreflightRuntime = createLazyRuntimeModule(() => import("./message-handler.preflight-CdJ-nZdG.mjs"));
283
283
  function createDiscordMessageDispatcher(params) {
284
284
  const readPolicy = params.readPolicy ?? createDiscordLivePolicyReader({
285
285
  ...params,
@@ -2,10 +2,10 @@ import { c as resolveDefaultDiscordAccountId } from "./accounts-ljrzXBJi.mjs";
2
2
  import { C as resolveDiscordSystemLocation, S as formatDiscordUserTag, a as normalizeDiscordDisplaySlug, f as resolveDiscordGuildEntry, h as resolveDiscordMentionPolicy, l as resolveDiscordChannelConfigWithFallback, o as normalizeDiscordSlug, p as resolveDiscordMemberAccessState, w as resolveTimestampMs } from "./allow-list-B_ToXtew.mjs";
3
3
  import { Z as Message, ft as getChannelMessage, t as discord_exports } from "./discord-BGqgx-yd.mjs";
4
4
  import { n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-CuNARfyw.mjs";
5
- import { _ as resolveDiscordRuntimeBindingConversationId, f as resolveDiscordConversationRoute, h as resolveDiscordConversationIdentity, p as resolveDiscordEffectiveRoute, u as buildDiscordRoutePeer } from "./outbound-session-route-iwnu6IK8.mjs";
6
- import { t as resolveDiscordConversationBindingRoute } from "./conversation-binding-route-r4XyytCE.mjs";
5
+ import { _ as resolveDiscordRuntimeBindingConversationId, f as resolveDiscordConversationRoute, h as resolveDiscordConversationIdentity, p as resolveDiscordEffectiveRoute, u as buildDiscordRoutePeer } from "./outbound-session-route-CM6i691P.mjs";
6
+ import { t as resolveDiscordConversationBindingRoute } from "./conversation-binding-route-Dhxicw2Z.mjs";
7
7
  import { n as resolveDiscordChannelInfoSafe, r as resolveDiscordChannelNameSafe } from "./channel-access-DasWY_OV.mjs";
8
- import { A as resolveDiscordDmCommandAccess, E as handleDiscordDmCommandDecision, j as resolveDiscordTextCommandAccess, n as resolveDiscordPreflightChannelAccess } from "./provider-CbmXLYrW.mjs";
8
+ import { A as resolveDiscordDmCommandAccess, E as handleDiscordDmCommandDecision, j as resolveDiscordTextCommandAccess, n as resolveDiscordPreflightChannelAccess } from "./provider-B9drnVwM.mjs";
9
9
  import { A as resolveDiscordChannelInfo, C as resolveMediaList, D as resolveDiscordMessageStickers, O as resolveDiscordReferencedReplyMessage, S as resolveForwardedMediaList, _ as resolveDiscordMessageBatch, b as resolveDiscordMessageText, j as resolveDiscordMessageChannelId, v as resolveDiscordMessageHistoryText, y as resolveDiscordMessageMentionDocuments } from "./transcripts-source-EMrQb132.mjs";
10
10
  import { n as resolveDiscordWebhookId, t as resolveDiscordSenderIdentity } from "./sender-identity-BNBvGt1l.mjs";
11
11
  import { a as createDiscordHistorySenderProvenance, c as hasRawDiscordUserMention, d as matchesActiveDiscordMentionPatterns, f as resolveDiscordMentionState, i as loadSystemEventsRuntime, l as isBoundThreadBotSystemMessage, m as shouldIgnoreBoundThreadWebhookMessage, n as loadDiscordThreadingRuntime, p as resolveInjectedBoundThreadLookupRecord, r as loadPreflightAudioRuntime, s as resolveDiscordHistoryMediaIds, t as resolveDiscordPreflightPluralKitInfo, u as isDiscordThreadChannelMessage } from "./message-handler.preflight-pluralkit-CfRsEwg4.mjs";
@@ -26,7 +26,7 @@ import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-surface";
26
26
  import { createChannelHistoryWindow } from "openclaw/plugin-sdk/reply-history";
27
27
  //#region extensions/discord/src/monitor/message-handler.dm-preflight.ts
28
28
  const loadConversationRuntime$1 = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/conversation-binding-runtime"));
29
- const loadDiscordSendRuntime = createLazyRuntimeModule(() => import("./send-DbILKgcm.mjs").then((n) => n.t));
29
+ const loadDiscordSendRuntime = createLazyRuntimeModule(() => import("./send-DXma62sY.mjs").then((n) => n.t));
30
30
  async function resolveDiscordDmPreflightAccess(params) {
31
31
  if (params.dmPolicy === "disabled") {
32
32
  logVerbose("discord: drop dm (dmPolicy: disabled)");
@@ -4,13 +4,13 @@ import { F as createDiscordRuntimeAccountContext, O as resolveDiscordMessageFlag
4
4
  import { U as captureDiscordRequestAuthority, W as withDiscordRequestAuthority, Z as Message, _t as getGuildMember, lt as deleteChannelMessage, t as discord_exports, ut as editChannelMessage } from "./discord-BGqgx-yd.mjs";
5
5
  import { v as chunkDiscordTextWithMode } from "./send.receipt-BAlzXd8e.mjs";
6
6
  import { n as resolveDiscordChannelId } from "./target-parsing-C-HyNxcE.mjs";
7
- import { a as removeReactionDiscord, r as reactMessageDiscord } from "./send-DbILKgcm.mjs";
8
- import { a as discordTextHasBroadcastMention } from "./send.outbound-_jx4Xpd3.mjs";
7
+ import { a as removeReactionDiscord, r as reactMessageDiscord } from "./send-DXma62sY.mjs";
8
+ import { o as discordTextHasBroadcastMention } from "./send.outbound-D_ctMh-S.mjs";
9
9
  import { n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-CuNARfyw.mjs";
10
10
  import "./targets-DZJjkzwv.mjs";
11
- import { b as discordInboundEventDelivery, h as resolveDiscordConversationIdentity, u as buildDiscordRoutePeer } from "./outbound-session-route-iwnu6IK8.mjs";
12
- import { t as DISCORD_TEXT_CHUNK_LIMIT } from "./outbound-adapter-L3UDoMOG.mjs";
13
- import { T as createDiscordSupplementalContextAccessChecker, c as formatDiscordReplySkip, d as buildGuildLabel, f as resolveReplyContext, l as sanitizeDiscordFrontChannelReplyPayloads, o as deliverDiscordReply, s as formatDiscordReplyDeliveryFailure, u as buildDirectLabel, w as buildDiscordInboundAccessContext } from "./provider-CbmXLYrW.mjs";
11
+ import { b as discordInboundEventDelivery, h as resolveDiscordConversationIdentity, u as buildDiscordRoutePeer } from "./outbound-session-route-CM6i691P.mjs";
12
+ import { t as DISCORD_TEXT_CHUNK_LIMIT } from "./outbound-adapter-D1hxbwq3.mjs";
13
+ import { T as createDiscordSupplementalContextAccessChecker, c as formatDiscordReplySkip, d as buildGuildLabel, f as resolveReplyContext, l as sanitizeDiscordFrontChannelReplyPayloads, o as deliverDiscordReply, s as formatDiscordReplyDeliveryFailure, u as buildDirectLabel, w as buildDiscordInboundAccessContext } from "./provider-B9drnVwM.mjs";
14
14
  import { D as resolveDiscordMessageStickers, b as resolveDiscordMessageText, h as resolveDiscordThreadStarter, k as resolveDiscordReferencedReplyMessageId, v as resolveDiscordMessageHistoryText, w as resolveReferencedReplyMediaList, x as formatDiscordMediaText } from "./transcripts-source-EMrQb132.mjs";
15
15
  import { n as resolveDiscordWebhookId, t as resolveDiscordSenderIdentity } from "./sender-identity-BNBvGt1l.mjs";
16
16
  import { n as resolveDiscordAutoThreadReplyPlan } from "./threading-BWz5lW0p.mjs";
@@ -1,7 +1,7 @@
1
1
  import { t as createDiscordActionGate } from "./accounts-ljrzXBJi.mjs";
2
2
  import { d as normalizeDiscordMessagingTarget, f as normalizeDiscordOutboundTarget, g as hasDiscordMessageCreateAmbiguity, i as toDiscordOutboundDeliveryResult, n as createDiscordSendReceiptFromResults, p as canFallbackDiscordWebhookSend, s as resolveDiscordReplyReference, t as createDiscordSendReceipt, v as chunkDiscordTextWithMode } from "./send.receipt-BAlzXd8e.mjs";
3
3
  import { t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
4
- import { a as resolveDiscordComponentSpec, b as discordInboundEventDelivery, c as formatDiscordApprovalDisplayValue, g as resolveDiscordCurrentConversationIdentity, n as DISCORD_PRESENTATION_CAPABILITIES, o as sendDiscordComponentMessageLazy, r as buildDiscordPresentationPayload, x as notifyDiscordInboundEventOutboundPayloadSuccess } from "./outbound-session-route-iwnu6IK8.mjs";
4
+ import { a as resolveDiscordComponentSpec, b as discordInboundEventDelivery, c as formatDiscordApprovalDisplayValue, g as resolveDiscordCurrentConversationIdentity, n as DISCORD_PRESENTATION_CAPABILITIES, o as sendDiscordComponentMessageLazy, r as buildDiscordPresentationPayload, x as notifyDiscordInboundEventOutboundPayloadSuccess } from "./outbound-session-route-CM6i691P.mjs";
5
5
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
6
6
  import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
7
7
  import { asOptionalRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -137,7 +137,7 @@ function normalizeDiscordApprovalPayload(payload) {
137
137
  }
138
138
  //#endregion
139
139
  //#region extensions/discord/src/outbound-send-context.ts
140
- const loadDiscordSendRuntime = createLazyRuntimeModule(() => import("./send-DbILKgcm.mjs").then((n) => n.t));
140
+ const loadDiscordSendRuntime = createLazyRuntimeModule(() => import("./send-DXma62sY.mjs").then((n) => n.t));
141
141
  function resolveDiscordFormattingOptions(ctx) {
142
142
  const formatting = ctx.formatting;
143
143
  return {
@@ -333,8 +333,8 @@ async function sendDiscordOutboundPayload(params) {
333
333
  const DISCORD_TEXT_CHUNK_LIMIT = 2e3;
334
334
  const DISCORD_PRECHUNK_MAX_LINES = Number.MAX_SAFE_INTEGER;
335
335
  const log = createSubsystemLogger("discord/outbound");
336
- const loadDiscordThreadBindings = createLazyRuntimeModule(() => import("./thread-bindings-0hPTSK14.mjs").then((n) => n.i));
337
- const loadDiscordComponentSendRuntime = createLazyRuntimeModule(() => import("./send.components-FxOS3CeP.mjs").then((n) => n.i));
336
+ const loadDiscordThreadBindings = createLazyRuntimeModule(() => import("./thread-bindings-Blhv7XV8.mjs").then((n) => n.i));
337
+ const loadDiscordComponentSendRuntime = createLazyRuntimeModule(() => import("./send.components-DdUmsN5C.mjs").then((n) => n.i));
338
338
  function resolveDiscordDeliveryOptions(params) {
339
339
  return {
340
340
  onPlatformSendDispatch: params.onPlatformSendDispatch,
@@ -221,7 +221,7 @@ function resolveDiscordThreadReplyTarget(args) {
221
221
  const target = threadId !== void 0 ? `channel:${threadId}` : normalizeOptionalString(args.channelId) ?? normalizeOptionalString(args.to) ?? normalizeOptionalString(args.target);
222
222
  return target ? normalizeDiscordMessagingTarget(target) : void 0;
223
223
  }
224
- const loadDiscordChannelActionsRuntime = createLazyRuntimeModule(() => import("./handle-action-CsQmpfGZ.mjs"));
224
+ const loadDiscordChannelActionsRuntime = createLazyRuntimeModule(() => import("./handle-action-B4l4tVxj.mjs"));
225
225
  const discordActionGroups = [
226
226
  {
227
227
  gate: "polls",
@@ -642,7 +642,7 @@ const DISCORD_PRESENTATION_CAPABILITIES = {
642
642
  }
643
643
  }
644
644
  };
645
- const sendDiscordComponentMessageLazy = createLazyRuntimeMethod(createLazyRuntimeModule(() => import("./send.components-FxOS3CeP.mjs").then((n) => n.i)), (runtime) => runtime.sendDiscordComponentMessage);
645
+ const sendDiscordComponentMessageLazy = createLazyRuntimeMethod(createLazyRuntimeModule(() => import("./send.components-DdUmsN5C.mjs").then((n) => n.i)), (runtime) => runtime.sendDiscordComponentMessage);
646
646
  const loadDiscordSharedInteractive = createLazyRuntimeModule(() => import("./components-HN9052L1.mjs").then((n) => n.a));
647
647
  function addPayloadTextFallback(spec, payload) {
648
648
  return spec.text ? spec : {
@@ -5,19 +5,19 @@ import { i as setPresence, t as clearPresences } from "./presence-cache-DCeTsL73
5
5
  import { $ as BaseMessageInteractiveComponent, A as StringSelectMenu, D as Row, F as Plugin, G as hasDiscordV2Components, J as Command, P as Client, Q as User, R as RateLimitError, X as Guild, Y as CommandWithSubcommands, Z as Message, a as MessageCreateListener, c as PresenceUpdateListener, d as ThreadUpdateListener, h as Modal, i as InteractionCreateListener, j as TextDisplay, k as Separator, l as ReadyListener, n as GuildCreateListener, o as MessageReactionAddListener, r as GuildDeleteListener, s as MessageReactionRemoveListener, t as discord_exports, u as ThreadDeleteListener, x as Container, y as Button } from "./discord-BGqgx-yd.mjs";
6
6
  import { v as chunkDiscordTextWithMode } from "./send.receipt-BAlzXd8e.mjs";
7
7
  import { a as isDiscordRateLimitResponseBody, s as summarizeDiscordResponseBody } from "./api-CtmE1OUN.mjs";
8
- import { _ as readMessagesDiscord, s as sendVoiceMessageDiscord } from "./send-DbILKgcm.mjs";
9
- import { o as formatMention, t as sendMessageDiscord } from "./send.outbound-_jx4Xpd3.mjs";
8
+ import { _ as readMessagesDiscord, s as sendVoiceMessageDiscord } from "./send-DXma62sY.mjs";
9
+ import { s as formatMention, t as sendMessageDiscord } from "./send.outbound-D_ctMh-S.mjs";
10
10
  import { l as withAbortTimeout } from "./timeouts-CuNARfyw.mjs";
11
11
  import { C as parseDiscordActivityCustomIdForInteraction, D as parseDiscordModalCustomIdForInteraction, E as parseDiscordModalCustomId, O as decodeCustomIdComponent, T as parseDiscordComponentCustomIdForInteraction, c as parseExecApprovalData, d as buildDiscordComponentMessage, k as encodeCustomIdComponent, o as parseDiscordQuestionData, w as parseDiscordComponentCustomId, y as buildDiscordActivityCustomId } from "./components-HN9052L1.mjs";
12
- import { a as registerDiscordComponentEntries, o as resolveDiscordComponentEntryWithPersistence, s as resolveDiscordModalEntryWithPersistence, t as editDiscordComponentMessage } from "./send.components-FxOS3CeP.mjs";
12
+ import { a as registerDiscordComponentEntries, o as resolveDiscordComponentEntryWithPersistence, s as resolveDiscordModalEntryWithPersistence, t as editDiscordComponentMessage } from "./send.components-DdUmsN5C.mjs";
13
13
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.mjs";
14
14
  import { n as getDiscordActivitiesRuntime } from "./runtime-DPm3gZXk.mjs";
15
15
  import { t as resolveDiscordCommandOwnerAllowFrom } from "./command-owners-C7rUdqUX.mjs";
16
- import { D as isDiscordExecApprovalClientEnabled, T as getDiscordExecApprovalApprovers, a as resolveDiscordComponentSpec, c as formatDiscordApprovalDisplayValue, d as resolveDiscordBoundConversationRoute, h as resolveDiscordConversationIdentity, l as buildDiscordConversationRouteContext, n as DISCORD_PRESENTATION_CAPABILITIES, p as resolveDiscordEffectiveRoute, r as buildDiscordPresentationPayload, s as DISCORD_APPROVAL_ALLOWED_MENTIONS, u as buildDiscordRoutePeer } from "./outbound-session-route-iwnu6IK8.mjs";
16
+ import { D as isDiscordExecApprovalClientEnabled, T as getDiscordExecApprovalApprovers, a as resolveDiscordComponentSpec, c as formatDiscordApprovalDisplayValue, d as resolveDiscordBoundConversationRoute, h as resolveDiscordConversationIdentity, l as buildDiscordConversationRouteContext, n as DISCORD_PRESENTATION_CAPABILITIES, p as resolveDiscordEffectiveRoute, r as buildDiscordPresentationPayload, s as DISCORD_APPROVAL_ALLOWED_MENTIONS, u as buildDiscordRoutePeer } from "./outbound-session-route-CM6i691P.mjs";
17
17
  import { n as discordIngressIdentity, t as selectDiscordLivePolicyConfig } from "./live-policy-config-BPoB3eQi.mjs";
18
18
  import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-UdT38DzU.mjs";
19
19
  import { t as resolveDiscordUserAllowlist } from "./resolve-users-DnCsrXZ_.mjs";
20
- import { a as isThreadArchived, n as getThreadBindingManager } from "./thread-bindings.manager-CdNa6UIs.mjs";
20
+ import { a as isThreadArchived, n as getThreadBindingManager } from "./thread-bindings.manager-Cqml5pUh.mjs";
21
21
  import { n as resolveDiscordChannelInfoSafe, o as resolveDiscordChannelTopicSafe, r as resolveDiscordChannelNameSafe } from "./channel-access-DasWY_OV.mjs";
22
22
  import { a as probeDiscordApplicationId, r as parseApplicationIdFromToken } from "./probe-D3P1x4aN.mjs";
23
23
  import { O as resolveDiscordReferencedReplyMessage, a as authorizeDiscordVoiceIngress, c as resolveDiscordVoiceEnabled, i as setDiscordTranscriptsVoiceManager, k as resolveDiscordReferencedReplyMessageId, l as resolveDiscordThreadLikeChannelContext, o as resolveDiscordVoiceAccess, u as resolveFetchedDiscordThreadLikeChannelContext } from "./transcripts-source-EMrQb132.mjs";
@@ -5532,8 +5532,8 @@ const discordProviderRuntime = {
5532
5532
  probeDiscordApplicationId,
5533
5533
  createDiscordNativeCommand,
5534
5534
  runDiscordGatewayLifecycle,
5535
- loadDiscordVoiceRuntime: () => import("./voice-runtime-BFEBhf2B.mjs").then((n) => n.t),
5536
- loadDiscordProviderSessionRuntime: () => import("./provider-session.runtime-BMOuDbod.mjs"),
5535
+ loadDiscordVoiceRuntime: () => import("./voice-runtime-CI7JBfeA.mjs").then((n) => n.t),
5536
+ loadDiscordProviderSessionRuntime: () => import("./provider-session.runtime-1LmRZB68.mjs"),
5537
5537
  createClient: (...args) => new Client(...args),
5538
5538
  resolveDiscordAccount,
5539
5539
  resolveNativeCommandsEnabled,
@@ -1,6 +1,6 @@
1
- import { i as createNoopThreadBindingManager, t as createThreadBindingManager } from "./thread-bindings.manager-CdNa6UIs.mjs";
2
- import { c as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-0hPTSK14.mjs";
3
- import { t as createDiscordMessageHandler } from "./message-handler-C_BQFYCW.mjs";
1
+ import { i as createNoopThreadBindingManager, t as createThreadBindingManager } from "./thread-bindings.manager-Cqml5pUh.mjs";
2
+ import { c as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-Blhv7XV8.mjs";
3
+ import { t as createDiscordMessageHandler } from "./message-handler-BbwzASGH.mjs";
4
4
  import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "openclaw/plugin-sdk/conversation-runtime";
5
5
  import { getAcpSessionManager, isAcpRuntimeError, rethrowIncognitoSessionError } from "openclaw/plugin-sdk/acp-runtime";
6
6
  export { createDiscordMessageHandler, createNoopThreadBindingManager, createThreadBindingManager, getAcpSessionManager, isAcpRuntimeError, reconcileAcpThreadBindingsOnStartup, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled, rethrowIncognitoSessionError };
@@ -0,0 +1 @@
1
+ export { t as monitorDiscordProvider } from "./provider-B9drnVwM.mjs";
@@ -1,8 +1,8 @@
1
1
  import { _ as restoreDiscordAudioError, b as setDiscordAudioOutputStatus, g as releaseDiscordAudioInput, h as getDiscordAudioOutputStatus, l as createDiscordPcmToRealtimeConverter, m as admitDiscordAudioInput, p as DiscordAudioOutputStatus } from "./receive-recovery-eVmK2_hl.mjs";
2
2
  import { t as resolveDiscordOutputAudioDelta } from "./output-activity-uBpMSX75.mjs";
3
3
  import { n as discordRealtimeVoiceSecretOwnerId } from "./secret-config-contract-CIsH7R3B.mjs";
4
- import { y as logVoiceVerbose } from "./provider-CbmXLYrW.mjs";
5
- import { a as logDiscordVoiceAgentControlResult, c as formatVoiceLogPreview, i as handleDiscordVoiceAgentControlToolCall, l as shouldLogRealtimeVerboseEvent, n as DiscordRealtimeRecording, o as maybeControlDiscordVoiceAgentRun, r as formatVoiceIngressPrompt, s as formatRealtimeInfoLog } from "./voice-runtime-BFEBhf2B.mjs";
4
+ import { y as logVoiceVerbose } from "./provider-B9drnVwM.mjs";
5
+ import { a as logDiscordVoiceAgentControlResult, c as formatVoiceLogPreview, i as handleDiscordVoiceAgentControlToolCall, l as shouldLogRealtimeVerboseEvent, n as DiscordRealtimeRecording, o as maybeControlDiscordVoiceAgentRun, r as formatVoiceIngressPrompt, s as formatRealtimeInfoLog } from "./voice-runtime-CI7JBfeA.mjs";
6
6
  import { MessageChannel } from "node:worker_threads";
7
7
  import { formatErrorMessage, readErrorName, toErrorObject, toStringifiedError } from "openclaw/plugin-sdk/error-runtime";
8
8
  import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
@@ -1787,6 +1787,7 @@ var DiscordRealtimeVoiceSession = class {
1787
1787
  this.sessions = /* @__PURE__ */ new Set();
1788
1788
  this.nextSessionId = 0;
1789
1789
  this.closed = false;
1790
+ this.textFallback = false;
1790
1791
  this.closingSpeakers = /* @__PURE__ */ new Set();
1791
1792
  this.changingVoice = false;
1792
1793
  this.callAbort = new AbortController();
@@ -1816,17 +1817,19 @@ var DiscordRealtimeVoiceSession = class {
1816
1817
  close(disposition = "abort") {
1817
1818
  if (this.closed) return this.closeCompletion;
1818
1819
  this.closed = true;
1820
+ this.textFallback = disposition === "text-fallback";
1821
+ const speakerDisposition = disposition === "text-fallback" ? "detach" : disposition;
1819
1822
  this.voiceSelection?.unregister();
1820
1823
  if (disposition === "abort") this.callAbort.abort(/* @__PURE__ */ new Error("Discord voice call closed"));
1821
1824
  clearInterval(this.idleTimer);
1822
1825
  this.idleTimer = void 0;
1823
1826
  this.player.close();
1824
1827
  if (this.warmSession) {
1825
- this.closeSpeaker(this.warmSession, disposition);
1828
+ this.closeSpeaker(this.warmSession, speakerDisposition);
1826
1829
  this.warmSession = void 0;
1827
1830
  }
1828
- for (const { session } of this.sessions) this.closeSpeaker(session, disposition);
1829
- for (const session of this.candidates) this.closeSpeaker(session, disposition);
1831
+ for (const { session } of this.sessions) this.closeSpeaker(session, speakerDisposition);
1832
+ for (const session of this.candidates) this.closeSpeaker(session, speakerDisposition);
1830
1833
  this.candidates.clear();
1831
1834
  this.speakers.clear();
1832
1835
  this.sessions.clear();
@@ -1878,13 +1881,21 @@ var DiscordRealtimeVoiceSession = class {
1878
1881
  standby: previous !== void 0,
1879
1882
  conversationHistory: previous?.snapshotConversation(),
1880
1883
  runAgentTurn: async (turn) => {
1881
- const signal = turn.signal ? AbortSignal.any([turn.signal, this.callAbort.signal]) : this.callAbort.signal;
1884
+ const signal = AbortSignal.any([
1885
+ this.params.signal,
1886
+ this.callAbort.signal,
1887
+ ...turn.signal ? [turn.signal] : []
1888
+ ]);
1882
1889
  const text = await this.params.runAgentTurn({
1883
1890
  ...turn,
1884
1891
  signal,
1885
1892
  voiceSelection: this.voiceSelection
1886
1893
  });
1887
1894
  signal.throwIfAborted();
1895
+ if (this.textFallback) {
1896
+ if (text.trim()) await this.params.deliverText(turn, text, signal);
1897
+ return "";
1898
+ }
1888
1899
  return text;
1889
1900
  },
1890
1901
  onTerminalError: (error) => this.handleSpeakerFailure(session, error)
@@ -4,11 +4,11 @@ import { C as hasAnyChannelPermissionDiscord, F as createDiscordRuntimeAccountCo
4
4
  import { n as getPresence } from "./presence-cache-DCeTsL73.mjs";
5
5
  import { a as createReusableDiscordReplyReference, s as resolveDiscordReplyReference } from "./send.receipt-BAlzXd8e.mjs";
6
6
  import { n as resolveDiscordChannelId, t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
7
- import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, l as DiscordThreadInitialMessageError, m as listPinsDiscord, n as fetchReactionsDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, w as fetchGuildInfoDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-DbILKgcm.mjs";
8
- import { r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-_jx4Xpd3.mjs";
7
+ import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, l as DiscordThreadInitialMessageError, m as listPinsDiscord, n as fetchReactionsDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, w as fetchGuildInfoDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-DXma62sY.mjs";
8
+ import { r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-D_ctMh-S.mjs";
9
9
  import "./targets-DZJjkzwv.mjs";
10
10
  import { h as readDiscordComponentSpec, m as coerceDiscordComponentParam } from "./components-HN9052L1.mjs";
11
- import { r as sendDiscordComponentMessage } from "./send.components-FxOS3CeP.mjs";
11
+ import { r as sendDiscordComponentMessage } from "./send.components-DdUmsN5C.mjs";
12
12
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
13
13
  import { asBoolean, asOptionalRecord, isRecord, normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
14
14
  import { assertMediaNotDataUrl, jsonResult, parseAvailableTags, readNonNegativeIntegerParam, readPositiveIntegerParam, readReactionParams, readStringArrayParam, readStringParam, withNormalizedTimestamp } from "openclaw/plugin-sdk/channel-actions";
@@ -4,7 +4,7 @@ import { C as hasAnyChannelPermissionDiscord, D as createDiscordMessageNonce, I
4
4
  import { B as readDiscordCode, H as readRetryAfter, L as DiscordError, R as RateLimitError, V as readDiscordMessage, W as withDiscordRequestAuthority, _t as getGuildMember, at as deleteOwnMessageReaction, bt as stripUndefinedFields, ct as createThread, dt as getChannel, ft as getChannelMessage, gt as getGuild, ht as unpinChannelMessage, it as createOwnMessageReaction, lt as deleteChannelMessage, mt as pinChannelMessage, ot as listMessageReactionUsers, ut as editChannelMessage, vt as getGuildVoiceState, yt as listGuildEmojis, z as isUnknownDiscordVoiceStateError } from "./discord-BGqgx-yd.mjs";
5
5
  import { _ as recordDiscordMessageCreateAmbiguity, a as createReusableDiscordReplyReference, h as createDiscordRetryRunner, m as classifyDiscordDeliveryFailure, n as createDiscordSendReceiptFromResults, o as resolveDiscordReplyMessageId, r as createDiscordSendResult, v as chunkDiscordTextWithMode } from "./send.receipt-BAlzXd8e.mjs";
6
6
  import { o as parseDiscordHttpErrorBody } from "./api-CtmE1OUN.mjs";
7
- import { i as prepareDiscordOutboundText, n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-_jx4Xpd3.mjs";
7
+ import { a as prepareDiscordOutboundText, n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-D_ctMh-S.mjs";
8
8
  import { n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS } from "./timeouts-CuNARfyw.mjs";
9
9
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
10
10
  import { resolvePreferredOpenClawTmpDir, withTempWorkspace } from "openclaw/plugin-sdk/temp-path";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
2
  import { D as createDiscordMessageNonce, M as parseAndResolveChannelRecipient, N as createDiscordClient, T as SUPPRESS_NOTIFICATIONS_FLAG, c as resolveChannelId, l as resolveDiscordChannel, t as buildDiscordSendError } from "./send.shared-CjQ4jbMA.mjs";
3
3
  import { K as serializePayload, W as withDiscordRequestAuthority, st as createChannelMessage, ut as editChannelMessage } from "./discord-BGqgx-yd.mjs";
4
4
  import { r as createDiscordSendResult } from "./send.receipt-BAlzXd8e.mjs";
5
- import { t as sendMessageDiscord } from "./send.outbound-_jx4Xpd3.mjs";
5
+ import { t as sendMessageDiscord } from "./send.outbound-D_ctMh-S.mjs";
6
6
  import { d as buildDiscordComponentMessage, f as buildDiscordComponentMessageFlags, g as resolveDiscordComponentAttachmentName } from "./components-HN9052L1.mjs";
7
7
  import { n as getOptionalDiscordRuntime } from "./runtime-DgnVQ7zW.mjs";
8
8
  import { hasNonEmptyString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -1,3 +1,4 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
1
2
  import { A as resolveDiscordSendEmbeds, D as createDiscordMessageNonce, E as buildDiscordMessageRequest, M as parseAndResolveChannelRecipient, N as createDiscordClient, O as resolveDiscordMessageFlags, c as resolveChannelId, d as sendDiscordChunks, f as sendDiscordMedia, i as normalizeDiscordPollInput, j as resolveDiscordSuppressEmbeds, k as resolveDiscordSendComponents, l as resolveDiscordChannel, n as buildDiscordTextChunks, s as normalizeStickerIds, t as buildDiscordSendError } from "./send.shared-CjQ4jbMA.mjs";
2
3
  import { W as withDiscordRequestAuthority, ct as createThread, st as createChannelMessage } from "./discord-BGqgx-yd.mjs";
3
4
  import { a as createReusableDiscordReplyReference, n as createDiscordSendReceiptFromResults, r as createDiscordSendResult } from "./send.receipt-BAlzXd8e.mjs";
@@ -365,6 +366,11 @@ function prepareDiscordOutboundText(text, params) {
365
366
  }
366
367
  //#endregion
367
368
  //#region extensions/discord/src/send.outbound.ts
369
+ var send_outbound_exports = /* @__PURE__ */ __exportAll({
370
+ sendMessageDiscord: () => sendMessageDiscord,
371
+ sendPollDiscord: () => sendPollDiscord,
372
+ sendStickerDiscord: () => sendStickerDiscord
373
+ });
368
374
  const DEFAULT_DISCORD_MEDIA_MAX_MB = 100;
369
375
  /** Discord's ChannelFlags.RequireTag is bit 4 on forum/media parent channels. */
370
376
  const DISCORD_FORUM_REQUIRE_TAG_FLAG = 16;
@@ -622,4 +628,4 @@ async function sendDiscordStructuredMessage(to, opts, kind, buildPayload) {
622
628
  });
623
629
  }
624
630
  //#endregion
625
- export { discordTextHasBroadcastMention as a, prepareDiscordOutboundText as i, sendPollDiscord as n, formatMention as o, sendStickerDiscord as r, sendMessageDiscord as t };
631
+ export { prepareDiscordOutboundText as a, send_outbound_exports as i, sendPollDiscord as n, discordTextHasBroadcastMention as o, sendStickerDiscord as r, formatMention as s, sendMessageDiscord as t };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
2
  import { x as ensureBindingsLoadedAsync } from "./thread-bindings.session-updates-DGSljVf6.mjs";
3
- import { o as listThreadBindingsBySessionKey, u as unbindThreadBindingsBySessionKeyAsync } from "./thread-bindings-0hPTSK14.mjs";
3
+ import { o as listThreadBindingsBySessionKey, u as unbindThreadBindingsBySessionKeyAsync } from "./thread-bindings-Blhv7XV8.mjs";
4
4
  import { normalizeOptionalLowercaseString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/discord/src/subagent-hooks.ts
6
6
  var subagent_hooks_exports = /* @__PURE__ */ __exportAll({
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
2
  import { t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
3
3
  import "./targets-DZJjkzwv.mjs";
4
4
  import { C as getThreadBindingToken, E as refreshUnboundThreadWebhookIdentity, F as resolveThreadBindingMaxAgeMs$1, M as resolveThreadBindingIdleTimeoutMs$1, N as resolveThreadBindingInactivityExpiresAt, P as resolveThreadBindingMaxAgeExpiresAt, _ as MANAGERS_BY_ACCOUNT_ID, a as mutateBindingsForTargetSession, g as BINDINGS_BY_THREAD_ID, i as setThreadBindingMaxAgeBySessionKeyAsync, n as setThreadBindingIdleTimeoutBySessionKeyAsync, o as resolveBindingIdsForTargetSession, r as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey, u as removeBindingRecordSync } from "./thread-bindings.session-updates-DGSljVf6.mjs";
5
- import { c as resolveThreadBindingPersonaFromRecord, i as createNoopThreadBindingManager, n as getThreadBindingManager, o as resolveChannelIdForBinding, s as resolveThreadBindingPersona, t as createThreadBindingManager } from "./thread-bindings.manager-CdNa6UIs.mjs";
5
+ import { c as resolveThreadBindingPersonaFromRecord, i as createNoopThreadBindingManager, n as getThreadBindingManager, o as resolveChannelIdForBinding, s as resolveThreadBindingPersona, t as createThreadBindingManager } from "./thread-bindings.manager-Cqml5pUh.mjs";
6
6
  import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
7
7
  import { normalizeOptionalLowercaseString, normalizeOptionalString, normalizeOptionalStringifiedId, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  import { formatThreadBindingDurationLabel as formatThreadBindingDurationLabel$1, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingIntroText, resolveThreadBindingIntroText as resolveThreadBindingIntroText$1, resolveThreadBindingMaxAgeMs, resolveThreadBindingThreadName, resolveThreadBindingThreadName as resolveThreadBindingThreadName$1, resolveThreadBindingsEnabled } from "openclaw/plugin-sdk/conversation-runtime";
@@ -4,8 +4,8 @@ import { P as createDiscordRestClient } from "./send.shared-CjQ4jbMA.mjs";
4
4
  import { W as withDiscordRequestAuthority, dt as getChannel, tt as createChannelWebhook } from "./discord-BGqgx-yd.mjs";
5
5
  import { p as canFallbackDiscordWebhookSend } from "./send.receipt-BAlzXd8e.mjs";
6
6
  import { n as resolveDiscordChannelId } from "./target-parsing-C-HyNxcE.mjs";
7
- import { c as sendWebhookMessageDiscord, u as createThreadDiscord } from "./send-DbILKgcm.mjs";
8
- import { t as sendMessageDiscord } from "./send.outbound-_jx4Xpd3.mjs";
7
+ import { c as sendWebhookMessageDiscord, u as createThreadDiscord } from "./send-DXma62sY.mjs";
8
+ import { t as sendMessageDiscord } from "./send.outbound-D_ctMh-S.mjs";
9
9
  import { A as resolveBindingRecordKey, C as getThreadBindingToken, D as rememberReusableWebhook, E as refreshUnboundThreadWebhookIdentity, F as resolveThreadBindingMaxAgeMs$1, I as shouldDefaultPersist, L as toBindingRecordKey, M as resolveThreadBindingIdleTimeoutMs$1, O as rememberThreadBindingToken, R as toReusableWebhookKey, S as forgetThreadBindingToken, T as normalizeThreadBindingDurationMs, _ as MANAGERS_BY_ACCOUNT_ID, b as THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS, c as drainThreadBindingAccountOperations, d as runThreadBindingAccountOperation, f as runThreadBindingMutation, g as BINDINGS_BY_THREAD_ID, h as updateBindingRecordSync, j as resolvePreparedThreadBindingLifecycle, k as resolveBindingIdsForSession, l as drainThreadBindingMutations, m as snapshotThreadBindingMetadata, p as shouldPersistAnyBindingState, s as commitBindingRecord, v as PERSIST_BY_ACCOUNT_ID, w as normalizeTargetKind, x as ensureBindingsLoadedAsync, y as REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL } from "./thread-bindings.session-updates-DGSljVf6.mjs";
10
10
  import { n as resolveDiscordChannelInfoSafe, t as resolveDiscordChannelIdSafe } from "./channel-access-DasWY_OV.mjs";
11
11
  import { createSubsystemLogger, logVerbose } from "openclaw/plugin-sdk/runtime-env";
@@ -3,9 +3,9 @@ import { _ as restoreDiscordAudioError, f as writeVoiceWavFile, i as noteVoiceDe
3
3
  import { S as formatDiscordUserTag, g as resolveDiscordOwnerAccess, o as normalizeDiscordSlug } from "./allow-list-B_ToXtew.mjs";
4
4
  import { f as VoiceStateUpdateListener, t as discord_exports, vt as getGuildVoiceState, z as isUnknownDiscordVoiceStateError } from "./discord-BGqgx-yd.mjs";
5
5
  import { t as parseDiscordTarget } from "./target-parsing-C-HyNxcE.mjs";
6
- import { o as formatMention } from "./send.outbound-_jx4Xpd3.mjs";
6
+ import { s as formatMention } from "./send.outbound-D_ctMh-S.mjs";
7
7
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.mjs";
8
- import { C as buildDiscordGroupSystemPrompt, _ as isDiscordRealtimeVoiceMode, b as resolveDiscordVoiceMode, g as VOICE_RECONNECT_GRACE_MS, h as VOICE_CONNECT_READY_TIMEOUT_MS, m as MIN_SEGMENT_SECONDS, p as CAPTURE_FINALIZE_GRACE_MS, v as isVoiceChannel, x as resolveVoiceTimeoutMs, y as logVoiceVerbose } from "./provider-CbmXLYrW.mjs";
8
+ import { C as buildDiscordGroupSystemPrompt, _ as isDiscordRealtimeVoiceMode, b as resolveDiscordVoiceMode, g as VOICE_RECONNECT_GRACE_MS, h as VOICE_CONNECT_READY_TIMEOUT_MS, m as MIN_SEGMENT_SECONDS, p as CAPTURE_FINALIZE_GRACE_MS, v as isVoiceChannel, x as resolveVoiceTimeoutMs, y as logVoiceVerbose } from "./provider-B9drnVwM.mjs";
9
9
  import { a as authorizeDiscordVoiceIngress, c as resolveDiscordVoiceEnabled, o as resolveDiscordVoiceAccess, r as resolveDiscordTranscriptsCapture, s as resolveDiscordVoiceAccessTarget, t as bindDiscordCaptureReceipts } from "./transcripts-source-EMrQb132.mjs";
10
10
  import { Worker } from "node:worker_threads";
11
11
  import { PassThrough, Readable } from "node:stream";
@@ -2473,7 +2473,10 @@ var DiscordVoiceSessions = class {
2473
2473
  }
2474
2474
  if (existing) {
2475
2475
  logVoiceVerbose(`join: replacing existing session for guild ${guildId}`);
2476
- await this.leave({ guildId }, { preserveFollowState: options?.preserveFollowState });
2476
+ await this.leave({ guildId }, {
2477
+ preserveFollowState: options?.preserveFollowState,
2478
+ disposition: "abort"
2479
+ });
2477
2480
  }
2478
2481
  const resolved = await this.resolveChannel(params);
2479
2482
  if (authority && !authority.isCurrent()) return failedJoinResult("Discord voice join was cancelled.");
@@ -2535,7 +2538,7 @@ var DiscordVoiceSessions = class {
2535
2538
  const { route, voiceRoute, agentSessionMode, agentSessionTarget } = routeInfo;
2536
2539
  logger$2.info(`discord voice: joining guild=${guildId} channel=${channelId} mode=${voiceMode} agent=${route.agentId} voiceSession=${voiceRoute.sessionKey} supervisorSession=${route.sessionKey} agentSessionMode=${agentSessionMode}${agentSessionTarget ? ` agentSessionTarget=${agentSessionTarget}` : ""} voiceModel=${voiceConfig?.model ?? "route-default"} realtimeProvider=${voiceConfig?.realtime?.provider ?? "auto"} realtimeModel=${voiceConfig?.realtime?.model ?? "provider-default"} realtimeVoice=${voiceConfig?.realtime?.speakerVoice ?? voiceConfig?.realtime?.speakerVoiceId ?? "provider-default"}`);
2537
2540
  let stopCompletion;
2538
- const stopEntry = (reason) => {
2541
+ const stopEntry = (reason, disposition = "abort") => {
2539
2542
  if (entry.sessionLifecycle.status === "stopped") return stopCompletion;
2540
2543
  entry.sessionLifecycle = {
2541
2544
  status: "stopped",
@@ -2554,7 +2557,7 @@ var DiscordVoiceSessions = class {
2554
2557
  };
2555
2558
  let realtimeCompletion = void 0;
2556
2559
  try {
2557
- if (realtimeLifecycle.status === "starting" || realtimeLifecycle.status === "active") realtimeCompletion = realtimeLifecycle.instance.close();
2560
+ if (realtimeLifecycle.status === "starting" || realtimeLifecycle.status === "active") realtimeCompletion = realtimeLifecycle.instance.close(disposition);
2558
2561
  } catch (error) {
2559
2562
  logger$2.warn(`discord voice: realtime close failed: ${formatErrorMessage$1(error)}`);
2560
2563
  }
@@ -2606,8 +2609,8 @@ var DiscordVoiceSessions = class {
2606
2609
  status: "inactive",
2607
2610
  generation: 0
2608
2611
  },
2609
- stop(reason) {
2610
- return stopEntry(reason ?? `stop guild ${guildId} channel ${channelId}`);
2612
+ stop(reason, disposition) {
2613
+ return stopEntry(reason ?? `stop guild ${guildId} channel ${channelId}`, disposition);
2611
2614
  }
2612
2615
  };
2613
2616
  const speakingHandler = (userId, speaking) => {
@@ -2617,7 +2620,7 @@ var DiscordVoiceSessions = class {
2617
2620
  else this.params.receive.scheduleCaptureFinalize(entry, userId);
2618
2621
  };
2619
2622
  const destroyedHandler = () => {
2620
- stopEntry("audio worker stopped");
2623
+ stopEntry("audio worker stopped", "text-fallback");
2621
2624
  };
2622
2625
  audio.on("stopped", destroyedHandler);
2623
2626
  if (!entry.captureOnly && isDiscordRealtimeVoiceMode(voiceMode)) {
@@ -2655,7 +2658,7 @@ var DiscordVoiceSessions = class {
2655
2658
  ok: false,
2656
2659
  message: "Not connected to that voice channel."
2657
2660
  };
2658
- const stopped = entry.stop();
2661
+ const stopped = entry.stop(void 0, options?.disposition ?? "text-fallback");
2659
2662
  if (!entry.receiveRecovery.decryptRecoveryInFlight) this.params.receive.daveRecoveryAttempts.delete(guildId);
2660
2663
  if (!options?.preserveFollowState) this.params.onLeaveFollowState(guildId);
2661
2664
  await stopped;
@@ -2677,7 +2680,7 @@ var DiscordVoiceSessions = class {
2677
2680
  ok: false,
2678
2681
  message: "Discord realtime voice session stopped before startup completed."
2679
2682
  };
2680
- const { DiscordRealtimeVoiceSession } = await import("./realtime-session.runtime-YCumnRSE.mjs");
2683
+ const { DiscordRealtimeVoiceSession } = await import("./realtime-session.runtime-DcPHqGQM.mjs");
2681
2684
  const realtime = new DiscordRealtimeVoiceSession({
2682
2685
  ...this.params,
2683
2686
  bootstrapContextInstructions,
@@ -2700,6 +2703,24 @@ var DiscordVoiceSessions = class {
2700
2703
  ...turn,
2701
2704
  entry
2702
2705
  }),
2706
+ deliverText: async (turn, text, signal) => {
2707
+ try {
2708
+ const context = await this.params.receive.resolveDiscordVoiceIngressContext(entry, turn.userId);
2709
+ const assertCurrent = () => {
2710
+ signal.throwIfAborted();
2711
+ if (!this.params.isSessionGenerationCurrent(entry) || !context || context.isCurrent?.() === false || context.senderIsOwner !== turn.context.senderIsOwner) throw new Error("Discord voice reply authorization is no longer current");
2712
+ };
2713
+ assertCurrent();
2714
+ const { sendMessageDiscord } = await import("./send.outbound-D_ctMh-S.mjs").then((n) => n.i);
2715
+ await sendMessageDiscord(`channel:${entry.channelId}`, text, {
2716
+ cfg: this.params.cfg,
2717
+ accountId: this.params.accountId,
2718
+ assertPlatformSendAuthorized: assertCurrent
2719
+ });
2720
+ } catch (error) {
2721
+ logger$2.warn(`discord voice: text fallback dropped guild=${entry.guildId} channel=${entry.channelId}: ${formatErrorMessage$1(error)}`);
2722
+ }
2723
+ },
2703
2724
  resolveSpeakerContext: (userId) => this.params.receive.resolveDiscordVoiceIngressContext(entry, userId)
2704
2725
  });
2705
2726
  const generation = entry.realtimeLifecycle.generation + 1;
@@ -2813,6 +2834,7 @@ var DiscordVoiceManager = class {
2813
2834
  this.fatalAutoJoinFailures = /* @__PURE__ */ new Map();
2814
2835
  this.occupancyWatchers = /* @__PURE__ */ new Set();
2815
2836
  this.destroyed = false;
2837
+ this.abort = new AbortController();
2816
2838
  this.client = params.client;
2817
2839
  this.readPolicy = params.readPolicy;
2818
2840
  this.botUserId = params.botUserId;
@@ -2869,6 +2891,8 @@ var DiscordVoiceManager = class {
2869
2891
  });
2870
2892
  this.voiceSessions = new DiscordVoiceSessions({
2871
2893
  ...params,
2894
+ signal: this.abort.signal,
2895
+ isSessionGenerationCurrent: (entry) => this.guildLifecycles.get(entry.guildId)?.generation === entry.generation,
2872
2896
  botUserId: () => this.botUserId,
2873
2897
  destroyed: () => this.destroyed,
2874
2898
  getTranscripts: this.getTranscripts,
@@ -3202,6 +3226,7 @@ var DiscordVoiceManager = class {
3202
3226
  }
3203
3227
  async destroy() {
3204
3228
  this.destroyed = true;
3229
+ this.abort.abort(/* @__PURE__ */ new Error("Discord voice manager stopped"));
3205
3230
  this.occupancyWatchers.clear();
3206
3231
  const followingStopped = this.following.destroy();
3207
3232
  for (const entry of this.sessions.values()) entry.stop();
@@ -1 +1 @@
1
- export { t as handleDiscordAction } from "./.setup/runtime-CRTkKU1G.mjs";
1
+ export { t as handleDiscordAction } from "./.setup/runtime-C665qrc0.mjs";
@@ -2,7 +2,7 @@ import { l as resolveDiscordAccount } from "./.setup/accounts-ljrzXBJi.mjs";
2
2
  import { D as getDiscordEndpointRuntime } from "./.setup/allow-list-B_ToXtew.mjs";
3
3
  import { n as resolveDiscordChannelId$1 } from "./.setup/target-parsing-C-HyNxcE.mjs";
4
4
  import { S as parseDiscordActivityCustomId, i as buildDiscordPresentationComponents } from "./.setup/components-HN9052L1.mjs";
5
- import { r as sendDiscordComponentMessage } from "./.setup/send.components-FxOS3CeP.mjs";
5
+ import { r as sendDiscordComponentMessage } from "./.setup/send.components-DdUmsN5C.mjs";
6
6
  import { r as setDiscordActivitiesRuntime, t as DiscordActivitiesRuntime } from "./.setup/runtime-DPm3gZXk.mjs";
7
7
  import { asOptionalRecord, normalizeBoundedOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  import { randomBytes } from "node:crypto";
package/dist/api.js CHANGED
@@ -7,19 +7,19 @@ import { n as resolveDiscordTarget } from "./.setup/target-resolver-Bse8fuTi.mjs
7
7
  import { i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, r as DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./.setup/timeouts-CuNARfyw.mjs";
8
8
  import "./.setup/targets-DZJjkzwv.mjs";
9
9
  import { D as parseDiscordModalCustomIdForInteraction, E as parseDiscordModalCustomId, T as parseDiscordComponentCustomIdForInteraction, _ as DISCORD_COMPONENT_CUSTOM_ID_KEY, b as buildDiscordComponentCustomId, d as buildDiscordComponentMessage, f as buildDiscordComponentMessageFlags, g as resolveDiscordComponentAttachmentName, h as readDiscordComponentSpec, l as DiscordFormModal, n as formatDiscordComponentEventText, p as DISCORD_COMPONENT_ATTACHMENT_PREFIX, r as buildDiscordInteractiveComponents, u as createDiscordFormModal, v as DISCORD_MODAL_CUSTOM_ID_KEY, w as parseDiscordComponentCustomId, x as buildDiscordModalCustomId } from "./.setup/components-HN9052L1.mjs";
10
- import { D as isDiscordExecApprovalClientEnabled, E as isDiscordExecApprovalApprover, O as shouldSuppressLocalDiscordExecApprovalPrompt, T as getDiscordExecApprovalApprovers } from "./.setup/outbound-session-route-iwnu6IK8.mjs";
11
- import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./.setup/channel-C24afwHP.mjs";
10
+ import { D as isDiscordExecApprovalClientEnabled, E as isDiscordExecApprovalApprover, O as shouldSuppressLocalDiscordExecApprovalPrompt, T as getDiscordExecApprovalApprovers } from "./.setup/outbound-session-route-CM6i691P.mjs";
11
+ import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./.setup/channel-1Z1mnB_P.mjs";
12
12
  import { t as normalizeExplicitDiscordSessionKey } from "./.setup/session-key-normalization-CCHGNSQw.mjs";
13
13
  import { t as discordSetupPlugin } from "./.setup/channel.setup-B3KEh05g.mjs";
14
- import { n as handleDiscordSubagentEnded, t as handleDiscordSubagentDeliveryTarget } from "./.setup/subagent-hooks-CME7dSGf.mjs";
15
- import { t as tryHandleDiscordMessageActionGuildAdmin } from "./.setup/handle-action.guild-admin-Aw-vutu3.mjs";
14
+ import { n as handleDiscordSubagentEnded, t as handleDiscordSubagentDeliveryTarget } from "./.setup/subagent-hooks-D2QDvcXg.mjs";
15
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./.setup/handle-action.guild-admin-CdwwzmP_.mjs";
16
16
  import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./.setup/directory-config-3iVub-3m.mjs";
17
17
  import { t as fetchPluralKitMessageInfo } from "./.setup/pluralkit-B64dfq_j.mjs";
18
18
  import { i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, s as resolveDiscordPrivilegedIntentsFromFlags, t as fetchDiscordApplicationId } from "./.setup/probe-D3P1x4aN.mjs";
19
19
  import { t as collectDiscordSecurityAuditFindings } from "./.setup/security-audit-BFT84Uny.mjs";
20
20
  import { resolveOpenProviderRuntimeGroupPolicy as resolveDiscordRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
21
21
  //#region extensions/discord/api.ts
22
- const handleDiscordMessageAction = async (...args) => (await import("./.setup/handle-action-CsQmpfGZ.mjs")).handleDiscordMessageAction(...args);
22
+ const handleDiscordMessageAction = async (...args) => (await import("./.setup/handle-action-B4l4tVxj.mjs")).handleDiscordMessageAction(...args);
23
23
  /**
24
24
  * @deprecated Shipped `@openclaw/discord/api` compatibility only. Use native
25
25
  * `AbortSignal.any` after filtering optional signals. Removal with the next
@@ -1 +1 @@
1
- export { t as discordPlugin } from "./.setup/channel-C24afwHP.mjs";
1
+ export { t as discordPlugin } from "./.setup/channel-1Z1mnB_P.mjs";
@@ -2,22 +2,22 @@ import { b as shouldEmitDiscordReactionNotification, c as resolveDiscordChannelC
2
2
  import { G as unregisterGateway, H as clearGateways, S as hasAllGuildPermissionsDiscord, U as getGateway, W as registerGateway, b as fetchChannelPermissionsDiscord, g as DiscordSendError, w as hasAnyGuildPermissionDiscord, x as fetchMemberGuildPermissionsDiscord } from "./.setup/send.shared-CjQ4jbMA.mjs";
3
3
  import { i as setPresence, n as getPresence, r as presenceCacheSize, t as clearPresences } from "./.setup/presence-cache-DCeTsL73.mjs";
4
4
  import { n as listDiscordDirectoryGroupsLive, r as listDiscordDirectoryPeersLive } from "./.setup/directory-live-DLygQVtW.mjs";
5
- import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./.setup/send-DbILKgcm.mjs";
6
- import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./.setup/send.outbound-_jx4Xpd3.mjs";
5
+ import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./.setup/send-DXma62sY.mjs";
6
+ import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./.setup/send.outbound-D_ctMh-S.mjs";
7
7
  import { a as isAbortError, c as runDiscordTaskWithTimeout, i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, o as normalizeDiscordInboundWorkerTimeoutMs, r as DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, s as normalizeDiscordListenerTimeoutMs, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./.setup/timeouts-CuNARfyw.mjs";
8
- import { c as readDiscordChannelMoveParams, i as requiredGuildPermissionForModerationAction, l as readDiscordParentIdParam, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./.setup/runtime-CRTkKU1G.mjs";
9
- import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./.setup/send.components-FxOS3CeP.mjs";
8
+ import { c as readDiscordChannelMoveParams, i as requiredGuildPermissionForModerationAction, l as readDiscordParentIdParam, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./.setup/runtime-C665qrc0.mjs";
9
+ import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./.setup/send.components-DdUmsN5C.mjs";
10
10
  import { r as setDiscordRuntime } from "./.setup/runtime-DgnVQ7zW.mjs";
11
- import { t as resolveDiscordOutboundSessionRoute, v as discordMessageActions } from "./.setup/outbound-session-route-iwnu6IK8.mjs";
11
+ import { t as resolveDiscordOutboundSessionRoute, v as discordMessageActions } from "./.setup/outbound-session-route-CM6i691P.mjs";
12
12
  import { F as resolveThreadBindingMaxAgeMs, M as resolveThreadBindingIdleTimeoutMs, N as resolveThreadBindingInactivityExpiresAt, P as resolveThreadBindingMaxAgeExpiresAt, r as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./.setup/thread-bindings.session-updates-DGSljVf6.mjs";
13
13
  import { t as resolveDiscordChannelAllowlist } from "./.setup/resolve-channels-UdT38DzU.mjs";
14
14
  import { t as resolveDiscordUserAllowlist } from "./.setup/resolve-users-DnCsrXZ_.mjs";
15
- import { c as resolveThreadBindingPersonaFromRecord, i as createNoopThreadBindingManager, n as getThreadBindingManager, s as resolveThreadBindingPersona, t as createThreadBindingManager } from "./.setup/thread-bindings.manager-CdNa6UIs.mjs";
16
- import { a as autoBindSpawnedDiscordSubagent, c as reconcileAcpThreadBindingsOnStartup, d as resolveDiscordThreadBindingIdleTimeoutMs, f as resolveDiscordThreadBindingMaxAgeMs, l as unbindThreadBindingsBySessionKey, n as resolveThreadBindingIntroText, o as listThreadBindingsBySessionKey, p as resolveThreadBindingsEnabled, r as resolveThreadBindingThreadName, s as listThreadBindingsForAccount, t as formatThreadBindingDurationLabel } from "./.setup/thread-bindings-0hPTSK14.mjs";
15
+ import { c as resolveThreadBindingPersonaFromRecord, i as createNoopThreadBindingManager, n as getThreadBindingManager, s as resolveThreadBindingPersona, t as createThreadBindingManager } from "./.setup/thread-bindings.manager-Cqml5pUh.mjs";
16
+ import { a as autoBindSpawnedDiscordSubagent, c as reconcileAcpThreadBindingsOnStartup, d as resolveDiscordThreadBindingIdleTimeoutMs, f as resolveDiscordThreadBindingMaxAgeMs, l as unbindThreadBindingsBySessionKey, n as resolveThreadBindingIntroText, o as listThreadBindingsBySessionKey, p as resolveThreadBindingsEnabled, r as resolveThreadBindingThreadName, s as listThreadBindingsForAccount, t as formatThreadBindingDurationLabel } from "./.setup/thread-bindings-Blhv7XV8.mjs";
17
17
  import { i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, s as resolveDiscordPrivilegedIntentsFromFlags, t as fetchDiscordApplicationId } from "./.setup/probe-D3P1x4aN.mjs";
18
- import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./.setup/audit-TGIPL0f_.mjs";
19
- import { S as createDiscordNativeCommand, a as waitForDiscordGatewayPluginRegistration, i as resolveDiscordGatewayIntents, k as registerDiscordListener, r as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./.setup/provider-CbmXLYrW.mjs";
18
+ import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./.setup/audit-Bpu7xst9.mjs";
19
+ import { S as createDiscordNativeCommand, a as waitForDiscordGatewayPluginRegistration, i as resolveDiscordGatewayIntents, k as registerDiscordListener, r as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./.setup/provider-B9drnVwM.mjs";
20
20
  import { f as resolveDiscordReplyTarget, g as sanitizeDiscordThreadName } from "./.setup/transcripts-source-EMrQb132.mjs";
21
- import { t as createDiscordMessageHandler } from "./.setup/message-handler-C_BQFYCW.mjs";
21
+ import { t as createDiscordMessageHandler } from "./.setup/message-handler-BbwzASGH.mjs";
22
22
  import "./.setup/threading-BWz5lW0p.mjs";
23
23
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, DiscordSendError, addRoleDiscord, allowListMatches, auditDiscordChannelPermissions, autoBindSpawnedDiscordSubagent, banMemberDiscord, clearGateways, clearPresences, collectDiscordAuditChannelIds, createChannelDiscord, createDiscordGatewayPlugin, createDiscordMessageHandler, createDiscordNativeCommand, createNoopThreadBindingManager, createScheduledEventDiscord, createThreadBindingManager, createThreadDiscord, deleteChannelDiscord, deleteMessageDiscord, discordMessageActions, editChannelDiscord, editDiscordComponentMessage, editMessageDiscord, fetchChannelInfoDiscord, fetchChannelPermissionsDiscord, fetchDiscordApplicationId, fetchDiscordApplicationSummary, fetchMemberGuildPermissionsDiscord, fetchMemberInfoDiscord, fetchMessageDiscord, fetchReactionsDiscord, fetchRoleInfoDiscord, fetchVoiceStatusDiscord, formatThreadBindingDurationLabel, getGateway, getPresence, getThreadBindingManager, handleDiscordAction, hasAllGuildPermissionsDiscord, hasAnyGuildPermissionDiscord, isAbortError, isDiscordGroupAllowedByPolicy, isDiscordModerationAction, kickMemberDiscord, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadBindingsBySessionKey, listThreadBindingsForAccount, listThreadsDiscord, monitorDiscordProvider, moveChannelDiscord, normalizeDiscordAllowList, normalizeDiscordInboundWorkerTimeoutMs, normalizeDiscordListenerTimeoutMs, normalizeDiscordSlug, parseApplicationIdFromToken, pinMessageDiscord, presenceCacheSize, probeDiscord, reactMessageDiscord, readDiscordChannelCreateParams, readDiscordChannelEditParams, readDiscordChannelMoveParams, readDiscordModerationCommand, readDiscordParentIdParam, readMessagesDiscord, reconcileAcpThreadBindingsOnStartup, registerBuiltDiscordComponentMessage, registerDiscordListener, registerGateway, removeChannelPermissionDiscord, removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, requiredGuildPermissionForModerationAction, resolveDiscordChannelAllowlist, resolveDiscordChannelConfig, resolveDiscordChannelConfigWithFallback, resolveDiscordCommandAuthorized, resolveDiscordGatewayIntents, resolveDiscordGuildEntry, resolveDiscordOutboundSessionRoute, resolveDiscordPrivilegedIntentsFromFlags, resolveDiscordReplyTarget, resolveDiscordShouldRequireMention, resolveDiscordThreadBindingIdleTimeoutMs, resolveDiscordThreadBindingMaxAgeMs, resolveDiscordUserAllowlist, resolveEventCoverImage, resolveGroupDmAllow, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingInactivityExpiresAt, resolveThreadBindingIntroText, resolveThreadBindingMaxAgeExpiresAt, resolveThreadBindingMaxAgeMs, resolveThreadBindingPersona, resolveThreadBindingPersonaFromRecord, resolveThreadBindingThreadName, resolveThreadBindingsEnabled, runDiscordTaskWithTimeout, sanitizeDiscordThreadName, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, sendPollDiscord, sendStickerDiscord, sendTypingDiscord, sendVoiceMessageDiscord, sendWebhookMessageDiscord, setChannelPermissionDiscord, setDiscordRuntime, setPresence, setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, shouldEmitDiscordReactionNotification, timeoutMemberDiscord, unbindThreadBindingsBySessionKey, unpinMessageDiscord, unregisterGateway, uploadEmojiDiscord, uploadStickerDiscord, waitForDiscordGatewayPluginRegistration };
@@ -1,6 +1,6 @@
1
1
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
2
2
  //#region extensions/discord/subagent-hooks-api.ts
3
- const loadDiscordSubagentHooksModule = createLazyRuntimeModule(() => import("./.setup/subagent-hooks-CME7dSGf.mjs").then((n) => n.r));
3
+ const loadDiscordSubagentHooksModule = createLazyRuntimeModule(() => import("./.setup/subagent-hooks-D2QDvcXg.mjs").then((n) => n.r));
4
4
  function registerDiscordSubagentHooks(api) {
5
5
  api.on("subagent_ended", async (event) => {
6
6
  const { handleDiscordSubagentEnded } = await loadDiscordSubagentHooksModule();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "2026.10.5",
3
+ "version": "2026.10.7",
4
4
  "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,7 +19,7 @@
19
19
  "zod": "4.6.5"
20
20
  },
21
21
  "peerDependencies": {
22
- "openclaw": ">=2026.10.5"
22
+ "openclaw": ">=2026.10.7"
23
23
  },
24
24
  "peerDependenciesMeta": {
25
25
  "openclaw": {
@@ -95,14 +95,14 @@
95
95
  "allowInvalidConfigRecovery": true
96
96
  },
97
97
  "compat": {
98
- "pluginApi": ">=2026.10.5"
98
+ "pluginApi": ">=2026.10.7"
99
99
  },
100
100
  "build": {
101
101
  "bundledDist": false,
102
102
  "workerEntries": [
103
103
  "./src/voice/audio-worker.runtime.ts"
104
104
  ],
105
- "openclawVersion": "2026.10.5",
105
+ "openclawVersion": "2026.10.7",
106
106
  "staticAssets": [
107
107
  {
108
108
  "source": "./assets/embedded-app-sdk.mjs",
@@ -1 +0,0 @@
1
- export { t as monitorDiscordProvider } from "./provider-CbmXLYrW.mjs";