@openclaw/discord 2026.9.6 → 2026.9.8

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 (150) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{account-inspect-BwQj24ht.mjs → account-inspect-De8hOUxG.mjs} +1 -1
  3. package/dist/.setup/{accounts-CwJQoLjM.mjs → accounts-ChaMcixG.mjs} +1 -4
  4. package/dist/.setup/{activities-api-COU4-0nR.mjs → activities-api-tvbsU2e3.mjs} +38 -66
  5. package/dist/.setup/{api-CBK9zcq5.mjs → api-DVbJwZVt.mjs} +10 -2
  6. package/dist/.setup/{approval-handler.runtime-CbBktBb4.mjs → approval-handler.runtime-DxCK2Rux.mjs} +49 -125
  7. package/dist/.setup/{approval-message-updates-jf9zMaIC.mjs → approval-message-updates-BKFqavHZ.mjs} +2 -2
  8. package/dist/.setup/{audit-vKbh-LFR.mjs → audit-CLg9I71N.mjs} +5 -5
  9. package/dist/.setup/{channel-Dv4e3Jpc.mjs → channel-DxlUVU9t.mjs} +121 -227
  10. package/dist/.setup/{channel-type-DKnjV1XW.mjs → channel-type-DRCrEMss.mjs} +22 -22
  11. package/dist/.setup/{channel.setup-0NX6FFwi.mjs → channel.setup-CRo1GjV7.mjs} +6 -9
  12. package/dist/.setup/{components-yBEb75bB.mjs → components-Cq1PvIpN.mjs} +41 -69
  13. package/dist/.setup/{config-schema-CiZz-mtA.mjs → config-schema-oxELUSDx.mjs} +19 -44
  14. package/dist/.setup/{conversation-binding-route-B7qImK_b.mjs → conversation-binding-route-Caz_XuFH.mjs} +10 -5
  15. package/dist/.setup/{directory-config-BytTftz-.mjs → directory-config-esqNn0Eo.mjs} +6 -9
  16. package/dist/.setup/{directory-live--EGTH0DC.mjs → directory-live-DtKRHuGV.mjs} +6 -12
  17. package/dist/.setup/{discord-BXpHW-cu.mjs → discord-0xJYfdDD.mjs} +82 -386
  18. package/dist/.setup/{doctor-D1R-uFIu.mjs → doctor-BCl1H5tl.mjs} +21 -36
  19. package/dist/.setup/{doctor-contract-Co5vRCZ6.mjs → doctor-contract-CvvgwrrG.mjs} +41 -50
  20. package/dist/.setup/{channel-actions.runtime-leZuw01r.mjs → handle-action-CUvQWnE7.mjs} +67 -104
  21. package/dist/.setup/{handle-action.guild-admin-DcFa8NwA.mjs → handle-action.guild-admin-Df-8gVle.mjs} +62 -120
  22. package/dist/.setup/{live-policy-config-eKQ-PLdy.mjs → live-policy-config-8Pv20CHc.mjs} +2 -3
  23. package/dist/.setup/{message-handler-X6ejmbtY.mjs → message-handler-B-Jk4oDk.mjs} +18 -94
  24. package/dist/.setup/{message-handler.preflight-pluralkit-8Xji34AF.mjs → message-handler.preflight-pluralkit-CWLUBVcx.mjs} +8 -10
  25. package/dist/.setup/{message-handler.preflight-DE_POxFc.mjs → message-handler.preflight-v-__NSDq.mjs} +69 -180
  26. package/dist/.setup/{message-handler.process-CCmIVnxy.mjs → message-handler.process-BNFFuChn.mjs} +65 -86
  27. package/dist/.setup/{outbound-adapter-ClIgmu4F.mjs → outbound-adapter-BobT-kse.mjs} +105 -19
  28. package/dist/.setup/{outbound-session-route-VulUE0yV.mjs → outbound-session-route-zVGxxceg.mjs} +140 -108
  29. package/dist/.setup/{pluralkit-CdAt1G0P.mjs → pluralkit-a6_NLfH9.mjs} +1 -1
  30. package/dist/.setup/{presence-cache-dYSHPWMx.mjs → presence-cache-Di3H3DIU.mjs} +0 -4
  31. package/dist/.setup/{probe-CupW4we4.mjs → probe-LYrIHlBF.mjs} +13 -4
  32. package/dist/.setup/{provider-iOf73HW-.mjs → provider-B_G5hASF.mjs} +721 -1416
  33. package/dist/.setup/provider-session.runtime-BYlTBFD2.mjs +6 -0
  34. package/dist/.setup/provider.runtime-CUE3UxER.mjs +2 -0
  35. package/dist/.setup/{realtime-session.runtime-Dz8uVutq.mjs → realtime-session.runtime-oUd9DOcz.mjs} +41 -55
  36. package/dist/.setup/{receive-recovery-DHst8WRx.mjs → receive-recovery-CHPOsnLc.mjs} +1 -4
  37. package/dist/.setup/{resolve-allowlist-common-CwMBzbx9.mjs → resolve-allowlist-common-DPdRggu5.mjs} +4 -7
  38. package/dist/.setup/{resolve-channels-BbvsLQOZ.mjs → resolve-channels-BFPNRmVv.mjs} +21 -40
  39. package/dist/.setup/{resolve-users-ByFlR7LQ.mjs → resolve-users-0-aBuCy3.mjs} +4 -4
  40. package/dist/.setup/{retry-BEYkDy0P.mjs → retry-pz_cSha2.mjs} +3 -3
  41. package/dist/.setup/rolldown-runtime-B4FMCO8f.mjs +28 -0
  42. package/dist/.setup/{runtime-B8lJfyrA.mjs → runtime-FN000lxA.mjs} +60 -162
  43. package/dist/.setup/runtime-doctor-migrations-CshUGl36.mjs +159 -0
  44. package/dist/.setup/{runtime-DisDbixd.mjs → runtime-sUksZ--Q.mjs} +2 -5
  45. package/dist/.setup/{secret-config-contract-DFu9hfU8.mjs → secret-config-contract-uOE2J7yM.mjs} +15 -85
  46. package/dist/.setup/{security-audit-s5w50-Ly.mjs → security-audit-Cdaegq7C.mjs} +3 -1
  47. package/dist/.setup/{send-CIBzvXjS.mjs → send-CrfEI6Bs.mjs} +53 -108
  48. package/dist/.setup/{send.components-ChY21qr-.mjs → send.components-DxQAMfES.mjs} +62 -107
  49. package/dist/.setup/{send.outbound-QTyuFupn.mjs → send.outbound-BISKnb-a.mjs} +66 -140
  50. package/dist/.setup/{send.shared-VNvWfX2T.mjs → send.shared-DGFkbkQR.mjs} +10 -25
  51. package/dist/.setup/{sender-identity-0Ymgvmaj.mjs → sender-identity-B9X5Vb9R.mjs} +2 -3
  52. package/dist/.setup/setup-plugin-api-BQUBxbhe.mjs +3 -0
  53. package/dist/.setup/{shared-DHPDaMSx.mjs → shared-B3wZ4hN-.mjs} +25 -32
  54. package/dist/.setup/{subagent-hooks-CjW7r8Pe.mjs → subagent-hooks-nlUE9ow7.mjs} +5 -6
  55. package/dist/.setup/system-events-CdeZnvPV.mjs +33 -0
  56. package/dist/.setup/{target-resolver-BXpy6VT8.mjs → target-resolver-BuLapkhy.mjs} +9 -12
  57. package/dist/.setup/targets-0KUcEIYx.mjs +3 -0
  58. package/dist/.setup/{thread-bindings-CEh2dhqP.mjs → thread-bindings-D7TfgjR_.mjs} +33 -35
  59. package/dist/.setup/{thread-bindings.manager-ve-i6oqt.mjs → thread-bindings.manager-DN-NissX.mjs} +325 -233
  60. package/dist/.setup/thread-bindings.session-updates-CshfKghV.mjs +359 -0
  61. package/dist/.setup/{thread-bindings.state-BThFQEga.mjs → thread-bindings.state-g6v9zAym.mjs} +21 -62
  62. package/dist/.setup/{transcripts-source-DVegW0WI.mjs → transcripts-source-p8EV179h.mjs} +76 -235
  63. package/dist/.setup/{typing-BKZL5fGj.mjs → typing-BiHCzBRu.mjs} +2 -1
  64. package/dist/.setup/{voice-runtime-elTtjEIG.mjs → voice-runtime-B46rcwrG.mjs} +140 -244
  65. package/dist/account-inspect-api.js +1 -1
  66. package/dist/action-runtime-api.js +1 -1
  67. package/dist/activities-api.js +1 -1
  68. package/dist/api.js +18 -18
  69. package/dist/channel-config-api.js +1 -1
  70. package/dist/channel-plugin-api.js +1 -1
  71. package/dist/directory-contract-api.js +1 -1
  72. package/dist/doctor-contract-api.js +4 -4
  73. package/dist/index.js +1 -1
  74. package/dist/runtime-api.js +20 -20
  75. package/dist/secret-contract-api.js +1 -1
  76. package/dist/security-audit-contract-api.js +1 -1
  77. package/dist/setup-entry.js +1 -1
  78. package/dist/setup-plugin-api.js +1 -1
  79. package/dist/src/voice/audio-worker.runtime.js +15 -24
  80. package/dist/subagent-hooks-api.js +3 -4
  81. package/dist/transcripts-source-api.js +1 -1
  82. package/node_modules/@types/node/README.md +2 -2
  83. package/node_modules/@types/node/child_process.d.ts +1 -1
  84. package/node_modules/@types/node/crypto.d.ts +20 -8
  85. package/node_modules/@types/node/ffi.d.ts +14 -0
  86. package/node_modules/@types/node/http2.d.ts +3 -2
  87. package/node_modules/@types/node/net.d.ts +16 -4
  88. package/node_modules/@types/node/package.json +2 -17
  89. package/node_modules/@types/node/process.d.ts +1 -0
  90. package/node_modules/@types/node/quic.d.ts +39 -1
  91. package/node_modules/@types/node/stream/iter.d.ts +9 -12
  92. package/node_modules/@types/node/test/reporters.d.ts +1 -0
  93. package/node_modules/@types/node/test.d.ts +72 -0
  94. package/node_modules/@types/node/tls.d.ts +14 -10
  95. package/node_modules/@types/node/vm.d.ts +2 -1
  96. package/node_modules/@types/node/worker_threads.d.ts +4 -1
  97. package/node_modules/typebox/build/compile/code.mjs +1 -2
  98. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  99. package/node_modules/typebox/build/format/iri.mjs +16 -9
  100. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  101. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  102. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  103. package/node_modules/typebox/build/guard/index.mjs +6 -0
  104. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  105. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  106. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  107. package/node_modules/typebox/build/schema/build.mjs +2 -3
  108. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  109. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  110. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  111. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  112. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  113. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  114. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  115. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  116. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  117. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  118. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  119. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  120. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  121. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  122. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  123. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  124. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  125. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  126. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  127. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  128. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  129. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  130. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  131. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  132. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  133. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  134. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  135. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  136. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  137. package/node_modules/typebox/package.json +1 -1
  138. package/node_modules/typebox/readme.md +3 -1
  139. package/openclaw.plugin.json +21 -1
  140. package/package.json +5 -5
  141. package/dist/.setup/agent-components.runtime-CEPrf2SY.mjs +0 -4
  142. package/dist/.setup/probe.runtime-DBQ_AGPe.mjs +0 -2
  143. package/dist/.setup/provider-session.runtime-DrGAYnZv.mjs +0 -6
  144. package/dist/.setup/provider.runtime-BmjW_pIw.mjs +0 -2
  145. package/dist/.setup/security-audit.runtime-DHtYenx9.mjs +0 -2
  146. package/dist/.setup/setup-plugin-api-Dvr41dyx.mjs +0 -3
  147. package/dist/.setup/system-events-B2YEEMbS.mjs +0 -34
  148. package/dist/.setup/targets-CvemhN3i.mjs +0 -3
  149. package/dist/.setup/thread-bindings.session-updates-DCQq1WZ5.mjs +0 -55
  150. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -1,11 +1,13 @@
1
- import { Ut as __exportAll, _ as DiscordError, ct as createThread, dt as editChannel, mt as getChannelMessage, t as discord_exports } from "./discord-BXpHW-cu.mjs";
2
- import { E as getDiscordEndpointRuntime, O as resolveDiscordEndpointMediaGuard, f as resolveDiscordGuildEntry, i as normalizeDiscordAllowList, l as resolveDiscordChannelConfigWithFallback, n as allowListMatches, o as normalizeDiscordSlug, p as resolveDiscordMemberAccessState, r as isDiscordGroupAllowedByPolicy, t as isDiscordThreadChannelType } from "./channel-type-DKnjV1XW.mjs";
3
- import { a as listEnabledDiscordAccounts, c as resolveDiscordAccount, l as resolveDiscordAccountAllowFrom } from "./accounts-CwJQoLjM.mjs";
1
+ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
+ import { _ as DiscordError, ft as editChannel, ht as getChannelMessage, lt as createThread, t as discord_exports } from "./discord-0xJYfdDD.mjs";
3
+ import { D as getDiscordEndpointRuntime, f as resolveDiscordGuildEntry, i as normalizeDiscordAllowList, k as resolveDiscordEndpointMediaGuard, l as resolveDiscordChannelConfigWithFallback, n as allowListMatches, o as normalizeDiscordSlug, p as resolveDiscordMemberAccessState, r as isDiscordGroupAllowedByPolicy, t as isDiscordThreadChannelType } from "./channel-type-DRCrEMss.mjs";
4
+ import { a as listEnabledDiscordAccounts, c as resolveDiscordAccount, l as resolveDiscordAccountAllowFrom } from "./accounts-ChaMcixG.mjs";
4
5
  import { t as resolveDiscordCommandOwnerAllowFrom } from "./command-owners-D78sAoOz.mjs";
5
6
  import { a as resolveDiscordChannelParentSafe, i as resolveDiscordChannelParentIdSafe, n as resolveDiscordChannelInfoSafe, r as resolveDiscordChannelNameSafe, t as resolveDiscordChannelIdSafe } from "./channel-access-C12aDZ0p.mjs";
6
7
  import { ComponentType, StickerFormatType } from "discord-api-types/v10";
7
8
  import { asDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
8
9
  import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime";
10
+ import { resolveGlobalSingleton } from "openclaw/plugin-sdk/global-singleton";
9
11
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
10
12
  import { buildAgentSessionKey } from "openclaw/plugin-sdk/routing";
11
13
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId, summarizeStringEntries, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -27,11 +29,8 @@ const discordChannelInfoCacheState = { entries: /* @__PURE__ */ new Map() };
27
29
  const DISCORD_CHANNEL_INFO_CACHE_TTL_MS = 3e5;
28
30
  const DISCORD_CHANNEL_INFO_NEGATIVE_CACHE_TTL_MS = 3e4;
29
31
  const DISCORD_CHANNEL_INFO_CACHE_MAX_ENTRIES = 1e3;
30
- function resolveDiscordChannelInfoCacheExpiresAt(ttlMs, nowMs) {
31
- return resolveExpiresAtMsFromDurationMs(ttlMs, { nowMs });
32
- }
33
32
  function cacheDiscordChannelInfo(channelId, value, ttlMs, nowMs) {
34
- const expiresAt = resolveDiscordChannelInfoCacheExpiresAt(ttlMs, nowMs);
33
+ const expiresAt = resolveExpiresAtMsFromDurationMs(ttlMs, { nowMs });
35
34
  if (expiresAt !== void 0) {
36
35
  discordChannelInfoCacheState.entries.set(channelId, {
37
36
  value,
@@ -264,10 +263,13 @@ const AUDIO_ATTACHMENT_EXTENSIONS = /* @__PURE__ */ new Set([
264
263
  ".wav"
265
264
  ]);
266
265
  const DISCORD_STICKER_ASSET_BASE_URL = "https://media.discordapp.net/stickers";
267
- function createDiscordMediaOperation(abortSignal) {
266
+ function createDiscordMediaOperation(maxBytes, options) {
268
267
  return {
268
+ ...options,
269
+ ssrfPolicy: resolveDiscordCdnPolicy(options?.ssrfPolicy),
269
270
  endpointRuntime: getDiscordEndpointRuntime() ?? null,
270
- abortSignal
271
+ maxBytes,
272
+ out: []
271
273
  };
272
274
  }
273
275
  function isDiscordAudioAttachmentFileName(fileName) {
@@ -308,121 +310,46 @@ function resolveDiscordMediaClassification(params) {
308
310
  ...kind ? { kind } : {}
309
311
  };
310
312
  }
311
- async function resolveMediaList(message, maxBytes, options) {
312
- const out = [];
313
- const resolvedSsrFPolicy = resolveDiscordCdnPolicy(options?.ssrfPolicy);
314
- const operation = createDiscordMediaOperation(options?.abortSignal);
313
+ async function resolveMessageMedia(message, operation, errorPrefix) {
315
314
  await appendResolvedMediaFromAttachments({
315
+ ...operation,
316
316
  attachments: message.attachments ?? [],
317
- maxBytes,
318
- out,
319
- errorPrefix: "discord: failed to download attachment",
320
- fetchImpl: options?.fetchImpl,
321
- ssrfPolicy: resolvedSsrFPolicy,
322
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
323
- totalTimeoutMs: options?.totalTimeoutMs,
324
- ...operation
317
+ errorPrefix: `${errorPrefix} attachment`
325
318
  });
326
319
  await appendResolvedMediaFromStickers({
320
+ ...operation,
327
321
  stickers: resolveDiscordMessageStickers(message),
328
- maxBytes,
329
- out,
330
- errorPrefix: "discord: failed to download sticker",
331
- fetchImpl: options?.fetchImpl,
332
- ssrfPolicy: resolvedSsrFPolicy,
333
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
334
- totalTimeoutMs: options?.totalTimeoutMs,
335
- ...operation
322
+ errorPrefix: `${errorPrefix} sticker`
336
323
  });
337
- return out;
324
+ return operation.out;
325
+ }
326
+ async function resolveMediaList(message, maxBytes, options) {
327
+ return resolveMessageMedia(message, createDiscordMediaOperation(maxBytes, options), "discord: failed to download");
338
328
  }
339
329
  async function resolveForwardedMediaList(message, maxBytes, options) {
340
330
  const snapshots = resolveDiscordMessageSnapshots(message);
341
- const out = [];
342
- const resolvedSsrFPolicy = resolveDiscordCdnPolicy(options?.ssrfPolicy);
343
- const operation = createDiscordMediaOperation(options?.abortSignal);
331
+ const operation = createDiscordMediaOperation(maxBytes, options);
344
332
  if (snapshots.length > 0) {
345
333
  for (const snapshot of snapshots) {
346
334
  await appendResolvedMediaFromAttachments({
335
+ ...operation,
347
336
  attachments: snapshot.message?.attachments,
348
- maxBytes,
349
- out,
350
- errorPrefix: "discord: failed to download forwarded attachment",
351
- fetchImpl: options?.fetchImpl,
352
- ssrfPolicy: resolvedSsrFPolicy,
353
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
354
- totalTimeoutMs: options?.totalTimeoutMs,
355
- ...operation
337
+ errorPrefix: "discord: failed to download forwarded attachment"
356
338
  });
357
339
  await appendResolvedMediaFromStickers({
340
+ ...operation,
358
341
  stickers: snapshot.message ? resolveDiscordSnapshotStickers(snapshot.message) : [],
359
- maxBytes,
360
- out,
361
- errorPrefix: "discord: failed to download forwarded sticker",
362
- fetchImpl: options?.fetchImpl,
363
- ssrfPolicy: resolvedSsrFPolicy,
364
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
365
- totalTimeoutMs: options?.totalTimeoutMs,
366
- ...operation
342
+ errorPrefix: "discord: failed to download forwarded sticker"
367
343
  });
368
344
  }
369
- return out;
345
+ return operation.out;
370
346
  }
371
347
  const referencedForward = resolveDiscordReferencedForwardMessage(message);
372
- if (!referencedForward) return out;
373
- await appendResolvedMediaFromAttachments({
374
- attachments: referencedForward.attachments,
375
- maxBytes,
376
- out,
377
- errorPrefix: "discord: failed to download forwarded attachment",
378
- fetchImpl: options?.fetchImpl,
379
- ssrfPolicy: resolvedSsrFPolicy,
380
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
381
- totalTimeoutMs: options?.totalTimeoutMs,
382
- ...operation
383
- });
384
- await appendResolvedMediaFromStickers({
385
- stickers: resolveDiscordMessageStickers(referencedForward),
386
- maxBytes,
387
- out,
388
- errorPrefix: "discord: failed to download forwarded sticker",
389
- fetchImpl: options?.fetchImpl,
390
- ssrfPolicy: resolvedSsrFPolicy,
391
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
392
- totalTimeoutMs: options?.totalTimeoutMs,
393
- ...operation
394
- });
395
- return out;
348
+ return referencedForward ? resolveMessageMedia(referencedForward, operation, "discord: failed to download forwarded") : operation.out;
396
349
  }
397
350
  async function resolveReferencedReplyMediaList(message, maxBytes, options) {
398
351
  const referencedReply = resolveDiscordReferencedReplyMessage(message);
399
- const out = [];
400
- if (!referencedReply) return out;
401
- const resolvedSsrFPolicy = resolveDiscordCdnPolicy(options?.ssrfPolicy);
402
- const operation = createDiscordMediaOperation(options?.abortSignal);
403
- await appendResolvedMediaFromAttachments({
404
- attachments: referencedReply.attachments,
405
- maxBytes,
406
- out,
407
- errorPrefix: "discord: failed to download referenced reply attachment",
408
- fetchImpl: options?.fetchImpl,
409
- ssrfPolicy: resolvedSsrFPolicy,
410
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
411
- totalTimeoutMs: options?.totalTimeoutMs,
412
- ...operation
413
- });
414
- await appendResolvedMediaFromStickers({
415
- stickers: resolveDiscordMessageStickers(referencedReply),
416
- maxBytes,
417
- out,
418
- errorPrefix: "discord: failed to download referenced reply sticker",
419
- fetchImpl: options?.fetchImpl,
420
- ssrfPolicy: resolvedSsrFPolicy,
421
- readIdleTimeoutMs: options?.readIdleTimeoutMs,
422
- totalTimeoutMs: options?.totalTimeoutMs,
423
- ...operation
424
- });
425
- return out;
352
+ return referencedReply ? resolveMessageMedia(referencedReply, createDiscordMediaOperation(maxBytes, options), "discord: failed to download referenced reply") : [];
426
353
  }
427
354
  async function fetchDiscordMedia(params) {
428
355
  const endpointGuard = resolveDiscordEndpointMediaGuard(params.url, params.endpointRuntime);
@@ -585,14 +512,9 @@ function isImageAttachment(attachment) {
585
512
  if (!name) return false;
586
513
  return /\.(avif|bmp|gif|heic|heif|jpe?g|png|tiff?|webp)$/.test(name);
587
514
  }
588
- function resolveDiscordTextMediaFacts(params) {
589
- return [...(params.attachments ?? []).map((attachment) => {
590
- return resolveDiscordMediaClassification({ attachment });
591
- }), ...(params.stickers ?? []).map(() => ({ kind: "sticker" }))];
592
- }
593
515
  /** Renders native Discord media only for transcript surfaces that cannot carry facts. */
594
516
  function formatDiscordMediaText(params) {
595
- return formatMediaPlaceholderText(resolveDiscordTextMediaFacts(params));
517
+ return formatMediaPlaceholderText([...(params.attachments ?? []).map((attachment) => resolveDiscordMediaClassification({ attachment })), ...(params.stickers ?? []).map(() => ({ kind: "sticker" }))]);
596
518
  }
597
519
  //#endregion
598
520
  //#region extensions/discord/src/monitor/message-text.ts
@@ -602,10 +524,7 @@ function resolveDiscordEmbedText(embeds) {
602
524
  function resolveDiscordMessageText(message, options) {
603
525
  const baseText = resolveDiscordMentions(resolveDiscordMessageMentionDocuments(message).map((text) => normalizeOptionalString(text)).filter(Boolean).join("\n") || normalizeOptionalString(options?.fallbackText) || "", message);
604
526
  if (!options?.includeForwarded) return baseText;
605
- const forwardedText = resolveDiscordForwardedMessagesText(message);
606
- if (!forwardedText) return baseText;
607
- if (!baseText) return forwardedText;
608
- return `${baseText}\n${forwardedText}`;
527
+ return [baseText, resolveDiscordForwardedMessagesText(message)].filter(Boolean).join("\n");
609
528
  }
610
529
  function resolveDiscordMessageMentionDocuments(message) {
611
530
  const content = typeof message.content === "string" ? message.content : "";
@@ -671,10 +590,7 @@ function resolveDiscordForwardedMessagesText(message) {
671
590
  if (snapshots.length > 0) return resolveDiscordForwardedMessagesTextFromSnapshots(snapshots);
672
591
  const referencedForward = resolveDiscordReferencedForwardMessage(message);
673
592
  if (!referencedForward) return "";
674
- const referencedText = resolveDiscordMessageHistoryText(referencedForward);
675
- if (!referencedText) return "";
676
- const authorLabel = formatDiscordSnapshotAuthor(referencedForward.author);
677
- return `${authorLabel ? `[Forwarded message from ${authorLabel}]` : "[Forwarded message]"}\n${referencedText}`;
593
+ return formatDiscordForwardedMessageBlock(resolveDiscordMessageHistoryText(referencedForward), referencedForward.author);
678
594
  }
679
595
  function resolveDiscordMessageComponents(message) {
680
596
  const components = message.components;
@@ -702,15 +618,11 @@ function collectDiscordTextDisplayDocuments(value, parts) {
702
618
  collectDiscordTextDisplayDocuments(component.component, parts);
703
619
  }
704
620
  function resolveDiscordForwardedMessagesTextFromSnapshots(snapshots) {
705
- const forwardedBlocks = normalizeDiscordMessageSnapshots(snapshots).map((snapshot) => buildDiscordForwardedMessageBlock(snapshot.message)).filter((entry) => Boolean(entry));
706
- if (forwardedBlocks.length === 0) return "";
707
- return forwardedBlocks.join("\n\n");
621
+ return snapshots.map(({ message }) => message ? formatDiscordForwardedMessageBlock(resolveDiscordRawMessageText(message), message.author) : "").filter(Boolean).join("\n\n");
708
622
  }
709
- function buildDiscordForwardedMessageBlock(snapshotMessage) {
710
- if (!snapshotMessage) return null;
711
- const text = resolveDiscordRawMessageText(snapshotMessage);
712
- if (!text) return null;
713
- const authorLabel = formatDiscordSnapshotAuthor(snapshotMessage.author);
623
+ function formatDiscordForwardedMessageBlock(text, author) {
624
+ if (!text) return "";
625
+ const authorLabel = formatDiscordSnapshotAuthor(author);
714
626
  return `${authorLabel ? `[Forwarded message from ${authorLabel}]` : "[Forwarded message]"}\n${text}`;
715
627
  }
716
628
  /** Single owner for raw Discord message payloads (REST fetches and forwarded snapshots). */
@@ -720,7 +632,7 @@ function resolveDiscordRawMessageText(message) {
720
632
  attachments: message.attachments ?? void 0,
721
633
  stickers: resolveDiscordSnapshotStickers(message)
722
634
  });
723
- return [content || resolveDiscordEmbedText(message.embeds) || extractDiscordComponentsV2Text(message.components) || resolveDiscordForwardedMessagesTextFromSnapshots(message.message_snapshots), mediaText].filter(Boolean).join("\n");
635
+ return [content || resolveDiscordEmbedText(message.embeds) || extractDiscordComponentsV2Text(message.components) || resolveDiscordForwardedMessagesTextFromSnapshots(normalizeDiscordMessageSnapshots(message.message_snapshots)), mediaText].filter(Boolean).join("\n");
724
636
  }
725
637
  //#endregion
726
638
  //#region extensions/discord/src/monitor/threading.cache.ts
@@ -750,9 +662,6 @@ function setCachedThreadStarter(key, value, now) {
750
662
  }
751
663
  //#endregion
752
664
  //#region extensions/discord/src/monitor/threading.starter.ts
753
- function isDiscordForumParentType(parentType) {
754
- return parentType === discord_exports.ChannelType.GuildForum || parentType === discord_exports.ChannelType.GuildMedia;
755
- }
756
665
  const IN_FLIGHT_DISCORD_THREAD_STARTERS = /* @__PURE__ */ new Map();
757
666
  function resolveDiscordThreadChannel(params) {
758
667
  if (!params.isGuildMessage) return null;
@@ -787,7 +696,7 @@ async function resolveDiscordThreadParentInfo(params) {
787
696
  };
788
697
  }
789
698
  async function resolveDiscordThreadStarter(params) {
790
- const messageChannelId = resolveDiscordThreadStarterMessageChannelId(params);
699
+ const messageChannelId = params.parentType === discord_exports.ChannelType.GuildForum || params.parentType === discord_exports.ChannelType.GuildMedia ? params.channel.id : params.parentId;
791
700
  if (!messageChannelId) return null;
792
701
  const cacheKey = `${params.accountId}:${params.channel.id}:${messageChannelId}`;
793
702
  const cached = getCachedThreadStarter(cacheKey, Date.now());
@@ -807,11 +716,7 @@ async function resolveDiscordThreadStarterUncached(params, cacheKey, messageChan
807
716
  setCachedThreadStarter(cacheKey, { kind: "miss" }, Date.now());
808
717
  };
809
718
  try {
810
- const starter = await fetchDiscordThreadStarterMessage({
811
- client: params.client,
812
- messageChannelId,
813
- threadId: params.channel.id
814
- });
719
+ const starter = await getChannelMessage(params.client.rest, messageChannelId, params.channel.id);
815
720
  if (!starter) {
816
721
  cacheMiss();
817
722
  return null;
@@ -830,80 +735,53 @@ async function resolveDiscordThreadStarterUncached(params, cacheKey, messageChan
830
735
  }, Date.now());
831
736
  return payload;
832
737
  } catch (error) {
833
- if (isDiscordThreadStarterNegativeCacheError(error)) cacheMiss();
738
+ if (error instanceof DiscordError && (error.status === 403 || error.status === 404)) cacheMiss();
834
739
  return null;
835
740
  }
836
741
  }
837
- function isDiscordThreadStarterNegativeCacheError(error) {
838
- return error instanceof DiscordError && (error.status === 403 || error.status === 404);
839
- }
840
- function resolveDiscordThreadStarterMessageChannelId(params) {
841
- return isDiscordForumParentType(params.parentType) ? params.channel.id : params.parentId;
842
- }
843
- async function fetchDiscordThreadStarterMessage(params) {
844
- const starter = await getChannelMessage(params.client.rest, params.messageChannelId, params.threadId);
845
- return starter ? starter : null;
846
- }
847
742
  function buildDiscordThreadStarterPayload(params) {
848
743
  const text = resolveDiscordRawMessageText(params.starter);
849
744
  if (!text) return null;
745
+ const starter = params.starter;
746
+ const authorTag = resolveDiscordThreadStarterAuthorTag(starter.author);
850
747
  return {
851
748
  text,
852
- ...resolveDiscordThreadStarterIdentity(params.starter),
853
- timestamp: params.resolveTimestampMs(params.starter.timestamp) ?? void 0
854
- };
855
- }
856
- function resolveDiscordThreadStarterIdentity(starter) {
857
- return {
858
- author: resolveDiscordThreadStarterAuthor(starter),
749
+ author: starter.member?.nick ?? starter.member?.displayName ?? authorTag ?? starter.author?.username ?? starter.author?.id ?? "Unknown",
859
750
  authorId: starter.author?.id ?? void 0,
860
751
  authorName: starter.author?.username ?? void 0,
861
- authorTag: resolveDiscordThreadStarterAuthorTag(starter.author),
862
- memberRoleIds: resolveDiscordThreadStarterRoleIds(starter.member)
752
+ authorTag,
753
+ memberRoleIds: Array.isArray(starter.member?.roles) ? starter.member.roles : void 0,
754
+ timestamp: params.resolveTimestampMs(starter.timestamp) ?? void 0
863
755
  };
864
756
  }
865
- function resolveDiscordThreadStarterAuthor(starter) {
866
- return starter.member?.nick ?? starter.member?.displayName ?? resolveDiscordThreadStarterAuthorTag(starter.author) ?? starter.author?.username ?? starter.author?.id ?? "Unknown";
867
- }
868
757
  function resolveDiscordThreadStarterAuthorTag(author) {
869
758
  if (!author?.username || !author.discriminator) return;
870
759
  if (author.discriminator !== "0") return `${author.username}#${author.discriminator}`;
871
760
  return author.username;
872
761
  }
873
- function resolveDiscordThreadStarterRoleIds(member) {
874
- return Array.isArray(member?.roles) ? member.roles : void 0;
875
- }
876
762
  function resolveDiscordReplyTarget(opts) {
877
- if (opts.replyToMode === "off") return;
878
- const replyToId = normalizeOptionalString(opts.replyToId);
879
- if (!replyToId) return;
880
- if (opts.replyToMode === "all") return replyToId;
881
- return opts.hasReplied ? void 0 : replyToId;
763
+ return createReplyReferencePlanner({
764
+ replyToMode: opts.replyToMode,
765
+ startId: opts.replyToId,
766
+ hasReplied: opts.hasReplied
767
+ }).peek();
882
768
  }
883
769
  function sanitizeDiscordThreadName(rawName, fallbackId) {
884
770
  const baseSource = rawName.replace(/<@!?\d+>/g, "").replace(/<@&\d+>/g, "").replace(/<#\d+>/g, "").replace(/\s+/g, " ").trim() || `Thread ${fallbackId}`;
885
- const base = truncateUtf16Safe(baseSource, 80);
886
- return truncateUtf16Safe(base, 100) || `Thread ${fallbackId}`;
771
+ return truncateUtf16Safe(baseSource, 80) || `Thread ${fallbackId}`;
887
772
  }
888
773
  function resolveDiscordReplyDeliveryPlan(params) {
889
- const originalReplyTarget = params.replyTarget;
890
- let deliverTarget = originalReplyTarget;
891
- let replyTarget = originalReplyTarget;
892
- if (params.createdThreadId) {
893
- deliverTarget = `channel:${params.createdThreadId}`;
894
- replyTarget = deliverTarget;
895
- }
896
- const allowReference = deliverTarget === originalReplyTarget;
897
- const replyReference = createReplyReferencePlanner({
898
- replyToMode: allowReference ? params.replyToMode : "off",
899
- existingId: params.threadChannel ? params.messageId : void 0,
900
- startId: params.messageId,
901
- allowReference
902
- });
774
+ const deliverTarget = params.createdThreadId ? `channel:${params.createdThreadId}` : params.replyTarget;
775
+ const allowReference = deliverTarget === params.replyTarget;
903
776
  return {
904
777
  deliverTarget,
905
- replyTarget,
906
- replyReference
778
+ replyTarget: deliverTarget,
779
+ replyReference: createReplyReferencePlanner({
780
+ replyToMode: allowReference ? params.replyToMode : "off",
781
+ existingId: params.threadChannel ? params.messageId : void 0,
782
+ startId: params.messageId,
783
+ allowReference
784
+ })
907
785
  };
908
786
  }
909
787
  //#endregion
@@ -939,20 +817,8 @@ async function resolveDiscordAutoThreadReplyPlan(params) {
939
817
  const messageChannelId = resolveTrimmedDiscordMessageChannelId(params);
940
818
  const originalReplyTarget = `channel:${params.threadChannel?.id ?? (messageChannelId || "unknown")}`;
941
819
  const createdThreadId = await maybeCreateDiscordAutoThread({
942
- client: params.client,
943
- message: params.message,
944
- messageChannelId: messageChannelId || void 0,
945
- channel: params.channel,
946
- isGuildMessage: params.isGuildMessage,
947
- channelConfig: params.channelConfig,
948
- threadChannel: params.threadChannel,
949
- channelType: params.channelType,
950
- channelName: params.channelName,
951
- channelDescription: params.channelDescription,
952
- baseText: params.baseText,
953
- combinedBody: params.combinedBody,
954
- cfg: params.cfg,
955
- agentId: params.agentId
820
+ ...params,
821
+ messageChannelId: messageChannelId || void 0
956
822
  });
957
823
  const deliveryPlan = resolveDiscordReplyDeliveryPlan({
958
824
  replyTarget: originalReplyTarget,
@@ -982,7 +848,7 @@ async function maybeCreateDiscordAutoThread(params) {
982
848
  if (params.channelType === discord_exports.ChannelType.GuildForum || params.channelType === discord_exports.ChannelType.GuildMedia || params.channelType === discord_exports.ChannelType.GuildVoice || params.channelType === discord_exports.ChannelType.GuildStageVoice) return;
983
849
  const messageChannelId = resolveTrimmedDiscordMessageChannelId(params);
984
850
  if (!messageChannelId) return;
985
- try {
851
+ const findExistingThread = async () => {
986
852
  try {
987
853
  const existingThreadId = (await getChannelMessage(params.client.rest, messageChannelId, params.message.id))?.thread?.id;
988
854
  if (existingThreadId) {
@@ -990,6 +856,10 @@ async function maybeCreateDiscordAutoThread(params) {
990
856
  return existingThreadId;
991
857
  }
992
858
  } catch {}
859
+ };
860
+ try {
861
+ const existingThreadId = await findExistingThread();
862
+ if (existingThreadId) return existingThreadId;
993
863
  if (params.message.author?.bot) {
994
864
  logVerbose(`discord: autoThread skipped for bot-authored message ${messageChannelId}/${params.message.id}`);
995
865
  return;
@@ -1026,14 +896,7 @@ async function maybeCreateDiscordAutoThread(params) {
1026
896
  return createdId || void 0;
1027
897
  } catch (err) {
1028
898
  logVerbose(`discord: autoThread creation failed for ${messageChannelId}/${params.message.id}: ${String(err)}`);
1029
- try {
1030
- const existingThreadId = (await getChannelMessage(params.client.rest, messageChannelId, params.message.id))?.thread?.id || "";
1031
- if (existingThreadId) {
1032
- logVerbose(`discord: autoThread reusing existing thread ${existingThreadId} on ${messageChannelId}/${params.message.id}`);
1033
- return existingThreadId;
1034
- }
1035
- } catch {}
1036
- return;
899
+ return findExistingThread();
1037
900
  }
1038
901
  }
1039
902
  function resolveDiscordThreadTitleModelRef(params) {
@@ -1282,37 +1145,15 @@ function resolveDiscordVoiceEnabled(voice) {
1282
1145
  if (voice?.enabled !== void 0) return voice.enabled;
1283
1146
  return voice !== void 0;
1284
1147
  }
1285
- function buildProviderConfigs(realtimeConfig) {
1286
- const configs = realtimeConfig?.providers;
1287
- return configs && Object.keys(configs).length > 0 ? { ...configs } : void 0;
1288
- }
1289
- function buildProviderConfigOverrides(realtimeConfig) {
1290
- const overrides = {
1291
- ...realtimeConfig?.model ? { model: realtimeConfig.model } : {},
1292
- ...realtimeConfig?.speakerVoice ? { voice: realtimeConfig.speakerVoice } : realtimeConfig?.speakerVoiceId ? { voice: realtimeConfig.speakerVoiceId } : {},
1293
- ...typeof realtimeConfig?.minBargeInAudioEndMs === "number" ? { minBargeInAudioEndMs: realtimeConfig.minBargeInAudioEndMs } : {}
1294
- };
1295
- return Object.keys(overrides).length > 0 ? overrides : void 0;
1296
- }
1297
1148
  //#endregion
1298
1149
  //#region extensions/discord/src/voice/transcripts-source.ts
1299
- const DISCORD_TRANSCRIPTS_STATE_KEY = Symbol.for("openclaw.discordTranscriptsState");
1300
- let discordTranscriptsState;
1301
- function resolveDiscordTranscriptsGlobalState() {
1302
- if (!discordTranscriptsState) {
1303
- const globalStore = globalThis;
1304
- discordTranscriptsState = globalStore[DISCORD_TRANSCRIPTS_STATE_KEY] ?? {
1305
- managersByAccountId: /* @__PURE__ */ new Map(),
1306
- captures: /* @__PURE__ */ new Map(),
1307
- managerWaiters: /* @__PURE__ */ new Set(),
1308
- captureEpochReaders: /* @__PURE__ */ new Map(),
1309
- nextRecordingEpoch: 0n
1310
- };
1311
- globalStore[DISCORD_TRANSCRIPTS_STATE_KEY] = discordTranscriptsState;
1312
- }
1313
- return discordTranscriptsState;
1314
- }
1315
- const TRANSCRIPTS_STATE = resolveDiscordTranscriptsGlobalState();
1150
+ const TRANSCRIPTS_STATE = resolveGlobalSingleton(Symbol.for("openclaw.discordTranscriptsState"), () => ({
1151
+ managersByAccountId: /* @__PURE__ */ new Map(),
1152
+ captures: /* @__PURE__ */ new Map(),
1153
+ managerWaiters: /* @__PURE__ */ new Set(),
1154
+ captureEpochReaders: /* @__PURE__ */ new Map(),
1155
+ nextRecordingEpoch: 0n
1156
+ }));
1316
1157
  const managersByAccountId = TRANSCRIPTS_STATE.managersByAccountId;
1317
1158
  const captures = TRANSCRIPTS_STATE.captures;
1318
1159
  const managerWaiters = TRANSCRIPTS_STATE.managerWaiters;
@@ -1777,4 +1618,4 @@ const discordVoiceTranscriptsSourceProvider = {
1777
1618
  }
1778
1619
  };
1779
1620
  //#endregion
1780
- export { resolveDiscordReferencedReplyMessageId as A, resolveForwardedMediaList as C, hasDiscordMessageStickers as D, resolveDiscordCdnPolicy as E, resolveDiscordMessageChannelId as M, resolveDiscordMessageStickers as O, formatDiscordMediaText as S, resolveReferencedReplyMediaList as T, sanitizeDiscordThreadName as _, buildProviderConfigOverrides as a, resolveDiscordMessageMentionDocuments as b, authorizeDiscordVoiceIngress as c, resolveDiscordThreadLikeChannelContext as d, resolveFetchedDiscordThreadLikeChannelContext as f, resolveDiscordThreadStarter as g, resolveDiscordReplyTarget as h, setDiscordTranscriptsVoiceManager as i, resolveDiscordChannelInfo as j, resolveDiscordReferencedReplyMessage as k, resolveDiscordVoiceAccess as l, resolveDiscordAutoThreadReplyPlan as m, discordVoiceTranscriptsSourceProvider as n, buildProviderConfigs as o, threading_exports as p, resolveDiscordTranscriptsCapture as r, resolveDiscordVoiceEnabled as s, bindDiscordCaptureReceipts as t, resolveDiscordVoiceAccessTarget as u, resolveDiscordMessageBatch as v, resolveMediaList as w, resolveDiscordMessageText as x, resolveDiscordMessageHistoryText as y };
1621
+ export { resolveDiscordMessageChannelId as A, resolveReferencedReplyMediaList as C, resolveDiscordReferencedReplyMessage as D, resolveDiscordMessageStickers as E, resolveDiscordReferencedReplyMessageId as O, resolveMediaList as S, hasDiscordMessageStickers as T, resolveDiscordMessageHistoryText as _, resolveDiscordVoiceEnabled as a, formatDiscordMediaText as b, resolveDiscordVoiceAccessTarget as c, threading_exports as d, resolveDiscordAutoThreadReplyPlan as f, resolveDiscordMessageBatch as g, sanitizeDiscordThreadName as h, setDiscordTranscriptsVoiceManager as i, resolveDiscordChannelInfo as k, resolveDiscordThreadLikeChannelContext as l, resolveDiscordThreadStarter as m, discordVoiceTranscriptsSourceProvider as n, authorizeDiscordVoiceIngress as o, resolveDiscordReplyTarget as p, resolveDiscordTranscriptsCapture as r, resolveDiscordVoiceAccess as s, bindDiscordCaptureReceipts as t, resolveFetchedDiscordThreadLikeChannelContext as u, resolveDiscordMessageMentionDocuments as v, resolveDiscordCdnPolicy as w, resolveForwardedMediaList as x, resolveDiscordMessageText as y };
@@ -1,4 +1,5 @@
1
- import { Ut as __exportAll, xt as sendChannelTyping } from "./discord-BXpHW-cu.mjs";
1
+ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
+ import { St as sendChannelTyping } from "./discord-0xJYfdDD.mjs";
2
3
  import { c as raceWithTimeout } from "./timeouts-D86uWLt_.mjs";
3
4
  //#region extensions/discord/src/monitor/typing.ts
4
5
  var typing_exports = /* @__PURE__ */ __exportAll({ sendTyping: () => sendTyping });