@openclaw/discord 2026.5.2 → 2026.5.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-B9ujuUtS.js +89 -0
- package/dist/account-inspect-C2UEUhbG.js +81 -0
- package/dist/account-inspect-api.js +10 -0
- package/dist/accounts-BKnkNaoA.js +128 -0
- package/dist/action-runtime-api.js +2 -0
- package/dist/agent-components.runtime-DUhLr9hy.js +4 -0
- package/dist/allow-list-ek-1hMKN.js +336 -0
- package/dist/api-DzNBVTto.js +130 -0
- package/dist/api.js +24 -0
- package/dist/approval-handler.runtime-v8nzQHlT.js +426 -0
- package/dist/approval-native-DqWGp0bM.js +153 -0
- package/dist/approval-shared-DKnwwjZM.js +93 -0
- package/dist/audit-CJ92YD6J.js +102 -0
- package/dist/channel-B3aTtBj1.js +745 -0
- package/dist/channel-access-ewDxhd9q.js +62 -0
- package/dist/channel-actions-TNih7k3w.js +140 -0
- package/dist/channel-actions.runtime-CaPytiY4.js +236 -0
- package/dist/channel-api-CTSWMrnD.js +21 -0
- package/dist/channel-config-api.js +2 -0
- package/dist/channel-plugin-api.js +2 -0
- package/dist/channel.setup-Dt4tIDrl.js +336 -0
- package/dist/components-BapWDmDM.js +760 -0
- package/dist/config-api-CFZtoMaS.js +2 -0
- package/dist/config-schema-DwFkL904.js +252 -0
- package/dist/configured-state.js +6 -0
- package/dist/contract-api.js +8 -0
- package/dist/conversation-identity-BN9wSmxJ.js +31 -0
- package/dist/directory-cache-D93eSrpB.js +62 -0
- package/dist/directory-config-LyMP0sdv.js +49 -0
- package/dist/directory-contract-api.js +2 -0
- package/dist/directory-live-BQapdpkZ.js +101 -0
- package/dist/discord-D1kDh0X_.js +2751 -0
- package/dist/doctor-B2G7WqO0.js +244 -0
- package/dist/doctor-contract-D3pSutkb.js +383 -0
- package/dist/doctor-contract-api.js +2 -0
- package/dist/doctor-shared-DU8RcnF5.js +4 -0
- package/dist/format-D8TsaXxW.js +24 -0
- package/dist/gateway-registry-BKG4KIVC.js +74 -0
- package/dist/handle-action.guild-admin-BuqsSVXu.js +283 -0
- package/dist/inbound-context-e_oBBJtF.js +51 -0
- package/dist/index.js +26 -0
- package/dist/manager.runtime-M2aAa7qA.js +1019 -0
- package/dist/mentions-BPZUaFk7.js +88 -0
- package/dist/message-handler-D6JfFV3P.js +381 -0
- package/dist/message-handler.preflight-DqaF3vHm.js +1022 -0
- package/dist/message-handler.process-tl3Nwnhr.js +1124 -0
- package/dist/message-utils-Dmgu-7fC.js +512 -0
- package/dist/normalize-B-ktw-T_.js +275 -0
- package/dist/outbound-adapter-DJf9_sfH.js +451 -0
- package/dist/outbound-session-route-uHGLDP-Y.js +43 -0
- package/dist/pluralkit-voQvSN3g.js +22 -0
- package/dist/preflight-audio-BpYtUAT6.js +72 -0
- package/dist/preflight-audio.runtime-BAGmU6uO.js +7 -0
- package/dist/preview-streaming-C0O92Qqz.js +14 -0
- package/dist/probe-DcNEodPI.js +139 -0
- package/dist/probe.runtime-P-e4r1Hl.js +2 -0
- package/dist/provider-CMvXOp-3.js +8440 -0
- package/dist/provider-session.runtime-JFemrDZT.js +6 -0
- package/dist/provider.runtime-BO007oR2.js +2 -0
- package/dist/reply-delivery-D9So77a6.js +131 -0
- package/dist/resolve-allowlist-common-DqqFY_qa.js +34 -0
- package/dist/resolve-channels-CGPntufJ.js +265 -0
- package/dist/resolve-users-CDvSlW0V.js +120 -0
- package/dist/rolldown-runtime-C3SqQTfK.js +28 -0
- package/dist/route-resolution-BYiC-6Cc.js +236 -0
- package/dist/runtime-K9RT6Egn.js +8 -0
- package/dist/runtime-api.actions.js +3 -0
- package/dist/runtime-api.js +31 -0
- package/dist/runtime-api.lookup.js +7 -0
- package/dist/runtime-api.monitor-BC-XN0tY.js +6 -0
- package/dist/runtime-api.monitor.js +9 -0
- package/dist/runtime-api.send.js +6 -0
- package/dist/runtime-api.threads.js +6 -0
- package/dist/runtime-n5xZHW55.js +1001 -0
- package/dist/runtime-setter-api.js +2 -0
- package/dist/secret-config-contract-CoGryS5c.js +115 -0
- package/dist/secret-contract-api.js +2 -0
- package/dist/security-audit-Cdz2iq3m.js +120 -0
- package/dist/security-audit-contract-api.js +2 -0
- package/dist/security-audit.runtime-DBV1T1_N.js +2 -0
- package/dist/security-contract-api.js +2 -0
- package/dist/security-contract-ei3Mz8Sa.js +26 -0
- package/dist/security-doctor-CzTzpXV8.js +18 -0
- package/dist/send-B_frVn_Q.js +845 -0
- package/dist/send.components-B1EgHAds.js +468 -0
- package/dist/send.outbound-DlBAuW7y.js +211 -0
- package/dist/send.shared-Db0opnak.js +708 -0
- package/dist/sender-identity-BiSDAk2P.js +43 -0
- package/dist/session-contract-goJZckp2.js +6 -0
- package/dist/session-key-api.js +2 -0
- package/dist/session-key-normalization-Daag9II6.js +23 -0
- package/dist/setup-entry.js +11 -0
- package/dist/setup-plugin-api.js +2 -0
- package/dist/shared-CqlrJmSs.js +166 -0
- package/dist/shared-interactive-KgJjCqnB.js +79 -0
- package/dist/subagent-hooks-api.js +22 -0
- package/dist/subagent-hooks-mEK5ARfP.js +113 -0
- package/dist/system-events-Bu9jmO4W.js +34 -0
- package/dist/targets-kKlbZ4ai.js +3 -0
- package/dist/test-api.js +45 -0
- package/dist/thread-binding-api.js +4 -0
- package/dist/thread-bindings-Bj1R-6QH.js +256 -0
- package/dist/thread-bindings.discord-api-ClPMuIr8.js +184 -0
- package/dist/thread-bindings.manager-BaN0l4y8.js +535 -0
- package/dist/thread-bindings.session-updates-TTP020qQ.js +54 -0
- package/dist/thread-bindings.state-Dzu1gCE7.js +318 -0
- package/dist/threading-CWhdYHVx.js +475 -0
- package/dist/timeouts-C7jeTtGs.js +52 -0
- package/dist/timeouts.js +2 -0
- package/dist/token-D-w3Rigl.js +42 -0
- package/dist/typing-CJiowRTZ.js +15 -0
- package/package.json +14 -6
- package/account-inspect-api.ts +0 -6
- package/action-runtime-api.ts +0 -1
- package/api.ts +0 -132
- package/channel-config-api.ts +0 -1
- package/channel-plugin-api.ts +0 -3
- package/config-api.ts +0 -4
- package/configured-state.ts +0 -6
- package/contract-api.ts +0 -21
- package/directory-contract-api.ts +0 -4
- package/doctor-contract-api.ts +0 -1
- package/index.test.ts +0 -13
- package/index.ts +0 -24
- package/runtime-api.actions.ts +0 -15
- package/runtime-api.lookup.ts +0 -22
- package/runtime-api.monitor.ts +0 -50
- package/runtime-api.send.ts +0 -79
- package/runtime-api.threads.ts +0 -30
- package/runtime-api.ts +0 -180
- package/runtime-setter-api.ts +0 -3
- package/secret-contract-api.ts +0 -4
- package/security-audit-contract-api.ts +0 -1
- package/security-contract-api.ts +0 -4
- package/session-key-api.ts +0 -1
- package/setup-entry.ts +0 -9
- package/setup-plugin-api.ts +0 -3
- package/src/account-inspect.test.ts +0 -126
- package/src/account-inspect.ts +0 -132
- package/src/accounts.test.ts +0 -247
- package/src/accounts.ts +0 -196
- package/src/actions/handle-action.guild-admin.ts +0 -411
- package/src/actions/handle-action.test.ts +0 -306
- package/src/actions/handle-action.ts +0 -372
- package/src/actions/runtime.guild.ts +0 -446
- package/src/actions/runtime.messaging.messages.ts +0 -205
- package/src/actions/runtime.messaging.reactions.ts +0 -67
- package/src/actions/runtime.messaging.runtime.ts +0 -69
- package/src/actions/runtime.messaging.send.ts +0 -248
- package/src/actions/runtime.messaging.shared.ts +0 -97
- package/src/actions/runtime.messaging.ts +0 -37
- package/src/actions/runtime.moderation-shared.ts +0 -48
- package/src/actions/runtime.moderation.authz.test.ts +0 -151
- package/src/actions/runtime.moderation.ts +0 -116
- package/src/actions/runtime.presence.test.ts +0 -160
- package/src/actions/runtime.presence.ts +0 -117
- package/src/actions/runtime.shared.ts +0 -83
- package/src/actions/runtime.test.ts +0 -1087
- package/src/actions/runtime.ts +0 -87
- package/src/api-barrel.test.ts +0 -80
- package/src/api.test.ts +0 -130
- package/src/api.ts +0 -169
- package/src/approval-handler.runtime.test.ts +0 -41
- package/src/approval-handler.runtime.ts +0 -632
- package/src/approval-native.test.ts +0 -330
- package/src/approval-native.ts +0 -219
- package/src/approval-runtime.ts +0 -14
- package/src/approval-shared.ts +0 -53
- package/src/audit-core.ts +0 -141
- package/src/audit.test.ts +0 -145
- package/src/audit.ts +0 -32
- package/src/channel-actions.contract.test.ts +0 -45
- package/src/channel-actions.runtime.ts +0 -1
- package/src/channel-actions.test.ts +0 -275
- package/src/channel-actions.ts +0 -203
- package/src/channel-api.ts +0 -29
- package/src/channel.conversation.ts +0 -159
- package/src/channel.loaders.ts +0 -47
- package/src/channel.runtime.ts +0 -1
- package/src/channel.setup.ts +0 -12
- package/src/channel.test.ts +0 -571
- package/src/channel.ts +0 -629
- package/src/chunk.test.ts +0 -157
- package/src/chunk.ts +0 -321
- package/src/client.proxy.test.ts +0 -176
- package/src/client.test.ts +0 -76
- package/src/client.ts +0 -132
- package/src/component-custom-id.ts +0 -72
- package/src/components-registry.ts +0 -356
- package/src/components.builders.ts +0 -409
- package/src/components.modal.ts +0 -124
- package/src/components.parse.ts +0 -407
- package/src/components.test.ts +0 -312
- package/src/components.ts +0 -54
- package/src/components.types.ts +0 -187
- package/src/config-schema.test.ts +0 -325
- package/src/config-schema.ts +0 -6
- package/src/config-ui-hints.ts +0 -249
- package/src/conversation-identity.ts +0 -58
- package/src/delivery-retry.ts +0 -56
- package/src/directory-cache.ts +0 -116
- package/src/directory-config.ts +0 -58
- package/src/directory-contract.test.ts +0 -129
- package/src/directory-live.test.ts +0 -126
- package/src/directory-live.ts +0 -135
- package/src/doctor-contract.ts +0 -477
- package/src/doctor-shared.ts +0 -5
- package/src/doctor.test.ts +0 -405
- package/src/doctor.ts +0 -340
- package/src/draft-chunking.test.ts +0 -64
- package/src/draft-chunking.ts +0 -43
- package/src/draft-stream.test.ts +0 -159
- package/src/draft-stream.ts +0 -154
- package/src/error-body.ts +0 -38
- package/src/exec-approvals.test.ts +0 -88
- package/src/exec-approvals.ts +0 -110
- package/src/gateway-logging.test.ts +0 -98
- package/src/gateway-logging.ts +0 -67
- package/src/group-policy.ts +0 -113
- package/src/guilds.ts +0 -29
- package/src/inbound-context.contract.test.ts +0 -11
- package/src/interactive-dispatch.ts +0 -104
- package/src/internal/api.commands.ts +0 -51
- package/src/internal/api.guild.ts +0 -164
- package/src/internal/api.interactions.ts +0 -53
- package/src/internal/api.messages.ts +0 -113
- package/src/internal/api.reactions.ts +0 -38
- package/src/internal/api.test.ts +0 -262
- package/src/internal/api.ts +0 -61
- package/src/internal/api.users.ts +0 -19
- package/src/internal/api.webhooks.ts +0 -13
- package/src/internal/client.test.ts +0 -440
- package/src/internal/client.ts +0 -310
- package/src/internal/command-deploy.ts +0 -297
- package/src/internal/commands.ts +0 -188
- package/src/internal/components.base.ts +0 -65
- package/src/internal/components.message.ts +0 -279
- package/src/internal/components.modal.ts +0 -95
- package/src/internal/components.ts +0 -31
- package/src/internal/discord.ts +0 -11
- package/src/internal/embeds.ts +0 -35
- package/src/internal/entity-cache.ts +0 -98
- package/src/internal/event-queue.ts +0 -162
- package/src/internal/gateway-close-codes.ts +0 -25
- package/src/internal/gateway-dispatch.ts +0 -96
- package/src/internal/gateway-identify-limiter.ts +0 -26
- package/src/internal/gateway-lifecycle.ts +0 -61
- package/src/internal/gateway-rate-limit.ts +0 -104
- package/src/internal/gateway.test.ts +0 -603
- package/src/internal/gateway.ts +0 -476
- package/src/internal/interaction-dispatch.test.ts +0 -148
- package/src/internal/interaction-dispatch.ts +0 -162
- package/src/internal/interaction-options.ts +0 -98
- package/src/internal/interaction-response.ts +0 -53
- package/src/internal/interactions.test.ts +0 -325
- package/src/internal/interactions.ts +0 -378
- package/src/internal/listeners.ts +0 -85
- package/src/internal/live-smoke.live.test.ts +0 -26
- package/src/internal/modal-fields.ts +0 -95
- package/src/internal/payload.ts +0 -69
- package/src/internal/rest-body.ts +0 -115
- package/src/internal/rest-errors.ts +0 -88
- package/src/internal/rest-routes.ts +0 -50
- package/src/internal/rest-scheduler.ts +0 -557
- package/src/internal/rest.test.ts +0 -673
- package/src/internal/rest.ts +0 -322
- package/src/internal/schemas.ts +0 -36
- package/src/internal/structures.test.ts +0 -43
- package/src/internal/structures.ts +0 -280
- package/src/internal/test-builders.test-support.ts +0 -167
- package/src/internal/voice.ts +0 -49
- package/src/media-detection.ts +0 -28
- package/src/mentions.test.ts +0 -111
- package/src/mentions.ts +0 -147
- package/src/monitor/access-groups.ts +0 -55
- package/src/monitor/ack-reactions.ts +0 -70
- package/src/monitor/acp-bind-here.integration.test.ts +0 -211
- package/src/monitor/agent-components-auth.ts +0 -7
- package/src/monitor/agent-components-context.ts +0 -154
- package/src/monitor/agent-components-data.ts +0 -224
- package/src/monitor/agent-components-dm-auth.ts +0 -221
- package/src/monitor/agent-components-guild-auth.ts +0 -322
- package/src/monitor/agent-components-helpers.runtime.ts +0 -5
- package/src/monitor/agent-components-helpers.ts +0 -34
- package/src/monitor/agent-components-reply.ts +0 -10
- package/src/monitor/agent-components.deps.runtime.ts +0 -2
- package/src/monitor/agent-components.dispatch.ts +0 -366
- package/src/monitor/agent-components.handlers.ts +0 -303
- package/src/monitor/agent-components.modal.ts +0 -160
- package/src/monitor/agent-components.plugin-interactive.ts +0 -187
- package/src/monitor/agent-components.runtime.ts +0 -14
- package/src/monitor/agent-components.system-controls.ts +0 -211
- package/src/monitor/agent-components.ts +0 -70
- package/src/monitor/agent-components.types.ts +0 -58
- package/src/monitor/agent-components.wildcard-controls.ts +0 -168
- package/src/monitor/agent-components.wildcard.test.ts +0 -71
- package/src/monitor/allow-list.test.ts +0 -14
- package/src/monitor/allow-list.ts +0 -633
- package/src/monitor/auto-presence.test.ts +0 -156
- package/src/monitor/auto-presence.ts +0 -356
- package/src/monitor/channel-access.test.ts +0 -99
- package/src/monitor/channel-access.ts +0 -102
- package/src/monitor/commands.test.ts +0 -24
- package/src/monitor/commands.ts +0 -9
- package/src/monitor/dm-command-auth.test.ts +0 -197
- package/src/monitor/dm-command-auth.ts +0 -158
- package/src/monitor/dm-command-decision.test.ts +0 -113
- package/src/monitor/dm-command-decision.ts +0 -49
- package/src/monitor/exec-approvals.test.ts +0 -226
- package/src/monitor/exec-approvals.ts +0 -158
- package/src/monitor/format.ts +0 -45
- package/src/monitor/gateway-handle.ts +0 -34
- package/src/monitor/gateway-metadata.test.ts +0 -29
- package/src/monitor/gateway-metadata.ts +0 -298
- package/src/monitor/gateway-plugin.test.ts +0 -297
- package/src/monitor/gateway-plugin.ts +0 -294
- package/src/monitor/gateway-registry.ts +0 -37
- package/src/monitor/gateway-supervisor.test.ts +0 -150
- package/src/monitor/gateway-supervisor.ts +0 -206
- package/src/monitor/inbound-context.test-helpers.ts +0 -37
- package/src/monitor/inbound-context.test.ts +0 -106
- package/src/monitor/inbound-context.ts +0 -103
- package/src/monitor/inbound-dedupe.ts +0 -79
- package/src/monitor/inbound-job.test.ts +0 -203
- package/src/monitor/inbound-job.ts +0 -118
- package/src/monitor/listeners.queue.ts +0 -91
- package/src/monitor/listeners.reactions.ts +0 -610
- package/src/monitor/listeners.test.ts +0 -200
- package/src/monitor/listeners.ts +0 -150
- package/src/monitor/message-channel-info.ts +0 -96
- package/src/monitor/message-forwarded.ts +0 -107
- package/src/monitor/message-handler.batch-gate.test.ts +0 -22
- package/src/monitor/message-handler.batch-gate.ts +0 -19
- package/src/monitor/message-handler.bot-self-filter.test.ts +0 -68
- package/src/monitor/message-handler.context.ts +0 -406
- package/src/monitor/message-handler.dm-preflight.ts +0 -123
- package/src/monitor/message-handler.draft-preview.ts +0 -246
- package/src/monitor/message-handler.hydration.test.ts +0 -80
- package/src/monitor/message-handler.hydration.ts +0 -198
- package/src/monitor/message-handler.inbound-context.test.ts +0 -59
- package/src/monitor/message-handler.module-test-helpers.ts +0 -31
- package/src/monitor/message-handler.preflight-channel-access.ts +0 -86
- package/src/monitor/message-handler.preflight-channel-context.test.ts +0 -18
- package/src/monitor/message-handler.preflight-channel-context.ts +0 -58
- package/src/monitor/message-handler.preflight-context.ts +0 -54
- package/src/monitor/message-handler.preflight-helpers.ts +0 -164
- package/src/monitor/message-handler.preflight-history.ts +0 -23
- package/src/monitor/message-handler.preflight-logging.ts +0 -36
- package/src/monitor/message-handler.preflight-pluralkit.ts +0 -26
- package/src/monitor/message-handler.preflight-runtime.ts +0 -28
- package/src/monitor/message-handler.preflight-thread.ts +0 -49
- package/src/monitor/message-handler.preflight.acp-bindings.test.ts +0 -369
- package/src/monitor/message-handler.preflight.test-helpers.ts +0 -111
- package/src/monitor/message-handler.preflight.test.ts +0 -1623
- package/src/monitor/message-handler.preflight.ts +0 -679
- package/src/monitor/message-handler.preflight.types.ts +0 -110
- package/src/monitor/message-handler.process.test.ts +0 -1369
- package/src/monitor/message-handler.process.ts +0 -686
- package/src/monitor/message-handler.queue.test.ts +0 -496
- package/src/monitor/message-handler.routing-preflight.ts +0 -112
- package/src/monitor/message-handler.test-harness.ts +0 -99
- package/src/monitor/message-handler.test-helpers.ts +0 -75
- package/src/monitor/message-handler.ts +0 -274
- package/src/monitor/message-media.ts +0 -509
- package/src/monitor/message-run-queue.ts +0 -101
- package/src/monitor/message-text.ts +0 -171
- package/src/monitor/message-utils.test.ts +0 -1157
- package/src/monitor/message-utils.ts +0 -32
- package/src/monitor/model-picker-preferences.test.ts +0 -67
- package/src/monitor/model-picker-preferences.ts +0 -184
- package/src/monitor/model-picker.state.ts +0 -364
- package/src/monitor/model-picker.test-utils.ts +0 -26
- package/src/monitor/model-picker.test.ts +0 -794
- package/src/monitor/model-picker.ts +0 -38
- package/src/monitor/model-picker.view.ts +0 -695
- package/src/monitor/monitor.agent-components.test.ts +0 -375
- package/src/monitor/monitor.test.ts +0 -849
- package/src/monitor/monitor.threading-utils.test.ts +0 -598
- package/src/monitor/native-command-agent-reply.ts +0 -125
- package/src/monitor/native-command-arg-ui.ts +0 -233
- package/src/monitor/native-command-auth.ts +0 -308
- package/src/monitor/native-command-bypass.ts +0 -13
- package/src/monitor/native-command-context.test.ts +0 -98
- package/src/monitor/native-command-context.ts +0 -103
- package/src/monitor/native-command-dispatch.ts +0 -35
- package/src/monitor/native-command-model-picker-apply.ts +0 -177
- package/src/monitor/native-command-model-picker-interaction.ts +0 -461
- package/src/monitor/native-command-model-picker-ui.ts +0 -368
- package/src/monitor/native-command-reply.test.ts +0 -68
- package/src/monitor/native-command-reply.ts +0 -185
- package/src/monitor/native-command-route.ts +0 -91
- package/src/monitor/native-command-status.ts +0 -76
- package/src/monitor/native-command-ui.ts +0 -26
- package/src/monitor/native-command-ui.types.ts +0 -20
- package/src/monitor/native-command.args.ts +0 -45
- package/src/monitor/native-command.command-arg.test.ts +0 -99
- package/src/monitor/native-command.commands-allowfrom.test.ts +0 -490
- package/src/monitor/native-command.model-picker.test.ts +0 -767
- package/src/monitor/native-command.options.test.ts +0 -369
- package/src/monitor/native-command.options.ts +0 -153
- package/src/monitor/native-command.plugin-dispatch.test.ts +0 -961
- package/src/monitor/native-command.runtime.ts +0 -50
- package/src/monitor/native-command.status-direct.test.ts +0 -272
- package/src/monitor/native-command.test-helpers.ts +0 -64
- package/src/monitor/native-command.think-autocomplete.test.ts +0 -416
- package/src/monitor/native-command.ts +0 -700
- package/src/monitor/native-command.types.ts +0 -9
- package/src/monitor/native-interaction-channel-context.ts +0 -50
- package/src/monitor/preflight-audio.runtime.ts +0 -9
- package/src/monitor/preflight-audio.test.ts +0 -157
- package/src/monitor/preflight-audio.ts +0 -130
- package/src/monitor/presence-cache.ts +0 -61
- package/src/monitor/presence.test.ts +0 -44
- package/src/monitor/presence.ts +0 -50
- package/src/monitor/provider-session.runtime.ts +0 -12
- package/src/monitor/provider.acp.ts +0 -89
- package/src/monitor/provider.allowlist.test.ts +0 -149
- package/src/monitor/provider.allowlist.ts +0 -394
- package/src/monitor/provider.cleanup.ts +0 -41
- package/src/monitor/provider.commands.ts +0 -129
- package/src/monitor/provider.config-log.ts +0 -45
- package/src/monitor/provider.deploy-errors.ts +0 -362
- package/src/monitor/provider.deploy.ts +0 -221
- package/src/monitor/provider.interactions.ts +0 -160
- package/src/monitor/provider.lifecycle.test.ts +0 -713
- package/src/monitor/provider.lifecycle.ts +0 -552
- package/src/monitor/provider.proxy.test.ts +0 -745
- package/src/monitor/provider.rest-proxy.test.ts +0 -121
- package/src/monitor/provider.runtime.ts +0 -1
- package/src/monitor/provider.skill-dedupe.test.ts +0 -42
- package/src/monitor/provider.startup-log.ts +0 -32
- package/src/monitor/provider.startup.test.ts +0 -426
- package/src/monitor/provider.startup.ts +0 -330
- package/src/monitor/provider.test.ts +0 -1111
- package/src/monitor/provider.ts +0 -713
- package/src/monitor/reply-context.ts +0 -64
- package/src/monitor/reply-delivery.test.ts +0 -244
- package/src/monitor/reply-delivery.ts +0 -203
- package/src/monitor/rest-fetch.ts +0 -43
- package/src/monitor/route-resolution.test.ts +0 -204
- package/src/monitor/route-resolution.ts +0 -140
- package/src/monitor/sender-identity.ts +0 -81
- package/src/monitor/startup-status.test.ts +0 -30
- package/src/monitor/startup-status.ts +0 -10
- package/src/monitor/status.ts +0 -22
- package/src/monitor/system-events.ts +0 -55
- package/src/monitor/thread-bindings.config.ts +0 -35
- package/src/monitor/thread-bindings.discord-api.test.ts +0 -229
- package/src/monitor/thread-bindings.discord-api.ts +0 -310
- package/src/monitor/thread-bindings.lifecycle.test.ts +0 -1871
- package/src/monitor/thread-bindings.lifecycle.ts +0 -354
- package/src/monitor/thread-bindings.manager.ts +0 -553
- package/src/monitor/thread-bindings.messages.ts +0 -6
- package/src/monitor/thread-bindings.persona.test.ts +0 -34
- package/src/monitor/thread-bindings.persona.ts +0 -25
- package/src/monitor/thread-bindings.session-adapter.ts +0 -229
- package/src/monitor/thread-bindings.session-shared.ts +0 -59
- package/src/monitor/thread-bindings.session-updates.ts +0 -35
- package/src/monitor/thread-bindings.shared-state.test.ts +0 -36
- package/src/monitor/thread-bindings.state.ts +0 -540
- package/src/monitor/thread-bindings.ts +0 -48
- package/src/monitor/thread-bindings.types.ts +0 -83
- package/src/monitor/thread-channel-context.ts +0 -112
- package/src/monitor/thread-session-close.test.ts +0 -180
- package/src/monitor/thread-session-close.ts +0 -63
- package/src/monitor/thread-title.generate.test.ts +0 -197
- package/src/monitor/thread-title.test.ts +0 -31
- package/src/monitor/thread-title.ts +0 -181
- package/src/monitor/threading.auto-thread.test.ts +0 -327
- package/src/monitor/threading.auto-thread.ts +0 -287
- package/src/monitor/threading.cache.ts +0 -45
- package/src/monitor/threading.parent-info.test.ts +0 -156
- package/src/monitor/threading.starter.test.ts +0 -260
- package/src/monitor/threading.starter.ts +0 -287
- package/src/monitor/threading.ts +0 -20
- package/src/monitor/threading.types.ts +0 -102
- package/src/monitor/timeouts.ts +0 -84
- package/src/monitor/typing.test.ts +0 -42
- package/src/monitor/typing.ts +0 -17
- package/src/monitor.gateway.test.ts +0 -187
- package/src/monitor.gateway.ts +0 -75
- package/src/monitor.test.ts +0 -1397
- package/src/monitor.ts +0 -28
- package/src/normalize.test.ts +0 -56
- package/src/normalize.ts +0 -86
- package/src/outbound-adapter.interactive-order.test.ts +0 -64
- package/src/outbound-adapter.test-harness.ts +0 -207
- package/src/outbound-adapter.test.ts +0 -696
- package/src/outbound-adapter.ts +0 -291
- package/src/outbound-approval.ts +0 -29
- package/src/outbound-components.ts +0 -81
- package/src/outbound-payload.contract.test.ts +0 -38
- package/src/outbound-payload.ts +0 -134
- package/src/outbound-send-context.ts +0 -92
- package/src/outbound-session-route.test.ts +0 -34
- package/src/outbound-session-route.ts +0 -72
- package/src/pluralkit.test.ts +0 -67
- package/src/pluralkit.ts +0 -58
- package/src/preview-streaming.ts +0 -32
- package/src/probe.intents.test.ts +0 -94
- package/src/probe.parse-token.test.ts +0 -43
- package/src/probe.runtime.ts +0 -1
- package/src/probe.ts +0 -237
- package/src/proxy-fetch.ts +0 -92
- package/src/proxy-request-client.test.ts +0 -78
- package/src/proxy-request-client.ts +0 -21
- package/src/recipient-resolution.ts +0 -39
- package/src/resolve-allowlist-common.test.ts +0 -36
- package/src/resolve-allowlist-common.ts +0 -39
- package/src/resolve-channels.test.ts +0 -340
- package/src/resolve-channels.ts +0 -369
- package/src/resolve-users.test.ts +0 -222
- package/src/resolve-users.ts +0 -184
- package/src/retry.test.ts +0 -83
- package/src/retry.ts +0 -98
- package/src/runtime-api.ts +0 -64
- package/src/runtime.ts +0 -23
- package/src/secret-config-contract.ts +0 -140
- package/src/security-audit.runtime.ts +0 -1
- package/src/security-audit.test.ts +0 -246
- package/src/security-audit.ts +0 -208
- package/src/security-contract.ts +0 -47
- package/src/security-doctor.test.ts +0 -25
- package/src/security-doctor.ts +0 -20
- package/src/security.ts +0 -60
- package/src/send-target-parsing.ts +0 -14
- package/src/send.channels.ts +0 -139
- package/src/send.components.test.ts +0 -275
- package/src/send.components.ts +0 -381
- package/src/send.creates-thread.test.ts +0 -643
- package/src/send.emojis-stickers.ts +0 -57
- package/src/send.guild.ts +0 -170
- package/src/send.message-request.ts +0 -97
- package/src/send.messages.test.ts +0 -53
- package/src/send.messages.ts +0 -225
- package/src/send.outbound.ts +0 -413
- package/src/send.permissions.authz.test.ts +0 -188
- package/src/send.permissions.ts +0 -283
- package/src/send.reactions.ts +0 -155
- package/src/send.sends-basic-channel-messages.test.ts +0 -941
- package/src/send.shared.ts +0 -447
- package/src/send.test-harness.ts +0 -56
- package/src/send.ts +0 -82
- package/src/send.types.ts +0 -188
- package/src/send.typing.test.ts +0 -41
- package/src/send.typing.ts +0 -9
- package/src/send.voice.ts +0 -134
- package/src/send.webhook-activity.test.ts +0 -105
- package/src/send.webhook.proxy.test.ts +0 -191
- package/src/send.webhook.ts +0 -133
- package/src/session-contract.ts +0 -3
- package/src/session-key-normalization.test.ts +0 -44
- package/src/session-key-normalization.ts +0 -47
- package/src/setup-account-state.test.ts +0 -91
- package/src/setup-account-state.ts +0 -144
- package/src/setup-adapter.ts +0 -12
- package/src/setup-core.ts +0 -212
- package/src/setup-runtime-helpers.ts +0 -10
- package/src/setup-surface.test.ts +0 -137
- package/src/setup-surface.ts +0 -129
- package/src/shared-interactive.test.ts +0 -153
- package/src/shared-interactive.ts +0 -124
- package/src/shared.test.ts +0 -165
- package/src/shared.ts +0 -190
- package/src/status-issues.test.ts +0 -70
- package/src/status-issues.ts +0 -169
- package/src/subagent-hooks.test.ts +0 -432
- package/src/subagent-hooks.ts +0 -214
- package/src/target-parsing.ts +0 -53
- package/src/target-resolver.ts +0 -129
- package/src/targets.test.ts +0 -367
- package/src/targets.ts +0 -12
- package/src/test-http-helpers.ts +0 -10
- package/src/test-support/component-runtime.ts +0 -190
- package/src/test-support/config.ts +0 -7
- package/src/test-support/configured-binding-runtime.ts +0 -29
- package/src/test-support/partial-channel.ts +0 -26
- package/src/test-support/provider.test-support.ts +0 -545
- package/src/token.test.ts +0 -107
- package/src/token.ts +0 -60
- package/src/ui-colors.ts +0 -27
- package/src/ui.ts +0 -20
- package/src/voice/access.test.ts +0 -217
- package/src/voice/access.ts +0 -124
- package/src/voice/audio.ts +0 -173
- package/src/voice/capture-state.test.ts +0 -48
- package/src/voice/capture-state.ts +0 -120
- package/src/voice/command.test.ts +0 -164
- package/src/voice/command.ts +0 -283
- package/src/voice/config.ts +0 -8
- package/src/voice/manager.e2e.test.ts +0 -928
- package/src/voice/manager.ready-listener.test.ts +0 -37
- package/src/voice/manager.runtime.ts +0 -11
- package/src/voice/manager.ts +0 -691
- package/src/voice/prompt.test.ts +0 -16
- package/src/voice/prompt.ts +0 -17
- package/src/voice/receive-recovery.test.ts +0 -79
- package/src/voice/receive-recovery.ts +0 -159
- package/src/voice/sanitize.test.ts +0 -34
- package/src/voice/sanitize.ts +0 -32
- package/src/voice/sdk-runtime.ts +0 -14
- package/src/voice/segment.ts +0 -156
- package/src/voice/session.ts +0 -50
- package/src/voice/speaker-context.ts +0 -127
- package/src/voice/tts.ts +0 -125
- package/src/voice-message.test.ts +0 -234
- package/src/voice-message.ts +0 -444
- package/subagent-hooks-api.ts +0 -27
- package/test-api.ts +0 -4
- package/thread-binding-api.ts +0 -1
- package/timeouts.ts +0 -6
- package/tsconfig.json +0 -16
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-C3SqQTfK.js";
|
|
2
|
+
import { s as resolveDiscordAccount } from "./accounts-BKnkNaoA.js";
|
|
3
|
+
import "./config-api-CFZtoMaS.js";
|
|
4
|
+
import "./channel-api-CTSWMrnD.js";
|
|
5
|
+
import "./outbound-session-route-uHGLDP-Y.js";
|
|
6
|
+
import { $ as createChannelMessage, it as editChannelMessage, w as serializePayload } from "./discord-D1kDh0X_.js";
|
|
7
|
+
import { M as createDiscordClient, h as SUPPRESS_NOTIFICATIONS_FLAG, k as parseAndResolveRecipient, l as resolveChannelId, m as toDiscordFileBlob, t as buildDiscordSendError, u as resolveDiscordChannelType, y as stripUndefinedFields } from "./send.shared-Db0opnak.js";
|
|
8
|
+
import { t as sendMessageDiscord } from "./send.outbound-DlBAuW7y.js";
|
|
9
|
+
import { a as buildDiscordComponentMessage, l as resolveDiscordComponentAttachmentName, o as buildDiscordComponentMessageFlags } from "./components-BapWDmDM.js";
|
|
10
|
+
import { n as getOptionalDiscordRuntime } from "./runtime-K9RT6Egn.js";
|
|
11
|
+
import "openclaw/plugin-sdk/account-id";
|
|
12
|
+
import "openclaw/plugin-sdk/secret-input";
|
|
13
|
+
import "openclaw/plugin-sdk/account-helpers";
|
|
14
|
+
import "openclaw/plugin-sdk/channel-config-helpers";
|
|
15
|
+
import "openclaw/plugin-sdk/routing";
|
|
16
|
+
import "openclaw/plugin-sdk/channel-status";
|
|
17
|
+
import { assertMediaNotDataUrl, jsonResult, parseAvailableTags, readNumberParam, readReactionParams, readStringArrayParam, readStringParam, resolvePollMaxSelections, withNormalizedTimestamp } from "openclaw/plugin-sdk/channel-actions";
|
|
18
|
+
import { readBooleanParam as readBooleanParam$1 } from "openclaw/plugin-sdk/boolean-param";
|
|
19
|
+
import "openclaw/plugin-sdk/channel-plugin-common";
|
|
20
|
+
import { loadOutboundMediaFromUrl } from "openclaw/plugin-sdk/outbound-media";
|
|
21
|
+
import { ChannelType } from "discord-api-types/v10";
|
|
22
|
+
import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
|
|
23
|
+
import { recordChannelActivity } from "openclaw/plugin-sdk/channel-activity-runtime";
|
|
24
|
+
import { resolveGlobalMap } from "openclaw/plugin-sdk/global-singleton";
|
|
25
|
+
//#region extensions/discord/src/components-registry.ts
|
|
26
|
+
const DEFAULT_COMPONENT_TTL_MS = 1800 * 1e3;
|
|
27
|
+
const PERSISTENT_COMPONENT_NAMESPACE = "discord.components";
|
|
28
|
+
const PERSISTENT_MODAL_NAMESPACE = "discord.modals";
|
|
29
|
+
const PERSISTENT_COMPONENT_MAX_ENTRIES = 500;
|
|
30
|
+
const PERSISTENT_MODAL_MAX_ENTRIES = 500;
|
|
31
|
+
const DISCORD_COMPONENT_ENTRIES_KEY = Symbol.for("openclaw.discord.componentEntries");
|
|
32
|
+
const DISCORD_MODAL_ENTRIES_KEY = Symbol.for("openclaw.discord.modalEntries");
|
|
33
|
+
let componentEntries;
|
|
34
|
+
let modalEntries;
|
|
35
|
+
let persistentComponentStore;
|
|
36
|
+
let persistentModalStore;
|
|
37
|
+
let persistentRegistryDisabled = false;
|
|
38
|
+
function getComponentEntries() {
|
|
39
|
+
componentEntries ??= resolveGlobalMap(DISCORD_COMPONENT_ENTRIES_KEY);
|
|
40
|
+
return componentEntries;
|
|
41
|
+
}
|
|
42
|
+
function getModalEntries() {
|
|
43
|
+
modalEntries ??= resolveGlobalMap(DISCORD_MODAL_ENTRIES_KEY);
|
|
44
|
+
return modalEntries;
|
|
45
|
+
}
|
|
46
|
+
function reportPersistentComponentRegistryError(error) {
|
|
47
|
+
try {
|
|
48
|
+
getOptionalDiscordRuntime()?.logging.getChildLogger({
|
|
49
|
+
plugin: "discord",
|
|
50
|
+
feature: "component-registry-state"
|
|
51
|
+
}).warn("Discord persistent component registry state failed", { error: String(error) });
|
|
52
|
+
} catch {}
|
|
53
|
+
}
|
|
54
|
+
function disablePersistentComponentRegistry(error) {
|
|
55
|
+
persistentRegistryDisabled = true;
|
|
56
|
+
persistentComponentStore = void 0;
|
|
57
|
+
persistentModalStore = void 0;
|
|
58
|
+
reportPersistentComponentRegistryError(error);
|
|
59
|
+
}
|
|
60
|
+
function getPersistentComponentStore() {
|
|
61
|
+
if (persistentRegistryDisabled) return;
|
|
62
|
+
if (persistentComponentStore) return persistentComponentStore;
|
|
63
|
+
const runtime = getOptionalDiscordRuntime();
|
|
64
|
+
if (!runtime) return;
|
|
65
|
+
try {
|
|
66
|
+
persistentComponentStore = runtime.state.openKeyedStore({
|
|
67
|
+
namespace: PERSISTENT_COMPONENT_NAMESPACE,
|
|
68
|
+
maxEntries: PERSISTENT_COMPONENT_MAX_ENTRIES,
|
|
69
|
+
defaultTtlMs: DEFAULT_COMPONENT_TTL_MS
|
|
70
|
+
});
|
|
71
|
+
return persistentComponentStore;
|
|
72
|
+
} catch (error) {
|
|
73
|
+
disablePersistentComponentRegistry(error);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function getPersistentModalStore() {
|
|
78
|
+
if (persistentRegistryDisabled) return;
|
|
79
|
+
if (persistentModalStore) return persistentModalStore;
|
|
80
|
+
const runtime = getOptionalDiscordRuntime();
|
|
81
|
+
if (!runtime) return;
|
|
82
|
+
try {
|
|
83
|
+
persistentModalStore = runtime.state.openKeyedStore({
|
|
84
|
+
namespace: PERSISTENT_MODAL_NAMESPACE,
|
|
85
|
+
maxEntries: PERSISTENT_MODAL_MAX_ENTRIES,
|
|
86
|
+
defaultTtlMs: DEFAULT_COMPONENT_TTL_MS
|
|
87
|
+
});
|
|
88
|
+
return persistentModalStore;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
disablePersistentComponentRegistry(error);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function isExpired(entry, now) {
|
|
95
|
+
return typeof entry.expiresAt === "number" && entry.expiresAt <= now;
|
|
96
|
+
}
|
|
97
|
+
function normalizeEntryTimestamps(entry, now, ttlMs) {
|
|
98
|
+
const createdAt = entry.createdAt ?? now;
|
|
99
|
+
const expiresAt = entry.expiresAt ?? createdAt + ttlMs;
|
|
100
|
+
return {
|
|
101
|
+
...entry,
|
|
102
|
+
createdAt,
|
|
103
|
+
expiresAt
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function registerEntries(entries, store, params) {
|
|
107
|
+
const normalizedEntries = [];
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const normalized = normalizeEntryTimestamps({
|
|
110
|
+
...entry,
|
|
111
|
+
messageId: params.messageId ?? entry.messageId
|
|
112
|
+
}, params.now, params.ttlMs);
|
|
113
|
+
store.set(entry.id, normalized);
|
|
114
|
+
normalizedEntries.push(normalized);
|
|
115
|
+
}
|
|
116
|
+
return normalizedEntries;
|
|
117
|
+
}
|
|
118
|
+
function resolveEntry(store, params) {
|
|
119
|
+
const entry = store.get(params.id);
|
|
120
|
+
if (!entry) return null;
|
|
121
|
+
if (isExpired(entry, Date.now())) {
|
|
122
|
+
store.delete(params.id);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (params.consume !== false) store.delete(params.id);
|
|
126
|
+
return entry;
|
|
127
|
+
}
|
|
128
|
+
function readPersistedRegistryEntry(persisted) {
|
|
129
|
+
if (persisted?.version !== 1 || typeof persisted.entry?.id !== "string") return null;
|
|
130
|
+
return persisted.entry;
|
|
131
|
+
}
|
|
132
|
+
function registerPersistentRegistryEntries(params) {
|
|
133
|
+
if (params.entries.length === 0) return;
|
|
134
|
+
const store = params.openStore();
|
|
135
|
+
if (!store) return;
|
|
136
|
+
for (const entry of params.entries) store.register(entry.id, {
|
|
137
|
+
version: 1,
|
|
138
|
+
entry
|
|
139
|
+
}, { ttlMs: params.ttlMs }).catch(disablePersistentComponentRegistry);
|
|
140
|
+
}
|
|
141
|
+
function registerPersistentEntries(params) {
|
|
142
|
+
registerPersistentRegistryEntries({
|
|
143
|
+
entries: params.entries,
|
|
144
|
+
ttlMs: params.ttlMs,
|
|
145
|
+
openStore: getPersistentComponentStore
|
|
146
|
+
});
|
|
147
|
+
registerPersistentRegistryEntries({
|
|
148
|
+
entries: params.modals,
|
|
149
|
+
ttlMs: params.ttlMs,
|
|
150
|
+
openStore: getPersistentModalStore
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function deletePersistentEntry(params) {
|
|
154
|
+
const store = params.openStore();
|
|
155
|
+
if (!store) return;
|
|
156
|
+
store.delete(params.id).catch(disablePersistentComponentRegistry);
|
|
157
|
+
}
|
|
158
|
+
function resolveComponentConsumptionIds(entry) {
|
|
159
|
+
if (!entry.consumptionGroupId) return [entry.id];
|
|
160
|
+
const ids = entry.consumptionGroupEntryIds?.filter((id) => typeof id === "string" && id) ?? [];
|
|
161
|
+
return ids.length > 0 ? Array.from(new Set(ids)) : [entry.id];
|
|
162
|
+
}
|
|
163
|
+
function deleteComponentConsumptionGroup(entry) {
|
|
164
|
+
const store = getComponentEntries();
|
|
165
|
+
for (const id of resolveComponentConsumptionIds(entry)) store.delete(id);
|
|
166
|
+
}
|
|
167
|
+
function deletePersistentComponentConsumptionGroup(entry) {
|
|
168
|
+
const store = getPersistentComponentStore();
|
|
169
|
+
if (!store) return;
|
|
170
|
+
for (const id of resolveComponentConsumptionIds(entry)) store.delete(id).catch(disablePersistentComponentRegistry);
|
|
171
|
+
}
|
|
172
|
+
async function resolvePersistentRegistryEntry(params) {
|
|
173
|
+
const store = params.openStore();
|
|
174
|
+
if (!store) return null;
|
|
175
|
+
try {
|
|
176
|
+
return readPersistedRegistryEntry(params.consume === false ? await store.lookup(params.id) : await store.consume(params.id));
|
|
177
|
+
} catch (error) {
|
|
178
|
+
disablePersistentComponentRegistry(error);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function registerDiscordComponentEntries(params) {
|
|
183
|
+
const now = Date.now();
|
|
184
|
+
const ttlMs = params.ttlMs ?? DEFAULT_COMPONENT_TTL_MS;
|
|
185
|
+
registerPersistentEntries({
|
|
186
|
+
entries: registerEntries(params.entries, getComponentEntries(), {
|
|
187
|
+
now,
|
|
188
|
+
ttlMs,
|
|
189
|
+
messageId: params.messageId
|
|
190
|
+
}),
|
|
191
|
+
modals: registerEntries(params.modals, getModalEntries(), {
|
|
192
|
+
now,
|
|
193
|
+
ttlMs,
|
|
194
|
+
messageId: params.messageId
|
|
195
|
+
}),
|
|
196
|
+
ttlMs
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function resolveDiscordComponentEntry(params) {
|
|
200
|
+
const entry = resolveEntry(getComponentEntries(), params);
|
|
201
|
+
if (entry && params.consume !== false) deleteComponentConsumptionGroup(entry);
|
|
202
|
+
return entry;
|
|
203
|
+
}
|
|
204
|
+
async function resolveDiscordComponentEntryWithPersistence(params) {
|
|
205
|
+
const inMemory = resolveDiscordComponentEntry(params);
|
|
206
|
+
if (inMemory) {
|
|
207
|
+
if (params.consume !== false) deletePersistentComponentConsumptionGroup(inMemory);
|
|
208
|
+
return inMemory;
|
|
209
|
+
}
|
|
210
|
+
const persisted = await resolvePersistentRegistryEntry({
|
|
211
|
+
...params,
|
|
212
|
+
openStore: getPersistentComponentStore
|
|
213
|
+
});
|
|
214
|
+
if (persisted && params.consume !== false) deletePersistentComponentConsumptionGroup(persisted);
|
|
215
|
+
return persisted;
|
|
216
|
+
}
|
|
217
|
+
function resolveDiscordModalEntry(params) {
|
|
218
|
+
return resolveEntry(getModalEntries(), params);
|
|
219
|
+
}
|
|
220
|
+
async function resolveDiscordModalEntryWithPersistence(params) {
|
|
221
|
+
const inMemory = resolveDiscordModalEntry(params);
|
|
222
|
+
if (inMemory) {
|
|
223
|
+
if (params.consume !== false) deletePersistentEntry({
|
|
224
|
+
...params,
|
|
225
|
+
openStore: getPersistentModalStore
|
|
226
|
+
});
|
|
227
|
+
return inMemory;
|
|
228
|
+
}
|
|
229
|
+
return await resolvePersistentRegistryEntry({
|
|
230
|
+
...params,
|
|
231
|
+
openStore: getPersistentModalStore
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region extensions/discord/src/send.components.ts
|
|
236
|
+
var send_components_exports = /* @__PURE__ */ __exportAll({
|
|
237
|
+
editDiscordComponentMessage: () => editDiscordComponentMessage,
|
|
238
|
+
registerBuiltDiscordComponentMessage: () => registerBuiltDiscordComponentMessage,
|
|
239
|
+
sendDiscordComponentMessage: () => sendDiscordComponentMessage
|
|
240
|
+
});
|
|
241
|
+
const DISCORD_FORUM_LIKE_TYPES = new Set([ChannelType.GuildForum, ChannelType.GuildMedia]);
|
|
242
|
+
function extractComponentAttachmentNames(spec) {
|
|
243
|
+
const names = [];
|
|
244
|
+
for (const block of spec.blocks ?? []) if (block.type === "file") names.push(resolveDiscordComponentAttachmentName(block.file));
|
|
245
|
+
return names;
|
|
246
|
+
}
|
|
247
|
+
function hasComponentAttachmentBlock(spec) {
|
|
248
|
+
return (spec.blocks ?? []).some((block) => block.type === "file");
|
|
249
|
+
}
|
|
250
|
+
function withImplicitComponentAttachmentBlock(spec, attachmentName) {
|
|
251
|
+
if (!attachmentName || hasComponentAttachmentBlock(spec)) return spec;
|
|
252
|
+
return {
|
|
253
|
+
...spec,
|
|
254
|
+
blocks: [...spec.blocks ?? [], {
|
|
255
|
+
type: "file",
|
|
256
|
+
file: `attachment://${attachmentName}`
|
|
257
|
+
}]
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function hasClassicOnlyBlocks(spec) {
|
|
261
|
+
return (spec.blocks ?? []).every((block) => block.type === "text" || block.type === "file");
|
|
262
|
+
}
|
|
263
|
+
function hasUnsupportedClassicFeatures(spec) {
|
|
264
|
+
return Boolean(spec.modal || spec.container);
|
|
265
|
+
}
|
|
266
|
+
function hasAtMostOneNonSpoilerFile(spec) {
|
|
267
|
+
let fileBlockCount = 0;
|
|
268
|
+
for (const block of spec.blocks ?? []) {
|
|
269
|
+
if (block.type !== "file") continue;
|
|
270
|
+
fileBlockCount += 1;
|
|
271
|
+
if (block.spoiler) return false;
|
|
272
|
+
}
|
|
273
|
+
return fileBlockCount <= 1;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Keep the downgrade rules explicit because this path is only safe when the
|
|
277
|
+
* spec means exactly what a plain Discord message can represent.
|
|
278
|
+
*/
|
|
279
|
+
function getClassicDiscordMessageDecision(spec) {
|
|
280
|
+
if (hasUnsupportedClassicFeatures(spec)) return {
|
|
281
|
+
mode: "components",
|
|
282
|
+
reason: "unsupported-feature"
|
|
283
|
+
};
|
|
284
|
+
if (!hasClassicOnlyBlocks(spec)) return {
|
|
285
|
+
mode: "components",
|
|
286
|
+
reason: "unsupported-block"
|
|
287
|
+
};
|
|
288
|
+
if (!hasAtMostOneNonSpoilerFile(spec)) return {
|
|
289
|
+
mode: "components",
|
|
290
|
+
reason: "multiple-or-spoiler-files"
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
mode: "classic",
|
|
294
|
+
reason: "plain-text-single-file"
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function collapseClassicComponentText(spec) {
|
|
298
|
+
const parts = [];
|
|
299
|
+
const addPart = (value) => {
|
|
300
|
+
if (typeof value !== "string") return;
|
|
301
|
+
const trimmed = value.trim();
|
|
302
|
+
if (!trimmed || parts.includes(trimmed)) return;
|
|
303
|
+
parts.push(trimmed);
|
|
304
|
+
};
|
|
305
|
+
addPart(spec.text);
|
|
306
|
+
for (const block of spec.blocks ?? []) if (block.type === "text") addPart(block.text);
|
|
307
|
+
return parts.join("\n\n");
|
|
308
|
+
}
|
|
309
|
+
function registerBuiltDiscordComponentMessage(params) {
|
|
310
|
+
registerDiscordComponentEntries({
|
|
311
|
+
entries: params.buildResult.entries,
|
|
312
|
+
modals: params.buildResult.modals,
|
|
313
|
+
messageId: params.messageId
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
async function buildDiscordComponentPayload(params) {
|
|
317
|
+
const messageReference = params.opts.replyTo ? {
|
|
318
|
+
message_id: params.opts.replyTo,
|
|
319
|
+
fail_if_not_exists: false
|
|
320
|
+
} : void 0;
|
|
321
|
+
let spec = params.spec;
|
|
322
|
+
let resolvedFileName;
|
|
323
|
+
let files;
|
|
324
|
+
if (params.opts.mediaUrl) {
|
|
325
|
+
const media = await loadOutboundMediaFromUrl(params.opts.mediaUrl, {
|
|
326
|
+
mediaAccess: params.opts.mediaAccess,
|
|
327
|
+
mediaLocalRoots: params.opts.mediaLocalRoots,
|
|
328
|
+
mediaReadFile: params.opts.mediaReadFile
|
|
329
|
+
});
|
|
330
|
+
resolvedFileName = params.opts.filename?.trim() || media.fileName || "upload";
|
|
331
|
+
spec = withImplicitComponentAttachmentBlock(spec, resolvedFileName);
|
|
332
|
+
files = [{
|
|
333
|
+
data: toDiscordFileBlob(media.buffer),
|
|
334
|
+
name: resolvedFileName
|
|
335
|
+
}];
|
|
336
|
+
}
|
|
337
|
+
const attachmentNames = extractComponentAttachmentNames(spec);
|
|
338
|
+
const uniqueAttachmentNames = [...new Set(attachmentNames)];
|
|
339
|
+
if (uniqueAttachmentNames.length > 1) throw new Error("Discord component attachments currently support a single file. Use media-gallery for multiple files.");
|
|
340
|
+
const expectedAttachmentName = uniqueAttachmentNames[0];
|
|
341
|
+
if (expectedAttachmentName && resolvedFileName && expectedAttachmentName !== resolvedFileName) throw new Error(`Component file block expects attachment "${expectedAttachmentName}", but the uploaded file is "${resolvedFileName}". Update components.blocks[].file or provide a matching filename.`);
|
|
342
|
+
if (!params.opts.mediaUrl && expectedAttachmentName) throw new Error("Discord component file blocks require a media attachment (media/path/filePath).");
|
|
343
|
+
const buildResult = buildDiscordComponentMessage({
|
|
344
|
+
spec,
|
|
345
|
+
sessionKey: params.opts.sessionKey,
|
|
346
|
+
agentId: params.opts.agentId,
|
|
347
|
+
accountId: params.accountId
|
|
348
|
+
});
|
|
349
|
+
const flags = buildDiscordComponentMessageFlags(buildResult.components);
|
|
350
|
+
const finalFlags = params.opts.silent ? (flags ?? 0) | SUPPRESS_NOTIFICATIONS_FLAG : flags ?? void 0;
|
|
351
|
+
return {
|
|
352
|
+
body: stripUndefinedFields({
|
|
353
|
+
...serializePayload({
|
|
354
|
+
components: buildResult.components,
|
|
355
|
+
...finalFlags ? { flags: finalFlags } : {},
|
|
356
|
+
...files ? { files } : {}
|
|
357
|
+
}),
|
|
358
|
+
...messageReference ? { message_reference: messageReference } : {}
|
|
359
|
+
}),
|
|
360
|
+
buildResult
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
async function sendDiscordComponentMessage(to, spec, opts) {
|
|
364
|
+
const classicDecision = getClassicDiscordMessageDecision(spec);
|
|
365
|
+
if (opts.mediaUrl && classicDecision.mode === "classic") return await sendMessageDiscord(to, collapseClassicComponentText(spec), {
|
|
366
|
+
cfg: opts.cfg,
|
|
367
|
+
accountId: opts.accountId,
|
|
368
|
+
token: opts.token,
|
|
369
|
+
rest: opts.rest,
|
|
370
|
+
mediaUrl: opts.mediaUrl,
|
|
371
|
+
filename: opts.filename,
|
|
372
|
+
mediaLocalRoots: opts.mediaLocalRoots,
|
|
373
|
+
mediaReadFile: opts.mediaReadFile,
|
|
374
|
+
mediaAccess: opts.mediaAccess,
|
|
375
|
+
replyTo: opts.replyTo,
|
|
376
|
+
silent: opts.silent,
|
|
377
|
+
textLimit: opts.textLimit,
|
|
378
|
+
maxLinesPerMessage: opts.maxLinesPerMessage,
|
|
379
|
+
tableMode: opts.tableMode,
|
|
380
|
+
chunkMode: opts.chunkMode
|
|
381
|
+
});
|
|
382
|
+
const cfg = requireRuntimeConfig(opts.cfg, "Discord component send");
|
|
383
|
+
const accountInfo = resolveDiscordAccount({
|
|
384
|
+
cfg,
|
|
385
|
+
accountId: opts.accountId
|
|
386
|
+
});
|
|
387
|
+
const { token, rest, request } = createDiscordClient({
|
|
388
|
+
...opts,
|
|
389
|
+
cfg
|
|
390
|
+
});
|
|
391
|
+
const { channelId } = await resolveChannelId(rest, await parseAndResolveRecipient(to, cfg, opts.accountId), request);
|
|
392
|
+
const channelType = await resolveDiscordChannelType(rest, channelId);
|
|
393
|
+
if (channelType && DISCORD_FORUM_LIKE_TYPES.has(channelType)) throw new Error("Discord components are not supported in forum-style channels");
|
|
394
|
+
const { body, buildResult } = await buildDiscordComponentPayload({
|
|
395
|
+
spec,
|
|
396
|
+
opts,
|
|
397
|
+
accountId: accountInfo.accountId
|
|
398
|
+
});
|
|
399
|
+
let result;
|
|
400
|
+
try {
|
|
401
|
+
result = await request(() => createChannelMessage(rest, channelId, { body }), "components");
|
|
402
|
+
} catch (err) {
|
|
403
|
+
throw await buildDiscordSendError(err, {
|
|
404
|
+
channelId,
|
|
405
|
+
cfg,
|
|
406
|
+
rest,
|
|
407
|
+
token,
|
|
408
|
+
hasMedia: Boolean(opts.mediaUrl)
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
registerBuiltDiscordComponentMessage({
|
|
412
|
+
buildResult,
|
|
413
|
+
messageId: result.id
|
|
414
|
+
});
|
|
415
|
+
recordChannelActivity({
|
|
416
|
+
channel: "discord",
|
|
417
|
+
accountId: accountInfo.accountId,
|
|
418
|
+
direction: "outbound"
|
|
419
|
+
});
|
|
420
|
+
return {
|
|
421
|
+
messageId: result.id ?? "unknown",
|
|
422
|
+
channelId: result.channel_id ?? channelId
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
async function editDiscordComponentMessage(to, messageId, spec, opts) {
|
|
426
|
+
const cfg = requireRuntimeConfig(opts.cfg, "Discord component edit");
|
|
427
|
+
const accountInfo = resolveDiscordAccount({
|
|
428
|
+
cfg,
|
|
429
|
+
accountId: opts.accountId
|
|
430
|
+
});
|
|
431
|
+
const { token, rest, request } = createDiscordClient({
|
|
432
|
+
...opts,
|
|
433
|
+
cfg
|
|
434
|
+
});
|
|
435
|
+
const { channelId } = await resolveChannelId(rest, await parseAndResolveRecipient(to, cfg, opts.accountId), request);
|
|
436
|
+
const { body, buildResult } = await buildDiscordComponentPayload({
|
|
437
|
+
spec,
|
|
438
|
+
opts,
|
|
439
|
+
accountId: accountInfo.accountId
|
|
440
|
+
});
|
|
441
|
+
let result;
|
|
442
|
+
try {
|
|
443
|
+
result = await request(() => editChannelMessage(rest, channelId, messageId, { body }), "components");
|
|
444
|
+
} catch (err) {
|
|
445
|
+
throw await buildDiscordSendError(err, {
|
|
446
|
+
channelId,
|
|
447
|
+
cfg,
|
|
448
|
+
rest,
|
|
449
|
+
token,
|
|
450
|
+
hasMedia: Boolean(opts.mediaUrl)
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
registerBuiltDiscordComponentMessage({
|
|
454
|
+
buildResult,
|
|
455
|
+
messageId: result.id ?? messageId
|
|
456
|
+
});
|
|
457
|
+
recordChannelActivity({
|
|
458
|
+
channel: "discord",
|
|
459
|
+
accountId: accountInfo.accountId,
|
|
460
|
+
direction: "outbound"
|
|
461
|
+
});
|
|
462
|
+
return {
|
|
463
|
+
messageId: result.id ?? messageId,
|
|
464
|
+
channelId: result.channel_id ?? channelId
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
//#endregion
|
|
468
|
+
export { resolveDiscordComponentEntryWithPersistence as a, jsonResult as c, readNumberParam as d, readReactionParams as f, withNormalizedTimestamp as g, resolvePollMaxSelections as h, send_components_exports as i, parseAvailableTags as l, readStringParam as m, registerBuiltDiscordComponentMessage as n, resolveDiscordModalEntryWithPersistence as o, readStringArrayParam as p, sendDiscordComponentMessage as r, assertMediaNotDataUrl as s, editDiscordComponentMessage as t, readBooleanParam$1 as u };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { s as resolveDiscordAccount } from "./accounts-BKnkNaoA.js";
|
|
2
|
+
import { $ as createChannelMessage, et as createThread } from "./discord-D1kDh0X_.js";
|
|
3
|
+
import { M as createDiscordClient, _ as resolveDiscordSendComponents, a as normalizeDiscordPollInput, c as normalizeStickerIds, f as sendDiscordMedia, g as buildDiscordMessageRequest, h as SUPPRESS_NOTIFICATIONS_FLAG, k as parseAndResolveRecipient, l as resolveChannelId, n as buildDiscordTextChunks, p as sendDiscordText, t as buildDiscordSendError, u as resolveDiscordChannelType, v as resolveDiscordSendEmbeds } from "./send.shared-Db0opnak.js";
|
|
4
|
+
import { n as rewriteDiscordKnownMentions } from "./mentions-BPZUaFk7.js";
|
|
5
|
+
import { convertMarkdownTables, normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
|
|
6
|
+
import { ChannelType } from "discord-api-types/v10";
|
|
7
|
+
import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
|
|
8
|
+
import { resolveChunkMode } from "openclaw/plugin-sdk/reply-chunking";
|
|
9
|
+
import { recordChannelActivity } from "openclaw/plugin-sdk/channel-activity-runtime";
|
|
10
|
+
import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
|
|
11
|
+
//#region extensions/discord/src/send.outbound.ts
|
|
12
|
+
const DEFAULT_DISCORD_MEDIA_MAX_MB = 100;
|
|
13
|
+
async function sendDiscordThreadTextChunks(params) {
|
|
14
|
+
for (const chunk of params.chunks) await sendDiscordText(params.rest, params.threadId, chunk, void 0, params.request, params.maxLinesPerMessage, void 0, void 0, params.chunkMode, params.silent, params.maxChars);
|
|
15
|
+
}
|
|
16
|
+
/** Discord thread names are capped at 100 characters. */
|
|
17
|
+
const DISCORD_THREAD_NAME_LIMIT = 100;
|
|
18
|
+
/** Derive a thread title from the first non-empty line of the message text. */
|
|
19
|
+
function deriveForumThreadName(text) {
|
|
20
|
+
return (normalizeOptionalString(text.split("\n").find((line) => normalizeOptionalString(line))) ?? "").slice(0, DISCORD_THREAD_NAME_LIMIT) || (/* @__PURE__ */ new Date()).toISOString().slice(0, 16);
|
|
21
|
+
}
|
|
22
|
+
/** Forum/Media channels cannot receive regular messages; detect them here. */
|
|
23
|
+
function isForumLikeType(channelType) {
|
|
24
|
+
return channelType === ChannelType.GuildForum || channelType === ChannelType.GuildMedia;
|
|
25
|
+
}
|
|
26
|
+
function toDiscordSendResult(result, fallbackChannelId) {
|
|
27
|
+
return {
|
|
28
|
+
messageId: result.id || "unknown",
|
|
29
|
+
channelId: result.channel_id ?? fallbackChannelId
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function resolveDiscordSendTarget(to, opts) {
|
|
33
|
+
const cfg = requireRuntimeConfig(opts.cfg, "Discord send target resolution");
|
|
34
|
+
const { rest, request } = createDiscordClient({
|
|
35
|
+
...opts,
|
|
36
|
+
cfg
|
|
37
|
+
});
|
|
38
|
+
const { channelId } = await resolveChannelId(rest, await parseAndResolveRecipient(to, cfg, opts.accountId), request);
|
|
39
|
+
return {
|
|
40
|
+
rest,
|
|
41
|
+
request,
|
|
42
|
+
channelId
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async function sendMessageDiscord(to, text, opts) {
|
|
46
|
+
const cfg = requireRuntimeConfig(opts.cfg, "Discord send");
|
|
47
|
+
const accountInfo = resolveDiscordAccount({
|
|
48
|
+
cfg,
|
|
49
|
+
accountId: opts.accountId
|
|
50
|
+
});
|
|
51
|
+
const tableMode = resolveMarkdownTableMode({
|
|
52
|
+
cfg,
|
|
53
|
+
channel: "discord",
|
|
54
|
+
accountId: accountInfo.accountId
|
|
55
|
+
});
|
|
56
|
+
const effectiveTableMode = opts.tableMode ?? tableMode;
|
|
57
|
+
const chunkMode = opts.chunkMode ?? resolveChunkMode(cfg, "discord", accountInfo.accountId);
|
|
58
|
+
const maxLinesPerMessage = opts.maxLinesPerMessage ?? accountInfo.config.maxLinesPerMessage;
|
|
59
|
+
const textLimit = typeof opts.textLimit === "number" && Number.isFinite(opts.textLimit) ? Math.max(1, Math.min(Math.floor(opts.textLimit), 2e3)) : void 0;
|
|
60
|
+
const mediaMaxBytes = typeof accountInfo.config.mediaMaxMb === "number" ? accountInfo.config.mediaMaxMb * 1024 * 1024 : DEFAULT_DISCORD_MEDIA_MAX_MB * 1024 * 1024;
|
|
61
|
+
const textWithTables = convertMarkdownTables(text ?? "", effectiveTableMode);
|
|
62
|
+
const textWithMentions = rewriteDiscordKnownMentions(textWithTables, {
|
|
63
|
+
accountId: accountInfo.accountId,
|
|
64
|
+
mentionAliases: accountInfo.config.mentionAliases
|
|
65
|
+
});
|
|
66
|
+
const { token, rest, request } = createDiscordClient({
|
|
67
|
+
...opts,
|
|
68
|
+
cfg
|
|
69
|
+
});
|
|
70
|
+
const { channelId } = await resolveChannelId(rest, await parseAndResolveRecipient(to, cfg, opts.accountId), request);
|
|
71
|
+
if (isForumLikeType(await resolveDiscordChannelType(rest, channelId))) {
|
|
72
|
+
const threadName = deriveForumThreadName(textWithTables);
|
|
73
|
+
const chunks = buildDiscordTextChunks(textWithMentions, {
|
|
74
|
+
maxLinesPerMessage,
|
|
75
|
+
chunkMode,
|
|
76
|
+
maxChars: textLimit
|
|
77
|
+
});
|
|
78
|
+
const starterContent = chunks[0]?.trim() ? chunks[0] : threadName;
|
|
79
|
+
const starterBody = buildDiscordMessageRequest({
|
|
80
|
+
text: starterContent,
|
|
81
|
+
components: resolveDiscordSendComponents({
|
|
82
|
+
components: opts.components,
|
|
83
|
+
text: starterContent,
|
|
84
|
+
isFirst: true
|
|
85
|
+
}),
|
|
86
|
+
embeds: resolveDiscordSendEmbeds({
|
|
87
|
+
embeds: opts.embeds,
|
|
88
|
+
isFirst: true
|
|
89
|
+
}),
|
|
90
|
+
flags: opts.silent ? SUPPRESS_NOTIFICATIONS_FLAG : void 0
|
|
91
|
+
});
|
|
92
|
+
let threadRes;
|
|
93
|
+
try {
|
|
94
|
+
threadRes = await request(() => createThread(rest, channelId, { body: {
|
|
95
|
+
name: threadName,
|
|
96
|
+
message: starterBody
|
|
97
|
+
} }), "forum-thread");
|
|
98
|
+
} catch (err) {
|
|
99
|
+
throw await buildDiscordSendError(err, {
|
|
100
|
+
channelId,
|
|
101
|
+
cfg,
|
|
102
|
+
rest,
|
|
103
|
+
token,
|
|
104
|
+
hasMedia: Boolean(opts.mediaUrl)
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const threadId = threadRes.id;
|
|
108
|
+
const messageId = threadRes.message?.id ?? threadId;
|
|
109
|
+
const resultChannelId = threadRes.message?.channel_id ?? threadId;
|
|
110
|
+
const remainingChunks = chunks.slice(1);
|
|
111
|
+
try {
|
|
112
|
+
if (opts.mediaUrl) {
|
|
113
|
+
const [mediaCaption, ...afterMediaChunks] = remainingChunks;
|
|
114
|
+
await sendDiscordMedia(rest, threadId, mediaCaption ?? "", opts.mediaUrl, opts.filename, opts.mediaAccess, opts.mediaLocalRoots, opts.mediaReadFile, mediaMaxBytes, void 0, request, maxLinesPerMessage, void 0, void 0, chunkMode, opts.silent, textLimit);
|
|
115
|
+
await sendDiscordThreadTextChunks({
|
|
116
|
+
rest,
|
|
117
|
+
threadId,
|
|
118
|
+
chunks: afterMediaChunks,
|
|
119
|
+
request,
|
|
120
|
+
maxLinesPerMessage,
|
|
121
|
+
chunkMode,
|
|
122
|
+
maxChars: textLimit,
|
|
123
|
+
silent: opts.silent
|
|
124
|
+
});
|
|
125
|
+
} else await sendDiscordThreadTextChunks({
|
|
126
|
+
rest,
|
|
127
|
+
threadId,
|
|
128
|
+
chunks: remainingChunks,
|
|
129
|
+
request,
|
|
130
|
+
maxLinesPerMessage,
|
|
131
|
+
chunkMode,
|
|
132
|
+
maxChars: textLimit,
|
|
133
|
+
silent: opts.silent
|
|
134
|
+
});
|
|
135
|
+
} catch (err) {
|
|
136
|
+
throw await buildDiscordSendError(err, {
|
|
137
|
+
channelId: threadId,
|
|
138
|
+
cfg,
|
|
139
|
+
rest,
|
|
140
|
+
token,
|
|
141
|
+
hasMedia: Boolean(opts.mediaUrl)
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
recordChannelActivity({
|
|
145
|
+
channel: "discord",
|
|
146
|
+
accountId: accountInfo.accountId,
|
|
147
|
+
direction: "outbound"
|
|
148
|
+
});
|
|
149
|
+
return toDiscordSendResult({
|
|
150
|
+
id: messageId,
|
|
151
|
+
channel_id: resultChannelId
|
|
152
|
+
}, channelId);
|
|
153
|
+
}
|
|
154
|
+
let result;
|
|
155
|
+
try {
|
|
156
|
+
if (opts.mediaUrl) result = await sendDiscordMedia(rest, channelId, textWithMentions, opts.mediaUrl, opts.filename, opts.mediaAccess, opts.mediaLocalRoots, opts.mediaReadFile, mediaMaxBytes, opts.replyTo, request, maxLinesPerMessage, opts.components, opts.embeds, chunkMode, opts.silent, textLimit);
|
|
157
|
+
else result = await sendDiscordText(rest, channelId, textWithMentions, opts.replyTo, request, maxLinesPerMessage, opts.components, opts.embeds, chunkMode, opts.silent, textLimit);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
throw await buildDiscordSendError(err, {
|
|
160
|
+
channelId,
|
|
161
|
+
cfg,
|
|
162
|
+
rest,
|
|
163
|
+
token,
|
|
164
|
+
hasMedia: Boolean(opts.mediaUrl)
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
recordChannelActivity({
|
|
168
|
+
channel: "discord",
|
|
169
|
+
accountId: accountInfo.accountId,
|
|
170
|
+
direction: "outbound"
|
|
171
|
+
});
|
|
172
|
+
return toDiscordSendResult(result, channelId);
|
|
173
|
+
}
|
|
174
|
+
async function sendStickerDiscord(to, stickerIds, opts) {
|
|
175
|
+
const { rest, request, channelId, rewrittenContent } = await resolveDiscordStructuredSendContext(to, opts);
|
|
176
|
+
const stickers = normalizeStickerIds(stickerIds);
|
|
177
|
+
return toDiscordSendResult(await request(() => createChannelMessage(rest, channelId, { body: {
|
|
178
|
+
content: rewrittenContent || void 0,
|
|
179
|
+
sticker_ids: stickers
|
|
180
|
+
} }), "sticker"), channelId);
|
|
181
|
+
}
|
|
182
|
+
async function sendPollDiscord(to, poll, opts) {
|
|
183
|
+
const { rest, request, channelId, rewrittenContent } = await resolveDiscordStructuredSendContext(to, opts);
|
|
184
|
+
if (poll.durationSeconds !== void 0) throw new Error("Discord polls do not support durationSeconds; use durationHours");
|
|
185
|
+
const payload = normalizeDiscordPollInput(poll);
|
|
186
|
+
const flags = opts.silent ? SUPPRESS_NOTIFICATIONS_FLAG : void 0;
|
|
187
|
+
return toDiscordSendResult(await request(() => createChannelMessage(rest, channelId, { body: {
|
|
188
|
+
content: rewrittenContent || void 0,
|
|
189
|
+
poll: payload,
|
|
190
|
+
...flags ? { flags } : {}
|
|
191
|
+
} }), "poll"), channelId);
|
|
192
|
+
}
|
|
193
|
+
async function resolveDiscordStructuredSendContext(to, opts) {
|
|
194
|
+
const accountInfo = resolveDiscordAccount({
|
|
195
|
+
cfg: requireRuntimeConfig(opts.cfg, "Discord structured send"),
|
|
196
|
+
accountId: opts.accountId
|
|
197
|
+
});
|
|
198
|
+
const { rest, request, channelId } = await resolveDiscordSendTarget(to, opts);
|
|
199
|
+
const content = opts.content?.trim();
|
|
200
|
+
return {
|
|
201
|
+
rest,
|
|
202
|
+
request,
|
|
203
|
+
channelId,
|
|
204
|
+
rewrittenContent: content ? rewriteDiscordKnownMentions(content, {
|
|
205
|
+
accountId: accountInfo.accountId,
|
|
206
|
+
mentionAliases: accountInfo.config.mentionAliases
|
|
207
|
+
}) : void 0
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
//#endregion
|
|
211
|
+
export { sendPollDiscord as n, sendStickerDiscord as r, sendMessageDiscord as t };
|