@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.
- package/dist/account-inspect-BY-ve3yH.js +45 -0
- package/dist/account-inspect-api.js +1 -1
- package/dist/{accounts-DNl-oCEw.js → accounts-CwJQoLjM.js} +87 -162
- package/dist/action-runtime-api.js +1 -1
- package/dist/{activities-api-KCBAmWxD.js → activities-api-CkKcHUB6.js} +14 -12
- package/dist/activities-api.js +1 -1
- package/dist/{allow-list-BDMimASD.js → allow-list-C2JuH-R0.js} +10 -6
- package/dist/{api-DNVbJyEy.js → api-BfmEP6wp.js} +6 -5
- package/dist/api.js +18 -18
- package/dist/{approval-handler.runtime-B12RCYr8.js → approval-handler.runtime-DZM6Kt1Z.js} +30 -106
- package/dist/{audit-Yc7eZDd6.js → audit-DIbQA4VT.js} +8 -7
- package/dist/{channel-cXYzGc4L.js → channel-CarzU3bg.js} +25 -25
- package/dist/{channel-actions.runtime-CODTvo7c.js → channel-actions.runtime-B2wMqeVK.js} +60 -57
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/channel-type-CVLZyGYS.js +7 -0
- package/dist/{channel.setup-CSiwnMgs.js → channel.setup-z_ewMVa9.js} +18 -18
- package/dist/{components-ezGKo_Yh.js → components-gvRA0oaI.js} +33 -29
- package/dist/{config-schema-DC5kDtQ5.js → config-schema-B797-Spt.js} +21 -14
- package/dist/{conversation-binding-route-D6rCQ5S0.js → conversation-binding-route-DPpBRpYI.js} +1 -1
- package/dist/{directory-config-XyCfoqLg.js → directory-config-AA8wQx0D.js} +2 -2
- package/dist/directory-contract-api.js +1 -1
- package/dist/{directory-live-Df0NbFJB.js → directory-live-D_kFz_Fj.js} +4 -4
- package/dist/{doctor-DYY31GrO.js → doctor-QQTOkBfW.js} +5 -5
- package/dist/{doctor-contract-DsWvKIXF.js → doctor-contract-Co5vRCZ6.js} +9 -6
- package/dist/doctor-contract-api.js +4 -3
- package/dist/{handle-action.guild-admin-6Tvvinsa.js → handle-action.guild-admin-Cc88ZGon.js} +9 -5
- package/dist/index.js +1 -1
- package/dist/ingress-identity-BCzfPPYM.js +60 -0
- package/dist/{message-handler-B61q5MOF.js → message-handler-CAeEpqWo.js} +14 -10
- package/dist/{message-handler.preflight-Bzg_Hawz.js → message-handler.preflight-CoKoE3dY.js} +32 -91
- package/dist/{message-handler.process--4_712Ec.js → message-handler.process-cdIJ_fDT.js} +99 -123
- package/dist/{message-utils-BXLLnFl6.js → message-text-C0K4-fkg.js} +41 -34
- package/dist/{outbound-adapter-DxHTOqiN.js → outbound-adapter-Ch0At5Ra.js} +85 -78
- package/dist/{outbound-components-B2PL0ooH.js → outbound-components-Bnt_7x7r.js} +5 -4
- package/dist/outbound-session-route-CzzerX2K.js +668 -0
- package/dist/{owner-access-Bg41VzAf.js → owner-access-yc1sX7Gx.js} +7 -6
- package/dist/{pluralkit-dUl4v1X3.js → pluralkit-B3cUVI7i.js} +2 -2
- package/dist/{probe-BTdtVRwU.js → probe-3ovFAp3b.js} +3 -3
- package/dist/{probe.runtime-Dq5-PRKT.js → probe.runtime-BckHn3cJ.js} +1 -1
- package/dist/{provider-DlK_ynqt.js → provider-CjI8BSzS.js} +511 -342
- package/dist/{provider-session.runtime-CvvphHvs.js → provider-session.runtime-DdKRMcE9.js} +3 -3
- package/dist/provider.runtime-Bo1WbLLr.js +2 -0
- package/dist/{realtime-session.runtime-ysbMG8v7.js → realtime-session.runtime-37IC-p5K.js} +110 -126
- package/dist/{resolve-allowlist-common-DIVXbD1P.js → resolve-allowlist-common-BJ5UZNNT.js} +3 -3
- package/dist/{resolve-channels-CGeUoIqb.js → resolve-channels-BexR2eUn.js} +6 -5
- package/dist/{resolve-users-BtKxLUZv.js → resolve-users-BtXBCH5W.js} +5 -4
- package/dist/{retry-after-DdLPmPoa.js → retry-after-BrLjLUJi.js} +2 -1
- package/dist/{retry-DNsVTeTo.js → retry-t5RcEsPk.js} +237 -15
- package/dist/{runtime-CQovMsH3.js → runtime-BNlDfLwS.js} +2 -2
- package/dist/{runtime-D71_VFLr.js → runtime-DydyfxST.js} +182 -131
- package/dist/runtime-api.js +19 -26
- package/dist/{secret-config-contract-B3i6WxV5.js → secret-config-contract-DFu9hfU8.js} +14 -6
- package/dist/secret-contract-api.js +1 -1
- package/dist/{security-audit-BfJhAXZp.js → security-audit-DKfK-iPY.js} +10 -11
- package/dist/security-audit-contract-api.js +1 -1
- package/dist/{security-audit.runtime-BVKF9VtY.js → security-audit.runtime-sKZyKgpx.js} +1 -1
- package/dist/{send-rQIffSYu.js → send-mTKSBdmZ.js} +149 -58
- package/dist/{send.components-ChK1wS7w.js → send.components-nsPnc7kK.js} +29 -30
- package/dist/{send.outbound-HIkgji_7.js → send.outbound-CaOs9Zy1.js} +87 -84
- package/dist/{send.shared-B3fpaLWJ.js → send.shared-BJHt0Vyf.js} +55 -33
- package/dist/{sender-identity-BJtfyise.js → sender-identity-Dt0imZyY.js} +1 -1
- package/dist/setup-plugin-api.js +1 -1
- package/dist/{shared-CaAaoksy.js → shared-BNesVA4P.js} +43 -18
- package/dist/{subagent-hooks-CNT2ZJTJ.js → subagent-hooks-IeZVPLGj.js} +2 -2
- package/dist/subagent-hooks-api.js +1 -6
- package/dist/{system-events-Nuwoq_au.js → system-events-Be5EJI3b.js} +2 -2
- package/dist/{target-resolver-DIXShHaZ.js → target-resolver-C0MnwEki.js} +6 -5
- package/dist/targets-DQSye1Rv.js +3 -0
- package/dist/{thread-bindings-VlymUnbz.js → thread-bindings-wECUSIIG.js} +6 -6
- package/dist/{thread-bindings.manager-CngsgErq.js → thread-bindings.manager-B-3UHCc1.js} +31 -32
- package/dist/{thread-bindings.session-updates-CJb-BpPL.js → thread-bindings.session-updates-CC7HoQvt.js} +2 -1
- package/dist/{threading-DU6pgeGm.js → threading-te5ADPQI.js} +51 -27
- package/dist/{timeouts-B9cy6RvQ.js → timeouts-D86uWLt_.js} +1 -1
- package/dist/{transcripts-source-DeIMNbRh.js → transcripts-source-DkUhR7YK.js} +9 -4
- package/dist/transcripts-source-api.js +1 -1
- package/dist/{typing-oLiS5Z13.js → typing-DAwJF5VT.js} +2 -2
- package/dist/{voice-runtime-CjNFaynA.js → voice-runtime-COyYYTDD.js} +418 -74
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/README.md +1 -1
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/conforms.d.ts +2 -0
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/package.json +3 -3
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubArray.d.ts +2 -0
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubObject.d.ts +2 -0
- package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubString.d.ts +2 -0
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/README.md +19 -19
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist/v1.js +7 -3
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist/v7.js +5 -2
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist-node/v1.js +7 -3
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/dist-node/v7.js +5 -2
- package/node_modules/@discord/embedded-app-sdk/node_modules/uuid/package.json +4 -3
- package/node_modules/@discordjs/voice/node_modules/@types/node/README.md +1 -1
- package/node_modules/@discordjs/voice/node_modules/@types/node/child_process.d.ts +0 -1
- package/node_modules/@discordjs/voice/node_modules/@types/node/crypto.d.ts +6 -6
- package/node_modules/@discordjs/voice/node_modules/@types/node/dns/promises.d.ts +5 -5
- package/node_modules/@discordjs/voice/node_modules/@types/node/dns.d.ts +5 -5
- package/node_modules/@discordjs/voice/node_modules/@types/node/fs.d.ts +7 -0
- package/node_modules/@discordjs/voice/node_modules/@types/node/http.d.ts +30 -0
- package/node_modules/@discordjs/voice/node_modules/@types/node/http2.d.ts +4 -4
- package/node_modules/@discordjs/voice/node_modules/@types/node/os.d.ts +30 -30
- package/node_modules/@discordjs/voice/node_modules/@types/node/package.json +2 -2
- package/node_modules/@discordjs/voice/node_modules/@types/node/perf_hooks.d.ts +2 -1
- package/node_modules/@discordjs/voice/node_modules/@types/node/process.d.ts +42 -43
- package/node_modules/@discordjs/voice/node_modules/@types/node/quic.d.ts +1049 -84
- package/node_modules/@discordjs/voice/node_modules/@types/node/sqlite.d.ts +14 -1
- package/node_modules/@discordjs/voice/node_modules/@types/node/stream/iter.d.ts +3 -2
- package/node_modules/@discordjs/voice/node_modules/@types/node/test.d.ts +61 -0
- package/node_modules/@discordjs/voice/node_modules/@types/node/v8.d.ts +20 -23
- package/node_modules/discord-api-types/CHANGELOG.md +8 -0
- package/node_modules/discord-api-types/package.json +4 -4
- package/node_modules/discord-api-types/payloads/v10/channel.d.ts +2 -2
- package/node_modules/discord-api-types/payloads/v10/channel.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v10/gateway.d.ts +4 -0
- package/node_modules/discord-api-types/payloads/v10/gateway.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v10/gateway.js.map +1 -1
- package/node_modules/discord-api-types/payloads/v10/message.d.ts +4 -1
- package/node_modules/discord-api-types/payloads/v10/message.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v10/message.js +1 -0
- package/node_modules/discord-api-types/payloads/v10/message.js.map +1 -1
- package/node_modules/discord-api-types/payloads/v9/channel.d.ts +2 -2
- package/node_modules/discord-api-types/payloads/v9/channel.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v9/gateway.d.ts +4 -0
- package/node_modules/discord-api-types/payloads/v9/gateway.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v9/gateway.js.map +1 -1
- package/node_modules/discord-api-types/payloads/v9/message.d.ts +4 -1
- package/node_modules/discord-api-types/payloads/v9/message.d.ts.map +1 -1
- package/node_modules/discord-api-types/payloads/v9/message.js +1 -0
- package/node_modules/discord-api-types/payloads/v9/message.js.map +1 -1
- package/node_modules/typebox/build/format/date.d.mts +1 -1
- package/node_modules/typebox/build/format/date.mjs +1 -1
- package/node_modules/typebox/build/format/date_time.d.mts +2 -2
- package/node_modules/typebox/build/format/date_time.mjs +3 -3
- package/node_modules/typebox/build/format/email.d.mts +1 -1
- package/node_modules/typebox/build/format/email.mjs +2 -2
- package/node_modules/typebox/build/format/hostname.mjs +2 -10
- package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
- package/node_modules/typebox/build/format/idn_email.mjs +3 -3
- package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
- package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
- package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
- package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
- package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
- package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
- package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/idn-hostname.mjs +41 -0
- package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
- package/node_modules/typebox/build/format/idna/index.mjs +2 -0
- package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
- package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
- package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
- package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
- package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
- package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
- package/node_modules/typebox/build/format/ipv4.mjs +2 -32
- package/node_modules/typebox/build/format/ipv6.mjs +2 -61
- package/node_modules/typebox/build/format/iri.d.mts +2 -2
- package/node_modules/typebox/build/format/iri.mjs +26 -8
- package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
- package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
- package/node_modules/typebox/build/format/regex.d.mts +1 -2
- package/node_modules/typebox/build/format/regex.mjs +2 -6
- package/node_modules/typebox/build/format/time.d.mts +2 -2
- package/node_modules/typebox/build/format/time.mjs +19 -14
- package/node_modules/typebox/build/format/uri.d.mts +1 -1
- package/node_modules/typebox/build/format/uri.mjs +3 -130
- package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
- package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
- package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
- package/node_modules/typebox/build/format/uri_template.mjs +4 -5
- package/node_modules/typebox/build/format/url.d.mts +3 -3
- package/node_modules/typebox/build/format/url.mjs +4 -5
- package/node_modules/typebox/build/guard/emit.d.mts +3 -1
- package/node_modules/typebox/build/guard/emit.mjs +12 -5
- package/node_modules/typebox/build/guard/guard.d.mts +8 -2
- package/node_modules/typebox/build/guard/guard.mjs +25 -4
- package/node_modules/typebox/build/guard/string.d.mts +2 -2
- package/node_modules/typebox/build/guard/string.mjs +7 -7
- package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
- package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
- package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
- package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
- package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
- package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
- package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
- package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
- package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
- package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
- package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
- package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
- package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
- package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
- package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
- package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
- package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
- package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
- package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
- package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
- package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
- package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
- package/node_modules/typebox/build/schema/types/index.mjs +0 -2
- package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
- package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
- package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
- package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
- package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
- package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
- package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
- package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
- package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
- package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
- package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
- package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
- package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
- package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
- package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
- package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
- package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
- package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
- package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
- package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
- package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
- package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
- package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
- package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
- package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
- package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
- package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
- package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
- package/node_modules/typebox/build/type/script/parser.mjs +27 -23
- package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
- package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
- package/node_modules/typebox/package.json +27 -27
- package/node_modules/typebox/readme.md +79 -82
- package/node_modules/undici/docs/docs/api/Client.md +21 -8
- package/node_modules/undici/lib/api/readable.js +33 -43
- package/node_modules/undici/lib/core/connect.js +16 -2
- package/node_modules/undici/lib/core/symbols.js +1 -0
- package/node_modules/undici/lib/dispatcher/client-h1.js +3 -3
- package/node_modules/undici/lib/dispatcher/client-h2.js +179 -10
- package/node_modules/undici/lib/dispatcher/client.js +74 -29
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +28 -6
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +15 -1
- package/node_modules/undici/lib/handler/retry-handler.js +7 -2
- package/node_modules/undici/lib/interceptor/cache.js +5 -2
- package/node_modules/undici/lib/interceptor/deduplicate.js +1 -1
- package/node_modules/undici/lib/mock/mock-utils.js +213 -24
- package/node_modules/undici/lib/util/cache.js +2 -4
- package/node_modules/undici/lib/web/websocket/websocket.js +22 -0
- package/node_modules/undici/package.json +1 -1
- package/node_modules/undici/types/client.d.ts +40 -0
- package/node_modules/ws/lib/permessage-deflate.js +3 -1
- package/node_modules/ws/package.json +1 -1
- package/openclaw.plugin.json +14 -6
- package/package.json +8 -8
- package/skills/discord/SKILL.md +1 -1
- package/dist/account-inspect-D5xmUpnj.js +0 -89
- package/dist/approval-message-safety-XGFPbDoI.js +0 -226
- package/dist/audit-core-BCX8UeFH.js +0 -105
- package/dist/channel-actions-Dr2QI8Bf.js +0 -212
- package/dist/inbound-event-delivery-De2qxTrP.js +0 -39
- package/dist/provider.runtime-CzKGRiAF.js +0 -2
- package/dist/runtime-api.actions.js +0 -3
- package/dist/runtime-api.lookup.js +0 -7
- package/dist/runtime-api.monitor-CzeTYF32.js +0 -6
- package/dist/runtime-api.monitor.js +0 -9
- package/dist/runtime-api.send.js +0 -7
- package/dist/runtime-api.threads.js +0 -5
- package/dist/sdk-runtime-37OU6_Yh.js +0 -369
- package/dist/send.reactions-gmJ6yFPo.js +0 -78
- package/dist/send.receipt-Cnhoautb.js +0 -76
- package/dist/subagent-progress-FPLqBY1s.js +0 -110
- package/dist/targets-B2pf49zc.js +0 -3
- package/node_modules/typebox/build/format/_idna.d.mts +0 -2
- package/node_modules/typebox/build/format/_idna.mjs +0 -246
- package/node_modules/typebox/build/format/_puny.d.mts +0 -1
- package/node_modules/typebox/build/format/_puny.mjs +0 -77
- package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
- package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
- package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
- package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
- package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
- package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
|
@@ -1,25 +1,350 @@
|
|
|
1
|
-
import {
|
|
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-
|
|
5
|
-
import { a as formatMention } from "./send.outbound-
|
|
6
|
-
import { n as resolveDiscordVoiceEnabled, r as authorizeDiscordVoiceIngress, t as resolveDiscordVoiceAccess } from "./owner-access-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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 {
|
|
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 {
|
|
21
|
-
import {
|
|
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
|
|
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
|
-
|
|
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
|
-
})
|
|
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,
|
|
1291
|
-
|
|
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)
|
|
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
|
|
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
|
-
|
|
1865
|
-
|
|
2212
|
+
connection.receiver.speaking.off("start", speakingHandler);
|
|
2213
|
+
connection.receiver.speaking.off("end", speakingEndHandler);
|
|
1866
2214
|
stopVoiceCaptureState(entry.capture);
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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-
|
|
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:
|
|
11
|
+
* Last updated: Sat, 01 Aug 2026 03:43:12 GMT
|
|
12
12
|
* Dependencies: none
|
|
13
13
|
|
|
14
14
|
# Credits
|