@openclaw/discord 2026.5.31-beta.4 → 2026.6.1-beta.2

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.
package/dist/api.js CHANGED
@@ -6,7 +6,7 @@ import { n as fetchDiscord, r as requestDiscord, t as DiscordApiError } from "./
6
6
  import { i as parseDiscordSendTarget, n as resolveDiscordTarget } from "./target-resolver-BKGK0ftO.js";
7
7
  import "./targets-Cv797U29.js";
8
8
  import { a as getDiscordExecApprovalApprovers, c as shouldSuppressLocalDiscordExecApprovalPrompt, o as isDiscordExecApprovalApprover, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-CEP1KbK0.js";
9
- import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./channel-W1HBHzdw.js";
9
+ import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./channel-CXLt6qgK.js";
10
10
  import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-wJgsKPNF.js";
11
11
  import { t as discordSetupPlugin } from "./channel.setup-BX7g7pL-.js";
12
12
  import { n as handleDiscordSubagentEnded, r as handleDiscordSubagentSpawning, t as handleDiscordSubagentDeliveryTarget } from "./subagent-hooks-nBcp0iGm.js";
@@ -131,7 +131,7 @@ const loadDiscordResolveUsersModule = createLazyRuntimeModule(() => import("./re
131
131
  const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-CRc4hYr1.js").then((n) => n.a));
132
132
  const loadDiscordTargetResolverModule = createLazyRuntimeModule(() => import("./target-resolver-BKGK0ftO.js").then((n) => n.r));
133
133
  async function loadDiscordProviderRuntime() {
134
- discordProviderRuntimePromise ??= import("./provider.runtime-DUQJvWin.js");
134
+ discordProviderRuntimePromise ??= import("./provider.runtime-D8AxhXYN.js");
135
135
  return await discordProviderRuntimePromise;
136
136
  }
137
137
  async function loadDiscordProbeRuntime() {
@@ -1,2 +1,2 @@
1
- import { t as discordPlugin } from "./channel-W1HBHzdw.js";
1
+ import { t as discordPlugin } from "./channel-CXLt6qgK.js";
2
2
  export { discordPlugin };
@@ -3,7 +3,7 @@ import { c as resolveDiscordAccountAllowFrom } from "./accounts-P19jm1lf.js";
3
3
  import { a as normalizeDiscordSlug, b as formatDiscordUserTag, m as resolveDiscordOwnerAccess } from "./allow-list-C-MqM-B_.js";
4
4
  import { o as formatMention } from "./send.outbound-DhMLobqR.js";
5
5
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.js";
6
- import { f as buildDiscordGroupSystemPrompt, o as authorizeDiscordVoiceIngress, u as resolveDiscordVoiceEnabled } from "./provider-BTp6enEl.js";
6
+ import { f as buildDiscordGroupSystemPrompt, o as authorizeDiscordVoiceIngress, u as resolveDiscordVoiceEnabled } from "./provider-BI4VdnRd.js";
7
7
  import { createRequire } from "node:module";
8
8
  import { asBoolean, normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
@@ -20,7 +20,7 @@ import { agentCommandFromIngress, getTtsProvider, resolveAgentDir, resolveTtsCon
20
20
  import { escapeRegExp } from "openclaw/plugin-sdk/text-utility-runtime";
21
21
  import { spawn } from "node:child_process";
22
22
  import { PassThrough, Readable, Transform } from "node:stream";
23
- import { Application, createDecoder, createEncoder } from "libopus-wasm";
23
+ import { Application, OpusErrorCode, createDecoder, createEncoder, isOpusError } from "libopus-wasm";
24
24
  import { resolveRealtimeBootstrapContextInstructions } from "openclaw/plugin-sdk/realtime-bootstrap-context";
25
25
  import { parseTtsDirectives } from "openclaw/plugin-sdk/speech";
26
26
  //#region extensions/discord/src/voice/audio.ts
@@ -1601,13 +1601,18 @@ function isAbortLikeReceiveError(err) {
1601
1601
  const message = "message" in err && typeof err.message === "string" ? err.message : "";
1602
1602
  return name === "AbortError" || message === "Premature close" || message.includes("The operation was aborted") || message.includes("aborted");
1603
1603
  }
1604
+ function isOpusDecodeInvalidPacketError(err) {
1605
+ return isOpusError(err) && err.code === OpusErrorCode.InvalidPacket && (err.operation === "decode" || err.operation === "decodeFloat");
1606
+ }
1604
1607
  function analyzeVoiceReceiveError(err) {
1605
1608
  const message = formatErrorMessage(err);
1609
+ const normalizedMessage = message.toLowerCase();
1606
1610
  const shouldAttemptPassthrough = message.includes(DAVE_PASSTHROUGH_DISABLED_MARKER);
1607
- const isWasmMemoryAccessFailure = message.toLowerCase().includes(WASM_MEMORY_ACCESS_MARKER);
1611
+ const isWasmMemoryAccessFailure = normalizedMessage.includes(WASM_MEMORY_ACCESS_MARKER);
1608
1612
  return {
1609
1613
  message,
1610
1614
  isAbortLike: isAbortLikeReceiveError(err),
1615
+ isDecodeCorruption: isOpusDecodeInvalidPacketError(err),
1611
1616
  shouldAttemptPassthrough,
1612
1617
  countsAsDecryptFailure: message.includes(DECRYPT_FAILURE_MARKER) || shouldAttemptPassthrough || isWasmMemoryAccessFailure
1613
1618
  };
@@ -3143,6 +3148,10 @@ var DiscordVoiceManager$1 = class {
3143
3148
  logVoiceVerbose(`receive stream ended: ${analysis.message}`);
3144
3149
  return;
3145
3150
  }
3151
+ if (analysis.isDecodeCorruption && !analysis.countsAsDecryptFailure) {
3152
+ logVoiceVerbose(`receive decode skipped: ${analysis.message}`);
3153
+ return;
3154
+ }
3146
3155
  logger.warn(`discord voice: receive error: ${analysis.message}`);
3147
3156
  if (analysis.shouldAttemptPassthrough) this.enableDaveReceivePassthrough(entry, "receive decrypt error", 15);
3148
3157
  if (!analysis.countsAsDecryptFailure) return;
@@ -178,7 +178,7 @@ function resolveDiscordAcceptedTypingPrestart(ctx) {
178
178
  //#region extensions/discord/src/monitor/message-run-queue.ts
179
179
  let messageProcessRuntimePromise;
180
180
  async function loadMessageProcessRuntime() {
181
- messageProcessRuntimePromise ??= import("./message-handler.process-DrLZOgzG.js");
181
+ messageProcessRuntimePromise ??= import("./message-handler.process-_dPFZ80j.js");
182
182
  return await messageProcessRuntimePromise;
183
183
  }
184
184
  async function processDiscordQueuedMessage(params) {
@@ -307,7 +307,7 @@ function createDiscordReplyTypingFeedback(params) {
307
307
  //#region extensions/discord/src/monitor/message-handler.ts
308
308
  let messagePreflightRuntimePromise;
309
309
  async function loadMessagePreflightRuntime() {
310
- messagePreflightRuntimePromise ??= import("./message-handler.preflight-B9aZ9jQD.js");
310
+ messagePreflightRuntimePromise ??= import("./message-handler.preflight-D6YqC67A.js");
311
311
  return await messagePreflightRuntimePromise;
312
312
  }
313
313
  function isNonEmptyString(value) {
@@ -5,7 +5,7 @@ import { t as resolveDiscordConversationIdentity } from "./conversation-identity
5
5
  import { d as isRecentlyUnboundThreadWebhookMessage } from "./thread-bindings.state-CVLF7gJH.js";
6
6
  import { d as resolveDiscordChannelNameSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-CfDs1lWu.js";
7
7
  import "./thread-bindings-Tfr_vFxk.js";
8
- import { D as resolveDiscordTextCommandAccess, E as resolveDiscordDmCommandAccess, _ as resolveDiscordEffectiveRoute, g as resolveDiscordConversationRoute, h as buildDiscordRoutePeer, v as shouldIgnoreStaleDiscordRouteBinding, y as handleDiscordDmCommandDecision } from "./provider-BTp6enEl.js";
8
+ import { D as resolveDiscordTextCommandAccess, E as resolveDiscordDmCommandAccess, _ as resolveDiscordEffectiveRoute, g as resolveDiscordConversationRoute, h as buildDiscordRoutePeer, v as shouldIgnoreStaleDiscordRouteBinding, y as handleDiscordDmCommandDecision } from "./provider-BI4VdnRd.js";
9
9
  import { d as resolveDiscordMessageChannelId, l as resolveDiscordMessageStickers, o as resolveMediaList, r as resolveDiscordMessageText, u as resolveDiscordChannelInfo } from "./message-utils-ZTGvA2L8.js";
10
10
  import { n as resolveDiscordWebhookId, t as resolveDiscordSenderIdentity } from "./sender-identity-CEsfDF0L.js";
11
11
  import { normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -438,7 +438,7 @@ async function loadSystemEventsRuntime() {
438
438
  return await systemEventsRuntimePromise;
439
439
  }
440
440
  async function loadDiscordThreadingRuntime() {
441
- discordThreadingRuntimePromise ??= import("./provider-BTp6enEl.js").then((n) => n.x);
441
+ discordThreadingRuntimePromise ??= import("./provider-BI4VdnRd.js").then((n) => n.x);
442
442
  return await discordThreadingRuntimePromise;
443
443
  }
444
444
  function isPreflightAborted(abortSignal) {
@@ -10,9 +10,9 @@ import { t as beginDiscordInboundEventDeliveryCorrelation } from "./inbound-even
10
10
  import { t as DISCORD_TEXT_CHUNK_LIMIT } from "./outbound-adapter-Bt6-9M13.js";
11
11
  import { t as resolveDiscordPreviewStreamMode } from "./preview-streaming-DXT8oJdo.js";
12
12
  import { n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-CEJ3--Uw.js";
13
- import { S as resolveDiscordAutoThreadReplyPlan, a as resolveReplyContext, i as buildGuildLabel, m as createDiscordSupplementalContextAccessChecker, n as deliverDiscordReply, p as buildDiscordInboundAccessContext, r as buildDirectLabel, w as resolveDiscordThreadStarter } from "./provider-BTp6enEl.js";
13
+ import { S as resolveDiscordAutoThreadReplyPlan, a as resolveReplyContext, i as buildGuildLabel, m as createDiscordSupplementalContextAccessChecker, n as deliverDiscordReply, p as buildDiscordInboundAccessContext, r as buildDirectLabel, w as resolveDiscordThreadStarter } from "./provider-BI4VdnRd.js";
14
14
  import { a as resolveForwardedMediaList, o as resolveMediaList, r as resolveDiscordMessageText, s as resolveReferencedReplyMediaList } from "./message-utils-ZTGvA2L8.js";
15
- import { n as createDiscordReplyTypingFeedback } from "./message-handler-CQGpWQ0f.js";
15
+ import { n as createDiscordReplyTypingFeedback } from "./message-handler-DRzdnJyM.js";
16
16
  import { buildAgentSessionKey, normalizeAccountId, resolveAccountEntry, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
17
17
  import { MessageFlags } from "discord-api-types/v10";
18
18
  import path from "node:path";
@@ -24,7 +24,7 @@ import { danger, logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtim
24
24
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
25
25
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
26
26
  import { convertMarkdownTables, stripInlineDirectiveTagsForDelivery, stripReasoningTagsFromText } from "openclaw/plugin-sdk/text-chunking";
27
- import { buildChannelProgressDraftLine, buildChannelProgressDraftLineForEntry, createChannelMessageReplyPipeline, createChannelProgressDraftGate, createFinalizableDraftLifecycle, defineFinalizableLivePreviewAdapter, deliverWithFinalizableLivePreviewAdapter, formatChannelProgressDraftText, isChannelProgressDraftWorkToolName, mergeChannelProgressDraftLine, normalizeChannelProgressDraftLineIdentity, resolveChannelMessageSourceReplyDeliveryMode, resolveChannelProgressDraftMaxLines, resolveChannelStreamingBlockEnabled, resolveChannelStreamingPreviewChunk, resolveChannelStreamingPreviewToolProgress, resolveChannelStreamingProgressCommentary, resolveChannelStreamingSuppressDefaultToolProgressMessages, resolveTranscriptBackedChannelFinalText } from "openclaw/plugin-sdk/channel-outbound";
27
+ import { buildChannelProgressDraftLine, buildChannelProgressDraftLineForEntry, createChannelMessageReplyPipeline, createChannelProgressDraftGate, createFinalizableDraftLifecycle, defineFinalizableLivePreviewAdapter, deliverWithFinalizableLivePreviewAdapter, formatChannelProgressDraftText, isChannelProgressDraftWorkToolName, mergeChannelProgressDraftLine, normalizeChannelProgressDraftLineIdentity, resolveChannelMessageSourceReplyDeliveryMode, resolveChannelProgressDraftMaxLineChars, resolveChannelProgressDraftMaxLines, resolveChannelStreamingBlockEnabled, resolveChannelStreamingPreviewChunk, resolveChannelStreamingPreviewToolProgress, resolveChannelStreamingProgressCommentary, resolveChannelStreamingSuppressDefaultToolProgressMessages, resolveTranscriptBackedChannelFinalText } from "openclaw/plugin-sdk/channel-outbound";
28
28
  import { recordInboundSession, resolvePinnedMainDmOwnerFromAllowlist } from "openclaw/plugin-sdk/conversation-runtime";
29
29
  import { EmbeddedBlockChunker, formatReasoningMessage, resolveAckReaction, resolveHumanDelayConfig } from "openclaw/plugin-sdk/agent-runtime";
30
30
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
@@ -698,13 +698,15 @@ function createDiscordDraftPreviewController(params) {
698
698
  reasoningProgressRawText = mergeReasoningProgressText(reasoningProgressRawText, text, { snapshot: options?.snapshot === true });
699
699
  const normalized = normalizeReasoningProgressLine(reasoningProgressRawText);
700
700
  if (!normalized) return;
701
+ const displayLine = formatReasoningProgressDisplayLine(normalized, resolveChannelProgressDraftMaxLineChars(params.discordConfig));
702
+ if (!displayLine) return;
701
703
  if (previewToolProgressEnabled && !previewToolProgressSuppressed) {
702
704
  const priorIndex = lastReasoningProgressLine === void 0 ? -1 : previewToolProgressLines.lastIndexOf(lastReasoningProgressLine);
703
705
  if (priorIndex >= 0) {
704
706
  previewToolProgressLines = [...previewToolProgressLines];
705
- previewToolProgressLines[priorIndex] = normalized;
706
- } else previewToolProgressLines = [...previewToolProgressLines, normalized].slice(-resolveChannelProgressDraftMaxLines(params.discordConfig));
707
- lastReasoningProgressLine = normalized;
707
+ previewToolProgressLines[priorIndex] = displayLine;
708
+ } else previewToolProgressLines = [...previewToolProgressLines, displayLine].slice(-resolveChannelProgressDraftMaxLines(params.discordConfig));
709
+ lastReasoningProgressLine = displayLine;
708
710
  }
709
711
  if (await progressDraftGate.noteWork() && progressDraftGate.hasStarted) await renderProgressDraft();
710
712
  },
@@ -815,7 +817,30 @@ function createDiscordDraftPreviewController(params) {
815
817
  };
816
818
  }
817
819
  function normalizeReasoningProgressLine(text) {
818
- return text.replace(/^\s*(?:>\s*)?(?:Reasoning:|Thinking\.{0,3})\s*/i, "").replace(/\s+/g, " ").trim();
820
+ return text.replace(/^\s*(?:>\s*)?(?:Reasoning:\s*(?:\r?\n|\r)\s*|Thinking\.{0,3}\s*(?:\r?\n|\r)\s*(?:\r?\n|\r)\s*)/i, "").replace(/\s+/g, " ").trim();
821
+ }
822
+ function normalizeReasoningProgressInput(text) {
823
+ const normalized = normalizeReasoningProgressLine(text);
824
+ return (normalized.match(/^_(.*)_$/u)?.[1] ?? normalized).trim();
825
+ }
826
+ function formatReasoningProgressDisplayLine(text, maxChars) {
827
+ const formatted = normalizeReasoningProgressLine(formatReasoningMessage(normalizeReasoningProgressInput(text)));
828
+ if (!formatted) return "";
829
+ if (Array.from(formatted).length <= maxChars) return formatted;
830
+ const italic = formatted.match(/^_(.*)_$/u);
831
+ if (!italic) return compactReasoningProgressDisplayLine(formatted, maxChars);
832
+ const body = compactReasoningProgressDisplayLine(italic[1] ?? "", Math.max(1, maxChars - 2));
833
+ return body ? `_${body}_` : "";
834
+ }
835
+ function compactReasoningProgressDisplayLine(text, maxChars) {
836
+ const normalized = text.replace(/\s+/g, " ").trim();
837
+ const chars = Array.from(normalized);
838
+ if (chars.length <= maxChars) return normalized;
839
+ if (maxChars <= 1) return "…";
840
+ const head = chars.slice(0, maxChars - 1).join("").trimEnd();
841
+ const boundary = head.search(/\s+\S*$/u);
842
+ if (boundary > Math.floor(maxChars * .6)) return `${head.slice(0, boundary).trimEnd()}…`;
843
+ return `${head}…`;
819
844
  }
820
845
  function normalizeCommentaryProgressText(text) {
821
846
  const cleaned = stripInlineDirectiveTagsForDelivery(text).text.trim();
@@ -835,7 +860,7 @@ function mergeReasoningProgressText(current, incoming, options) {
835
860
  return `${current}${incoming}`;
836
861
  }
837
862
  function isReasoningSnapshotText(text) {
838
- return /^\s*(?:>\s*)?(?:Reasoning:|Thinking\.{0,3})\s*/i.test(text);
863
+ return /^\s*(?:>\s*)?(?:Reasoning:\s*(?:\r?\n|\r)\s*|Thinking\.{0,3}\s*(?:\r?\n|\r)\s*(?:\r?\n|\r)\s*)/i.test(text);
839
864
  }
840
865
  function isEmptyDiscordProgressLine(line) {
841
866
  if (!line || typeof line === "string") return false;
@@ -1449,8 +1474,7 @@ async function processDiscordMessageInner(ctx, observer) {
1449
1474
  suppressDefaultToolProgressMessages: draftPreview.suppressDefaultToolProgressMessages ? true : void 0,
1450
1475
  onReasoningStream: async (payload) => {
1451
1476
  await statusReactions.setThinking();
1452
- const formattedText = payload?.text ? formatReasoningMessage(payload.text) : void 0;
1453
- await draftPreview.pushReasoningProgress(formattedText, { snapshot: payload?.isReasoningSnapshot === true });
1477
+ await draftPreview.pushReasoningProgress(payload?.text, { snapshot: payload?.isReasoningSnapshot === true });
1454
1478
  },
1455
1479
  onToolStart: async (payload) => {
1456
1480
  if (isProcessAborted(abortSignal)) return;
@@ -9838,7 +9838,7 @@ function logDiscordStartupPhase(params) {
9838
9838
  });
9839
9839
  }
9840
9840
  async function loadDiscordVoiceRuntime() {
9841
- const promise = discordVoiceRuntimePromise ?? import("./manager.runtime-CVB9_dwq.js");
9841
+ const promise = discordVoiceRuntimePromise ?? import("./manager.runtime-M8890WS1.js");
9842
9842
  discordVoiceRuntimePromise = promise;
9843
9843
  try {
9844
9844
  return await promise;
@@ -9848,7 +9848,7 @@ async function loadDiscordVoiceRuntime() {
9848
9848
  }
9849
9849
  }
9850
9850
  async function loadDiscordProviderSessionRuntime() {
9851
- const promise = discordProviderSessionRuntimePromise ?? import("./provider-session.runtime-CC2f_W1j.js");
9851
+ const promise = discordProviderSessionRuntimePromise ?? import("./provider-session.runtime-DgqndvlW.js");
9852
9852
  discordProviderSessionRuntimePromise = promise;
9853
9853
  try {
9854
9854
  return await promise;
@@ -1,6 +1,6 @@
1
1
  import { a as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-Tfr_vFxk.js";
2
2
  import { n as createThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-CRc4hYr1.js";
3
- import { t as createDiscordMessageHandler } from "./message-handler-CQGpWQ0f.js";
3
+ import { t as createDiscordMessageHandler } from "./message-handler-DRzdnJyM.js";
4
4
  import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "openclaw/plugin-sdk/conversation-runtime";
5
5
  import { getAcpSessionManager, isAcpRuntimeError } from "openclaw/plugin-sdk/acp-runtime";
6
6
  export { createDiscordMessageHandler, createNoopThreadBindingManager, createThreadBindingManager, getAcpSessionManager, isAcpRuntimeError, reconcileAcpThreadBindingsOnStartup, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled };
@@ -0,0 +1,2 @@
1
+ import { t as monitorDiscordProvider } from "./provider-BI4VdnRd.js";
2
+ export { monitorDiscordProvider };
@@ -21,10 +21,10 @@ import { a as mergeAbortSignals, i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as
21
21
  import "./runtime-api.actions.js";
22
22
  import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./audit-eI8e8RpG.js";
23
23
  import "./runtime-api.lookup.js";
24
- import { C as resolveDiscordReplyTarget, T as sanitizeDiscordThreadName, b as registerDiscordListener, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-BTp6enEl.js";
24
+ import { C as resolveDiscordReplyTarget, T as sanitizeDiscordThreadName, b as registerDiscordListener, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-BI4VdnRd.js";
25
25
  import { i as buildDiscordMediaPayload } from "./message-utils-ZTGvA2L8.js";
26
- import { t as createDiscordMessageHandler } from "./message-handler-CQGpWQ0f.js";
27
- import "./runtime-api.monitor-BkA-vJZA.js";
26
+ import { t as createDiscordMessageHandler } from "./message-handler-DRzdnJyM.js";
27
+ import "./runtime-api.monitor-CX6Z4-7x.js";
28
28
  import "./runtime-api.send.js";
29
29
  import "./runtime-api.threads.js";
30
30
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, DiscordSendError, testing as __testing, testing, addRoleDiscord, allowListMatches, auditDiscordChannelPermissions, autoBindSpawnedDiscordSubagent, banMemberDiscord, buildDiscordMediaPayload, 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, isDiscordGroupAllowedByPolicy, isDiscordModerationAction, isRecentlyUnboundThreadWebhookMessage, kickMemberDiscord, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadBindingsBySessionKey, listThreadBindingsForAccount, listThreadsDiscord, mergeAbortSignals, monitorDiscordProvider, moveChannelDiscord, normalizeDiscordAllowList, 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, 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 "./allow-list-C-MqM-B_.js";
2
2
  import "./timeouts-CEJ3--Uw.js";
3
- import "./provider-BTp6enEl.js";
3
+ import "./provider-BI4VdnRd.js";
4
4
  import "./message-utils-ZTGvA2L8.js";
5
- import "./message-handler-CQGpWQ0f.js";
5
+ import "./message-handler-DRzdnJyM.js";
6
6
  export {};
@@ -1,8 +1,8 @@
1
1
  import { a as clearPresences, c as setPresence, i as unregisterGateway, n as getGateway, o as getPresence, r as registerGateway, s as presenceCacheSize, t as clearGateways } from "./gateway-registry-DPxmW0Db.js";
2
2
  import { _ as resolveGroupDmAllow, a as normalizeDiscordSlug, c as resolveDiscordChannelConfigWithFallback, d as resolveDiscordGuildEntry, g as resolveDiscordShouldRequireMention, n as isDiscordGroupAllowedByPolicy, r as normalizeDiscordAllowList, s as resolveDiscordChannelConfig, t as allowListMatches, u as resolveDiscordCommandAuthorized, v as shouldEmitDiscordReactionNotification } from "./allow-list-C-MqM-B_.js";
3
3
  import { a as mergeAbortSignals, 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 "./timeouts-CEJ3--Uw.js";
4
- import { C as resolveDiscordReplyTarget, T as sanitizeDiscordThreadName, b as registerDiscordListener, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-BTp6enEl.js";
4
+ import { C as resolveDiscordReplyTarget, T as sanitizeDiscordThreadName, b as registerDiscordListener, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-BI4VdnRd.js";
5
5
  import { i as buildDiscordMediaPayload } from "./message-utils-ZTGvA2L8.js";
6
- import { t as createDiscordMessageHandler } from "./message-handler-CQGpWQ0f.js";
7
- import "./runtime-api.monitor-BkA-vJZA.js";
6
+ import { t as createDiscordMessageHandler } from "./message-handler-DRzdnJyM.js";
7
+ import "./runtime-api.monitor-CX6Z4-7x.js";
8
8
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, allowListMatches, buildDiscordMediaPayload, clearGateways, clearPresences, createDiscordGatewayPlugin, createDiscordMessageHandler, createDiscordNativeCommand, getGateway, getPresence, isDiscordGroupAllowedByPolicy, mergeAbortSignals, monitorDiscordProvider, normalizeDiscordAllowList, normalizeDiscordSlug, presenceCacheSize, registerDiscordListener, registerGateway, resolveDiscordChannelConfig, resolveDiscordChannelConfigWithFallback, resolveDiscordCommandAuthorized, resolveDiscordGatewayIntents, resolveDiscordGuildEntry, resolveDiscordReplyTarget, resolveDiscordShouldRequireMention, resolveGroupDmAllow, sanitizeDiscordThreadName, setPresence, shouldEmitDiscordReactionNotification, unregisterGateway, waitForDiscordGatewayPluginRegistration };
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.2.0 - 2026-06-01
6
+
7
+ - Add named Opus error codes, `codeName` metadata, and `isOpusError()` for structured libopus error handling.
8
+ - Add coverage tooling and broaden validation-path tests.
9
+ - Add dedicated docs pages for packet inspection (`getPacketInfo`) and error handling, list `getPacketInfo` in the API reference, and wire both into the site navigation.
10
+
5
11
  ## 0.1.0 - 2026-05-26
6
12
 
7
13
  - Initial npm release of `libopus-wasm`, a small ESM-only WebAssembly wrapper around libopus 1.6.1 for raw Opus packet encode/decode in Node 20+ and browsers.
@@ -1,5 +1,7 @@
1
1
  # libopus-wasm
2
2
 
3
+ ![libopus-wasm banner](docs/assets/readme-banner.jpg)
4
+
3
5
  [![CI](https://github.com/openclaw/libopus-wasm/actions/workflows/ci.yml/badge.svg)](https://github.com/openclaw/libopus-wasm/actions/workflows/ci.yml)
4
6
  [![Docs](https://img.shields.io/badge/docs-libopus--wasm.dev-6d4aff)](https://libopus-wasm.dev)
5
7
 
@@ -190,7 +192,8 @@ Read-only: `channels`, `maxFrameSize`, `sampleRate`.
190
192
  `Bitrate` (`Auto`, `Max`) ·
191
193
  `Bandwidth` (`Narrowband`…`Fullband`) ·
192
194
  `EncoderCtl` / `DecoderCtl` request codes ·
193
- `OpusError` (`code`, `operation`).
195
+ `OpusError` (`code`, `codeName`, `operation`) ·
196
+ `OpusErrorCode` · `isOpusError`.
194
197
 
195
198
  ### Supported formats
196
199
 
@@ -135,7 +135,19 @@ export declare function createDecoder(options?: DecoderOptions): Promise<OpusDec
135
135
  export declare function getPacketInfo(packet: Uint8Array, options?: PacketInfoOptions): Promise<OpusPacketInfo>;
136
136
  export declare class OpusError extends Error {
137
137
  readonly code: number;
138
+ readonly codeName: OpusErrorCodeName | undefined;
138
139
  readonly operation: string | undefined;
139
140
  constructor(code: number, message: string, operation?: string);
140
141
  }
142
+ export declare const OpusErrorCode: {
143
+ readonly BadArg: -1;
144
+ readonly BufferTooSmall: -2;
145
+ readonly InternalError: -3;
146
+ readonly InvalidPacket: -4;
147
+ readonly Unimplemented: -5;
148
+ readonly InvalidState: -6;
149
+ readonly AllocFail: -7;
150
+ };
151
+ export type OpusErrorCodeName = keyof typeof OpusErrorCode;
152
+ export declare function isOpusError(error: unknown): error is OpusError;
141
153
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -483,18 +483,50 @@ class WasmOpusDecoder {
483
483
  }
484
484
  export class OpusError extends Error {
485
485
  code;
486
+ codeName;
486
487
  operation;
487
488
  constructor(code, message, operation) {
488
489
  super(message);
489
490
  this.name = "OpusError";
490
491
  this.code = code;
492
+ this.codeName = resolveOpusErrorCodeName(code);
491
493
  this.operation = operation;
492
494
  }
493
495
  }
496
+ export const OpusErrorCode = {
497
+ BadArg: -1,
498
+ BufferTooSmall: -2,
499
+ InternalError: -3,
500
+ InvalidPacket: -4,
501
+ Unimplemented: -5,
502
+ InvalidState: -6,
503
+ AllocFail: -7,
504
+ };
505
+ export function isOpusError(error) {
506
+ if (error instanceof OpusError) {
507
+ return true;
508
+ }
509
+ const candidate = error;
510
+ return (Boolean(error) &&
511
+ typeof error === "object" &&
512
+ candidate.name === "OpusError" &&
513
+ typeof candidate.message === "string" &&
514
+ typeof candidate.code === "number" &&
515
+ (typeof candidate.codeName === "string" || candidate.codeName === undefined) &&
516
+ (typeof candidate.operation === "string" || candidate.operation === undefined));
517
+ }
494
518
  async function getModule() {
495
519
  modulePromise ??= createLibopusModule();
496
520
  return await modulePromise;
497
521
  }
522
+ function resolveOpusErrorCodeName(code) {
523
+ for (const [name, value] of Object.entries(OpusErrorCode)) {
524
+ if (value === code) {
525
+ return name;
526
+ }
527
+ }
528
+ return undefined;
529
+ }
498
530
  function createOpusError(module, code, operation) {
499
531
  const message = module.UTF8ToString(module._oc_strerror(code));
500
532
  return new OpusError(code, `libopus ${operation} failed (${code}): ${message}`, operation);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libopus-wasm",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Small, modern WASM bindings for libopus raw packet encode/decode.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -42,11 +42,13 @@
42
42
  "docs:build": "node scripts/build-docs-site.mjs",
43
43
  "prepack": "pnpm build",
44
44
  "test": "pnpm build:wasm && vitest run",
45
+ "test:coverage": "pnpm build:wasm && vitest run --coverage",
45
46
  "typecheck": "tsc -p tsconfig.json --noEmit"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@discordjs/opus": "0.10.0",
49
50
  "@types/node": "24.10.2",
51
+ "@vitest/coverage-v8": "4.0.14",
50
52
  "typescript": "5.9.3",
51
53
  "vitest": "4.0.14"
52
54
  },
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "2026.5.31-beta.4",
3
+ "version": "2026.6.1-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/discord",
9
- "version": "2026.5.31-beta.4",
9
+ "version": "2026.6.1-beta.2",
10
10
  "dependencies": {
11
11
  "@discordjs/voice": "0.19.2",
12
12
  "discord-api-types": "0.38.48",
13
- "libopus-wasm": "0.1.0",
13
+ "libopus-wasm": "0.2.0",
14
14
  "typebox": "1.1.39",
15
15
  "undici": "8.3.0",
16
16
  "ws": "8.21.0"
17
17
  },
18
18
  "peerDependencies": {
19
- "openclaw": ">=2026.5.31-beta.4"
19
+ "openclaw": ">=2026.6.1-beta.2"
20
20
  },
21
21
  "peerDependenciesMeta": {
22
22
  "openclaw": {
@@ -352,9 +352,9 @@
352
352
  ]
353
353
  },
354
354
  "node_modules/libopus-wasm": {
355
- "version": "0.1.0",
356
- "resolved": "https://registry.npmjs.org/libopus-wasm/-/libopus-wasm-0.1.0.tgz",
357
- "integrity": "sha512-/aurGcAVgy0GcBEUzFaX9pm9qv7zYcy8W5hBXFiK+cyqOXAX4lOS6rlFogkY9CcSIajhjnuXyixsbmziSHCDMQ==",
355
+ "version": "0.2.0",
356
+ "resolved": "https://registry.npmjs.org/libopus-wasm/-/libopus-wasm-0.2.0.tgz",
357
+ "integrity": "sha512-x/2Gu1/C6L3IICY09zyfp984AWiOYjn53u4WfdY3yh+3KTzMN8Xkm77q3lenWMVIk5SnSzjGEkQT+VQMFHLBHQ==",
358
358
  "license": "MIT",
359
359
  "engines": {
360
360
  "node": ">=20"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "2026.5.31-beta.4",
3
+ "version": "2026.6.1-beta.2",
4
4
  "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,13 +10,13 @@
10
10
  "dependencies": {
11
11
  "@discordjs/voice": "0.19.2",
12
12
  "discord-api-types": "0.38.48",
13
- "libopus-wasm": "0.1.0",
13
+ "libopus-wasm": "0.2.0",
14
14
  "typebox": "1.1.39",
15
15
  "undici": "8.3.0",
16
16
  "ws": "8.21.0"
17
17
  },
18
18
  "peerDependencies": {
19
- "openclaw": ">=2026.5.31-beta.4"
19
+ "openclaw": ">=2026.6.1-beta.2"
20
20
  },
21
21
  "peerDependenciesMeta": {
22
22
  "openclaw": {
@@ -63,10 +63,10 @@
63
63
  "allowInvalidConfigRecovery": true
64
64
  },
65
65
  "compat": {
66
- "pluginApi": ">=2026.5.31-beta.4"
66
+ "pluginApi": ">=2026.6.1-beta.2"
67
67
  },
68
68
  "build": {
69
- "openclawVersion": "2026.5.31-beta.4"
69
+ "openclawVersion": "2026.6.1-beta.2"
70
70
  },
71
71
  "release": {
72
72
  "publishToClawHub": true,
@@ -1,2 +0,0 @@
1
- import { t as monitorDiscordProvider } from "./provider-BTp6enEl.js";
2
- export { monitorDiscordProvider };