@kodelyth/discord 2026.5.42 → 2026.6.1
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 +16 -4
- 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
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
|
|
2
|
-
import type { SessionBindingRecord } from "klaw/plugin-sdk/conversation-runtime";
|
|
3
|
-
import {
|
|
4
|
-
deriveLastRoutePolicy,
|
|
5
|
-
isAcpSessionKey,
|
|
6
|
-
isSubagentSessionKey,
|
|
7
|
-
parseAgentSessionKey,
|
|
8
|
-
resolveAgentRoute,
|
|
9
|
-
type ResolvedAgentRoute,
|
|
10
|
-
type RoutePeer,
|
|
11
|
-
} from "klaw/plugin-sdk/routing";
|
|
12
|
-
import { resolveAgentIdFromSessionKey } from "klaw/plugin-sdk/routing";
|
|
13
|
-
|
|
14
|
-
export function buildDiscordRoutePeer(params: {
|
|
15
|
-
isDirectMessage: boolean;
|
|
16
|
-
isGroupDm: boolean;
|
|
17
|
-
directUserId?: string | null;
|
|
18
|
-
conversationId: string;
|
|
19
|
-
}): RoutePeer {
|
|
20
|
-
return {
|
|
21
|
-
kind: params.isDirectMessage ? "direct" : params.isGroupDm ? "group" : "channel",
|
|
22
|
-
id: params.isDirectMessage
|
|
23
|
-
? params.directUserId?.trim() || params.conversationId
|
|
24
|
-
: params.conversationId,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function resolveDiscordConversationRoute(params: {
|
|
29
|
-
cfg: KlawConfig;
|
|
30
|
-
accountId?: string | null;
|
|
31
|
-
guildId?: string | null;
|
|
32
|
-
memberRoleIds?: string[];
|
|
33
|
-
peer: RoutePeer;
|
|
34
|
-
parentConversationId?: string | null;
|
|
35
|
-
}): ResolvedAgentRoute {
|
|
36
|
-
return resolveAgentRoute({
|
|
37
|
-
cfg: params.cfg,
|
|
38
|
-
channel: "discord",
|
|
39
|
-
accountId: params.accountId,
|
|
40
|
-
guildId: params.guildId ?? undefined,
|
|
41
|
-
memberRoleIds: params.memberRoleIds,
|
|
42
|
-
peer: params.peer,
|
|
43
|
-
parentPeer: params.parentConversationId
|
|
44
|
-
? { kind: "channel", id: params.parentConversationId }
|
|
45
|
-
: undefined,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function resolveDiscordBoundConversationRoute(params: {
|
|
50
|
-
cfg: KlawConfig;
|
|
51
|
-
accountId?: string | null;
|
|
52
|
-
guildId?: string | null;
|
|
53
|
-
memberRoleIds?: string[];
|
|
54
|
-
isDirectMessage: boolean;
|
|
55
|
-
isGroupDm: boolean;
|
|
56
|
-
directUserId?: string | null;
|
|
57
|
-
conversationId: string;
|
|
58
|
-
parentConversationId?: string | null;
|
|
59
|
-
boundSessionKey?: string | null;
|
|
60
|
-
configuredRoute?: { route: ResolvedAgentRoute } | null;
|
|
61
|
-
matchedBy?: ResolvedAgentRoute["matchedBy"];
|
|
62
|
-
}): ResolvedAgentRoute {
|
|
63
|
-
const route = resolveDiscordConversationRoute({
|
|
64
|
-
cfg: params.cfg,
|
|
65
|
-
accountId: params.accountId,
|
|
66
|
-
guildId: params.guildId,
|
|
67
|
-
memberRoleIds: params.memberRoleIds,
|
|
68
|
-
peer: buildDiscordRoutePeer({
|
|
69
|
-
isDirectMessage: params.isDirectMessage,
|
|
70
|
-
isGroupDm: params.isGroupDm,
|
|
71
|
-
directUserId: params.directUserId,
|
|
72
|
-
conversationId: params.conversationId,
|
|
73
|
-
}),
|
|
74
|
-
parentConversationId: params.parentConversationId,
|
|
75
|
-
});
|
|
76
|
-
return resolveDiscordEffectiveRoute({
|
|
77
|
-
route,
|
|
78
|
-
boundSessionKey: params.boundSessionKey,
|
|
79
|
-
configuredRoute: params.configuredRoute,
|
|
80
|
-
matchedBy: params.matchedBy,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export function resolveDiscordEffectiveRoute(params: {
|
|
85
|
-
route: ResolvedAgentRoute;
|
|
86
|
-
boundSessionKey?: string | null;
|
|
87
|
-
configuredRoute?: { route: ResolvedAgentRoute } | null;
|
|
88
|
-
matchedBy?: ResolvedAgentRoute["matchedBy"];
|
|
89
|
-
}): ResolvedAgentRoute {
|
|
90
|
-
const boundSessionKey = params.boundSessionKey?.trim();
|
|
91
|
-
if (!boundSessionKey) {
|
|
92
|
-
return params.configuredRoute?.route ?? params.route;
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
...params.route,
|
|
96
|
-
sessionKey: boundSessionKey,
|
|
97
|
-
agentId: resolveAgentIdFromSessionKey(boundSessionKey),
|
|
98
|
-
lastRoutePolicy: deriveLastRoutePolicy({
|
|
99
|
-
sessionKey: boundSessionKey,
|
|
100
|
-
mainSessionKey: params.route.mainSessionKey,
|
|
101
|
-
}),
|
|
102
|
-
...(params.matchedBy ? { matchedBy: params.matchedBy } : {}),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function hasExplicitRuntimeBindingIntent(record: SessionBindingRecord): boolean {
|
|
107
|
-
if (record.targetKind === "subagent") {
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
if (isAcpSessionKey(record.targetSessionKey) || isSubagentSessionKey(record.targetSessionKey)) {
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
const metadata = record.metadata;
|
|
114
|
-
if (!metadata || typeof metadata !== "object") {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
return (
|
|
118
|
-
typeof metadata.boundBy === "string" ||
|
|
119
|
-
typeof metadata.label === "string" ||
|
|
120
|
-
typeof metadata.threadName === "string" ||
|
|
121
|
-
metadata.pluginBindingOwner === "plugin"
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export function shouldIgnoreStaleDiscordRouteBinding(params: {
|
|
126
|
-
bindingRecord?: SessionBindingRecord | null;
|
|
127
|
-
route: ResolvedAgentRoute;
|
|
128
|
-
}): boolean {
|
|
129
|
-
const bindingRecord = params.bindingRecord;
|
|
130
|
-
const boundSessionKey = bindingRecord?.targetSessionKey?.trim();
|
|
131
|
-
if (!bindingRecord || !boundSessionKey || hasExplicitRuntimeBindingIntent(bindingRecord)) {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
const bound = parseAgentSessionKey(boundSessionKey);
|
|
135
|
-
const routed = parseAgentSessionKey(params.route.sessionKey);
|
|
136
|
-
if (!bound || !routed || bound.rest !== routed.rest) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
return bound.agentId !== params.route.agentId;
|
|
140
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
|
|
2
|
-
import type { User } from "../internal/discord.js";
|
|
3
|
-
import type { PluralKitMessageInfo } from "../pluralkit.js";
|
|
4
|
-
import { formatDiscordUserTag } from "./format.js";
|
|
5
|
-
|
|
6
|
-
export type DiscordSenderIdentity = {
|
|
7
|
-
id: string;
|
|
8
|
-
name?: string;
|
|
9
|
-
tag?: string;
|
|
10
|
-
label: string;
|
|
11
|
-
isPluralKit: boolean;
|
|
12
|
-
pluralkit?: {
|
|
13
|
-
memberId: string;
|
|
14
|
-
memberName?: string;
|
|
15
|
-
systemId?: string;
|
|
16
|
-
systemName?: string;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
type DiscordWebhookMessageLike = {
|
|
21
|
-
webhookId?: string | null;
|
|
22
|
-
webhook_id?: string | null;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
type DiscordMemberLike = {
|
|
26
|
-
nickname?: string | null;
|
|
27
|
-
nick?: string | null;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export function resolveDiscordWebhookId(message: DiscordWebhookMessageLike): string | null {
|
|
31
|
-
const candidate = message.webhookId ?? message.webhook_id;
|
|
32
|
-
return typeof candidate === "string" && candidate.trim() ? candidate.trim() : null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function resolveDiscordSenderIdentity(params: {
|
|
36
|
-
author: User;
|
|
37
|
-
member?: DiscordMemberLike | null;
|
|
38
|
-
pluralkitInfo?: PluralKitMessageInfo | null;
|
|
39
|
-
}): DiscordSenderIdentity {
|
|
40
|
-
const pkInfo = params.pluralkitInfo ?? null;
|
|
41
|
-
const pkMember = pkInfo?.member ?? undefined;
|
|
42
|
-
const pkSystem = pkInfo?.system ?? undefined;
|
|
43
|
-
const memberId = pkMember?.id?.trim();
|
|
44
|
-
const memberNameRaw = pkMember?.display_name ?? pkMember?.name ?? "";
|
|
45
|
-
const memberName = memberNameRaw?.trim();
|
|
46
|
-
if (memberId && memberName) {
|
|
47
|
-
const systemName = pkSystem?.name?.trim();
|
|
48
|
-
const label = systemName ? `${memberName} (PK:${systemName})` : `${memberName} (PK)`;
|
|
49
|
-
return {
|
|
50
|
-
id: memberId,
|
|
51
|
-
name: memberName,
|
|
52
|
-
tag: normalizeOptionalString(pkMember?.name),
|
|
53
|
-
label,
|
|
54
|
-
isPluralKit: true,
|
|
55
|
-
pluralkit: {
|
|
56
|
-
memberId,
|
|
57
|
-
memberName,
|
|
58
|
-
systemId: normalizeOptionalString(pkSystem?.id),
|
|
59
|
-
systemName,
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const senderTag = formatDiscordUserTag(params.author);
|
|
65
|
-
const senderDisplay =
|
|
66
|
-
params.member?.nickname ??
|
|
67
|
-
params.member?.nick ??
|
|
68
|
-
params.author.globalName ??
|
|
69
|
-
params.author.username;
|
|
70
|
-
const senderLabel =
|
|
71
|
-
senderDisplay && senderTag && senderDisplay !== senderTag
|
|
72
|
-
? `${senderDisplay} (${senderTag})`
|
|
73
|
-
: (senderDisplay ?? senderTag ?? params.author.id);
|
|
74
|
-
return {
|
|
75
|
-
id: params.author.id,
|
|
76
|
-
name: params.author.username ?? undefined,
|
|
77
|
-
tag: senderTag,
|
|
78
|
-
label: senderLabel,
|
|
79
|
-
isPluralKit: false,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { formatDiscordStartupStatusMessage } from "./startup-status.js";
|
|
3
|
-
|
|
4
|
-
describe("formatDiscordStartupStatusMessage", () => {
|
|
5
|
-
it("reports logged-in status only after the gateway is ready", () => {
|
|
6
|
-
expect(
|
|
7
|
-
formatDiscordStartupStatusMessage({
|
|
8
|
-
gatewayReady: true,
|
|
9
|
-
botIdentity: "bot-1 (Molty)",
|
|
10
|
-
}),
|
|
11
|
-
).toBe("logged in to discord as bot-1 (Molty)");
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it("reports client initialization while gateway readiness is still pending", () => {
|
|
15
|
-
expect(
|
|
16
|
-
formatDiscordStartupStatusMessage({
|
|
17
|
-
gatewayReady: false,
|
|
18
|
-
botIdentity: "bot-1 (Molty)",
|
|
19
|
-
}),
|
|
20
|
-
).toBe("discord client initialized as bot-1 (Molty); awaiting gateway readiness");
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("handles missing identity without awkward punctuation", () => {
|
|
24
|
-
expect(
|
|
25
|
-
formatDiscordStartupStatusMessage({
|
|
26
|
-
gatewayReady: false,
|
|
27
|
-
}),
|
|
28
|
-
).toBe("discord client initialized; awaiting gateway readiness");
|
|
29
|
-
});
|
|
30
|
-
});
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export function formatDiscordStartupStatusMessage(params: {
|
|
2
|
-
gatewayReady: boolean;
|
|
3
|
-
botIdentity?: string;
|
|
4
|
-
}): string {
|
|
5
|
-
const identitySuffix = params.botIdentity ? ` as ${params.botIdentity}` : "";
|
|
6
|
-
if (params.gatewayReady) {
|
|
7
|
-
return `logged in to discord${identitySuffix}`;
|
|
8
|
-
}
|
|
9
|
-
return `discord client initialized${identitySuffix}; awaiting gateway readiness`;
|
|
10
|
-
}
|
package/src/monitor/status.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
type DiscordMonitorStatusPatch = {
|
|
2
|
-
connected?: boolean;
|
|
3
|
-
lastEventAt?: number | null;
|
|
4
|
-
lastTransportActivityAt?: number | null;
|
|
5
|
-
lastConnectedAt?: number | null;
|
|
6
|
-
lastDisconnect?:
|
|
7
|
-
| string
|
|
8
|
-
| {
|
|
9
|
-
at: number;
|
|
10
|
-
status?: number;
|
|
11
|
-
error?: string;
|
|
12
|
-
loggedOut?: boolean;
|
|
13
|
-
}
|
|
14
|
-
| null;
|
|
15
|
-
lastInboundAt?: number | null;
|
|
16
|
-
lastError?: string | null;
|
|
17
|
-
busy?: boolean;
|
|
18
|
-
activeRuns?: number;
|
|
19
|
-
lastRunActivityAt?: number | null;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export type DiscordMonitorStatusSink = (patch: DiscordMonitorStatusPatch) => void;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { type Message, MessageType } from "../internal/discord.js";
|
|
2
|
-
import { formatDiscordUserTag } from "./format.js";
|
|
3
|
-
|
|
4
|
-
export function resolveDiscordSystemEvent(message: Message, location: string): string | null {
|
|
5
|
-
switch (message.type) {
|
|
6
|
-
case MessageType.ChannelPinnedMessage:
|
|
7
|
-
return buildDiscordSystemEvent(message, location, "pinned a message");
|
|
8
|
-
case MessageType.RecipientAdd:
|
|
9
|
-
return buildDiscordSystemEvent(message, location, "added a recipient");
|
|
10
|
-
case MessageType.RecipientRemove:
|
|
11
|
-
return buildDiscordSystemEvent(message, location, "removed a recipient");
|
|
12
|
-
case MessageType.UserJoin:
|
|
13
|
-
return buildDiscordSystemEvent(message, location, "user joined");
|
|
14
|
-
case MessageType.GuildBoost:
|
|
15
|
-
return buildDiscordSystemEvent(message, location, "boosted the server");
|
|
16
|
-
case MessageType.GuildBoostTier1:
|
|
17
|
-
return buildDiscordSystemEvent(message, location, "boosted the server (Tier 1 reached)");
|
|
18
|
-
case MessageType.GuildBoostTier2:
|
|
19
|
-
return buildDiscordSystemEvent(message, location, "boosted the server (Tier 2 reached)");
|
|
20
|
-
case MessageType.GuildBoostTier3:
|
|
21
|
-
return buildDiscordSystemEvent(message, location, "boosted the server (Tier 3 reached)");
|
|
22
|
-
case MessageType.ThreadCreated:
|
|
23
|
-
return buildDiscordSystemEvent(message, location, "created a thread");
|
|
24
|
-
case MessageType.AutoModerationAction:
|
|
25
|
-
return buildDiscordSystemEvent(message, location, "auto moderation action");
|
|
26
|
-
case MessageType.GuildIncidentAlertModeEnabled:
|
|
27
|
-
return buildDiscordSystemEvent(message, location, "raid protection enabled");
|
|
28
|
-
case MessageType.GuildIncidentAlertModeDisabled:
|
|
29
|
-
return buildDiscordSystemEvent(message, location, "raid protection disabled");
|
|
30
|
-
case MessageType.GuildIncidentReportRaid:
|
|
31
|
-
return buildDiscordSystemEvent(message, location, "raid reported");
|
|
32
|
-
case MessageType.GuildIncidentReportFalseAlarm:
|
|
33
|
-
return buildDiscordSystemEvent(message, location, "raid report marked false alarm");
|
|
34
|
-
case MessageType.StageStart:
|
|
35
|
-
return buildDiscordSystemEvent(message, location, "stage started");
|
|
36
|
-
case MessageType.StageEnd:
|
|
37
|
-
return buildDiscordSystemEvent(message, location, "stage ended");
|
|
38
|
-
case MessageType.StageSpeaker:
|
|
39
|
-
return buildDiscordSystemEvent(message, location, "stage speaker updated");
|
|
40
|
-
case MessageType.StageTopic:
|
|
41
|
-
return buildDiscordSystemEvent(message, location, "stage topic updated");
|
|
42
|
-
case MessageType.PollResult:
|
|
43
|
-
return buildDiscordSystemEvent(message, location, "poll results posted");
|
|
44
|
-
case MessageType.PurchaseNotification:
|
|
45
|
-
return buildDiscordSystemEvent(message, location, "purchase notification");
|
|
46
|
-
default:
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function buildDiscordSystemEvent(message: Message, location: string, action: string) {
|
|
52
|
-
const authorLabel = message.author ? formatDiscordUserTag(message.author) : "";
|
|
53
|
-
const actor = authorLabel ? `${authorLabel} ` : "";
|
|
54
|
-
return `Discord system: ${actor}${action} in ${location}`;
|
|
55
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
|
|
2
|
-
import {
|
|
3
|
-
resolveThreadBindingIdleTimeoutMs,
|
|
4
|
-
resolveThreadBindingMaxAgeMs,
|
|
5
|
-
resolveThreadBindingsEnabled,
|
|
6
|
-
} from "klaw/plugin-sdk/conversation-runtime";
|
|
7
|
-
import { normalizeAccountId } from "klaw/plugin-sdk/routing";
|
|
8
|
-
|
|
9
|
-
export { resolveThreadBindingsEnabled };
|
|
10
|
-
|
|
11
|
-
export function resolveDiscordThreadBindingIdleTimeoutMs(params: {
|
|
12
|
-
cfg: KlawConfig;
|
|
13
|
-
accountId?: string;
|
|
14
|
-
}): number {
|
|
15
|
-
const accountId = normalizeAccountId(params.accountId);
|
|
16
|
-
const root = params.cfg.channels?.discord?.threadBindings;
|
|
17
|
-
const account = params.cfg.channels?.discord?.accounts?.[accountId]?.threadBindings;
|
|
18
|
-
return resolveThreadBindingIdleTimeoutMs({
|
|
19
|
-
channelIdleHoursRaw: account?.idleHours ?? root?.idleHours,
|
|
20
|
-
sessionIdleHoursRaw: params.cfg.session?.threadBindings?.idleHours,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function resolveDiscordThreadBindingMaxAgeMs(params: {
|
|
25
|
-
cfg: KlawConfig;
|
|
26
|
-
accountId?: string;
|
|
27
|
-
}): number {
|
|
28
|
-
const accountId = normalizeAccountId(params.accountId);
|
|
29
|
-
const root = params.cfg.channels?.discord?.threadBindings;
|
|
30
|
-
const account = params.cfg.channels?.discord?.accounts?.[accountId]?.threadBindings;
|
|
31
|
-
return resolveThreadBindingMaxAgeMs({
|
|
32
|
-
channelMaxAgeHoursRaw: account?.maxAgeHours ?? root?.maxAgeHours,
|
|
33
|
-
sessionMaxAgeHoursRaw: params.cfg.session?.threadBindings?.maxAgeHours,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { ChannelType } from "discord-api-types/v10";
|
|
2
|
-
import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
|
|
3
|
-
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import * as discordClientModule from "../client.js";
|
|
5
|
-
import * as discordSendModule from "../send.js";
|
|
6
|
-
import { createDiscordSendReceipt } from "../send.receipt.js";
|
|
7
|
-
import { EMPTY_DISCORD_TEST_CONFIG } from "../test-support/config.js";
|
|
8
|
-
import type { ThreadBindingRecord } from "./thread-bindings.types.js";
|
|
9
|
-
|
|
10
|
-
const DEFAULT_SEND_RESULT = {
|
|
11
|
-
messageId: "msg-1",
|
|
12
|
-
channelId: "thread-1",
|
|
13
|
-
receipt: createDiscordSendReceipt({
|
|
14
|
-
platformMessageIds: ["msg-1"],
|
|
15
|
-
channelId: "thread-1",
|
|
16
|
-
kind: "text",
|
|
17
|
-
}),
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const restGet = vi.fn<(...args: unknown[]) => Promise<unknown>>();
|
|
21
|
-
const sendMessageDiscord = vi.fn<typeof discordSendModule.sendMessageDiscord>();
|
|
22
|
-
const sendWebhookMessageDiscord = vi.fn<typeof discordSendModule.sendWebhookMessageDiscord>();
|
|
23
|
-
const createDiscordRestClient = vi.fn<typeof discordClientModule.createDiscordRestClient>(
|
|
24
|
-
() =>
|
|
25
|
-
({
|
|
26
|
-
rest: {
|
|
27
|
-
get: restGet,
|
|
28
|
-
},
|
|
29
|
-
}) as unknown as ReturnType<typeof discordClientModule.createDiscordRestClient>,
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
let maybeSendBindingMessage: typeof import("./thread-bindings.discord-api.js").maybeSendBindingMessage;
|
|
33
|
-
let resolveChannelIdForBinding: typeof import("./thread-bindings.discord-api.js").resolveChannelIdForBinding;
|
|
34
|
-
|
|
35
|
-
beforeAll(async () => {
|
|
36
|
-
({ maybeSendBindingMessage, resolveChannelIdForBinding } =
|
|
37
|
-
await import("./thread-bindings.discord-api.js"));
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
function resolveTestChannelIdForBinding(
|
|
41
|
-
params: Omit<Parameters<typeof resolveChannelIdForBinding>[0], "cfg"> & {
|
|
42
|
-
cfg?: KlawConfig;
|
|
43
|
-
},
|
|
44
|
-
) {
|
|
45
|
-
return resolveChannelIdForBinding({
|
|
46
|
-
cfg: EMPTY_DISCORD_TEST_CONFIG,
|
|
47
|
-
...params,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function firstMockCall(mock: { mock: { calls: unknown[][] } }, label: string): unknown[] {
|
|
52
|
-
const call = mock.mock.calls.at(0);
|
|
53
|
-
if (!call) {
|
|
54
|
-
throw new Error(`expected ${label} call`);
|
|
55
|
-
}
|
|
56
|
-
return call;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
describe("resolveChannelIdForBinding", () => {
|
|
60
|
-
beforeEach(() => {
|
|
61
|
-
vi.restoreAllMocks();
|
|
62
|
-
restGet.mockReset();
|
|
63
|
-
sendMessageDiscord.mockReset().mockResolvedValue(DEFAULT_SEND_RESULT);
|
|
64
|
-
sendWebhookMessageDiscord.mockReset().mockResolvedValue(DEFAULT_SEND_RESULT);
|
|
65
|
-
createDiscordRestClient.mockReset().mockImplementation(
|
|
66
|
-
() =>
|
|
67
|
-
({
|
|
68
|
-
rest: {
|
|
69
|
-
get: restGet,
|
|
70
|
-
},
|
|
71
|
-
}) as unknown as ReturnType<typeof discordClientModule.createDiscordRestClient>,
|
|
72
|
-
);
|
|
73
|
-
vi.spyOn(discordClientModule, "createDiscordRestClient").mockImplementation(
|
|
74
|
-
(...args) =>
|
|
75
|
-
createDiscordRestClient(...args) as unknown as ReturnType<
|
|
76
|
-
typeof discordClientModule.createDiscordRestClient
|
|
77
|
-
>,
|
|
78
|
-
);
|
|
79
|
-
vi.spyOn(discordSendModule, "sendMessageDiscord").mockImplementation((...args) =>
|
|
80
|
-
sendMessageDiscord(...args),
|
|
81
|
-
);
|
|
82
|
-
vi.spyOn(discordSendModule, "sendWebhookMessageDiscord").mockImplementation((...args) =>
|
|
83
|
-
sendWebhookMessageDiscord(...args),
|
|
84
|
-
);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("returns explicit channelId without resolving route", async () => {
|
|
88
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
89
|
-
accountId: "default",
|
|
90
|
-
threadId: "thread-1",
|
|
91
|
-
channelId: "channel-explicit",
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
expect(resolved).toBe("channel-explicit");
|
|
95
|
-
expect(createDiscordRestClient).not.toHaveBeenCalled();
|
|
96
|
-
expect(restGet).not.toHaveBeenCalled();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it("normalizes prefixed explicit channelId without resolving route", async () => {
|
|
100
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
101
|
-
accountId: "default",
|
|
102
|
-
threadId: "thread-1",
|
|
103
|
-
channelId: "channel:123456789012345678",
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
expect(resolved).toBe("123456789012345678");
|
|
107
|
-
expect(createDiscordRestClient).not.toHaveBeenCalled();
|
|
108
|
-
expect(restGet).not.toHaveBeenCalled();
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("strips channel prefix before resolving route", async () => {
|
|
112
|
-
restGet.mockResolvedValueOnce({
|
|
113
|
-
id: "123456789012345678",
|
|
114
|
-
type: ChannelType.GuildText,
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
118
|
-
accountId: "default",
|
|
119
|
-
threadId: "channel:123456789012345678",
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
expect(resolved).toBe("123456789012345678");
|
|
123
|
-
const route = JSON.stringify(firstMockCall(restGet, "REST get")[0] ?? null);
|
|
124
|
-
expect(route).toContain("123456789012345678");
|
|
125
|
-
expect(route).not.toContain("channel:");
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it("returns parent channel for thread channels", async () => {
|
|
129
|
-
restGet.mockResolvedValueOnce({
|
|
130
|
-
id: "thread-1",
|
|
131
|
-
type: ChannelType.PublicThread,
|
|
132
|
-
parent_id: "channel-parent",
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
136
|
-
accountId: "default",
|
|
137
|
-
threadId: "thread-1",
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
expect(resolved).toBe("channel-parent");
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("forwards cfg when resolving channel id through Discord client", async () => {
|
|
144
|
-
const cfg = {
|
|
145
|
-
channels: { discord: { token: "tok" } },
|
|
146
|
-
} as KlawConfig;
|
|
147
|
-
restGet.mockResolvedValueOnce({
|
|
148
|
-
id: "thread-1",
|
|
149
|
-
type: ChannelType.PublicThread,
|
|
150
|
-
parent_id: "channel-parent",
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
await resolveTestChannelIdForBinding({
|
|
154
|
-
cfg,
|
|
155
|
-
accountId: "default",
|
|
156
|
-
threadId: "thread-1",
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
expect(
|
|
160
|
-
(
|
|
161
|
-
firstMockCall(createDiscordRestClient, "createDiscordRestClient")[0] as
|
|
162
|
-
| { cfg?: KlawConfig }
|
|
163
|
-
| undefined
|
|
164
|
-
)?.cfg,
|
|
165
|
-
).toBe(cfg);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("keeps non-thread channel id even when parent_id exists", async () => {
|
|
169
|
-
restGet.mockResolvedValueOnce({
|
|
170
|
-
id: "channel-text",
|
|
171
|
-
type: ChannelType.GuildText,
|
|
172
|
-
parent_id: "category-1",
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
176
|
-
accountId: "default",
|
|
177
|
-
threadId: "channel-text",
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
expect(resolved).toBe("channel-text");
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it("keeps forum channel id instead of parent category", async () => {
|
|
184
|
-
restGet.mockResolvedValueOnce({
|
|
185
|
-
id: "forum-1",
|
|
186
|
-
type: ChannelType.GuildForum,
|
|
187
|
-
parent_id: "category-1",
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
const resolved = await resolveTestChannelIdForBinding({
|
|
191
|
-
accountId: "default",
|
|
192
|
-
threadId: "forum-1",
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
expect(resolved).toBe("forum-1");
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
describe("maybeSendBindingMessage", () => {
|
|
200
|
-
beforeEach(() => {
|
|
201
|
-
vi.restoreAllMocks();
|
|
202
|
-
sendMessageDiscord.mockReset().mockResolvedValue(DEFAULT_SEND_RESULT);
|
|
203
|
-
sendWebhookMessageDiscord.mockReset().mockResolvedValue(DEFAULT_SEND_RESULT);
|
|
204
|
-
vi.spyOn(discordSendModule, "sendMessageDiscord").mockImplementation((...args) =>
|
|
205
|
-
sendMessageDiscord(...args),
|
|
206
|
-
);
|
|
207
|
-
vi.spyOn(discordSendModule, "sendWebhookMessageDiscord").mockImplementation((...args) =>
|
|
208
|
-
sendWebhookMessageDiscord(...args),
|
|
209
|
-
);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it("forwards cfg to webhook send path", async () => {
|
|
213
|
-
const cfg = {
|
|
214
|
-
channels: { discord: { token: "tok" } },
|
|
215
|
-
} as KlawConfig;
|
|
216
|
-
const record = {
|
|
217
|
-
accountId: "default",
|
|
218
|
-
channelId: "parent-1",
|
|
219
|
-
threadId: "thread-1",
|
|
220
|
-
targetKind: "subagent",
|
|
221
|
-
targetSessionKey: "agent:main:subagent:test",
|
|
222
|
-
agentId: "main",
|
|
223
|
-
boundBy: "test",
|
|
224
|
-
boundAt: Date.now(),
|
|
225
|
-
lastActivityAt: Date.now(),
|
|
226
|
-
webhookId: "wh_1",
|
|
227
|
-
webhookToken: "tok_1",
|
|
228
|
-
} satisfies ThreadBindingRecord;
|
|
229
|
-
|
|
230
|
-
await maybeSendBindingMessage({
|
|
231
|
-
cfg,
|
|
232
|
-
record,
|
|
233
|
-
text: "hello webhook",
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
expect(sendWebhookMessageDiscord).toHaveBeenCalledTimes(1);
|
|
237
|
-
expect(firstMockCall(sendWebhookMessageDiscord, "sendWebhookMessageDiscord")).toEqual([
|
|
238
|
-
"hello webhook",
|
|
239
|
-
{
|
|
240
|
-
cfg,
|
|
241
|
-
webhookId: "wh_1",
|
|
242
|
-
webhookToken: "tok_1",
|
|
243
|
-
accountId: "default",
|
|
244
|
-
threadId: "thread-1",
|
|
245
|
-
username: "⚙️ main",
|
|
246
|
-
},
|
|
247
|
-
]);
|
|
248
|
-
expect(sendMessageDiscord).not.toHaveBeenCalled();
|
|
249
|
-
});
|
|
250
|
-
});
|