@kodelyth/discord 2026.5.42 → 2026.6.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/klaw.plugin.json +3822 -2
- package/package.json +18 -6
- package/account-inspect-api.ts +0 -6
- package/action-runtime-api.ts +0 -1
- package/api.ts +0 -130
- 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 -31
- package/runtime-api.ts +0 -181
- 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 -128
- package/src/accounts.test.ts +0 -381
- package/src/accounts.ts +0 -205
- package/src/actions/handle-action.guild-admin.ts +0 -421
- package/src/actions/handle-action.test.ts +0 -480
- package/src/actions/handle-action.ts +0 -402
- package/src/actions/runtime.guild.ts +0 -446
- package/src/actions/runtime.messaging.messages.ts +0 -226
- package/src/actions/runtime.messaging.reactions.ts +0 -67
- package/src/actions/runtime.messaging.runtime.ts +0 -73
- package/src/actions/runtime.messaging.send.ts +0 -336
- 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 -165
- package/src/actions/runtime.presence.ts +0 -117
- package/src/actions/runtime.shared.ts +0 -86
- package/src/actions/runtime.test.ts +0 -1337
- package/src/actions/runtime.ts +0 -87
- package/src/api-barrel.test.ts +0 -78
- package/src/api.test.ts +0 -152
- package/src/api.ts +0 -215
- package/src/approval-handler.runtime.test.ts +0 -41
- package/src/approval-handler.runtime.ts +0 -633
- 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 -50
- package/src/audit-core.ts +0 -178
- package/src/audit.test.ts +0 -204
- 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 -504
- package/src/channel-actions.ts +0 -254
- package/src/channel-api.ts +0 -29
- package/src/channel.conversation.ts +0 -159
- package/src/channel.loaders.ts +0 -50
- package/src/channel.message-adapter.test.ts +0 -230
- package/src/channel.runtime.ts +0 -1
- package/src/channel.setup.ts +0 -12
- package/src/channel.test.ts +0 -828
- package/src/channel.ts +0 -728
- package/src/chunk.test.ts +0 -170
- package/src/chunk.ts +0 -321
- package/src/client.proxy.test.ts +0 -177
- package/src/client.test.ts +0 -83
- package/src/client.ts +0 -143
- 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 -345
- package/src/components.ts +0 -54
- package/src/components.types.ts +0 -187
- package/src/config-schema.test.ts +0 -439
- package/src/config-schema.ts +0 -6
- package/src/config-ui-hints.ts +0 -354
- package/src/conversation-identity.ts +0 -58
- package/src/delivery-retry.ts +0 -52
- 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 -141
- 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 -393
- 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 -193
- package/src/draft-stream.ts +0 -162
- package/src/durable-delivery.test.ts +0 -103
- 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/inbound-event-delivery.ts +0 -135
- 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 -260
- 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 -472
- package/src/internal/client.ts +0 -310
- package/src/internal/command-deploy.test.ts +0 -197
- package/src/internal/command-deploy.ts +0 -352
- 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 -185
- 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.test.ts +0 -114
- package/src/internal/gateway-lifecycle.ts +0 -75
- package/src/internal/gateway-rate-limit.ts +0 -104
- package/src/internal/gateway.test.ts +0 -676
- package/src/internal/gateway.ts +0 -479
- 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 -329
- package/src/internal/interactions.ts +0 -378
- package/src/internal/listeners.ts +0 -91
- 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 -681
- 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/ack-reactions.ts +0 -70
- package/src/monitor/acp-bind-here.integration.test.ts +0 -219
- 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 -177
- package/src/monitor/agent-components-guild-auth.ts +0 -322
- package/src/monitor/agent-components-helpers.runtime.ts +0 -3
- 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 -359
- 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 -215
- 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 -171
- 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 -631
- package/src/monitor/auto-presence.test.ts +0 -184
- package/src/monitor/auto-presence.ts +0 -356
- package/src/monitor/channel-access.test.ts +0 -113
- 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 -274
- package/src/monitor/dm-command-auth.ts +0 -259
- package/src/monitor/dm-command-decision.test.ts +0 -108
- package/src/monitor/dm-command-decision.ts +0 -49
- package/src/monitor/exec-approvals.test.ts +0 -225
- package/src/monitor/exec-approvals.ts +0 -158
- package/src/monitor/format.ts +0 -45
- package/src/monitor/gateway-handle.ts +0 -33
- 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 -320
- package/src/monitor/gateway-plugin.ts +0 -302
- package/src/monitor/gateway-registry.ts +0 -37
- package/src/monitor/gateway-supervisor.test.ts +0 -157
- 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 -112
- package/src/monitor/inbound-context.ts +0 -95
- package/src/monitor/inbound-dedupe.ts +0 -79
- package/src/monitor/inbound-job.test.ts +0 -216
- package/src/monitor/inbound-job.ts +0 -118
- package/src/monitor/listeners.queue.ts +0 -91
- package/src/monitor/listeners.reactions.ts +0 -594
- package/src/monitor/listeners.test.ts +0 -209
- package/src/monitor/listeners.ts +0 -150
- package/src/monitor/message-channel-info.ts +0 -96
- package/src/monitor/message-forwarded.ts +0 -114
- 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 -492
- package/src/monitor/message-handler.dm-preflight.ts +0 -119
- package/src/monitor/message-handler.draft-preview.ts +0 -426
- 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 -61
- 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 -371
- package/src/monitor/message-handler.preflight.test-helpers.ts +0 -114
- package/src/monitor/message-handler.preflight.test.ts +0 -2255
- package/src/monitor/message-handler.preflight.ts +0 -822
- package/src/monitor/message-handler.preflight.types.ts +0 -115
- package/src/monitor/message-handler.process.test.ts +0 -2520
- package/src/monitor/message-handler.process.ts +0 -1027
- package/src/monitor/message-handler.queue.test.ts +0 -680
- 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 -309
- package/src/monitor/message-media.ts +0 -536
- 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 -1234
- package/src/monitor/message-utils.ts +0 -34
- 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 -869
- package/src/monitor/model-picker.ts +0 -38
- package/src/monitor/model-picker.view.ts +0 -722
- package/src/monitor/monitor.agent-components.test.ts +0 -410
- package/src/monitor/monitor.test.ts +0 -919
- package/src/monitor/monitor.threading-utils.test.ts +0 -614
- 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 -309
- package/src/monitor/native-command-bypass.ts +0 -13
- package/src/monitor/native-command-context.test.ts +0 -105
- package/src/monitor/native-command-context.ts +0 -109
- package/src/monitor/native-command-dispatch.ts +0 -35
- package/src/monitor/native-command-model-picker-apply.ts +0 -209
- package/src/monitor/native-command-model-picker-interaction.ts +0 -516
- package/src/monitor/native-command-model-picker-ui.ts +0 -357
- 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 -108
- package/src/monitor/native-command.commands-allowfrom.test.ts +0 -504
- package/src/monitor/native-command.model-picker.test.ts +0 -930
- package/src/monitor/native-command.options.test.ts +0 -379
- package/src/monitor/native-command.options.ts +0 -153
- package/src/monitor/native-command.plugin-dispatch.test.ts +0 -1212
- package/src/monitor/native-command.runtime.ts +0 -51
- package/src/monitor/native-command.status-direct.test.ts +0 -278
- package/src/monitor/native-command.test-helpers.ts +0 -64
- package/src/monitor/native-command.think-autocomplete.test.ts +0 -411
- package/src/monitor/native-command.ts +0 -747
- 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 -61
- 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 -217
- package/src/monitor/provider.allowlist.ts +0 -398
- 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 -734
- package/src/monitor/provider.lifecycle.ts +0 -562
- package/src/monitor/provider.proxy.test.ts +0 -804
- package/src/monitor/provider.rest-proxy.test.ts +0 -389
- 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 -440
- package/src/monitor/provider.startup.ts +0 -323
- package/src/monitor/provider.test.ts +0 -1173
- package/src/monitor/provider.ts +0 -688
- package/src/monitor/reply-context.ts +0 -64
- package/src/monitor/reply-delivery.test.ts +0 -474
- package/src/monitor/reply-delivery.ts +0 -212
- package/src/monitor/reply-safety.ts +0 -96
- package/src/monitor/rest-fetch.ts +0 -94
- package/src/monitor/route-resolution.test.ts +0 -209
- 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 -250
- package/src/monitor/thread-bindings.discord-api.ts +0 -310
- package/src/monitor/thread-bindings.lifecycle.test.ts +0 -1994
- package/src/monitor/thread-bindings.lifecycle.ts +0 -354
- package/src/monitor/thread-bindings.manager.ts +0 -551
- 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 -39
- 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 -209
- 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 -330
- 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 -279
- package/src/monitor/threading.starter.ts +0 -288
- 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 -1416
- package/src/monitor.ts +0 -28
- package/src/network-config.test.ts +0 -92
- package/src/network-config.ts +0 -79
- package/src/normalize.test.ts +0 -56
- package/src/normalize.ts +0 -86
- package/src/outbound-adapter.interactive-order.test.ts +0 -82
- package/src/outbound-adapter.test-harness.ts +0 -207
- package/src/outbound-adapter.test.ts +0 -804
- package/src/outbound-adapter.ts +0 -326
- package/src/outbound-approval.ts +0 -29
- package/src/outbound-components.ts +0 -86
- package/src/outbound-payload.contract.test.ts +0 -49
- package/src/outbound-payload.ts +0 -208
- package/src/outbound-send-context.ts +0 -89
- package/src/outbound-session-route.test.ts +0 -42
- 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 -18
- 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 -100
- package/src/proxy-request-client.ts +0 -21
- package/src/recipient-resolution.ts +0 -39
- package/src/resolve-allowlist-common.test.ts +0 -40
- package/src/resolve-allowlist-common.ts +0 -39
- package/src/resolve-channels.test.ts +0 -341
- package/src/resolve-channels.ts +0 -369
- package/src/resolve-users.test.ts +0 -243
- 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 -61
- package/src/runtime-config.ts +0 -16
- 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 -245
- 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 -330
- package/src/send.components.ts +0 -391
- package/src/send.creates-thread.test.ts +0 -681
- package/src/send.emojis-stickers.ts +0 -57
- package/src/send.guild.ts +0 -170
- package/src/send.message-request.ts +0 -112
- package/src/send.messages.test.ts +0 -59
- package/src/send.messages.ts +0 -229
- package/src/send.outbound.ts +0 -459
- package/src/send.permissions.authz.test.ts +0 -190
- package/src/send.permissions.ts +0 -283
- package/src/send.reactions.ts +0 -155
- package/src/send.receipt.ts +0 -69
- package/src/send.sends-basic-channel-messages.test.ts +0 -1068
- package/src/send.shared.ts +0 -469
- package/src/send.test-harness.ts +0 -56
- package/src/send.ts +0 -82
- package/src/send.types.ts +0 -191
- package/src/send.typing.test.ts +0 -41
- package/src/send.typing.ts +0 -9
- package/src/send.voice.ts +0 -136
- package/src/send.webhook-activity.test.ts +0 -152
- package/src/send.webhook.proxy.test.ts +0 -210
- package/src/send.webhook.ts +0 -137
- 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 -113
- package/src/setup-account-state.ts +0 -141
- package/src/setup-adapter.ts +0 -14
- package/src/setup-core.ts +0 -215
- package/src/setup-runtime-helpers.ts +0 -10
- package/src/setup-surface.test.ts +0 -137
- package/src/setup-surface.ts +0 -132
- package/src/shared-interactive.test.ts +0 -153
- package/src/shared-interactive.ts +0 -161
- package/src/shared.test.ts +0 -186
- package/src/shared.ts +0 -197
- package/src/status-issues.test.ts +0 -97
- package/src/status-issues.ts +0 -198
- package/src/subagent-hooks.test.ts +0 -465
- package/src/subagent-hooks.ts +0 -232
- package/src/target-parsing.ts +0 -70
- package/src/target-resolver.ts +0 -129
- package/src/targets.test.ts +0 -393
- package/src/targets.ts +0 -12
- package/src/test-http-helpers.ts +0 -10
- package/src/test-support/component-runtime.ts +0 -194
- 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 -547
- package/src/token.test.ts +0 -174
- package/src/token.ts +0 -107
- package/src/ui-colors.ts +0 -27
- package/src/ui.ts +0 -20
- package/src/voice/access.test.ts +0 -288
- package/src/voice/access.ts +0 -126
- package/src/voice/audio.test.ts +0 -47
- package/src/voice/audio.ts +0 -249
- package/src/voice/capture-state.test.ts +0 -48
- package/src/voice/capture-state.ts +0 -120
- package/src/voice/command.test.ts +0 -170
- package/src/voice/command.ts +0 -284
- package/src/voice/config.ts +0 -8
- package/src/voice/ingress.ts +0 -164
- package/src/voice/manager.e2e.test.ts +0 -3286
- package/src/voice/manager.ready-listener.test.ts +0 -54
- package/src/voice/manager.runtime.ts +0 -14
- package/src/voice/manager.ts +0 -1155
- package/src/voice/prompt.test.ts +0 -30
- package/src/voice/prompt.ts +0 -22
- package/src/voice/realtime.ts +0 -1370
- package/src/voice/receive-recovery.test.ts +0 -81
- package/src/voice/receive-recovery.ts +0 -159
- package/src/voice/sanitize.test.ts +0 -34
- package/src/voice/sanitize.ts +0 -29
- package/src/voice/sdk-runtime.ts +0 -14
- package/src/voice/segment.ts +0 -160
- package/src/voice/session.ts +0 -81
- package/src/voice/speaker-context.ts +0 -127
- package/src/voice/tts.ts +0 -151
- package/src/voice-message.test.ts +0 -376
- package/src/voice-message.ts +0 -474
- 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
package/src/probe.ts
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import type { BaseProbeResult } from "klaw/plugin-sdk/channel-contract";
|
|
2
|
-
import { formatErrorMessage } from "klaw/plugin-sdk/error-runtime";
|
|
3
|
-
import { resolveFetch } from "klaw/plugin-sdk/fetch-runtime";
|
|
4
|
-
import { fetchWithTimeout } from "klaw/plugin-sdk/text-utility-runtime";
|
|
5
|
-
import { DiscordApiError, fetchDiscord } from "./api.js";
|
|
6
|
-
import { normalizeDiscordToken } from "./token.js";
|
|
7
|
-
|
|
8
|
-
const DISCORD_API_BASE = "https://discord.com/api/v10";
|
|
9
|
-
|
|
10
|
-
export type DiscordProbe = BaseProbeResult & {
|
|
11
|
-
status?: number | null;
|
|
12
|
-
elapsedMs: number;
|
|
13
|
-
bot?: { id?: string | null; username?: string | null };
|
|
14
|
-
application?: DiscordApplicationSummary;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export type DiscordPrivilegedIntentStatus = "enabled" | "limited" | "disabled";
|
|
18
|
-
|
|
19
|
-
export type DiscordPrivilegedIntentsSummary = {
|
|
20
|
-
messageContent: DiscordPrivilegedIntentStatus;
|
|
21
|
-
guildMembers: DiscordPrivilegedIntentStatus;
|
|
22
|
-
presence: DiscordPrivilegedIntentStatus;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type DiscordApplicationSummary = {
|
|
26
|
-
id?: string | null;
|
|
27
|
-
flags?: number | null;
|
|
28
|
-
intents?: DiscordPrivilegedIntentsSummary;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const DISCORD_APP_FLAG_GATEWAY_PRESENCE = 1 << 12;
|
|
32
|
-
const DISCORD_APP_FLAG_GATEWAY_PRESENCE_LIMITED = 1 << 13;
|
|
33
|
-
const DISCORD_APP_FLAG_GATEWAY_GUILD_MEMBERS = 1 << 14;
|
|
34
|
-
const DISCORD_APP_FLAG_GATEWAY_GUILD_MEMBERS_LIMITED = 1 << 15;
|
|
35
|
-
const DISCORD_APP_FLAG_GATEWAY_MESSAGE_CONTENT = 1 << 18;
|
|
36
|
-
const DISCORD_APP_FLAG_GATEWAY_MESSAGE_CONTENT_LIMITED = 1 << 19;
|
|
37
|
-
|
|
38
|
-
async function fetchDiscordApplicationMe(
|
|
39
|
-
token: string,
|
|
40
|
-
timeoutMs: number,
|
|
41
|
-
fetcher: typeof fetch,
|
|
42
|
-
): Promise<{ id?: string; flags?: number } | undefined> {
|
|
43
|
-
try {
|
|
44
|
-
const normalized = normalizeDiscordToken(token, "channels.discord.token");
|
|
45
|
-
if (!normalized) {
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
return await fetchDiscord<{ id?: string; flags?: number }>(
|
|
49
|
-
"/oauth2/applications/@me",
|
|
50
|
-
normalized,
|
|
51
|
-
createDiscordTimeoutFetch(fetcher, timeoutMs),
|
|
52
|
-
{ retry: { attempts: 1 } },
|
|
53
|
-
);
|
|
54
|
-
} catch {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function createDiscordTimeoutFetch(fetcher: typeof fetch, timeoutMs: number): typeof fetch {
|
|
60
|
-
const fetchImpl = getResolvedFetch(fetcher);
|
|
61
|
-
return ((input: RequestInfo | URL, init?: RequestInit) =>
|
|
62
|
-
fetchWithTimeout(
|
|
63
|
-
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url,
|
|
64
|
-
init ?? {},
|
|
65
|
-
timeoutMs,
|
|
66
|
-
fetchImpl,
|
|
67
|
-
)) as typeof fetch;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function resolveDiscordPrivilegedIntentsFromFlags(
|
|
71
|
-
flags: number,
|
|
72
|
-
): DiscordPrivilegedIntentsSummary {
|
|
73
|
-
const resolve = (enabledBit: number, limitedBit: number) => {
|
|
74
|
-
if ((flags & enabledBit) !== 0) {
|
|
75
|
-
return "enabled";
|
|
76
|
-
}
|
|
77
|
-
if ((flags & limitedBit) !== 0) {
|
|
78
|
-
return "limited";
|
|
79
|
-
}
|
|
80
|
-
return "disabled";
|
|
81
|
-
};
|
|
82
|
-
return {
|
|
83
|
-
presence: resolve(DISCORD_APP_FLAG_GATEWAY_PRESENCE, DISCORD_APP_FLAG_GATEWAY_PRESENCE_LIMITED),
|
|
84
|
-
guildMembers: resolve(
|
|
85
|
-
DISCORD_APP_FLAG_GATEWAY_GUILD_MEMBERS,
|
|
86
|
-
DISCORD_APP_FLAG_GATEWAY_GUILD_MEMBERS_LIMITED,
|
|
87
|
-
),
|
|
88
|
-
messageContent: resolve(
|
|
89
|
-
DISCORD_APP_FLAG_GATEWAY_MESSAGE_CONTENT,
|
|
90
|
-
DISCORD_APP_FLAG_GATEWAY_MESSAGE_CONTENT_LIMITED,
|
|
91
|
-
),
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export async function fetchDiscordApplicationSummary(
|
|
96
|
-
token: string,
|
|
97
|
-
timeoutMs: number,
|
|
98
|
-
fetcher: typeof fetch = fetch,
|
|
99
|
-
): Promise<DiscordApplicationSummary | undefined> {
|
|
100
|
-
const json = await fetchDiscordApplicationMe(token, timeoutMs, fetcher);
|
|
101
|
-
if (!json) {
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
const flags =
|
|
105
|
-
typeof json.flags === "number" && Number.isFinite(json.flags) ? json.flags : undefined;
|
|
106
|
-
return {
|
|
107
|
-
id: json.id ?? null,
|
|
108
|
-
flags: flags ?? null,
|
|
109
|
-
intents:
|
|
110
|
-
typeof flags === "number" ? resolveDiscordPrivilegedIntentsFromFlags(flags) : undefined,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function getResolvedFetch(fetcher: typeof fetch): typeof fetch {
|
|
115
|
-
const fetchImpl = resolveFetch(fetcher);
|
|
116
|
-
if (!fetchImpl) {
|
|
117
|
-
throw new Error("fetch is not available");
|
|
118
|
-
}
|
|
119
|
-
return fetchImpl;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export async function probeDiscord(
|
|
123
|
-
token: string,
|
|
124
|
-
timeoutMs: number,
|
|
125
|
-
opts?: { fetcher?: typeof fetch; includeApplication?: boolean },
|
|
126
|
-
): Promise<DiscordProbe> {
|
|
127
|
-
const started = Date.now();
|
|
128
|
-
const fetcher = opts?.fetcher ?? fetch;
|
|
129
|
-
const includeApplication = opts?.includeApplication === true;
|
|
130
|
-
const normalized = normalizeDiscordToken(token, "channels.discord.token");
|
|
131
|
-
const result: DiscordProbe = {
|
|
132
|
-
ok: false,
|
|
133
|
-
status: null,
|
|
134
|
-
error: null,
|
|
135
|
-
elapsedMs: 0,
|
|
136
|
-
};
|
|
137
|
-
if (!normalized) {
|
|
138
|
-
return {
|
|
139
|
-
...result,
|
|
140
|
-
error: "missing token",
|
|
141
|
-
elapsedMs: Date.now() - started,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
try {
|
|
145
|
-
const res = await fetchWithTimeout(
|
|
146
|
-
`${DISCORD_API_BASE}/users/@me`,
|
|
147
|
-
{ headers: { Authorization: `Bot ${normalized}` } },
|
|
148
|
-
timeoutMs,
|
|
149
|
-
getResolvedFetch(fetcher),
|
|
150
|
-
);
|
|
151
|
-
if (!res.ok) {
|
|
152
|
-
result.status = res.status;
|
|
153
|
-
result.error = `getMe failed (${res.status})`;
|
|
154
|
-
return { ...result, elapsedMs: Date.now() - started };
|
|
155
|
-
}
|
|
156
|
-
const json = (await res.json()) as { id?: string; username?: string };
|
|
157
|
-
result.ok = true;
|
|
158
|
-
result.bot = {
|
|
159
|
-
id: json.id ?? null,
|
|
160
|
-
username: json.username ?? null,
|
|
161
|
-
};
|
|
162
|
-
if (includeApplication) {
|
|
163
|
-
result.application =
|
|
164
|
-
(await fetchDiscordApplicationSummary(normalized, timeoutMs, fetcher)) ?? undefined;
|
|
165
|
-
}
|
|
166
|
-
return { ...result, elapsedMs: Date.now() - started };
|
|
167
|
-
} catch (err) {
|
|
168
|
-
return {
|
|
169
|
-
...result,
|
|
170
|
-
status: err instanceof Response ? err.status : result.status,
|
|
171
|
-
error: formatErrorMessage(err),
|
|
172
|
-
elapsedMs: Date.now() - started,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Extract the application (bot user) ID from a Discord bot token by
|
|
179
|
-
* base64-decoding the first segment. Discord tokens have the format:
|
|
180
|
-
* base64(user_id) . timestamp . hmac
|
|
181
|
-
* The decoded first segment is the numeric snowflake ID as a plain string,
|
|
182
|
-
* so we keep it as a string to avoid precision loss for IDs that exceed
|
|
183
|
-
* Number.MAX_SAFE_INTEGER.
|
|
184
|
-
*/
|
|
185
|
-
export function parseApplicationIdFromToken(token: string): string | undefined {
|
|
186
|
-
const normalized = normalizeDiscordToken(token, "channels.discord.token");
|
|
187
|
-
if (!normalized) {
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
const firstDot = normalized.indexOf(".");
|
|
191
|
-
if (firstDot <= 0) {
|
|
192
|
-
return undefined;
|
|
193
|
-
}
|
|
194
|
-
try {
|
|
195
|
-
const decoded = Buffer.from(normalized.slice(0, firstDot), "base64").toString("utf-8");
|
|
196
|
-
if (/^\d+$/.test(decoded)) {
|
|
197
|
-
return decoded;
|
|
198
|
-
}
|
|
199
|
-
return undefined;
|
|
200
|
-
} catch {
|
|
201
|
-
return undefined;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export async function fetchDiscordApplicationId(
|
|
206
|
-
token: string,
|
|
207
|
-
timeoutMs: number,
|
|
208
|
-
fetcher: typeof fetch = fetch,
|
|
209
|
-
): Promise<string | undefined> {
|
|
210
|
-
const normalized = normalizeDiscordToken(token, "channels.discord.token");
|
|
211
|
-
if (!normalized) {
|
|
212
|
-
return undefined;
|
|
213
|
-
}
|
|
214
|
-
const parsedApplicationId = parseApplicationIdFromToken(token);
|
|
215
|
-
if (parsedApplicationId) {
|
|
216
|
-
return parsedApplicationId;
|
|
217
|
-
}
|
|
218
|
-
try {
|
|
219
|
-
const json = await fetchDiscord<{ id?: string }>(
|
|
220
|
-
"/oauth2/applications/@me",
|
|
221
|
-
normalized,
|
|
222
|
-
createDiscordTimeoutFetch(fetcher, timeoutMs),
|
|
223
|
-
);
|
|
224
|
-
if (json?.id) {
|
|
225
|
-
return json.id;
|
|
226
|
-
}
|
|
227
|
-
return undefined;
|
|
228
|
-
} catch (error) {
|
|
229
|
-
if (error instanceof DiscordApiError) {
|
|
230
|
-
if (error.status === 429) {
|
|
231
|
-
throw error;
|
|
232
|
-
}
|
|
233
|
-
return undefined;
|
|
234
|
-
}
|
|
235
|
-
return undefined;
|
|
236
|
-
}
|
|
237
|
-
}
|
package/src/proxy-fetch.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { isIP } from "node:net";
|
|
2
|
-
import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
|
|
3
|
-
import { makeProxyFetch } from "klaw/plugin-sdk/fetch-runtime";
|
|
4
|
-
import { danger } from "klaw/plugin-sdk/runtime-env";
|
|
5
|
-
import type { RuntimeEnv } from "klaw/plugin-sdk/runtime-env";
|
|
6
|
-
import { normalizeLowercaseStringOrEmpty } from "klaw/plugin-sdk/string-coerce-runtime";
|
|
7
|
-
import type { ResolvedDiscordAccount } from "./accounts.js";
|
|
8
|
-
|
|
9
|
-
function resolveDiscordProxyUrl(
|
|
10
|
-
account: Pick<ResolvedDiscordAccount, "config">,
|
|
11
|
-
cfg: KlawConfig,
|
|
12
|
-
): string | undefined {
|
|
13
|
-
const accountProxy = account.config.proxy?.trim();
|
|
14
|
-
if (accountProxy) {
|
|
15
|
-
return accountProxy;
|
|
16
|
-
}
|
|
17
|
-
const channelProxy = cfg?.channels?.discord?.proxy;
|
|
18
|
-
if (typeof channelProxy !== "string") {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
const trimmed = channelProxy.trim();
|
|
22
|
-
return trimmed || undefined;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function resolveDiscordProxyFetchByUrl(
|
|
26
|
-
proxyUrl: string | undefined,
|
|
27
|
-
runtime?: Pick<RuntimeEnv, "error">,
|
|
28
|
-
): typeof fetch | undefined {
|
|
29
|
-
return withValidatedDiscordProxy(proxyUrl, runtime, (proxy) => makeProxyFetch(proxy));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function resolveDiscordProxyFetchForAccount(
|
|
33
|
-
account: Pick<ResolvedDiscordAccount, "config">,
|
|
34
|
-
cfg: KlawConfig,
|
|
35
|
-
runtime?: Pick<RuntimeEnv, "error">,
|
|
36
|
-
): typeof fetch | undefined {
|
|
37
|
-
return resolveDiscordProxyFetchByUrl(resolveDiscordProxyUrl(account, cfg), runtime);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function withValidatedDiscordProxy<T>(
|
|
41
|
-
proxyUrl: string | undefined,
|
|
42
|
-
runtime: Pick<RuntimeEnv, "error"> | undefined,
|
|
43
|
-
createValue: (proxyUrl: string) => T,
|
|
44
|
-
): T | undefined {
|
|
45
|
-
const proxy = proxyUrl?.trim();
|
|
46
|
-
if (!proxy) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
validateDiscordProxyUrl(proxy);
|
|
51
|
-
return createValue(proxy);
|
|
52
|
-
} catch (err) {
|
|
53
|
-
runtime?.error?.(danger(`discord: invalid rest proxy: ${String(err)}`));
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function validateDiscordProxyUrl(proxyUrl: string): string {
|
|
59
|
-
let parsed: URL;
|
|
60
|
-
try {
|
|
61
|
-
parsed = new URL(proxyUrl);
|
|
62
|
-
} catch {
|
|
63
|
-
throw new Error("Proxy URL must be a valid http or https URL");
|
|
64
|
-
}
|
|
65
|
-
if (!["http:", "https:"].includes(parsed.protocol)) {
|
|
66
|
-
throw new Error("Proxy URL must use http or https");
|
|
67
|
-
}
|
|
68
|
-
if (!isLoopbackProxyHostname(parsed.hostname)) {
|
|
69
|
-
throw new Error("Proxy URL must target a loopback host");
|
|
70
|
-
}
|
|
71
|
-
return proxyUrl;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function isLoopbackProxyHostname(hostname: string): boolean {
|
|
75
|
-
const normalized = normalizeLowercaseStringOrEmpty(hostname);
|
|
76
|
-
if (!normalized) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
const bracketless =
|
|
80
|
-
normalized.startsWith("[") && normalized.endsWith("]") ? normalized.slice(1, -1) : normalized;
|
|
81
|
-
if (bracketless === "localhost") {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
const ipFamily = isIP(bracketless);
|
|
85
|
-
if (ipFamily === 4) {
|
|
86
|
-
return bracketless.startsWith("127.");
|
|
87
|
-
}
|
|
88
|
-
if (ipFamily === 6) {
|
|
89
|
-
return bracketless === "::1" || bracketless === "0:0:0:0:0:0:0:1";
|
|
90
|
-
}
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
createAbortableFetchMock,
|
|
4
|
-
createJsonResponse,
|
|
5
|
-
} from "./internal/test-builders.test-support.js";
|
|
6
|
-
import { createDiscordRequestClient, DISCORD_REST_TIMEOUT_MS } from "./proxy-request-client.js";
|
|
7
|
-
|
|
8
|
-
async function expectAbortError(promise: Promise<unknown>) {
|
|
9
|
-
let abortError: unknown;
|
|
10
|
-
try {
|
|
11
|
-
await promise;
|
|
12
|
-
} catch (error) {
|
|
13
|
-
abortError = error;
|
|
14
|
-
}
|
|
15
|
-
expect(abortError).toBeInstanceOf(DOMException);
|
|
16
|
-
if (!(abortError instanceof DOMException)) {
|
|
17
|
-
throw new Error("expected Discord request abort error");
|
|
18
|
-
}
|
|
19
|
-
expect(abortError.name).toBe("AbortError");
|
|
20
|
-
expect(abortError.message).toBe("The operation was aborted.");
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe("createDiscordRequestClient", () => {
|
|
24
|
-
it("preserves the REST client's abort signal for proxied fetch calls", async () => {
|
|
25
|
-
const fetchSpy = vi.fn(async (_input: string | URL | Request, init?: RequestInit) => {
|
|
26
|
-
if (!(init?.signal instanceof AbortSignal)) {
|
|
27
|
-
throw new Error("Expected proxied fetch init to include an AbortSignal");
|
|
28
|
-
}
|
|
29
|
-
expect(init.signal.aborted).toBe(false);
|
|
30
|
-
return createJsonResponse([]);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const client = createDiscordRequestClient("Bot test-token", {
|
|
34
|
-
fetch: fetchSpy as never,
|
|
35
|
-
queueRequests: false,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
await client.get("/channels/123/messages");
|
|
39
|
-
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("lets the REST client abort hanging proxied requests after its timeout", async () => {
|
|
43
|
-
const { fetch: fetchSpy } = createAbortableFetchMock();
|
|
44
|
-
|
|
45
|
-
const client = createDiscordRequestClient("Bot test-token", {
|
|
46
|
-
fetch: fetchSpy as never,
|
|
47
|
-
queueRequests: false,
|
|
48
|
-
timeout: 20,
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
await expectAbortError(client.get("/channels/123/messages"));
|
|
52
|
-
}, 1_000);
|
|
53
|
-
|
|
54
|
-
it("lets abortAllRequests cancel active proxied fetches", async () => {
|
|
55
|
-
const abortable = createAbortableFetchMock();
|
|
56
|
-
|
|
57
|
-
const client = createDiscordRequestClient("Bot test-token", {
|
|
58
|
-
fetch: abortable.fetch as never,
|
|
59
|
-
queueRequests: false,
|
|
60
|
-
timeout: 5_000,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const request = client.get("/channels/123/messages");
|
|
64
|
-
await vi.waitFor(() => expect(abortable.fetch).toHaveBeenCalledTimes(1));
|
|
65
|
-
|
|
66
|
-
client.abortAllRequests();
|
|
67
|
-
|
|
68
|
-
await expectAbortError(request);
|
|
69
|
-
if (!abortable.receivedSignal) {
|
|
70
|
-
throw new Error("Expected proxied fetch abort signal");
|
|
71
|
-
}
|
|
72
|
-
expect(abortable.receivedSignal.aborted).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("provides the REST client's timeout signal even without a caller signal", async () => {
|
|
76
|
-
let receivedSignal: AbortSignal | undefined;
|
|
77
|
-
|
|
78
|
-
const fetchSpy = vi.fn(async (_input: string | URL | Request, init?: RequestInit) => {
|
|
79
|
-
receivedSignal = init?.signal ?? undefined;
|
|
80
|
-
return createJsonResponse({});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const client = createDiscordRequestClient("Bot test-token", {
|
|
84
|
-
fetch: fetchSpy as never,
|
|
85
|
-
queueRequests: false,
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
await client.get("/channels/123/messages");
|
|
89
|
-
|
|
90
|
-
if (!receivedSignal) {
|
|
91
|
-
throw new Error("Expected proxied fetch to receive the REST timeout signal");
|
|
92
|
-
}
|
|
93
|
-
expect(receivedSignal.aborted).toBe(false);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("exports a reasonable timeout constant", () => {
|
|
97
|
-
expect(DISCORD_REST_TIMEOUT_MS).toBeGreaterThanOrEqual(5_000);
|
|
98
|
-
expect(DISCORD_REST_TIMEOUT_MS).toBeLessThanOrEqual(30_000);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { RequestClient, type RequestClientOptions } from "./internal/discord.js";
|
|
2
|
-
|
|
3
|
-
type ProxyRequestClientOptions = RequestClientOptions;
|
|
4
|
-
|
|
5
|
-
export const DISCORD_REST_TIMEOUT_MS = 15_000;
|
|
6
|
-
|
|
7
|
-
export function createDiscordRequestClient(
|
|
8
|
-
token: string,
|
|
9
|
-
options?: ProxyRequestClientOptions,
|
|
10
|
-
): RequestClient {
|
|
11
|
-
if (!options?.fetch) {
|
|
12
|
-
return new RequestClient(token, options);
|
|
13
|
-
}
|
|
14
|
-
return new RequestClient(token, {
|
|
15
|
-
runtimeProfile: "persistent",
|
|
16
|
-
maxQueueSize: 1000,
|
|
17
|
-
timeout: DISCORD_REST_TIMEOUT_MS,
|
|
18
|
-
...options,
|
|
19
|
-
fetch: options.fetch,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
|
|
2
|
-
import { requireRuntimeConfig } from "klaw/plugin-sdk/plugin-config-runtime";
|
|
3
|
-
import { resolveDiscordAccount } from "./accounts.js";
|
|
4
|
-
import { parseAndResolveDiscordTarget } from "./target-resolver.js";
|
|
5
|
-
import type { DiscordTargetParseOptions } from "./targets.js";
|
|
6
|
-
|
|
7
|
-
type DiscordRecipient =
|
|
8
|
-
| {
|
|
9
|
-
kind: "user";
|
|
10
|
-
id: string;
|
|
11
|
-
}
|
|
12
|
-
| {
|
|
13
|
-
kind: "channel";
|
|
14
|
-
id: string;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export async function parseAndResolveRecipient(
|
|
18
|
-
raw: string,
|
|
19
|
-
cfg: KlawConfig,
|
|
20
|
-
accountId?: string,
|
|
21
|
-
parseOptions: DiscordTargetParseOptions = {},
|
|
22
|
-
): Promise<DiscordRecipient> {
|
|
23
|
-
if (!cfg) {
|
|
24
|
-
throw new Error(
|
|
25
|
-
"Discord recipient resolution requires a resolved runtime config. Load and resolve config at the command or gateway boundary, then pass cfg through the runtime path.",
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
const resolvedCfg = requireRuntimeConfig(cfg, "Discord recipient resolution");
|
|
29
|
-
const accountInfo = resolveDiscordAccount({ cfg: resolvedCfg, accountId });
|
|
30
|
-
const resolved = await parseAndResolveDiscordTarget(
|
|
31
|
-
raw,
|
|
32
|
-
{
|
|
33
|
-
cfg: resolvedCfg,
|
|
34
|
-
accountId: accountInfo.accountId,
|
|
35
|
-
},
|
|
36
|
-
parseOptions,
|
|
37
|
-
);
|
|
38
|
-
return { kind: resolved.kind, id: resolved.id };
|
|
39
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
buildDiscordUnresolvedResults,
|
|
4
|
-
filterDiscordGuilds,
|
|
5
|
-
findDiscordGuildByName,
|
|
6
|
-
resolveDiscordAllowlistToken,
|
|
7
|
-
} from "./resolve-allowlist-common.js";
|
|
8
|
-
|
|
9
|
-
describe("resolve-allowlist-common", () => {
|
|
10
|
-
const guilds = [
|
|
11
|
-
{ id: "1", name: "Main Guild", slug: "main-guild" },
|
|
12
|
-
{ id: "2", name: "Ops Guild", slug: "ops-guild" },
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
it("resolves and filters guilds by id or name", () => {
|
|
16
|
-
const mainGuild = findDiscordGuildByName(guilds, "Main Guild");
|
|
17
|
-
if (!mainGuild) {
|
|
18
|
-
throw new Error("expected Main Guild lookup result");
|
|
19
|
-
}
|
|
20
|
-
expect(mainGuild.id).toBe("1");
|
|
21
|
-
expect(filterDiscordGuilds(guilds, { guildId: "2" })).toEqual([guilds[1]]);
|
|
22
|
-
expect(filterDiscordGuilds(guilds, { guildName: "main-guild" })).toEqual([guilds[0]]);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("builds unresolved result rows in input order", () => {
|
|
26
|
-
const unresolved = buildDiscordUnresolvedResults(["a", "b"], (input) => ({
|
|
27
|
-
input,
|
|
28
|
-
resolved: false,
|
|
29
|
-
}));
|
|
30
|
-
expect(unresolved).toEqual([
|
|
31
|
-
{ input: "a", resolved: false },
|
|
32
|
-
{ input: "b", resolved: false },
|
|
33
|
-
]);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("normalizes allowlist token values", () => {
|
|
37
|
-
expect(resolveDiscordAllowlistToken(" discord-token ")).toBe("discord-token");
|
|
38
|
-
expect(resolveDiscordAllowlistToken("")).toBeUndefined();
|
|
39
|
-
});
|
|
40
|
-
});
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { DiscordGuildSummary } from "./guilds.js";
|
|
2
|
-
import { normalizeDiscordSlug } from "./monitor/allow-list.js";
|
|
3
|
-
import { normalizeDiscordToken } from "./token.js";
|
|
4
|
-
|
|
5
|
-
export function resolveDiscordAllowlistToken(token: string): string | undefined {
|
|
6
|
-
return normalizeDiscordToken(token, "channels.discord.token");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function buildDiscordUnresolvedResults<T extends { input: string; resolved: boolean }>(
|
|
10
|
-
entries: string[],
|
|
11
|
-
buildResult: (input: string) => T,
|
|
12
|
-
): T[] {
|
|
13
|
-
return entries.map((input) => buildResult(input));
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function findDiscordGuildByName(
|
|
17
|
-
guilds: DiscordGuildSummary[],
|
|
18
|
-
input: string,
|
|
19
|
-
): DiscordGuildSummary | undefined {
|
|
20
|
-
const slug = normalizeDiscordSlug(input);
|
|
21
|
-
if (!slug) {
|
|
22
|
-
return undefined;
|
|
23
|
-
}
|
|
24
|
-
return guilds.find((guild) => guild.slug === slug);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function filterDiscordGuilds(
|
|
28
|
-
guilds: DiscordGuildSummary[],
|
|
29
|
-
params: { guildId?: string; guildName?: string },
|
|
30
|
-
): DiscordGuildSummary[] {
|
|
31
|
-
if (params.guildId) {
|
|
32
|
-
return guilds.filter((guild) => guild.id === params.guildId);
|
|
33
|
-
}
|
|
34
|
-
if (params.guildName) {
|
|
35
|
-
const match = findDiscordGuildByName(guilds, params.guildName);
|
|
36
|
-
return match ? [match] : [];
|
|
37
|
-
}
|
|
38
|
-
return guilds;
|
|
39
|
-
}
|