@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,318 @@
|
|
|
1
|
+
import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/text-runtime";
|
|
2
|
+
import { normalizeAccountId, resolveAgentIdFromSessionKey } from "openclaw/plugin-sdk/routing";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import { loadJsonFile, saveJsonFile } from "openclaw/plugin-sdk/json-store";
|
|
6
|
+
import { resolveStateDir } from "openclaw/plugin-sdk/state-paths";
|
|
7
|
+
//#region extensions/discord/src/monitor/thread-bindings.types.ts
|
|
8
|
+
const THREAD_BINDINGS_SWEEP_INTERVAL_MS = 12e4;
|
|
9
|
+
const DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS = 1440 * 60 * 1e3;
|
|
10
|
+
const DISCORD_UNKNOWN_CHANNEL_ERROR_CODE = 10003;
|
|
11
|
+
const RECENT_UNBOUND_WEBHOOK_ECHO_WINDOW_MS = 3e4;
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region extensions/discord/src/monitor/thread-bindings.state.ts
|
|
14
|
+
const THREAD_BINDINGS_STATE_KEY = Symbol.for("openclaw.discordThreadBindingsState");
|
|
15
|
+
let threadBindingsState;
|
|
16
|
+
function createThreadBindingsGlobalState() {
|
|
17
|
+
return {
|
|
18
|
+
managersByAccountId: /* @__PURE__ */ new Map(),
|
|
19
|
+
bindingsByThreadId: /* @__PURE__ */ new Map(),
|
|
20
|
+
bindingsBySessionKey: /* @__PURE__ */ new Map(),
|
|
21
|
+
tokensByAccountId: /* @__PURE__ */ new Map(),
|
|
22
|
+
recentUnboundWebhookEchoesByBindingKey: /* @__PURE__ */ new Map(),
|
|
23
|
+
reusableWebhooksByAccountChannel: /* @__PURE__ */ new Map(),
|
|
24
|
+
persistByAccountId: /* @__PURE__ */ new Map(),
|
|
25
|
+
loadedBindings: false,
|
|
26
|
+
lastPersistedAtMs: 0
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function resolveThreadBindingsGlobalState() {
|
|
30
|
+
if (!threadBindingsState) {
|
|
31
|
+
const globalStore = globalThis;
|
|
32
|
+
threadBindingsState = globalStore[THREAD_BINDINGS_STATE_KEY] ?? createThreadBindingsGlobalState();
|
|
33
|
+
globalStore[THREAD_BINDINGS_STATE_KEY] = threadBindingsState;
|
|
34
|
+
}
|
|
35
|
+
return threadBindingsState;
|
|
36
|
+
}
|
|
37
|
+
const THREAD_BINDINGS_STATE = resolveThreadBindingsGlobalState();
|
|
38
|
+
const MANAGERS_BY_ACCOUNT_ID = THREAD_BINDINGS_STATE.managersByAccountId;
|
|
39
|
+
const BINDINGS_BY_THREAD_ID = THREAD_BINDINGS_STATE.bindingsByThreadId;
|
|
40
|
+
const BINDINGS_BY_SESSION_KEY = THREAD_BINDINGS_STATE.bindingsBySessionKey;
|
|
41
|
+
const TOKENS_BY_ACCOUNT_ID = THREAD_BINDINGS_STATE.tokensByAccountId;
|
|
42
|
+
const RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY = THREAD_BINDINGS_STATE.recentUnboundWebhookEchoesByBindingKey;
|
|
43
|
+
const REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL = THREAD_BINDINGS_STATE.reusableWebhooksByAccountChannel;
|
|
44
|
+
const PERSIST_BY_ACCOUNT_ID = THREAD_BINDINGS_STATE.persistByAccountId;
|
|
45
|
+
const THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS = 15e3;
|
|
46
|
+
function rememberThreadBindingToken(params) {
|
|
47
|
+
const normalizedAccountId = normalizeAccountId(params.accountId);
|
|
48
|
+
const token = params.token?.trim();
|
|
49
|
+
if (!token) return;
|
|
50
|
+
TOKENS_BY_ACCOUNT_ID.set(normalizedAccountId, token);
|
|
51
|
+
}
|
|
52
|
+
function forgetThreadBindingToken(accountId) {
|
|
53
|
+
TOKENS_BY_ACCOUNT_ID.delete(normalizeAccountId(accountId));
|
|
54
|
+
}
|
|
55
|
+
function getThreadBindingToken(accountId) {
|
|
56
|
+
return TOKENS_BY_ACCOUNT_ID.get(normalizeAccountId(accountId));
|
|
57
|
+
}
|
|
58
|
+
function shouldDefaultPersist() {
|
|
59
|
+
return !(process.env.VITEST || false);
|
|
60
|
+
}
|
|
61
|
+
function resolveThreadBindingsPath() {
|
|
62
|
+
return path.join(resolveStateDir(process.env), "discord", "thread-bindings.json");
|
|
63
|
+
}
|
|
64
|
+
function normalizeTargetKind(raw, targetSessionKey) {
|
|
65
|
+
if (raw === "subagent" || raw === "acp") return raw;
|
|
66
|
+
return targetSessionKey.includes(":subagent:") ? "subagent" : "acp";
|
|
67
|
+
}
|
|
68
|
+
function normalizeThreadId(raw) {
|
|
69
|
+
return normalizeOptionalStringifiedId(raw);
|
|
70
|
+
}
|
|
71
|
+
function toBindingRecordKey(params) {
|
|
72
|
+
return `${normalizeAccountId(params.accountId)}:${params.threadId.trim()}`;
|
|
73
|
+
}
|
|
74
|
+
function resolveBindingRecordKey(params) {
|
|
75
|
+
const threadId = normalizeThreadId(params.threadId);
|
|
76
|
+
if (!threadId) return;
|
|
77
|
+
return toBindingRecordKey({
|
|
78
|
+
accountId: normalizeAccountId(params.accountId),
|
|
79
|
+
threadId
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function normalizePersistedBinding(threadIdKey, raw) {
|
|
83
|
+
if (!raw || typeof raw !== "object") return null;
|
|
84
|
+
const value = raw;
|
|
85
|
+
const threadId = normalizeThreadId(value.threadId ?? threadIdKey);
|
|
86
|
+
const channelId = normalizeOptionalString(value.channelId) ?? "";
|
|
87
|
+
const targetSessionKey = normalizeOptionalString(value.targetSessionKey) ?? normalizeOptionalString(value.sessionKey) ?? "";
|
|
88
|
+
if (!threadId || !channelId || !targetSessionKey) return null;
|
|
89
|
+
const accountId = normalizeAccountId(value.accountId);
|
|
90
|
+
const targetKind = normalizeTargetKind(value.targetKind, targetSessionKey);
|
|
91
|
+
const agentId = (normalizeOptionalString(value.agentId) ?? "") || resolveAgentIdFromSessionKey(targetSessionKey);
|
|
92
|
+
const label = normalizeOptionalString(value.label);
|
|
93
|
+
const webhookId = normalizeOptionalString(value.webhookId);
|
|
94
|
+
const webhookToken = normalizeOptionalString(value.webhookToken);
|
|
95
|
+
const boundBy = normalizeOptionalString(value.boundBy) ?? "system";
|
|
96
|
+
const boundAt = typeof value.boundAt === "number" && Number.isFinite(value.boundAt) ? Math.floor(value.boundAt) : Date.now();
|
|
97
|
+
const lastActivityAt = typeof value.lastActivityAt === "number" && Number.isFinite(value.lastActivityAt) ? Math.max(0, Math.floor(value.lastActivityAt)) : boundAt;
|
|
98
|
+
const idleTimeoutMs = typeof value.idleTimeoutMs === "number" && Number.isFinite(value.idleTimeoutMs) ? Math.max(0, Math.floor(value.idleTimeoutMs)) : void 0;
|
|
99
|
+
const maxAgeMs = typeof value.maxAgeMs === "number" && Number.isFinite(value.maxAgeMs) ? Math.max(0, Math.floor(value.maxAgeMs)) : void 0;
|
|
100
|
+
const metadata = value.metadata && typeof value.metadata === "object" ? { ...value.metadata } : void 0;
|
|
101
|
+
const legacyExpiresAt = typeof value.expiresAt === "number" && Number.isFinite(value.expiresAt) ? Math.max(0, Math.floor(value.expiresAt ?? 0)) : void 0;
|
|
102
|
+
let migratedIdleTimeoutMs = idleTimeoutMs;
|
|
103
|
+
let migratedMaxAgeMs = maxAgeMs;
|
|
104
|
+
if (migratedIdleTimeoutMs === void 0 && migratedMaxAgeMs === void 0 && legacyExpiresAt != null) if (legacyExpiresAt <= 0) {
|
|
105
|
+
migratedIdleTimeoutMs = 0;
|
|
106
|
+
migratedMaxAgeMs = 0;
|
|
107
|
+
} else {
|
|
108
|
+
const baseBoundAt = boundAt > 0 ? boundAt : lastActivityAt;
|
|
109
|
+
migratedIdleTimeoutMs = 0;
|
|
110
|
+
migratedMaxAgeMs = Math.max(1, legacyExpiresAt - Math.max(0, baseBoundAt));
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
accountId,
|
|
114
|
+
channelId,
|
|
115
|
+
threadId,
|
|
116
|
+
targetKind,
|
|
117
|
+
targetSessionKey,
|
|
118
|
+
agentId,
|
|
119
|
+
label,
|
|
120
|
+
webhookId,
|
|
121
|
+
webhookToken,
|
|
122
|
+
boundBy,
|
|
123
|
+
boundAt,
|
|
124
|
+
lastActivityAt,
|
|
125
|
+
idleTimeoutMs: migratedIdleTimeoutMs,
|
|
126
|
+
maxAgeMs: migratedMaxAgeMs,
|
|
127
|
+
metadata
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function normalizeThreadBindingDurationMs(raw, defaultsTo) {
|
|
131
|
+
if (typeof raw !== "number" || !Number.isFinite(raw)) return defaultsTo;
|
|
132
|
+
const durationMs = Math.floor(raw);
|
|
133
|
+
if (durationMs < 0) return defaultsTo;
|
|
134
|
+
return durationMs;
|
|
135
|
+
}
|
|
136
|
+
function resolveThreadBindingIdleTimeoutMs(params) {
|
|
137
|
+
const explicit = params.record.idleTimeoutMs;
|
|
138
|
+
if (typeof explicit === "number" && Number.isFinite(explicit)) return Math.max(0, Math.floor(explicit));
|
|
139
|
+
return Math.max(0, Math.floor(params.defaultIdleTimeoutMs));
|
|
140
|
+
}
|
|
141
|
+
function resolveThreadBindingMaxAgeMs(params) {
|
|
142
|
+
const explicit = params.record.maxAgeMs;
|
|
143
|
+
if (typeof explicit === "number" && Number.isFinite(explicit)) return Math.max(0, Math.floor(explicit));
|
|
144
|
+
return Math.max(0, Math.floor(params.defaultMaxAgeMs));
|
|
145
|
+
}
|
|
146
|
+
function resolveThreadBindingInactivityExpiresAt(params) {
|
|
147
|
+
const idleTimeoutMs = resolveThreadBindingIdleTimeoutMs({
|
|
148
|
+
record: params.record,
|
|
149
|
+
defaultIdleTimeoutMs: params.defaultIdleTimeoutMs
|
|
150
|
+
});
|
|
151
|
+
if (idleTimeoutMs <= 0) return;
|
|
152
|
+
const lastActivityAt = Math.floor(params.record.lastActivityAt);
|
|
153
|
+
if (!Number.isFinite(lastActivityAt) || lastActivityAt <= 0) return;
|
|
154
|
+
return lastActivityAt + idleTimeoutMs;
|
|
155
|
+
}
|
|
156
|
+
function resolveThreadBindingMaxAgeExpiresAt(params) {
|
|
157
|
+
const maxAgeMs = resolveThreadBindingMaxAgeMs({
|
|
158
|
+
record: params.record,
|
|
159
|
+
defaultMaxAgeMs: params.defaultMaxAgeMs
|
|
160
|
+
});
|
|
161
|
+
if (maxAgeMs <= 0) return;
|
|
162
|
+
const boundAt = Math.floor(params.record.boundAt);
|
|
163
|
+
if (!Number.isFinite(boundAt) || boundAt <= 0) return;
|
|
164
|
+
return boundAt + maxAgeMs;
|
|
165
|
+
}
|
|
166
|
+
function linkSessionBinding(targetSessionKey, bindingKey) {
|
|
167
|
+
const key = targetSessionKey.trim();
|
|
168
|
+
if (!key) return;
|
|
169
|
+
const threads = BINDINGS_BY_SESSION_KEY.get(key) ?? /* @__PURE__ */ new Set();
|
|
170
|
+
threads.add(bindingKey);
|
|
171
|
+
BINDINGS_BY_SESSION_KEY.set(key, threads);
|
|
172
|
+
}
|
|
173
|
+
function unlinkSessionBinding(targetSessionKey, bindingKey) {
|
|
174
|
+
const key = targetSessionKey.trim();
|
|
175
|
+
if (!key) return;
|
|
176
|
+
const threads = BINDINGS_BY_SESSION_KEY.get(key);
|
|
177
|
+
if (!threads) return;
|
|
178
|
+
threads.delete(bindingKey);
|
|
179
|
+
if (threads.size === 0) BINDINGS_BY_SESSION_KEY.delete(key);
|
|
180
|
+
}
|
|
181
|
+
function toReusableWebhookKey(params) {
|
|
182
|
+
return `${normalizeLowercaseStringOrEmpty(params.accountId)}:${params.channelId.trim()}`;
|
|
183
|
+
}
|
|
184
|
+
function rememberReusableWebhook(record) {
|
|
185
|
+
const webhookId = record.webhookId?.trim();
|
|
186
|
+
const webhookToken = record.webhookToken?.trim();
|
|
187
|
+
if (!webhookId || !webhookToken) return;
|
|
188
|
+
const key = toReusableWebhookKey({
|
|
189
|
+
accountId: record.accountId,
|
|
190
|
+
channelId: record.channelId
|
|
191
|
+
});
|
|
192
|
+
REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL.set(key, {
|
|
193
|
+
webhookId,
|
|
194
|
+
webhookToken
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function rememberRecentUnboundWebhookEcho(record) {
|
|
198
|
+
const webhookId = record.webhookId?.trim();
|
|
199
|
+
if (!webhookId) return;
|
|
200
|
+
const bindingKey = resolveBindingRecordKey({
|
|
201
|
+
accountId: record.accountId,
|
|
202
|
+
threadId: record.threadId
|
|
203
|
+
});
|
|
204
|
+
if (!bindingKey) return;
|
|
205
|
+
RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY.set(bindingKey, {
|
|
206
|
+
webhookId,
|
|
207
|
+
expiresAt: Date.now() + RECENT_UNBOUND_WEBHOOK_ECHO_WINDOW_MS
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function clearRecentUnboundWebhookEcho(bindingKeyRaw) {
|
|
211
|
+
const key = bindingKeyRaw.trim();
|
|
212
|
+
if (!key) return;
|
|
213
|
+
RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY.delete(key);
|
|
214
|
+
}
|
|
215
|
+
function setBindingRecord(record) {
|
|
216
|
+
const bindingKey = toBindingRecordKey({
|
|
217
|
+
accountId: record.accountId,
|
|
218
|
+
threadId: record.threadId
|
|
219
|
+
});
|
|
220
|
+
const existing = BINDINGS_BY_THREAD_ID.get(bindingKey);
|
|
221
|
+
if (existing) unlinkSessionBinding(existing.targetSessionKey, bindingKey);
|
|
222
|
+
BINDINGS_BY_THREAD_ID.set(bindingKey, record);
|
|
223
|
+
linkSessionBinding(record.targetSessionKey, bindingKey);
|
|
224
|
+
clearRecentUnboundWebhookEcho(bindingKey);
|
|
225
|
+
rememberReusableWebhook(record);
|
|
226
|
+
}
|
|
227
|
+
function removeBindingRecord(bindingKeyRaw) {
|
|
228
|
+
const key = bindingKeyRaw.trim();
|
|
229
|
+
if (!key) return null;
|
|
230
|
+
const existing = BINDINGS_BY_THREAD_ID.get(key);
|
|
231
|
+
if (!existing) return null;
|
|
232
|
+
BINDINGS_BY_THREAD_ID.delete(key);
|
|
233
|
+
unlinkSessionBinding(existing.targetSessionKey, key);
|
|
234
|
+
return existing;
|
|
235
|
+
}
|
|
236
|
+
function isRecentlyUnboundThreadWebhookMessage(params) {
|
|
237
|
+
const webhookId = normalizeOptionalString(params.webhookId) ?? "";
|
|
238
|
+
if (!webhookId) return false;
|
|
239
|
+
const bindingKey = resolveBindingRecordKey({
|
|
240
|
+
accountId: params.accountId,
|
|
241
|
+
threadId: params.threadId
|
|
242
|
+
});
|
|
243
|
+
if (!bindingKey) return false;
|
|
244
|
+
const suppressed = RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY.get(bindingKey);
|
|
245
|
+
if (!suppressed) return false;
|
|
246
|
+
if (suppressed.expiresAt <= Date.now()) {
|
|
247
|
+
RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY.delete(bindingKey);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
return suppressed.webhookId === webhookId;
|
|
251
|
+
}
|
|
252
|
+
function shouldPersistAnyBindingState() {
|
|
253
|
+
for (const value of PERSIST_BY_ACCOUNT_ID.values()) if (value) return true;
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
function shouldPersistBindingMutations() {
|
|
257
|
+
if (shouldPersistAnyBindingState()) return true;
|
|
258
|
+
return fs.existsSync(resolveThreadBindingsPath());
|
|
259
|
+
}
|
|
260
|
+
function saveBindingsToDisk(params = {}) {
|
|
261
|
+
if (!params.force && !shouldPersistAnyBindingState()) return;
|
|
262
|
+
const minIntervalMs = typeof params.minIntervalMs === "number" && Number.isFinite(params.minIntervalMs) ? Math.max(0, Math.floor(params.minIntervalMs)) : 0;
|
|
263
|
+
const now = Date.now();
|
|
264
|
+
if (!params.force && minIntervalMs > 0 && THREAD_BINDINGS_STATE.lastPersistedAtMs > 0 && now - THREAD_BINDINGS_STATE.lastPersistedAtMs < minIntervalMs) return;
|
|
265
|
+
const bindings = {};
|
|
266
|
+
for (const [bindingKey, record] of BINDINGS_BY_THREAD_ID.entries()) bindings[bindingKey] = { ...record };
|
|
267
|
+
const payload = {
|
|
268
|
+
version: 1,
|
|
269
|
+
bindings
|
|
270
|
+
};
|
|
271
|
+
saveJsonFile(resolveThreadBindingsPath(), payload);
|
|
272
|
+
THREAD_BINDINGS_STATE.lastPersistedAtMs = now;
|
|
273
|
+
}
|
|
274
|
+
function ensureBindingsLoaded() {
|
|
275
|
+
if (THREAD_BINDINGS_STATE.loadedBindings) return;
|
|
276
|
+
THREAD_BINDINGS_STATE.loadedBindings = true;
|
|
277
|
+
BINDINGS_BY_THREAD_ID.clear();
|
|
278
|
+
BINDINGS_BY_SESSION_KEY.clear();
|
|
279
|
+
REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL.clear();
|
|
280
|
+
const raw = loadJsonFile(resolveThreadBindingsPath());
|
|
281
|
+
if (!raw || typeof raw !== "object") return;
|
|
282
|
+
const payload = raw;
|
|
283
|
+
if (payload.version !== 1 || !payload.bindings || typeof payload.bindings !== "object") return;
|
|
284
|
+
for (const [threadId, entry] of Object.entries(payload.bindings)) {
|
|
285
|
+
const normalized = normalizePersistedBinding(threadId, entry);
|
|
286
|
+
if (!normalized) continue;
|
|
287
|
+
setBindingRecord(normalized);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
function resolveBindingIdsForSession(params) {
|
|
291
|
+
const key = params.targetSessionKey.trim();
|
|
292
|
+
if (!key) return [];
|
|
293
|
+
const ids = BINDINGS_BY_SESSION_KEY.get(key);
|
|
294
|
+
if (!ids) return [];
|
|
295
|
+
const out = [];
|
|
296
|
+
for (const bindingKey of ids.values()) {
|
|
297
|
+
const record = BINDINGS_BY_THREAD_ID.get(bindingKey);
|
|
298
|
+
if (!record) continue;
|
|
299
|
+
if (params.accountId && record.accountId !== params.accountId) continue;
|
|
300
|
+
if (params.targetKind && record.targetKind !== params.targetKind) continue;
|
|
301
|
+
out.push(bindingKey);
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
function resetThreadBindingsForTests() {
|
|
306
|
+
for (const manager of MANAGERS_BY_ACCOUNT_ID.values()) manager.stop();
|
|
307
|
+
MANAGERS_BY_ACCOUNT_ID.clear();
|
|
308
|
+
BINDINGS_BY_THREAD_ID.clear();
|
|
309
|
+
BINDINGS_BY_SESSION_KEY.clear();
|
|
310
|
+
RECENT_UNBOUND_WEBHOOK_ECHOES_BY_BINDING_KEY.clear();
|
|
311
|
+
REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL.clear();
|
|
312
|
+
TOKENS_BY_ACCOUNT_ID.clear();
|
|
313
|
+
PERSIST_BY_ACCOUNT_ID.clear();
|
|
314
|
+
THREAD_BINDINGS_STATE.loadedBindings = false;
|
|
315
|
+
THREAD_BINDINGS_STATE.lastPersistedAtMs = 0;
|
|
316
|
+
}
|
|
317
|
+
//#endregion
|
|
318
|
+
export { DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS as A, resolveThreadBindingMaxAgeMs as C, shouldDefaultPersist as D, setBindingRecord as E, THREAD_BINDINGS_SWEEP_INTERVAL_MS as M, shouldPersistBindingMutations as O, resolveThreadBindingMaxAgeExpiresAt as S, saveBindingsToDisk as T, resetThreadBindingsForTests as _, THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS as a, resolveThreadBindingIdleTimeoutMs as b, getThreadBindingToken as c, normalizeThreadBindingDurationMs as d, normalizeThreadId as f, removeBindingRecord as g, rememberThreadBindingToken as h, REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL as i, DISCORD_UNKNOWN_CHANNEL_ERROR_CODE as j, toReusableWebhookKey as k, isRecentlyUnboundThreadWebhookMessage as l, rememberReusableWebhook as m, MANAGERS_BY_ACCOUNT_ID as n, ensureBindingsLoaded as o, rememberRecentUnboundWebhookEcho as p, PERSIST_BY_ACCOUNT_ID as r, forgetThreadBindingToken as s, BINDINGS_BY_THREAD_ID as t, normalizeTargetKind as u, resolveBindingIdsForSession as v, resolveThreadBindingsPath as w, resolveThreadBindingInactivityExpiresAt as x, resolveBindingRecordKey as y };
|