@openclaw/discord 2026.8.1-beta.3 → 2026.8.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.
Files changed (290) hide show
  1. package/dist/account-inspect-BY-ve3yH.js +45 -0
  2. package/dist/account-inspect-api.js +1 -1
  3. package/dist/{accounts-DNl-oCEw.js → accounts-CwJQoLjM.js} +87 -162
  4. package/dist/action-runtime-api.js +1 -1
  5. package/dist/{activities-api-KCBAmWxD.js → activities-api-CkKcHUB6.js} +14 -12
  6. package/dist/activities-api.js +1 -1
  7. package/dist/{allow-list-BDMimASD.js → allow-list-C2JuH-R0.js} +10 -6
  8. package/dist/{api-DNVbJyEy.js → api-BfmEP6wp.js} +6 -5
  9. package/dist/api.js +18 -18
  10. package/dist/{approval-handler.runtime-B12RCYr8.js → approval-handler.runtime-DZM6Kt1Z.js} +30 -106
  11. package/dist/{audit-Yc7eZDd6.js → audit-DIbQA4VT.js} +8 -7
  12. package/dist/{channel-cXYzGc4L.js → channel-CarzU3bg.js} +25 -25
  13. package/dist/{channel-actions.runtime-CODTvo7c.js → channel-actions.runtime-B2wMqeVK.js} +60 -57
  14. package/dist/channel-config-api.js +1 -1
  15. package/dist/channel-plugin-api.js +1 -1
  16. package/dist/channel-type-CVLZyGYS.js +7 -0
  17. package/dist/{channel.setup-CSiwnMgs.js → channel.setup-z_ewMVa9.js} +18 -18
  18. package/dist/{components-ezGKo_Yh.js → components-gvRA0oaI.js} +33 -29
  19. package/dist/{config-schema-DC5kDtQ5.js → config-schema-B797-Spt.js} +21 -14
  20. package/dist/{conversation-binding-route-D6rCQ5S0.js → conversation-binding-route-DPpBRpYI.js} +1 -1
  21. package/dist/{directory-config-XyCfoqLg.js → directory-config-AA8wQx0D.js} +2 -2
  22. package/dist/directory-contract-api.js +1 -1
  23. package/dist/{directory-live-Df0NbFJB.js → directory-live-D_kFz_Fj.js} +4 -4
  24. package/dist/{doctor-DYY31GrO.js → doctor-QQTOkBfW.js} +5 -5
  25. package/dist/{doctor-contract-DsWvKIXF.js → doctor-contract-Co5vRCZ6.js} +9 -6
  26. package/dist/doctor-contract-api.js +4 -3
  27. package/dist/{handle-action.guild-admin-6Tvvinsa.js → handle-action.guild-admin-Cc88ZGon.js} +9 -5
  28. package/dist/index.js +1 -1
  29. package/dist/ingress-identity-BCzfPPYM.js +60 -0
  30. package/dist/{message-handler-B61q5MOF.js → message-handler-CAeEpqWo.js} +14 -10
  31. package/dist/{message-handler.preflight-Bzg_Hawz.js → message-handler.preflight-CoKoE3dY.js} +32 -91
  32. package/dist/{message-handler.process--4_712Ec.js → message-handler.process-cdIJ_fDT.js} +99 -123
  33. package/dist/{message-utils-BXLLnFl6.js → message-text-C0K4-fkg.js} +41 -34
  34. package/dist/{outbound-adapter-DxHTOqiN.js → outbound-adapter-Ch0At5Ra.js} +85 -78
  35. package/dist/{outbound-components-B2PL0ooH.js → outbound-components-Bnt_7x7r.js} +5 -4
  36. package/dist/outbound-session-route-CzzerX2K.js +668 -0
  37. package/dist/{owner-access-Bg41VzAf.js → owner-access-yc1sX7Gx.js} +7 -6
  38. package/dist/{pluralkit-dUl4v1X3.js → pluralkit-B3cUVI7i.js} +2 -2
  39. package/dist/{probe-BTdtVRwU.js → probe-3ovFAp3b.js} +3 -3
  40. package/dist/{probe.runtime-Dq5-PRKT.js → probe.runtime-BckHn3cJ.js} +1 -1
  41. package/dist/{provider-DlK_ynqt.js → provider-CjI8BSzS.js} +511 -342
  42. package/dist/{provider-session.runtime-CvvphHvs.js → provider-session.runtime-DdKRMcE9.js} +3 -3
  43. package/dist/provider.runtime-Bo1WbLLr.js +2 -0
  44. package/dist/{realtime-session.runtime-ysbMG8v7.js → realtime-session.runtime-37IC-p5K.js} +110 -126
  45. package/dist/{resolve-allowlist-common-DIVXbD1P.js → resolve-allowlist-common-BJ5UZNNT.js} +3 -3
  46. package/dist/{resolve-channels-CGeUoIqb.js → resolve-channels-BexR2eUn.js} +6 -5
  47. package/dist/{resolve-users-BtKxLUZv.js → resolve-users-BtXBCH5W.js} +5 -4
  48. package/dist/{retry-after-DdLPmPoa.js → retry-after-BrLjLUJi.js} +2 -1
  49. package/dist/{retry-DNsVTeTo.js → retry-t5RcEsPk.js} +237 -15
  50. package/dist/{runtime-CQovMsH3.js → runtime-BNlDfLwS.js} +2 -2
  51. package/dist/{runtime-D71_VFLr.js → runtime-DydyfxST.js} +182 -131
  52. package/dist/runtime-api.js +19 -26
  53. package/dist/{secret-config-contract-B3i6WxV5.js → secret-config-contract-DFu9hfU8.js} +14 -6
  54. package/dist/secret-contract-api.js +1 -1
  55. package/dist/{security-audit-BfJhAXZp.js → security-audit-DKfK-iPY.js} +10 -11
  56. package/dist/security-audit-contract-api.js +1 -1
  57. package/dist/{security-audit.runtime-BVKF9VtY.js → security-audit.runtime-sKZyKgpx.js} +1 -1
  58. package/dist/{send-rQIffSYu.js → send-mTKSBdmZ.js} +149 -58
  59. package/dist/{send.components-ChK1wS7w.js → send.components-nsPnc7kK.js} +29 -30
  60. package/dist/{send.outbound-HIkgji_7.js → send.outbound-CaOs9Zy1.js} +87 -84
  61. package/dist/{send.shared-B3fpaLWJ.js → send.shared-BJHt0Vyf.js} +55 -33
  62. package/dist/{sender-identity-BJtfyise.js → sender-identity-Dt0imZyY.js} +1 -1
  63. package/dist/setup-plugin-api.js +1 -1
  64. package/dist/{shared-CaAaoksy.js → shared-BNesVA4P.js} +43 -18
  65. package/dist/{subagent-hooks-CNT2ZJTJ.js → subagent-hooks-IeZVPLGj.js} +2 -2
  66. package/dist/subagent-hooks-api.js +1 -6
  67. package/dist/{system-events-Nuwoq_au.js → system-events-Be5EJI3b.js} +2 -2
  68. package/dist/{target-resolver-DIXShHaZ.js → target-resolver-C0MnwEki.js} +6 -5
  69. package/dist/targets-DQSye1Rv.js +3 -0
  70. package/dist/{thread-bindings-VlymUnbz.js → thread-bindings-wECUSIIG.js} +6 -6
  71. package/dist/{thread-bindings.manager-CngsgErq.js → thread-bindings.manager-B-3UHCc1.js} +31 -32
  72. package/dist/{thread-bindings.session-updates-CJb-BpPL.js → thread-bindings.session-updates-CC7HoQvt.js} +2 -1
  73. package/dist/{threading-DU6pgeGm.js → threading-te5ADPQI.js} +51 -27
  74. package/dist/{timeouts-B9cy6RvQ.js → timeouts-D86uWLt_.js} +1 -1
  75. package/dist/{transcripts-source-DeIMNbRh.js → transcripts-source-DkUhR7YK.js} +9 -4
  76. package/dist/transcripts-source-api.js +1 -1
  77. package/dist/{typing-oLiS5Z13.js → typing-DAwJF5VT.js} +2 -2
  78. package/dist/{voice-runtime-CjNFaynA.js → voice-runtime-COyYYTDD.js} +418 -74
  79. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/README.md +1 -1
  80. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/conforms.d.ts +2 -0
  81. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/package.json +3 -3
  82. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubArray.d.ts +2 -0
  83. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubObject.d.ts +2 -0
  84. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubString.d.ts +2 -0
  85. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/README.md +19 -19
  86. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist/v1.js +7 -3
  87. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist/v7.js +5 -2
  88. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist-node/v1.js +7 -3
  89. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist-node/v7.js +5 -2
  90. package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/package.json +4 -3
  91. package/node_modules/@discordjs/voice/node_modules/@types/node/README.md +1 -1
  92. package/node_modules/@discordjs/voice/node_modules/@types/node/child_process.d.ts +0 -1
  93. package/node_modules/@discordjs/voice/node_modules/@types/node/crypto.d.ts +6 -6
  94. package/node_modules/@discordjs/voice/node_modules/@types/node/dns/promises.d.ts +5 -5
  95. package/node_modules/@discordjs/voice/node_modules/@types/node/dns.d.ts +5 -5
  96. package/node_modules/@discordjs/voice/node_modules/@types/node/fs.d.ts +7 -0
  97. package/node_modules/@discordjs/voice/node_modules/@types/node/http.d.ts +30 -0
  98. package/node_modules/@discordjs/voice/node_modules/@types/node/http2.d.ts +4 -4
  99. package/node_modules/@discordjs/voice/node_modules/@types/node/os.d.ts +30 -30
  100. package/node_modules/@discordjs/voice/node_modules/@types/node/package.json +2 -2
  101. package/node_modules/@discordjs/voice/node_modules/@types/node/perf_hooks.d.ts +2 -1
  102. package/node_modules/@discordjs/voice/node_modules/@types/node/process.d.ts +42 -43
  103. package/node_modules/@discordjs/voice/node_modules/@types/node/quic.d.ts +1049 -84
  104. package/node_modules/@discordjs/voice/node_modules/@types/node/sqlite.d.ts +14 -1
  105. package/node_modules/@discordjs/voice/node_modules/@types/node/stream/iter.d.ts +3 -2
  106. package/node_modules/@discordjs/voice/node_modules/@types/node/test.d.ts +61 -0
  107. package/node_modules/@discordjs/voice/node_modules/@types/node/v8.d.ts +20 -23
  108. package/node_modules/discord-api-types/CHANGELOG.md +8 -0
  109. package/node_modules/discord-api-types/package.json +4 -4
  110. package/node_modules/discord-api-types/payloads/v10/channel.d.ts +2 -2
  111. package/node_modules/discord-api-types/payloads/v10/channel.d.ts.map +1 -1
  112. package/node_modules/discord-api-types/payloads/v10/gateway.d.ts +4 -0
  113. package/node_modules/discord-api-types/payloads/v10/gateway.d.ts.map +1 -1
  114. package/node_modules/discord-api-types/payloads/v10/gateway.js.map +1 -1
  115. package/node_modules/discord-api-types/payloads/v10/message.d.ts +4 -1
  116. package/node_modules/discord-api-types/payloads/v10/message.d.ts.map +1 -1
  117. package/node_modules/discord-api-types/payloads/v10/message.js +1 -0
  118. package/node_modules/discord-api-types/payloads/v10/message.js.map +1 -1
  119. package/node_modules/discord-api-types/payloads/v9/channel.d.ts +2 -2
  120. package/node_modules/discord-api-types/payloads/v9/channel.d.ts.map +1 -1
  121. package/node_modules/discord-api-types/payloads/v9/gateway.d.ts +4 -0
  122. package/node_modules/discord-api-types/payloads/v9/gateway.d.ts.map +1 -1
  123. package/node_modules/discord-api-types/payloads/v9/gateway.js.map +1 -1
  124. package/node_modules/discord-api-types/payloads/v9/message.d.ts +4 -1
  125. package/node_modules/discord-api-types/payloads/v9/message.d.ts.map +1 -1
  126. package/node_modules/discord-api-types/payloads/v9/message.js +1 -0
  127. package/node_modules/discord-api-types/payloads/v9/message.js.map +1 -1
  128. package/node_modules/typebox/build/format/date.d.mts +1 -1
  129. package/node_modules/typebox/build/format/date.mjs +1 -1
  130. package/node_modules/typebox/build/format/date_time.d.mts +2 -2
  131. package/node_modules/typebox/build/format/date_time.mjs +3 -3
  132. package/node_modules/typebox/build/format/email.d.mts +1 -1
  133. package/node_modules/typebox/build/format/email.mjs +2 -2
  134. package/node_modules/typebox/build/format/hostname.mjs +2 -10
  135. package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
  136. package/node_modules/typebox/build/format/idn_email.mjs +3 -3
  137. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
  138. package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
  139. package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
  140. package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
  141. package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
  142. package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
  143. package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
  144. package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
  145. package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
  146. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +41 -0
  147. package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
  148. package/node_modules/typebox/build/format/idna/index.mjs +2 -0
  149. package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
  150. package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
  151. package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
  152. package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
  153. package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
  154. package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
  155. package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
  156. package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
  157. package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
  158. package/node_modules/typebox/build/format/ipv4.mjs +2 -32
  159. package/node_modules/typebox/build/format/ipv6.mjs +2 -61
  160. package/node_modules/typebox/build/format/iri.d.mts +2 -2
  161. package/node_modules/typebox/build/format/iri.mjs +26 -8
  162. package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
  163. package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
  164. package/node_modules/typebox/build/format/regex.d.mts +1 -2
  165. package/node_modules/typebox/build/format/regex.mjs +2 -6
  166. package/node_modules/typebox/build/format/time.d.mts +2 -2
  167. package/node_modules/typebox/build/format/time.mjs +19 -14
  168. package/node_modules/typebox/build/format/uri.d.mts +1 -1
  169. package/node_modules/typebox/build/format/uri.mjs +3 -130
  170. package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
  171. package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
  172. package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
  173. package/node_modules/typebox/build/format/uri_template.mjs +4 -5
  174. package/node_modules/typebox/build/format/url.d.mts +3 -3
  175. package/node_modules/typebox/build/format/url.mjs +4 -5
  176. package/node_modules/typebox/build/guard/emit.d.mts +3 -1
  177. package/node_modules/typebox/build/guard/emit.mjs +12 -5
  178. package/node_modules/typebox/build/guard/guard.d.mts +8 -2
  179. package/node_modules/typebox/build/guard/guard.mjs +25 -4
  180. package/node_modules/typebox/build/guard/string.d.mts +2 -2
  181. package/node_modules/typebox/build/guard/string.mjs +7 -7
  182. package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
  183. package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
  184. package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
  185. package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
  186. package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
  187. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
  188. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
  189. package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
  190. package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
  191. package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
  192. package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
  193. package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
  194. package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
  195. package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
  196. package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
  197. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
  198. package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
  199. package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
  200. package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
  201. package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
  202. package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
  203. package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
  204. package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
  205. package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
  206. package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
  207. package/node_modules/typebox/build/schema/types/index.mjs +0 -2
  208. package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
  209. package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
  210. package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
  211. package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
  212. package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
  213. package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
  214. package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
  215. package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
  216. package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
  217. package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
  218. package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
  219. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
  220. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
  221. package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
  222. package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
  223. package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
  224. package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
  225. package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
  226. package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
  227. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
  228. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
  229. package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
  230. package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
  231. package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
  232. package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
  233. package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
  234. package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
  235. package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
  236. package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
  237. package/node_modules/typebox/build/type/script/parser.mjs +27 -23
  238. package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
  239. package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
  240. package/node_modules/typebox/package.json +27 -27
  241. package/node_modules/typebox/readme.md +79 -82
  242. package/node_modules/undici/docs/docs/api/Client.md +21 -8
  243. package/node_modules/undici/lib/api/readable.js +33 -43
  244. package/node_modules/undici/lib/core/connect.js +16 -2
  245. package/node_modules/undici/lib/core/symbols.js +1 -0
  246. package/node_modules/undici/lib/dispatcher/client-h1.js +3 -3
  247. package/node_modules/undici/lib/dispatcher/client-h2.js +179 -10
  248. package/node_modules/undici/lib/dispatcher/client.js +74 -29
  249. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +28 -6
  250. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +15 -1
  251. package/node_modules/undici/lib/handler/retry-handler.js +7 -2
  252. package/node_modules/undici/lib/interceptor/cache.js +5 -2
  253. package/node_modules/undici/lib/interceptor/deduplicate.js +1 -1
  254. package/node_modules/undici/lib/mock/mock-utils.js +213 -24
  255. package/node_modules/undici/lib/util/cache.js +2 -4
  256. package/node_modules/undici/lib/web/websocket/websocket.js +22 -0
  257. package/node_modules/undici/package.json +1 -1
  258. package/node_modules/undici/types/client.d.ts +40 -0
  259. package/node_modules/ws/lib/permessage-deflate.js +3 -1
  260. package/node_modules/ws/package.json +1 -1
  261. package/openclaw.plugin.json +14 -6
  262. package/package.json +8 -8
  263. package/skills/discord/SKILL.md +1 -1
  264. package/dist/account-inspect-D5xmUpnj.js +0 -89
  265. package/dist/approval-message-safety-XGFPbDoI.js +0 -226
  266. package/dist/audit-core-BCX8UeFH.js +0 -105
  267. package/dist/channel-actions-Dr2QI8Bf.js +0 -212
  268. package/dist/inbound-event-delivery-De2qxTrP.js +0 -39
  269. package/dist/provider.runtime-CzKGRiAF.js +0 -2
  270. package/dist/runtime-api.actions.js +0 -3
  271. package/dist/runtime-api.lookup.js +0 -7
  272. package/dist/runtime-api.monitor-CzeTYF32.js +0 -6
  273. package/dist/runtime-api.monitor.js +0 -9
  274. package/dist/runtime-api.send.js +0 -7
  275. package/dist/runtime-api.threads.js +0 -5
  276. package/dist/sdk-runtime-37OU6_Yh.js +0 -369
  277. package/dist/send.reactions-gmJ6yFPo.js +0 -78
  278. package/dist/send.receipt-Cnhoautb.js +0 -76
  279. package/dist/subagent-progress-FPLqBY1s.js +0 -110
  280. package/dist/targets-B2pf49zc.js +0 -3
  281. package/node_modules/typebox/build/format/_idna.d.mts +0 -2
  282. package/node_modules/typebox/build/format/_idna.mjs +0 -246
  283. package/node_modules/typebox/build/format/_puny.d.mts +0 -1
  284. package/node_modules/typebox/build/format/_puny.mjs +0 -77
  285. package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
  286. package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
  287. package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
  288. package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
  289. package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
  290. package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
@@ -1,25 +1,350 @@
1
- import { S as ResumedListener, T as VoiceStateUpdateListener, Ut as getGuildVoiceState, j as isUnknownDiscordVoiceStateError, p as discord_exports, x as ReadyListener } from "./retry-DNsVTeTo.js";
2
- import { k as parseDiscordTarget } from "./accounts-DNl-oCEw.js";
1
+ import { D as ReadyListener, L as isUnknownDiscordVoiceStateError, O as ResumedListener, Yt as getGuildVoiceState, _ as parseDiscordTarget, j as VoiceStateUpdateListener, on as __exportAll, y as discord_exports } from "./retry-t5RcEsPk.js";
3
2
  import { t as getDiscordRuntime } from "./runtime-DgnVQ7zW.js";
4
- import { a as normalizeDiscordSlug, h as resolveDiscordOwnerAccess, x as formatDiscordUserTag } from "./allow-list-BDMimASD.js";
5
- import { a as formatMention } from "./send.outbound-HIkgji_7.js";
6
- import { n as resolveDiscordVoiceEnabled, r as authorizeDiscordVoiceIngress, t as resolveDiscordVoiceAccess } from "./owner-access-Bg41VzAf.js";
7
- import { p as buildDiscordGroupSystemPrompt, y as resolveFetchedDiscordThreadLikeChannelContext } from "./provider-DlK_ynqt.js";
8
- import { S as formatVoiceLogPreview, _ as decodeOpusStream, a as SPEAKING_READY_TIMEOUT_MS, b as formatVoiceIngressPrompt, c as isDiscordRealtimeVoiceMode, d as resolveDiscordVoiceMode, f as resolveVoiceTimeoutMs, g as createDiscordOpusPlaybackStream, i as PLAYBACK_READY_TIMEOUT_MS, l as isVoiceChannel, n as CAPTURE_FINALIZE_GRACE_MS, o as VOICE_CONNECT_READY_TIMEOUT_MS, s as VOICE_RECONNECT_GRACE_MS, t as loadDiscordVoiceSdk, u as logVoiceVerbose, v as decodeOpusStreamChunks, x as maybeControlDiscordVoiceAgentRun, y as writeVoiceWavFile } from "./sdk-runtime-37OU6_Yh.js";
3
+ import { a as normalizeDiscordSlug, h as resolveDiscordOwnerAccess, x as formatDiscordUserTag } from "./allow-list-C2JuH-R0.js";
4
+ import { a as formatMention } from "./send.outbound-CaOs9Zy1.js";
5
+ import { n as resolveDiscordVoiceEnabled, r as authorizeDiscordVoiceIngress, t as resolveDiscordVoiceAccess } from "./owner-access-yc1sX7Gx.js";
6
+ import { b as resolveFetchedDiscordThreadLikeChannelContext, m as buildDiscordGroupSystemPrompt } from "./provider-CjI8BSzS.js";
7
+ import { createRequire } from "node:module";
8
+ import fs from "node:fs/promises";
9
9
  import { asDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
10
10
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";
11
11
  import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime";
12
12
  import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
13
13
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
14
- import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
14
+ import { createSubsystemLogger, logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env";
15
15
  import { escapeRegExp, truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
16
16
  import { stripInlineDirectiveTagsForDisplay } from "openclaw/plugin-sdk/text-chunking";
17
- import { unlinkIfExists } from "openclaw/plugin-sdk/media-runtime";
18
- import { agentCommandFromIngress, resolveAgentDir } from "openclaw/plugin-sdk/agent-runtime";
17
+ import { resolveFfmpegBin, unlinkIfExists } from "openclaw/plugin-sdk/media-runtime";
18
+ import { resolvePreferredOpenClawTmpDir, tempWorkspace } from "openclaw/plugin-sdk/temp-path";
19
+ import { resolveAgentDir } from "openclaw/plugin-sdk/agent-runtime";
19
20
  import { enqueueRoutedSystemEvent } from "openclaw/plugin-sdk/system-event-runtime";
20
- import { Readable } from "node:stream";
21
- import { OpusError } from "libopus-wasm";
21
+ import { controlRealtimeVoiceAgentRun, resamplePcm, shouldAutoControlRealtimeVoiceAgentText } from "openclaw/plugin-sdk/realtime-voice";
22
+ import { spawn } from "node:child_process";
23
+ import { Readable, Transform } from "node:stream";
24
+ import { StringDecoder } from "node:string_decoder";
25
+ import { Application, OpusError, createDecoder, createEncoder } from "libopus-wasm";
22
26
  import { resolveRealtimeBootstrapContextInstructions } from "openclaw/plugin-sdk/realtime-bootstrap-context";
27
+ //#region extensions/discord/src/voice/log-preview.ts
28
+ const DISCORD_VOICE_LOG_PREVIEW_CHARS = 500;
29
+ function formatVoiceLogPreview(text) {
30
+ const oneLine = text.replace(/\s+/g, " ").trim();
31
+ if (oneLine.length <= DISCORD_VOICE_LOG_PREVIEW_CHARS) return oneLine;
32
+ return `${truncateUtf16Safe(oneLine, DISCORD_VOICE_LOG_PREVIEW_CHARS)}...`;
33
+ }
34
+ //#endregion
35
+ //#region extensions/discord/src/voice/agent-control.ts
36
+ async function maybeControlDiscordVoiceAgentRun(params) {
37
+ if (!shouldAutoControlRealtimeVoiceAgentText(params.text)) return { handled: false };
38
+ const result = await controlRealtimeVoiceAgentRun({
39
+ sessionKey: params.entry.route.sessionKey,
40
+ text: params.text
41
+ });
42
+ if (!result.active) return {
43
+ handled: false,
44
+ result
45
+ };
46
+ return {
47
+ handled: true,
48
+ result,
49
+ ...result.speak && !result.suppress ? { speakText: result.message } : {}
50
+ };
51
+ }
52
+ //#endregion
53
+ //#region extensions/discord/src/voice/prompt.ts
54
+ const DISCORD_VOICE_SPOKEN_OUTPUT_CONTRACT = [
55
+ "You are OpenClaw's Discord voice interface in a live voice channel.",
56
+ "Discord voice reply requirements:",
57
+ "- Return only the concise text that should be spoken aloud in the voice channel.",
58
+ "- Treat the transcript as speech-to-text from a live conversation; repair obvious transcription artifacts and ignore repeated partial fragments caused by voice buffering.",
59
+ "- If the transcript is garbled, incomplete, or missing the user's intent, ask one brief clarifying question instead of guessing.",
60
+ "- If the request needs deeper reasoning, current information, or tools, use the available tools before answering.",
61
+ "- Do not call the tts tool; Discord voice will synthesize and play the returned text.",
62
+ "- Do not reply with NO_REPLY unless no spoken response is appropriate.",
63
+ "- Keep the response brief, natural, and conversational. Prefer one to three short sentences.",
64
+ "- Avoid markdown tables, code fences, citations, and visual formatting unless the user explicitly asks for something that cannot be spoken naturally."
65
+ ].join("\n");
66
+ function formatVoiceIngressPrompt(transcript, speakerLabel) {
67
+ const cleanedTranscript = transcript.trim();
68
+ const cleanedLabel = speakerLabel?.trim();
69
+ const voiceInput = cleanedLabel ? [`Voice transcript from speaker "${cleanedLabel}":`, cleanedTranscript].join("\n") : cleanedTranscript;
70
+ return [DISCORD_VOICE_SPOKEN_OUTPUT_CONTRACT, voiceInput].join("\n\n");
71
+ }
72
+ //#endregion
73
+ //#region extensions/discord/src/voice/audio.ts
74
+ const SAMPLE_RATE = 48e3;
75
+ const CHANNELS = 2;
76
+ const BIT_DEPTH = 16;
77
+ const FFMPEG_ERROR_OUTPUT_BYTES = 8192;
78
+ const DISCORD_OPUS_FRAME_SIZE = 960;
79
+ const DISCORD_OPUS_FRAME_BYTES = DISCORD_OPUS_FRAME_SIZE * CHANNELS * (BIT_DEPTH / 8);
80
+ const FFMPEG_PCM_ARGUMENTS = [
81
+ "-analyzeduration",
82
+ "0",
83
+ "-loglevel",
84
+ "error",
85
+ "-vn",
86
+ "-sn",
87
+ "-dn",
88
+ "-f",
89
+ "s16le",
90
+ "-ar",
91
+ String(SAMPLE_RATE),
92
+ "-ac",
93
+ String(CHANNELS)
94
+ ];
95
+ let warnedOpusMissing = false;
96
+ function buildWavBuffer(pcm) {
97
+ const blockAlign = 4;
98
+ const byteRate = SAMPLE_RATE * blockAlign;
99
+ const header = Buffer.alloc(44);
100
+ header.write("RIFF", 0);
101
+ header.writeUInt32LE(36 + pcm.length, 4);
102
+ header.write("WAVE", 8);
103
+ header.write("fmt ", 12);
104
+ header.writeUInt32LE(16, 16);
105
+ header.writeUInt16LE(1, 20);
106
+ header.writeUInt16LE(CHANNELS, 22);
107
+ header.writeUInt32LE(SAMPLE_RATE, 24);
108
+ header.writeUInt32LE(byteRate, 28);
109
+ header.writeUInt16LE(blockAlign, 32);
110
+ header.writeUInt16LE(BIT_DEPTH, 34);
111
+ header.write("data", 36);
112
+ header.writeUInt32LE(pcm.length, 40);
113
+ return Buffer.concat([header, pcm]);
114
+ }
115
+ function createDiscordOpusEncodeStream() {
116
+ return new DiscordOpusEncodeStream();
117
+ }
118
+ function createDiscordOpusPlaybackStream(input) {
119
+ const inputSource = typeof input === "string" ? input : "pipe:0";
120
+ const ffmpeg = spawn(resolveFfmpegBin(), [
121
+ "-i",
122
+ inputSource,
123
+ ...FFMPEG_PCM_ARGUMENTS,
124
+ "pipe:1"
125
+ ], {
126
+ stdio: [
127
+ "pipe",
128
+ "pipe",
129
+ "pipe"
130
+ ],
131
+ windowsHide: true
132
+ });
133
+ const opusStream = createDiscordOpusEncodeStream();
134
+ const stderr = Buffer.alloc(FFMPEG_ERROR_OUTPUT_BYTES);
135
+ let stderrBytes = 0;
136
+ let ffmpegClosed = false;
137
+ const killFfmpeg = (signal = "SIGTERM") => {
138
+ if (!ffmpegClosed && !ffmpeg.killed) ffmpeg.kill(signal);
139
+ };
140
+ ffmpeg.stderr.on("data", (chunk) => {
141
+ if (stderrBytes < FFMPEG_ERROR_OUTPUT_BYTES) stderrBytes += chunk.copy(stderr, stderrBytes, 0, FFMPEG_ERROR_OUTPUT_BYTES - stderrBytes);
142
+ });
143
+ ffmpeg.once("error", (err) => {
144
+ opusStream.destroy(err);
145
+ });
146
+ ffmpeg.once("close", (code, signal) => {
147
+ ffmpegClosed = true;
148
+ if (code && code !== 0) {
149
+ const stderrText = new StringDecoder("utf8").write(stderr.subarray(0, stderrBytes)).trim();
150
+ const suffix = stderrText ? `: ${stderrText}` : "";
151
+ opusStream.destroy(/* @__PURE__ */ new Error(`ffmpeg exited with code ${code}${suffix}`));
152
+ return;
153
+ }
154
+ if (signal) opusStream.destroy(/* @__PURE__ */ new Error(`ffmpeg exited with signal ${signal}`));
155
+ });
156
+ for (const readable of [ffmpeg.stdout, ffmpeg.stderr]) readable.on("error", (err) => {
157
+ killFfmpeg("SIGKILL");
158
+ opusStream.destroy(err);
159
+ });
160
+ ffmpeg.stdin.on("error", (err) => {
161
+ if (err.code !== "EPIPE") opusStream.destroy(err);
162
+ });
163
+ ffmpeg.stdout.pipe(opusStream);
164
+ opusStream.once("close", () => {
165
+ if (!opusStream.readableEnded) killFfmpeg();
166
+ });
167
+ if (typeof input !== "string") {
168
+ input.on("error", (err) => {
169
+ ffmpeg.stdin.destroy(err);
170
+ opusStream.destroy(err);
171
+ });
172
+ input.pipe(ffmpeg.stdin);
173
+ } else ffmpeg.stdin.end();
174
+ return opusStream;
175
+ }
176
+ var DiscordOpusEncodeStream = class extends Transform {
177
+ #buffer = Buffer.alloc(0);
178
+ #encoder;
179
+ constructor() {
180
+ super({ readableObjectMode: true });
181
+ }
182
+ _construct(done) {
183
+ createEncoder({
184
+ application: Application.Audio,
185
+ channels: CHANNELS,
186
+ sampleRate: SAMPLE_RATE
187
+ }).then((encoder) => {
188
+ this.#encoder = encoder;
189
+ done();
190
+ }, (err) => done(err instanceof Error ? err : new Error(formatErrorMessage(err))));
191
+ }
192
+ _transform(chunk, _encoding, done) {
193
+ try {
194
+ this.#buffer = this.#buffer.length > 0 ? Buffer.concat([this.#buffer, chunk]) : Buffer.from(chunk);
195
+ while (this.#buffer.length >= DISCORD_OPUS_FRAME_BYTES) {
196
+ const frame = this.#buffer.subarray(0, DISCORD_OPUS_FRAME_BYTES);
197
+ this.#buffer = this.#buffer.subarray(DISCORD_OPUS_FRAME_BYTES);
198
+ this.#encodeFrame(frame);
199
+ }
200
+ done();
201
+ } catch (err) {
202
+ done(err instanceof Error ? err : new Error(formatErrorMessage(err)));
203
+ }
204
+ }
205
+ _flush(done) {
206
+ try {
207
+ if (this.#buffer.length > 0) {
208
+ const frame = Buffer.alloc(DISCORD_OPUS_FRAME_BYTES);
209
+ this.#buffer.copy(frame);
210
+ this.#buffer = Buffer.alloc(0);
211
+ this.#encodeFrame(frame);
212
+ }
213
+ done();
214
+ } catch (err) {
215
+ done(err instanceof Error ? err : new Error(formatErrorMessage(err)));
216
+ }
217
+ }
218
+ _destroy(err, done) {
219
+ this.#encoder?.free();
220
+ this.#buffer = Buffer.alloc(0);
221
+ done(err);
222
+ }
223
+ #encodeFrame(frame) {
224
+ this.push(Buffer.from(this.#encoder.encode(frame, { frameSize: DISCORD_OPUS_FRAME_SIZE })));
225
+ }
226
+ };
227
+ function pcmInt16ToBuffer(pcm) {
228
+ return Buffer.from(pcm.buffer, pcm.byteOffset, pcm.byteLength);
229
+ }
230
+ async function decodeOpusStream(stream, params) {
231
+ const chunks = [];
232
+ await decodeOpusStreamChunks(stream, {
233
+ ...params,
234
+ onChunk: (chunk) => chunks.push(chunk)
235
+ });
236
+ return Buffer.concat(chunks);
237
+ }
238
+ async function decodeOpusStreamChunks(stream, params) {
239
+ let decoder;
240
+ try {
241
+ decoder = await createDecoder({
242
+ channels: CHANNELS,
243
+ sampleRate: SAMPLE_RATE
244
+ });
245
+ } catch (err) {
246
+ if (!warnedOpusMissing) {
247
+ warnedOpusMissing = true;
248
+ params.onWarn(`discord voice: no usable opus decoder available (libopus-wasm: ${formatErrorMessage(err)}); cannot decode voice audio`);
249
+ }
250
+ return;
251
+ }
252
+ params.onVerbose("opus decoder: libopus-wasm");
253
+ try {
254
+ for await (const chunk of stream) {
255
+ if (!chunk || !(chunk instanceof Buffer) || chunk.length === 0) continue;
256
+ const decoded = decoder.decode(chunk, { maxFrameSize: DISCORD_OPUS_FRAME_SIZE });
257
+ if (decoded.length > 0) params.onChunk(pcmInt16ToBuffer(decoded));
258
+ }
259
+ } catch (err) {
260
+ params.onError?.(err);
261
+ if (shouldLogVerbose()) logVerbose(`discord voice: opus decode failed: ${formatErrorMessage(err)}`);
262
+ } finally {
263
+ decoder.free();
264
+ }
265
+ }
266
+ function convertDiscordPcm48kStereoToRealtimePcm24kMono(pcm) {
267
+ const frameCount = Math.floor(pcm.length / 4);
268
+ if (frameCount === 0) return Buffer.alloc(0);
269
+ const mono48k = Buffer.alloc(frameCount * 2);
270
+ for (let frame = 0; frame < frameCount; frame += 1) {
271
+ const offset = frame * 4;
272
+ const left = pcm.readInt16LE(offset);
273
+ const right = pcm.readInt16LE(offset + 2);
274
+ mono48k.writeInt16LE(Math.round((left + right) / 2), frame * 2);
275
+ }
276
+ return resamplePcm(mono48k, SAMPLE_RATE, 24e3);
277
+ }
278
+ function convertRealtimePcm24kMonoToDiscordPcm48kStereo(pcm) {
279
+ const mono48k = resamplePcm(pcm, 24e3, SAMPLE_RATE);
280
+ const sampleCount = Math.floor(mono48k.length / 2);
281
+ if (sampleCount === 0) return Buffer.alloc(0);
282
+ const stereo = Buffer.alloc(sampleCount * 4);
283
+ for (let sampleIndex = 0; sampleIndex < sampleCount; sampleIndex += 1) {
284
+ const sample = mono48k.readInt16LE(sampleIndex * 2);
285
+ const offset = sampleIndex * 4;
286
+ stereo.writeInt16LE(sample, offset);
287
+ stereo.writeInt16LE(sample, offset + 2);
288
+ }
289
+ return stereo;
290
+ }
291
+ function estimateDurationSeconds(pcm) {
292
+ const bytesPerSample = BIT_DEPTH / 8 * CHANNELS;
293
+ return pcm.length / (bytesPerSample * SAMPLE_RATE);
294
+ }
295
+ async function writeVoiceWavFile(pcm) {
296
+ const workspace = await tempWorkspace({
297
+ rootDir: resolvePreferredOpenClawTmpDir(),
298
+ prefix: "discord-voice-"
299
+ });
300
+ scheduleTempCleanup(workspace.dir);
301
+ const wav = buildWavBuffer(pcm);
302
+ return {
303
+ path: await workspace.write("segment.wav", wav),
304
+ durationSeconds: estimateDurationSeconds(pcm)
305
+ };
306
+ }
307
+ function scheduleTempCleanup(tempDir, delayMs = 18e5) {
308
+ setTimeout(() => {
309
+ fs.rm(tempDir, {
310
+ recursive: true,
311
+ force: true
312
+ }).catch((err) => {
313
+ if (shouldLogVerbose()) logVerbose(`discord voice: temp cleanup failed for ${tempDir}: ${formatErrorMessage(err)}`);
314
+ });
315
+ }, delayMs).unref();
316
+ }
317
+ const CAPTURE_FINALIZE_GRACE_MS = 2e3;
318
+ const VOICE_CONNECT_READY_TIMEOUT_MS = 3e4;
319
+ const VOICE_RECONNECT_GRACE_MS = 15e3;
320
+ const PLAYBACK_READY_TIMEOUT_MS = 6e4;
321
+ function resolveVoiceTimeoutMs(value, fallbackMs) {
322
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return fallbackMs;
323
+ return Math.floor(value);
324
+ }
325
+ function resolveDiscordVoiceMode(voice) {
326
+ const mode = voice?.mode;
327
+ if (mode === "stt-tts" || mode === "bidi") return mode;
328
+ return "agent-proxy";
329
+ }
330
+ function isDiscordRealtimeVoiceMode(mode) {
331
+ return mode === "agent-proxy" || mode === "bidi";
332
+ }
333
+ function logVoiceVerbose(message) {
334
+ logVerbose(`discord voice: ${message}`);
335
+ }
336
+ function isVoiceChannel(type) {
337
+ return type === discord_exports.ChannelType.GuildVoice || type === discord_exports.ChannelType.GuildStageVoice;
338
+ }
339
+ //#endregion
340
+ //#region extensions/discord/src/voice/sdk-runtime.ts
341
+ let cachedDiscordVoiceSdk = null;
342
+ function loadDiscordVoiceSdk() {
343
+ if (cachedDiscordVoiceSdk) return cachedDiscordVoiceSdk;
344
+ cachedDiscordVoiceSdk = createRequire(import.meta.url)("@discordjs/voice");
345
+ return cachedDiscordVoiceSdk;
346
+ }
347
+ //#endregion
23
348
  //#region extensions/discord/src/voice/ingress.ts
24
349
  const DISCORD_VOICE_MESSAGE_PROVIDER = "discord-voice";
25
350
  const logger$7 = createSubsystemLogger("discord/voice");
@@ -84,7 +409,7 @@ async function runDiscordVoiceAgentTurn(params) {
84
409
  });
85
410
  if (!context) return null;
86
411
  const voiceModel = normalizeOptionalString(params.discordConfig.voice?.model);
87
- const payloads = (await agentCommandFromIngress({
412
+ const payloads = (await getDiscordRuntime().agent.runCommandFromIngress({
88
413
  message: params.message,
89
414
  sessionKey: params.entry.route.sessionKey,
90
415
  agentId: params.entry.route.agentId,
@@ -1116,12 +1441,13 @@ function sanitizeVoiceReplyTextForSpeech(text, speakerLabel) {
1116
1441
  //#endregion
1117
1442
  //#region extensions/discord/src/voice/tts.ts
1118
1443
  async function transcribeVoiceAudio(params) {
1119
- return normalizeOptionalString((await getDiscordRuntime().mediaUnderstanding.transcribeAudioFile({
1444
+ const result = await getDiscordRuntime().mediaUnderstanding.transcribeAudioFile({
1120
1445
  filePath: params.filePath,
1121
1446
  cfg: params.cfg,
1122
1447
  agentDir: resolveAgentDir(params.cfg, params.agentId),
1123
1448
  mime: "audio/wav"
1124
- })).text);
1449
+ });
1450
+ return normalizeOptionalString(result.text);
1125
1451
  }
1126
1452
  async function synthesizeVoiceReplyAudio(params) {
1127
1453
  const runtime = getDiscordRuntime();
@@ -1200,6 +1526,7 @@ async function processDiscordVoiceSegment(params) {
1200
1526
  logVoiceVerbose(`transcription ok (${transcript.length} chars): guild ${entry.guildId} channel ${entry.channelId}`);
1201
1527
  logVoiceVerbose(`transcript from ${ingress.speakerLabel} (${userId}) in guild ${entry.guildId} channel ${entry.channelId}: ${formatVoiceLogPreview(transcript)}`);
1202
1528
  if (params.transcripts) {
1529
+ if (entry.sessionLifecycle.status === "stopped" || entry.transcripts !== params.transcripts) return;
1203
1530
  await params.transcripts.onUtterance({
1204
1531
  sessionId: params.transcripts.sessionId,
1205
1532
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -1281,16 +1608,24 @@ async function processDiscordVoiceSegment(params) {
1281
1608
  }
1282
1609
  params.enqueuePlayback(entry, async () => {
1283
1610
  const voiceSdk = loadDiscordVoiceSdk();
1611
+ const playbackLifecycle = new AbortController();
1612
+ let playbackStarted = false;
1613
+ const cancelStoppedPlayback = () => (!playbackStarted || entry.sessionLifecycle.status === "stopped") && playbackLifecycle.abort();
1284
1614
  try {
1285
1615
  if (entry.sessionLifecycle.status === "stopped") return;
1616
+ entry.player.on(voiceSdk.AudioPlayerStatus.Idle, cancelStoppedPlayback);
1286
1617
  const input = voiceReplyAudio.mode === "stream" ? Readable.fromWeb(voiceReplyAudio.audioStream) : voiceReplyAudio.audioPath;
1287
1618
  logVoiceVerbose(`playback start: guild ${entry.guildId} channel ${entry.channelId} ${voiceReplyAudio.mode}`);
1288
1619
  const resource = voiceSdk.createAudioResource(createDiscordOpusPlaybackStream(input), { inputType: voiceSdk.StreamType.Opus });
1289
1620
  entry.player.play(resource);
1290
- await voiceSdk.entersState(entry.player, voiceSdk.AudioPlayerStatus.Playing, PLAYBACK_READY_TIMEOUT_MS).catch(() => void 0);
1291
- await voiceSdk.entersState(entry.player, voiceSdk.AudioPlayerStatus.Idle, SPEAKING_READY_TIMEOUT_MS).catch(() => void 0);
1621
+ await voiceSdk.entersState(entry.player, voiceSdk.AudioPlayerStatus.Playing, AbortSignal.any([AbortSignal.timeout(PLAYBACK_READY_TIMEOUT_MS), playbackLifecycle.signal]));
1622
+ playbackStarted = true;
1623
+ await voiceSdk.entersState(entry.player, voiceSdk.AudioPlayerStatus.Idle, playbackLifecycle.signal);
1292
1624
  logVoiceVerbose(`playback done: guild ${entry.guildId} channel ${entry.channelId}`);
1625
+ } catch (error) {
1626
+ if (entry.sessionLifecycle.status !== "stopped") throw error;
1293
1627
  } finally {
1628
+ entry.player.off(voiceSdk.AudioPlayerStatus.Idle, cancelStoppedPlayback);
1294
1629
  await releaseAudio?.();
1295
1630
  }
1296
1631
  });
@@ -1336,6 +1671,7 @@ var DiscordVoiceReceive = class {
1336
1671
  }
1337
1672
  logVoiceVerbose(`capture start: guild ${entry.guildId} channel ${entry.channelId} user ${userId}`);
1338
1673
  const voiceSdk = loadDiscordVoiceSdk();
1674
+ const transcripts = entry.transcripts;
1339
1675
  const voiceMode = resolveDiscordVoiceMode(this.params.discordConfig.voice);
1340
1676
  const realtime = entry.realtimeLifecycle.status === "active" && isDiscordRealtimeVoiceMode(voiceMode) ? entry.realtimeLifecycle.instance : void 0;
1341
1677
  if (entry.player.state.status === voiceSdk.AudioPlayerStatus.Playing && !realtime) {
@@ -1413,6 +1749,7 @@ var DiscordVoiceReceive = class {
1413
1749
  logVoiceVerbose(`capture ready (${durationSeconds.toFixed(2)}s): guild ${entry.guildId} channel ${entry.channelId} user ${userId}`);
1414
1750
  entry.processingQueue = entry.processingQueue.then(async () => {
1415
1751
  if (!this.params.isEntryCurrent(entry)) return;
1752
+ if (entry.transcripts !== transcripts) return;
1416
1753
  await this.processSegment({
1417
1754
  entry,
1418
1755
  wavPath,
@@ -1602,9 +1939,21 @@ var DiscordVoiceReceive = class {
1602
1939
  //#endregion
1603
1940
  //#region extensions/discord/src/voice/voice-session.ts
1604
1941
  const logger$2 = createSubsystemLogger("discord/voice");
1942
+ const REALTIME_PLAYBACK_MAX_MISSED_FRAMES = 100;
1605
1943
  function isVoiceSessionStopped(entry) {
1606
1944
  return entry.sessionLifecycle.status === "stopped";
1607
1945
  }
1946
+ function retireTranscripts(entry) {
1947
+ const transcripts = entry.transcripts;
1948
+ entry.transcripts = void 0;
1949
+ try {
1950
+ Promise.resolve(transcripts?.onStop?.()).catch((error) => {
1951
+ logger$2.warn(`discord voice: transcripts retirement failed: ${formatErrorMessage(error)}`);
1952
+ });
1953
+ } catch (error) {
1954
+ logger$2.warn(`discord voice: transcripts retirement failed: ${formatErrorMessage(error)}`);
1955
+ }
1956
+ }
1608
1957
  function isVoiceConnectionDestroyed(connection, voiceSdk) {
1609
1958
  return connection.state.status === voiceSdk.VoiceConnectionStatus.Destroyed;
1610
1959
  }
@@ -1691,7 +2040,10 @@ var DiscordVoiceSessions = class {
1691
2040
  if (existing && existing.channelId === channelId) {
1692
2041
  existing.autoJoinWhenOccupied = options?.autoJoinWhenOccupied === true;
1693
2042
  if (authority) existing.generation = authority.generation;
1694
- if (options?.transcripts) existing.transcripts = options.transcripts;
2043
+ if (options?.transcripts) {
2044
+ retireTranscripts(existing);
2045
+ existing.transcripts = options.transcripts;
2046
+ }
1695
2047
  if (!options?.transcripts && isDiscordRealtimeVoiceMode(voiceMode) && existing.realtimeLifecycle.status !== "active" && existing.realtimeLifecycle.status !== "starting") {
1696
2048
  const realtimeResult = await this.attachRealtimeSession(existing, voiceMode, {
1697
2049
  requireLiveEntry: true,
@@ -1751,10 +2103,7 @@ var DiscordVoiceSessions = class {
1751
2103
  logVoiceVerbose(`join: DAVE settings encryption=${daveEncryption === false ? "off" : "on"} tolerance=${decryptionFailureTolerance ?? "default"} connectTimeout=${connectReadyTimeoutMs}ms reconnectGrace=${reconnectGraceMs}ms`);
1752
2104
  const voiceSdk = loadDiscordVoiceSdk();
1753
2105
  const existingEntry = this.params.sessions.get(guildId);
1754
- if (existingEntry) {
1755
- existingEntry.stop();
1756
- this.params.sessions.delete(guildId);
1757
- }
2106
+ if (existingEntry) existingEntry.stop();
1758
2107
  const voiceConnectionGroup = resolveVoiceConnectionGroup(this.params.accountId);
1759
2108
  const staleConnection = voiceSdk.getVoiceConnection(guildId, voiceConnectionGroup);
1760
2109
  if (staleConnection) destroyVoiceConnectionSafely({
@@ -1849,24 +2198,23 @@ var DiscordVoiceSessions = class {
1849
2198
  }
1850
2199
  const { route, voiceRoute, agentSessionMode, agentSessionTarget } = routeInfo;
1851
2200
  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"}`);
1852
- const player = voiceSdk.createAudioPlayer();
2201
+ const player = isDiscordRealtimeVoiceMode(voiceMode) ? voiceSdk.createAudioPlayer({ behaviors: { maxMissedFrames: REALTIME_PLAYBACK_MAX_MISSED_FRAMES } }) : voiceSdk.createAudioPlayer();
1853
2202
  connection.subscribe(player);
1854
- const clearSessionIfCurrent = () => {
1855
- if (this.params.sessions.get(guildId)?.connection === connection) this.params.sessions.delete(guildId);
1856
- };
1857
- const stopEntry = (entry, optionsLocal) => {
2203
+ const stopEntry = (optionsLocal) => {
1858
2204
  if (entry.sessionLifecycle.status === "stopped") return;
1859
2205
  entry.sessionLifecycle = {
1860
2206
  status: "stopped",
1861
2207
  reason: optionsLocal.reason
1862
2208
  };
2209
+ retireTranscripts(entry);
2210
+ if (this.params.sessions.get(guildId) === entry) this.params.sessions.delete(guildId);
1863
2211
  this.params.membership.deactivate(entry);
1864
- if (speakingHandler) connection.receiver.speaking.off("start", speakingHandler);
1865
- if (speakingEndHandler) connection.receiver.speaking.off("end", speakingEndHandler);
2212
+ connection.receiver.speaking.off("start", speakingHandler);
2213
+ connection.receiver.speaking.off("end", speakingEndHandler);
1866
2214
  stopVoiceCaptureState(entry.capture);
1867
- if (disconnectedHandler) connection.off(voiceSdk.VoiceConnectionStatus.Disconnected, disconnectedHandler);
1868
- if (destroyedHandler) connection.off(voiceSdk.VoiceConnectionStatus.Destroyed, destroyedHandler);
1869
- if (playerErrorHandler) player.off("error", playerErrorHandler);
2215
+ connection.off(voiceSdk.VoiceConnectionStatus.Disconnected, disconnectedHandler);
2216
+ connection.off(voiceSdk.VoiceConnectionStatus.Destroyed, destroyedHandler);
2217
+ player.off("error", playerErrorHandler);
1870
2218
  const realtimeLifecycle = entry.realtimeLifecycle;
1871
2219
  if (realtimeLifecycle.status === "starting" || realtimeLifecycle.status === "active") realtimeLifecycle.instance.close();
1872
2220
  entry.realtimeLifecycle = {
@@ -1874,7 +2222,7 @@ var DiscordVoiceSessions = class {
1874
2222
  generation: realtimeLifecycle.generation,
1875
2223
  reason: optionsLocal.reason
1876
2224
  };
1877
- player.stop();
2225
+ player.stop(true);
1878
2226
  if (optionsLocal.destroyConnection) destroyVoiceConnectionSafely({
1879
2227
  connection,
1880
2228
  voiceSdk,
@@ -1906,41 +2254,12 @@ var DiscordVoiceSessions = class {
1906
2254
  generation: 0
1907
2255
  },
1908
2256
  stop(reason) {
1909
- clearSessionIfCurrent();
1910
- stopEntry(entry, {
2257
+ stopEntry({
1911
2258
  destroyConnection: true,
1912
2259
  reason: reason ?? `stop guild ${guildId} channel ${channelId}`
1913
2260
  });
1914
2261
  }
1915
2262
  };
1916
- if (!options?.transcripts && isDiscordRealtimeVoiceMode(voiceMode)) {
1917
- const realtimeResult = await this.attachRealtimeSession(entry, voiceMode, { isCurrent: authority?.isCurrent });
1918
- if (!realtimeResult.ok) {
1919
- destroyVoiceConnectionSafely({
1920
- connection,
1921
- voiceSdk,
1922
- reason: `realtime setup failed guild ${guildId} channel ${channelId}`
1923
- });
1924
- return {
1925
- ok: false,
1926
- message: realtimeResult.message,
1927
- guildId,
1928
- channelId
1929
- };
1930
- }
1931
- }
1932
- if (this.params.destroyed() || authority && !authority.isCurrent()) {
1933
- stopEntry(entry, {
1934
- destroyConnection: true,
1935
- reason: `${this.params.destroyed() ? "manager stopped" : "join cancelled"} during setup guild ${guildId} channel ${channelId}`
1936
- });
1937
- return {
1938
- ok: false,
1939
- message: this.params.destroyed() ? "Discord voice manager is stopped." : "Discord voice join was cancelled.",
1940
- guildId,
1941
- channelId
1942
- };
1943
- }
1944
2263
  const speakingHandler = (userId) => {
1945
2264
  this.params.receive.handleSpeakingStart(entry, userId).catch((err) => {
1946
2265
  logger$2.warn(`discord voice: capture failed: ${formatErrorMessage(err)}`);
@@ -1957,8 +2276,7 @@ var DiscordVoiceSessions = class {
1957
2276
  logVoiceVerbose(`disconnected: recovery started guild ${guildId} channel ${channelId}`);
1958
2277
  } catch (err) {
1959
2278
  logger$2.warn(`discord voice: disconnect recovery failed: guild ${guildId} channel ${channelId} timeout=${reconnectGraceMs}ms error=${formatErrorMessage(err)}; destroying connection`);
1960
- clearSessionIfCurrent();
1961
- stopEntry(entry, {
2279
+ stopEntry({
1962
2280
  destroyConnection: true,
1963
2281
  reason: `disconnect recovery failed guild ${guildId} channel ${channelId}`
1964
2282
  });
@@ -1966,8 +2284,7 @@ var DiscordVoiceSessions = class {
1966
2284
  })();
1967
2285
  };
1968
2286
  const destroyedHandler = () => {
1969
- clearSessionIfCurrent();
1970
- stopEntry(entry, {
2287
+ stopEntry({
1971
2288
  destroyConnection: false,
1972
2289
  reason: `destroyed guild ${guildId} channel ${channelId}`
1973
2290
  });
@@ -1975,12 +2292,33 @@ var DiscordVoiceSessions = class {
1975
2292
  const playerErrorHandler = (err) => {
1976
2293
  logger$2.warn(`discord voice: playback error: ${formatErrorMessage(err)}`);
1977
2294
  };
1978
- this.params.receive.enableDaveReceivePassthrough(entry, "post-join warmup", 30);
1979
- connection.receiver.speaking.on("start", speakingHandler);
1980
- connection.receiver.speaking.on("end", speakingEndHandler);
1981
2295
  connection.on(voiceSdk.VoiceConnectionStatus.Disconnected, disconnectedHandler);
1982
2296
  connection.on(voiceSdk.VoiceConnectionStatus.Destroyed, destroyedHandler);
1983
2297
  player.on("error", playerErrorHandler);
2298
+ if (!options?.transcripts && isDiscordRealtimeVoiceMode(voiceMode)) {
2299
+ const realtimeResult = await this.attachRealtimeSession(entry, voiceMode, { isCurrent: authority?.isCurrent });
2300
+ if (!realtimeResult.ok) {
2301
+ entry.stop(`realtime setup failed guild ${guildId} channel ${channelId}`);
2302
+ return {
2303
+ ok: false,
2304
+ message: realtimeResult.message,
2305
+ guildId,
2306
+ channelId
2307
+ };
2308
+ }
2309
+ }
2310
+ if (isVoiceSessionStopped(entry) || this.params.destroyed() || authority && !authority.isCurrent()) {
2311
+ entry.stop(`${this.params.destroyed() ? "manager stopped" : "join cancelled"} during setup guild ${guildId} channel ${channelId}`);
2312
+ return {
2313
+ ok: false,
2314
+ message: this.params.destroyed() ? "Discord voice manager is stopped." : "Discord voice join was cancelled.",
2315
+ guildId,
2316
+ channelId
2317
+ };
2318
+ }
2319
+ this.params.receive.enableDaveReceivePassthrough(entry, "post-join warmup", 30);
2320
+ connection.receiver.speaking.on("start", speakingHandler);
2321
+ connection.receiver.speaking.on("end", speakingEndHandler);
1984
2322
  this.params.sessions.set(guildId, entry);
1985
2323
  this.params.membership.activate(entry, this.params.botUserId());
1986
2324
  logger$2.info(`discord voice: joined guild=${guildId} channel=${channelId} mode=${voiceMode} agent=${route.agentId} voiceSession=${voiceRoute.sessionKey} supervisorSession=${route.sessionKey} voiceModel=${voiceConfig?.model ?? "route-default"}`);
@@ -2011,7 +2349,7 @@ var DiscordVoiceSessions = class {
2011
2349
  channelId: entry.channelId
2012
2350
  };
2013
2351
  if (entry.realtimeLifecycle.status === "active" || entry.realtimeLifecycle.status === "starting") {
2014
- entry.transcripts = void 0;
2352
+ retireTranscripts(entry);
2015
2353
  return {
2016
2354
  ok: true,
2017
2355
  message: `Stopped transcripts for ${formatMention({ channelId: entry.channelId })}.`,
@@ -2021,7 +2359,6 @@ var DiscordVoiceSessions = class {
2021
2359
  }
2022
2360
  }
2023
2361
  entry.stop();
2024
- this.params.sessions.delete(guildId);
2025
2362
  if (!entry.receiveRecovery.decryptRecoveryInFlight) this.params.receive.deleteRecoveryAttempt(guildId);
2026
2363
  if (!options?.preserveFollowState) this.params.onLeaveFollowState(guildId);
2027
2364
  logVoiceVerbose(`leave: disconnected from guild ${guildId} channel ${entry.channelId}`);
@@ -2042,7 +2379,7 @@ var DiscordVoiceSessions = class {
2042
2379
  ok: false,
2043
2380
  message: "Discord realtime voice session stopped before startup completed."
2044
2381
  };
2045
- const { DiscordRealtimeVoiceSession } = await import("./realtime-session.runtime-ysbMG8v7.js");
2382
+ const { DiscordRealtimeVoiceSession } = await import("./realtime-session.runtime-37IC-p5K.js");
2046
2383
  const realtime = new DiscordRealtimeVoiceSession({
2047
2384
  accountId: this.params.accountId,
2048
2385
  bootstrapContextInstructions,
@@ -2146,6 +2483,13 @@ var DiscordVoiceStateUpdateListener = class extends VoiceStateUpdateListener {
2146
2483
  };
2147
2484
  //#endregion
2148
2485
  //#region extensions/discord/src/voice/voice-runtime.ts
2486
+ var voice_runtime_exports = /* @__PURE__ */ __exportAll({
2487
+ DiscordVoiceGuildCreateListener: () => DiscordVoiceGuildCreateListener,
2488
+ DiscordVoiceManager: () => DiscordVoiceManager,
2489
+ DiscordVoiceReadyListener: () => DiscordVoiceReadyListener,
2490
+ DiscordVoiceResumedListener: () => DiscordVoiceResumedListener,
2491
+ DiscordVoiceStateUpdateListener: () => DiscordVoiceStateUpdateListener
2492
+ });
2149
2493
  const logger = createSubsystemLogger("discord/voice");
2150
2494
  const DISCORD_VOICE_FATAL_AUTOJOIN_ERROR_PATTERNS = [
2151
2495
  "api key missing",
@@ -2546,4 +2890,4 @@ var DiscordVoiceManager = class {
2546
2890
  }
2547
2891
  };
2548
2892
  //#endregion
2549
- export { DiscordVoiceGuildCreateListener, DiscordVoiceManager, DiscordVoiceReadyListener, DiscordVoiceResumedListener, DiscordVoiceStateUpdateListener };
2893
+ export { DiscordVoiceGuildCreateListener, DiscordVoiceManager, DiscordVoiceReadyListener, DiscordVoiceResumedListener, DiscordVoiceStateUpdateListener, convertRealtimePcm24kMonoToDiscordPcm48kStereo as a, maybeControlDiscordVoiceAgentRun as c, convertDiscordPcm48kStereoToRealtimePcm24kMono as i, formatVoiceLogPreview as l, loadDiscordVoiceSdk as n, createDiscordOpusEncodeStream as o, logVoiceVerbose as r, formatVoiceIngressPrompt as s, voice_runtime_exports as t };
@@ -8,7 +8,7 @@ This package contains type definitions for lodash (https://lodash.com).
8
8
  Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash.
9
9
 
10
10
  ### Additional Details
11
- * Last updated: Mon, 23 Feb 2026 05:30:26 GMT
11
+ * Last updated: Sat, 01 Aug 2026 03:43:12 GMT
12
12
  * Dependencies: none
13
13
 
14
14
  # Credits