@spinabot/brigade 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +51 -1
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/channels/bundled-channel-metas.d.ts +2 -0
- package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
- package/dist/agents/channels/bundled-channel-metas.js +11 -0
- package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
- package/dist/agents/channels/discord/account-config.d.ts +177 -0
- package/dist/agents/channels/discord/account-config.d.ts.map +1 -0
- package/dist/agents/channels/discord/account-config.js +349 -0
- package/dist/agents/channels/discord/account-config.js.map +1 -0
- package/dist/agents/channels/discord/adapter.d.ts +79 -0
- package/dist/agents/channels/discord/adapter.d.ts.map +1 -0
- package/dist/agents/channels/discord/adapter.js +693 -0
- package/dist/agents/channels/discord/adapter.js.map +1 -0
- package/dist/agents/channels/discord/approval-authorize.d.ts +43 -0
- package/dist/agents/channels/discord/approval-authorize.d.ts.map +1 -0
- package/dist/agents/channels/discord/approval-authorize.js +71 -0
- package/dist/agents/channels/discord/approval-authorize.js.map +1 -0
- package/dist/agents/channels/discord/approval-native.d.ts +68 -0
- package/dist/agents/channels/discord/approval-native.d.ts.map +1 -0
- package/dist/agents/channels/discord/approval-native.js +81 -0
- package/dist/agents/channels/discord/approval-native.js.map +1 -0
- package/dist/agents/channels/discord/command-menu.d.ts +49 -0
- package/dist/agents/channels/discord/command-menu.d.ts.map +1 -0
- package/dist/agents/channels/discord/command-menu.js +73 -0
- package/dist/agents/channels/discord/command-menu.js.map +1 -0
- package/dist/agents/channels/discord/component-blocks.d.ts +108 -0
- package/dist/agents/channels/discord/component-blocks.d.ts.map +1 -0
- package/dist/agents/channels/discord/component-blocks.js +113 -0
- package/dist/agents/channels/discord/component-blocks.js.map +1 -0
- package/dist/agents/channels/discord/components.d.ts +175 -0
- package/dist/agents/channels/discord/components.d.ts.map +1 -0
- package/dist/agents/channels/discord/components.js +220 -0
- package/dist/agents/channels/discord/components.js.map +1 -0
- package/dist/agents/channels/discord/connection.d.ts +570 -0
- package/dist/agents/channels/discord/connection.d.ts.map +1 -0
- package/dist/agents/channels/discord/connection.js +1600 -0
- package/dist/agents/channels/discord/connection.js.map +1 -0
- package/dist/agents/channels/discord/directory-cache.d.ts +47 -0
- package/dist/agents/channels/discord/directory-cache.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-cache.js +131 -0
- package/dist/agents/channels/discord/directory-cache.js.map +1 -0
- package/dist/agents/channels/discord/directory-live.d.ts +61 -0
- package/dist/agents/channels/discord/directory-live.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-live.js +140 -0
- package/dist/agents/channels/discord/directory-live.js.map +1 -0
- package/dist/agents/channels/discord/draft-stream.d.ts +92 -0
- package/dist/agents/channels/discord/draft-stream.d.ts.map +1 -0
- package/dist/agents/channels/discord/draft-stream.js +213 -0
- package/dist/agents/channels/discord/draft-stream.js.map +1 -0
- package/dist/agents/channels/discord/format.d.ts +70 -0
- package/dist/agents/channels/discord/format.d.ts.map +1 -0
- package/dist/agents/channels/discord/format.js +303 -0
- package/dist/agents/channels/discord/format.js.map +1 -0
- package/dist/agents/channels/discord/guilds.d.ts +25 -0
- package/dist/agents/channels/discord/guilds.d.ts.map +1 -0
- package/dist/agents/channels/discord/guilds.js +46 -0
- package/dist/agents/channels/discord/guilds.js.map +1 -0
- package/dist/agents/channels/discord/inbound-extras.d.ts +377 -0
- package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -0
- package/dist/agents/channels/discord/inbound-extras.js +589 -0
- package/dist/agents/channels/discord/inbound-extras.js.map +1 -0
- package/dist/agents/channels/discord/index.d.ts +21 -0
- package/dist/agents/channels/discord/index.d.ts.map +1 -0
- package/dist/agents/channels/discord/index.js +21 -0
- package/dist/agents/channels/discord/index.js.map +1 -0
- package/dist/agents/channels/discord/media.d.ts +85 -0
- package/dist/agents/channels/discord/media.d.ts.map +1 -0
- package/dist/agents/channels/discord/media.js +242 -0
- package/dist/agents/channels/discord/media.js.map +1 -0
- package/dist/agents/channels/discord/modal-registry.d.ts +89 -0
- package/dist/agents/channels/discord/modal-registry.d.ts.map +1 -0
- package/dist/agents/channels/discord/modal-registry.js +104 -0
- package/dist/agents/channels/discord/modal-registry.js.map +1 -0
- package/dist/agents/channels/discord/modals.d.ts +100 -0
- package/dist/agents/channels/discord/modals.d.ts.map +1 -0
- package/dist/agents/channels/discord/modals.js +124 -0
- package/dist/agents/channels/discord/modals.js.map +1 -0
- package/dist/agents/channels/discord/module.d.ts +15 -0
- package/dist/agents/channels/discord/module.d.ts.map +1 -0
- package/dist/agents/channels/discord/module.js +22 -0
- package/dist/agents/channels/discord/module.js.map +1 -0
- package/dist/agents/channels/discord/permission-audit.d.ts +43 -0
- package/dist/agents/channels/discord/permission-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/permission-audit.js +192 -0
- package/dist/agents/channels/discord/permission-audit.js.map +1 -0
- package/dist/agents/channels/discord/plugin.d.ts +89 -0
- package/dist/agents/channels/discord/plugin.d.ts.map +1 -0
- package/dist/agents/channels/discord/plugin.js +372 -0
- package/dist/agents/channels/discord/plugin.js.map +1 -0
- package/dist/agents/channels/discord/probe.d.ts +115 -0
- package/dist/agents/channels/discord/probe.d.ts.map +1 -0
- package/dist/agents/channels/discord/probe.js +193 -0
- package/dist/agents/channels/discord/probe.js.map +1 -0
- package/dist/agents/channels/discord/reasoning-lane.d.ts +42 -0
- package/dist/agents/channels/discord/reasoning-lane.d.ts.map +1 -0
- package/dist/agents/channels/discord/reasoning-lane.js +68 -0
- package/dist/agents/channels/discord/reasoning-lane.js.map +1 -0
- package/dist/agents/channels/discord/rest-actions.d.ts +346 -0
- package/dist/agents/channels/discord/rest-actions.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-actions.js +559 -0
- package/dist/agents/channels/discord/rest-actions.js.map +1 -0
- package/dist/agents/channels/discord/rest-components.d.ts +122 -0
- package/dist/agents/channels/discord/rest-components.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-components.js +243 -0
- package/dist/agents/channels/discord/rest-components.js.map +1 -0
- package/dist/agents/channels/discord/security-audit.d.ts +29 -0
- package/dist/agents/channels/discord/security-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-audit.js +94 -0
- package/dist/agents/channels/discord/security-audit.js.map +1 -0
- package/dist/agents/channels/discord/security-doctor.d.ts +43 -0
- package/dist/agents/channels/discord/security-doctor.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-doctor.js +83 -0
- package/dist/agents/channels/discord/security-doctor.js.map +1 -0
- package/dist/agents/channels/discord/status-issues.d.ts +37 -0
- package/dist/agents/channels/discord/status-issues.d.ts.map +1 -0
- package/dist/agents/channels/discord/status-issues.js +66 -0
- package/dist/agents/channels/discord/status-issues.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts +57 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js +98 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts +95 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js +208 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js.map +1 -0
- package/dist/agents/channels/discord/system-events.d.ts +31 -0
- package/dist/agents/channels/discord/system-events.d.ts.map +1 -0
- package/dist/agents/channels/discord/system-events.js +74 -0
- package/dist/agents/channels/discord/system-events.js.map +1 -0
- package/dist/agents/channels/general-callback.d.ts +12 -0
- package/dist/agents/channels/general-callback.d.ts.map +1 -1
- package/dist/agents/channels/general-callback.js +18 -0
- package/dist/agents/channels/general-callback.js.map +1 -1
- package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
- package/dist/agents/channels/inbound-pipeline.js +70 -10
- package/dist/agents/channels/inbound-pipeline.js.map +1 -1
- package/dist/agents/channels/sdk.d.ts +2 -0
- package/dist/agents/channels/sdk.d.ts.map +1 -1
- package/dist/agents/channels/sdk.js +2 -0
- package/dist/agents/channels/sdk.js.map +1 -1
- package/dist/agents/extensions/modules/index.d.ts.map +1 -1
- package/dist/agents/extensions/modules/index.js +5 -0
- package/dist/agents/extensions/modules/index.js.map +1 -1
- package/dist/agents/extensions/types.d.ts +7 -0
- package/dist/agents/extensions/types.d.ts.map +1 -1
- package/dist/agents/extensions/types.js.map +1 -1
- package/dist/agents/subagent-announce-delivery.d.ts +10 -0
- package/dist/agents/subagent-announce-delivery.d.ts.map +1 -1
- package/dist/agents/subagent-announce-delivery.js +1 -0
- package/dist/agents/subagent-announce-delivery.js.map +1 -1
- package/dist/agents/subagent-completion-bridge.d.ts.map +1 -1
- package/dist/agents/subagent-completion-bridge.js +81 -0
- package/dist/agents/subagent-completion-bridge.js.map +1 -1
- package/dist/agents/subagent-spawn.d.ts.map +1 -1
- package/dist/agents/subagent-spawn.js +57 -4
- package/dist/agents/subagent-spawn.js.map +1 -1
- package/dist/agents/tools/cron-tool.d.ts.map +1 -1
- package/dist/agents/tools/cron-tool.js +4 -1
- package/dist/agents/tools/cron-tool.js.map +1 -1
- package/dist/agents/tools/discord-action-tool.d.ts +224 -0
- package/dist/agents/tools/discord-action-tool.d.ts.map +1 -0
- package/dist/agents/tools/discord-action-tool.js +848 -0
- package/dist/agents/tools/discord-action-tool.js.map +1 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +21 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/agents/tools/sessions/index.d.ts +8 -0
- package/dist/agents/tools/sessions/index.d.ts.map +1 -1
- package/dist/agents/tools/sessions/index.js +15 -3
- package/dist/agents/tools/sessions/index.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/channels.d.ts +2 -0
- package/dist/cli/commands/channels.d.ts.map +1 -1
- package/dist/cli/commands/channels.js +58 -1
- package/dist/cli/commands/channels.js.map +1 -1
- package/dist/core/auth-bridge.d.ts +1 -0
- package/dist/core/auth-bridge.d.ts.map +1 -1
- package/dist/core/auth-bridge.js +46 -1
- package/dist/core/auth-bridge.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +18 -2
- package/dist/core/server.js.map +1 -1
- package/dist/cron/isolated-agent/run-executor.d.ts +11 -0
- package/dist/cron/isolated-agent/run-executor.d.ts.map +1 -1
- package/dist/cron/isolated-agent/run-executor.js +20 -4
- package/dist/cron/isolated-agent/run-executor.js.map +1 -1
- package/dist/cron/types.d.ts +8 -0
- package/dist/cron/types.d.ts.map +1 -1
- package/dist/system-prompt/assembler.d.ts.map +1 -1
- package/dist/system-prompt/assembler.js +4 -2
- package/dist/system-prompt/assembler.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord connection (Gateway WebSocket inbound + REST outbound).
|
|
3
|
+
*
|
|
4
|
+
* The Brigade analogue of `slack/connection.ts`, on top of discord.js v14. A
|
|
5
|
+
* single `Client` owns BOTH halves: the Gateway websocket delivers INBOUND
|
|
6
|
+
* events (no public URL needed — the local-first default, analogous to Slack
|
|
7
|
+
* Socket Mode / Telegram long-polling), and the same Client's REST drives every
|
|
8
|
+
* OUTBOUND call (send / edit / delete / react / upload / typing). `discord.js`
|
|
9
|
+
* is lazy-imported here (`await import("discord.js")` inside `connectDiscord`)
|
|
10
|
+
* so a non-Discord boot never pays for it; types are `type`-only on the static
|
|
11
|
+
* import so the static import never pulls the runtime in.
|
|
12
|
+
*
|
|
13
|
+
* Lifecycle:
|
|
14
|
+
* - `client.login(botToken)` BOOTSTRAPS the connection. An invalid token
|
|
15
|
+
* rejects login → TERMINAL (the only fix is a fresh token, mirroring Slack's
|
|
16
|
+
* `tokenInvalid`). The bot's own user id is cached on `ClientReady` (the
|
|
17
|
+
* group ACL needs it to detect `<@bot>` mentions + to filter the bot's own
|
|
18
|
+
* echoes; without it group messages never reach the agent and the bot could
|
|
19
|
+
* reply to itself).
|
|
20
|
+
* - Event handlers subscribe messageCreate / messageUpdate (edit) /
|
|
21
|
+
* messageDelete / messageReactionAdd / messageReactionRemove /
|
|
22
|
+
* interactionCreate (button presses = approval + general callbacks, and
|
|
23
|
+
* slash commands). Each normalizes the payload into a `DiscordInboundMessage`
|
|
24
|
+
* and routes it via `onMessage` / `onCallbackQuery` / `onReaction`.
|
|
25
|
+
* Attachment bytes are downloaded via a DEFERRED `resolveMedia` thunk — only
|
|
26
|
+
* after the central access gate admits the sender (mirrors Slack/Telegram).
|
|
27
|
+
* - discord.js auto-reconnects the Gateway internally; we SUPERVISE the initial
|
|
28
|
+
* `.login()` with the SAME backoff curve as Slack (2s → 30s, ×1.8, ±25%) and
|
|
29
|
+
* go terminal on an auth error.
|
|
30
|
+
* - Events are de-duplicated by message id (a redelivered event after a
|
|
31
|
+
* reconnect must not double-run the agent).
|
|
32
|
+
*/
|
|
33
|
+
import { type InboundMediaAttachment, type InboundReplyContext, type OutboundMedia } from "../sdk.js";
|
|
34
|
+
import { type DiscordActionRow, type DiscordSelectSpec } from "./components.js";
|
|
35
|
+
import { type DiscordV2MessageSpec } from "./component-blocks.js";
|
|
36
|
+
import { type DiscordModalEntry } from "./modal-registry.js";
|
|
37
|
+
/**
|
|
38
|
+
* Jittered exponential backoff for reconnect attempt `attempt` (0-based). Thin
|
|
39
|
+
* wrapper over the neutral `nextBackoffDelay` helper — kept as a named export so
|
|
40
|
+
* `index.ts` + the connection tests have a stable entry point.
|
|
41
|
+
*/
|
|
42
|
+
export declare function discordBackoffDelay(attempt: number): number;
|
|
43
|
+
/** Discord's hard per-message content limit (chars). Sends chunk under this. */
|
|
44
|
+
declare const DISCORD_MESSAGE_LIMIT = 2000;
|
|
45
|
+
/** A normalized inbound Discord message (text and/or attachments). Mirrors `SlackInboundMessage`. */
|
|
46
|
+
export interface DiscordInboundMessage {
|
|
47
|
+
/** Channel id (the conversation id). For a thread this is the thread channel id. */
|
|
48
|
+
conversationId: string;
|
|
49
|
+
/** Discord message id (snowflake) — surfaces for reply / edit / delete targeting. */
|
|
50
|
+
messageId?: string;
|
|
51
|
+
/** When Discord created the message (epoch ms). */
|
|
52
|
+
messageTimestampMs?: number;
|
|
53
|
+
/** Sender user id (snowflake). */
|
|
54
|
+
from: string;
|
|
55
|
+
/** Sender display name (nickname / global name / username). */
|
|
56
|
+
fromName?: string;
|
|
57
|
+
/** Plain message text (token-expanded). May be empty for attachment-only messages. */
|
|
58
|
+
text: string;
|
|
59
|
+
/** `direct` (DM) or `group` (guild text / thread). */
|
|
60
|
+
chatType: "direct" | "group";
|
|
61
|
+
/**
|
|
62
|
+
* Guild (server) id this message arrived in — feeds the route resolver's
|
|
63
|
+
* `binding.guild` (+ `guild+roles`) tier. Discord uses `guildId`, NOT `teamId`
|
|
64
|
+
* (that tier is Slack's workspace id); a Discord inbound never sets `teamId` so
|
|
65
|
+
* it can't collide with a Slack team binding.
|
|
66
|
+
*/
|
|
67
|
+
guildId?: string;
|
|
68
|
+
/**
|
|
69
|
+
* The sending member's guild-role ids (ids only — never names). Populated for a
|
|
70
|
+
* guild message; empty/omitted for a DM. The resolver's `guild+roles` tier
|
|
71
|
+
* matches when ANY of these overlaps a binding's `roles[]`.
|
|
72
|
+
*/
|
|
73
|
+
memberRoleIds?: string[];
|
|
74
|
+
/** Thread channel id, when the message belongs to a thread. */
|
|
75
|
+
threadId?: string;
|
|
76
|
+
/** User ids `<@…>`-mentioned (incl. the bot's own id when addressed). */
|
|
77
|
+
mentions?: string[];
|
|
78
|
+
/** Quoted-reply context, when this message replies to another. */
|
|
79
|
+
replyTo?: InboundReplyContext;
|
|
80
|
+
/**
|
|
81
|
+
* DEFERRED media download. The connection layer does NOT download eagerly —
|
|
82
|
+
* the pipeline invokes this ONLY after the access gate admits the sender, so a
|
|
83
|
+
* blocked stranger's attachment is never fetched. Resolves to an empty array
|
|
84
|
+
* for text-only messages.
|
|
85
|
+
*/
|
|
86
|
+
resolveMedia?: () => Promise<InboundMediaAttachment[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Inline-button callback context — present ONLY when this inbound is a button
|
|
89
|
+
* press rather than a typed message. `data` is the opaque payload the pressed
|
|
90
|
+
* button declared at send time (an approval-callback codec string OR a
|
|
91
|
+
* general-prefixed token); `callbackId` is the interaction id (so the press
|
|
92
|
+
* can be acked). `values` carries the chosen value(s) when the press came from
|
|
93
|
+
* a SELECT menu (entity selects prefix ids: `user:` / `role:` / `channel:` /
|
|
94
|
+
* `mentionable:`); a plain button press carries no `values`. Undefined for
|
|
95
|
+
* ordinary messages.
|
|
96
|
+
*/
|
|
97
|
+
callbackQuery?: {
|
|
98
|
+
data: string;
|
|
99
|
+
callbackId: string;
|
|
100
|
+
values?: string[];
|
|
101
|
+
};
|
|
102
|
+
/** True when this inbound is a message edit (text carries the NEW text). */
|
|
103
|
+
edited?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Inbound reaction context — present ONLY when this inbound is a reaction-add.
|
|
106
|
+
* `emojis` are the newly-added reaction emoji name(s); `targetMessageId` is the
|
|
107
|
+
* message they landed on; `targetAuthorId` is the author of the reacted message
|
|
108
|
+
* (so the adapter can gate `reactionNotifications: "own"`). Undefined for typed
|
|
109
|
+
* messages.
|
|
110
|
+
*/
|
|
111
|
+
reaction?: {
|
|
112
|
+
emojis: string[];
|
|
113
|
+
targetMessageId: string;
|
|
114
|
+
targetAuthorId?: string;
|
|
115
|
+
};
|
|
116
|
+
/** Raw discord.js object (for adapters that need more). */
|
|
117
|
+
raw: unknown;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The minimal slice of discord.js's `Client` the connection drives. Declared as
|
|
121
|
+
* an interface (rather than importing the concrete class) so tests inject a fake
|
|
122
|
+
* with zero network — the runtime path builds a real `Client` and it
|
|
123
|
+
* structurally satisfies this shape.
|
|
124
|
+
*/
|
|
125
|
+
/**
|
|
126
|
+
* The discord.js `PresenceData` shape the connection sets via
|
|
127
|
+
* `client.user.setPresence(...)`. `status` is the online dot; `activities` is at
|
|
128
|
+
* most one activity row (name + numeric `ActivityType` + optional `url` for a
|
|
129
|
+
* streaming activity + optional `state` for a custom activity).
|
|
130
|
+
*/
|
|
131
|
+
export interface DiscordPresencePayload {
|
|
132
|
+
status?: "online" | "idle" | "dnd" | "invisible";
|
|
133
|
+
activities?: Array<{
|
|
134
|
+
name: string;
|
|
135
|
+
type: number;
|
|
136
|
+
url?: string;
|
|
137
|
+
state?: string;
|
|
138
|
+
}>;
|
|
139
|
+
}
|
|
140
|
+
export interface DiscordClientLike {
|
|
141
|
+
/** Subscribe a Gateway event handler (`messageCreate`, `interactionCreate`, …). */
|
|
142
|
+
on(event: string, handler: (...args: never[]) => unknown): unknown;
|
|
143
|
+
once(event: string, handler: (...args: never[]) => unknown): unknown;
|
|
144
|
+
/** Open the Gateway connection with the bot token. Rejects on an invalid token. */
|
|
145
|
+
login(token: string): Promise<string>;
|
|
146
|
+
/** Tear down the connection + websocket. */
|
|
147
|
+
destroy(): Promise<void> | void;
|
|
148
|
+
/**
|
|
149
|
+
* The bot user once ready (carries `.id` + `.username`), else null. discord.js
|
|
150
|
+
* exposes `setPresence(data)` on `client.user` once the Gateway is ready — used
|
|
151
|
+
* to apply the configured presence/activity (Phase 5).
|
|
152
|
+
*/
|
|
153
|
+
user: {
|
|
154
|
+
id?: string;
|
|
155
|
+
username?: string;
|
|
156
|
+
setPresence?: (data: DiscordPresencePayload) => unknown;
|
|
157
|
+
} | null;
|
|
158
|
+
/** REST handle for application-command registration + raw calls. */
|
|
159
|
+
rest?: {
|
|
160
|
+
put(route: unknown, options?: {
|
|
161
|
+
body?: unknown;
|
|
162
|
+
}): Promise<unknown>;
|
|
163
|
+
};
|
|
164
|
+
/** Resolve a channel by id (used by outbound to fetch the send target). */
|
|
165
|
+
channels: {
|
|
166
|
+
fetch(id: string): Promise<DiscordSendChannelLike | null>;
|
|
167
|
+
};
|
|
168
|
+
/** Resolve a user by id (used to open a DM channel). */
|
|
169
|
+
users?: {
|
|
170
|
+
fetch(id: string): Promise<{
|
|
171
|
+
createDM(): Promise<DiscordSendChannelLike>;
|
|
172
|
+
} | null>;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** The outbound surface a resolved channel exposes (send / typing). */
|
|
176
|
+
export interface DiscordSendChannelLike {
|
|
177
|
+
id?: string;
|
|
178
|
+
/**
|
|
179
|
+
* discord.js `ChannelType` enum value. A `GuildForum` (15) / `GuildMedia` (16)
|
|
180
|
+
* channel REJECTS a plain `.send()` — the outbound path must open a thread
|
|
181
|
+
* (forum post) instead (Fix 2b).
|
|
182
|
+
*/
|
|
183
|
+
type?: number;
|
|
184
|
+
/** True for a text-capable channel (guild text, DM, thread). */
|
|
185
|
+
isTextBased?: () => boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Post a message. `options` is discord.js `MessageCreateOptions` (content +
|
|
188
|
+
* optional `components` + `files` + `reply` + `allowedMentions`). Returns the
|
|
189
|
+
* sent message (carrying `.id`).
|
|
190
|
+
*/
|
|
191
|
+
send(options: DiscordSendOptions): Promise<DiscordSentMessageLike>;
|
|
192
|
+
/**
|
|
193
|
+
* Thread manager — present on forum/media/text channels. `create` opens a new
|
|
194
|
+
* thread; for a forum/media channel it MUST carry a starter `message` (Discord
|
|
195
|
+
* rejects an empty forum post). Used by the forum auto-thread path (Fix 2b).
|
|
196
|
+
*/
|
|
197
|
+
threads?: {
|
|
198
|
+
create(options: DiscordThreadCreateOptions): Promise<DiscordThreadCreateResult>;
|
|
199
|
+
};
|
|
200
|
+
/** Fetch a message in this channel by id (for edit / delete / react). */
|
|
201
|
+
messages?: {
|
|
202
|
+
fetch(id: string): Promise<DiscordSentMessageLike | null>;
|
|
203
|
+
};
|
|
204
|
+
/** Show the typing indicator (best-effort). */
|
|
205
|
+
sendTyping?: () => Promise<unknown>;
|
|
206
|
+
}
|
|
207
|
+
/** Forum/media post creation options (the subset the connection sets). */
|
|
208
|
+
export interface DiscordThreadCreateOptions {
|
|
209
|
+
/** Thread title (Discord caps at 100 chars). */
|
|
210
|
+
name: string;
|
|
211
|
+
/** Starter message — REQUIRED for a forum/media post. */
|
|
212
|
+
message: {
|
|
213
|
+
content?: string;
|
|
214
|
+
flags?: number;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* The created thread handle. discord.js returns a `ThreadChannel` carrying its
|
|
219
|
+
* own `.id` and (on a forum post) the starter `.lastMessage` / a fetchable
|
|
220
|
+
* starter message; we read whichever id is available.
|
|
221
|
+
*/
|
|
222
|
+
export interface DiscordThreadCreateResult {
|
|
223
|
+
id?: string;
|
|
224
|
+
/** Some discord.js versions expose the starter message directly. */
|
|
225
|
+
lastMessage?: {
|
|
226
|
+
id?: string;
|
|
227
|
+
} | null;
|
|
228
|
+
}
|
|
229
|
+
/** A sent / fetched message handle the outbound path acts on. */
|
|
230
|
+
export interface DiscordSentMessageLike {
|
|
231
|
+
id?: string;
|
|
232
|
+
edit(options: DiscordSendOptions | string): Promise<DiscordSentMessageLike>;
|
|
233
|
+
delete(): Promise<unknown>;
|
|
234
|
+
react(emoji: string): Promise<unknown>;
|
|
235
|
+
/**
|
|
236
|
+
* Start a thread off this message (Phase 5 autoThread). discord.js
|
|
237
|
+
* `message.startThread({ name, autoArchiveDuration })` returns the created
|
|
238
|
+
* `ThreadChannel` (carrying `.id`). Optional — a minimal fake can omit it.
|
|
239
|
+
*/
|
|
240
|
+
startThread?: (options: {
|
|
241
|
+
name: string;
|
|
242
|
+
autoArchiveDuration?: number;
|
|
243
|
+
}) => Promise<{
|
|
244
|
+
id?: string;
|
|
245
|
+
}>;
|
|
246
|
+
/** Some discord.js versions surface an already-created thread on the message. */
|
|
247
|
+
thread?: {
|
|
248
|
+
id?: string;
|
|
249
|
+
} | null;
|
|
250
|
+
/** True when a thread already hangs off this message. */
|
|
251
|
+
hasThread?: boolean;
|
|
252
|
+
/** Pin this message (Fix 2e). */
|
|
253
|
+
pin?: () => Promise<unknown>;
|
|
254
|
+
/** Unpin this message (Fix 2e). */
|
|
255
|
+
unpin?: () => Promise<unknown>;
|
|
256
|
+
/** The bot's own reactions live under `.reactions.cache`; used by removeOwnReactions. */
|
|
257
|
+
reactions?: {
|
|
258
|
+
cache?: Map<string, DiscordReactionLike> | Iterable<DiscordReactionLike>;
|
|
259
|
+
removeAll?: () => Promise<unknown>;
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/** A reaction on a message (the subset removeOwnReactions reads). */
|
|
263
|
+
export interface DiscordReactionLike {
|
|
264
|
+
emoji?: {
|
|
265
|
+
name?: string | null;
|
|
266
|
+
id?: string | null;
|
|
267
|
+
};
|
|
268
|
+
/** True when the bot itself placed this reaction. */
|
|
269
|
+
me?: boolean;
|
|
270
|
+
/** Remove this reaction (optionally for a specific user). */
|
|
271
|
+
users?: {
|
|
272
|
+
remove(userId?: string): Promise<unknown>;
|
|
273
|
+
};
|
|
274
|
+
remove?: () => Promise<unknown>;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* discord.js `AllowedMentionsTypes` parse values the connection sets. We
|
|
278
|
+
* deliberately NEVER include `"everyone"` so an agent / prompt-injected
|
|
279
|
+
* `@everyone` / `@here` in the content renders as plain text but does NOT
|
|
280
|
+
* notify everyone — while explicit `<@id>` user + `<@&roleid>` role pings still
|
|
281
|
+
* work (their type IS parsed).
|
|
282
|
+
*/
|
|
283
|
+
export type DiscordAllowedMentionParse = "users" | "roles";
|
|
284
|
+
/**
|
|
285
|
+
* The `allowedMentions` shape the connection sets on every outbound send. `parse`
|
|
286
|
+
* whitelists which mention CLASSES notify (we use `["users", "roles"]`);
|
|
287
|
+
* omitting `"everyone"` is what kills the mass-ping vector. `repliedUser:false`
|
|
288
|
+
* stops a native reply from also pinging the replied-to author.
|
|
289
|
+
*/
|
|
290
|
+
export interface DiscordAllowedMentions {
|
|
291
|
+
parse?: DiscordAllowedMentionParse[];
|
|
292
|
+
repliedUser?: boolean;
|
|
293
|
+
}
|
|
294
|
+
/** discord.js `MessageCreateOptions` subset the connection emits. */
|
|
295
|
+
export interface DiscordSendOptions {
|
|
296
|
+
content?: string;
|
|
297
|
+
components?: unknown[];
|
|
298
|
+
files?: unknown[];
|
|
299
|
+
reply?: {
|
|
300
|
+
messageReference: string;
|
|
301
|
+
failIfNotExists: boolean;
|
|
302
|
+
};
|
|
303
|
+
allowedMentions?: DiscordAllowedMentions;
|
|
304
|
+
/**
|
|
305
|
+
* Message flags bitfield. The connection sets `MessageFlags.SuppressNotifications`
|
|
306
|
+
* (1 << 12 = 4096) for a silent send (Fix 2c) so the recipient gets no push/ping.
|
|
307
|
+
*/
|
|
308
|
+
flags?: number;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* The SAFE default `allowedMentions` applied to every outbound Discord send.
|
|
312
|
+
* `parse: ["users", "roles"]` lets explicit `<@id>` / `<@&roleid>` mentions ping
|
|
313
|
+
* as intended, while the absence of `"everyone"` means an `@everyone` / `@here`
|
|
314
|
+
* that slipped into the content (agent text or a prompt injection) renders as
|
|
315
|
+
* text and notifies no one. `repliedUser: false` keeps a native reply from
|
|
316
|
+
* pinging the author it answers. A fresh object is returned per call so a send
|
|
317
|
+
* can't mutate the shared default.
|
|
318
|
+
*/
|
|
319
|
+
export declare function safeDiscordAllowedMentions(): DiscordAllowedMentions;
|
|
320
|
+
/**
|
|
321
|
+
* Sanitize a string into a Discord thread name (Phase 5 autoThread): take the
|
|
322
|
+
* first non-empty line, strip user/role/channel mention markup, collapse
|
|
323
|
+
* whitespace, and truncate to Discord's 100-char limit. Falls back to
|
|
324
|
+
* `"Thread <id>"` when nothing usable remains.
|
|
325
|
+
*/
|
|
326
|
+
export declare function sanitizeThreadName(raw: string, fallbackId: string): string;
|
|
327
|
+
/**
|
|
328
|
+
* A `buildComponentRows` entry: a classic BUTTON row (an array of button specs),
|
|
329
|
+
* a SELECT-row marker (Fix 3a — alone in its ActionRow), or a Components-V2
|
|
330
|
+
* container marker (Fix 3c). The builders dispatch on shape: an array → buttons,
|
|
331
|
+
* `{ row: "select" }` → a select menu, `{ row: "v2" }` → a V2 container.
|
|
332
|
+
*/
|
|
333
|
+
export type DiscordComponentRow = DiscordActionRow | DiscordSelectSpec | DiscordV2MessageSpec;
|
|
334
|
+
/** The builders the connection needs from discord.js (injected for tests). */
|
|
335
|
+
export interface DiscordBuilders {
|
|
336
|
+
/** Wrap `{ path, name }` into an `AttachmentBuilder`-shaped object. */
|
|
337
|
+
buildAttachment(path: string, name: string): unknown;
|
|
338
|
+
/**
|
|
339
|
+
* Turn a serializable component-row list into discord.js builder objects. A
|
|
340
|
+
* button row → `ActionRowBuilder<ButtonBuilder>`; a select marker → an
|
|
341
|
+
* `ActionRowBuilder<*SelectMenuBuilder>`; a V2 marker → a `ContainerBuilder`.
|
|
342
|
+
*/
|
|
343
|
+
buildComponentRows(rows: DiscordComponentRow[]): unknown[];
|
|
344
|
+
/**
|
|
345
|
+
* Build a discord.js `ModalBuilder` from a registered modal entry (Fix 3b).
|
|
346
|
+
* Optional — a build that never opens modals (or a minimal test fake) can omit
|
|
347
|
+
* it; the connection guards its absence.
|
|
348
|
+
*/
|
|
349
|
+
buildModal?(params: {
|
|
350
|
+
modalId: string;
|
|
351
|
+
title: string;
|
|
352
|
+
entry: DiscordModalEntry;
|
|
353
|
+
}): unknown;
|
|
354
|
+
}
|
|
355
|
+
/** A discord.js Interaction (the subset Brigade reads). */
|
|
356
|
+
export interface DiscordInteractionLike {
|
|
357
|
+
/** True for a button press (`isButton()`); a command interaction sets `isChatInputCommand()`. */
|
|
358
|
+
isButton?: () => boolean;
|
|
359
|
+
isChatInputCommand?: () => boolean;
|
|
360
|
+
/** Select-menu type guards (Fix 3a) — exactly one is true for a select press. */
|
|
361
|
+
isStringSelectMenu?: () => boolean;
|
|
362
|
+
isUserSelectMenu?: () => boolean;
|
|
363
|
+
isRoleSelectMenu?: () => boolean;
|
|
364
|
+
isChannelSelectMenu?: () => boolean;
|
|
365
|
+
isMentionableSelectMenu?: () => boolean;
|
|
366
|
+
/** True for a modal submission (Fix 3b). */
|
|
367
|
+
isModalSubmit?: () => boolean;
|
|
368
|
+
/** The component's `custom_id` (button / select / modal interactions). */
|
|
369
|
+
customId?: string;
|
|
370
|
+
/** Slash-command name (command interactions). */
|
|
371
|
+
commandName?: string;
|
|
372
|
+
/** The chosen value(s) on a select press (raw ids/values; entity selects carry ids). */
|
|
373
|
+
values?: string[];
|
|
374
|
+
/** The interaction id (acked via the reply/deferUpdate path). */
|
|
375
|
+
id?: string;
|
|
376
|
+
channelId?: string;
|
|
377
|
+
channel?: DiscordChannelLikeForInteraction | null;
|
|
378
|
+
guildId?: string | null;
|
|
379
|
+
user?: {
|
|
380
|
+
id?: string;
|
|
381
|
+
username?: string;
|
|
382
|
+
globalName?: string | null;
|
|
383
|
+
};
|
|
384
|
+
member?: {
|
|
385
|
+
nickname?: string | null;
|
|
386
|
+
} | null;
|
|
387
|
+
message?: {
|
|
388
|
+
id?: string;
|
|
389
|
+
};
|
|
390
|
+
/** Modal-submit field accessor (Fix 3b) — `getTextInputValue(id)` yields a value. */
|
|
391
|
+
fields?: {
|
|
392
|
+
getTextInputValue?: (customId: string) => string;
|
|
393
|
+
fields?: unknown;
|
|
394
|
+
};
|
|
395
|
+
/** Ack a button press silently (no visible change). */
|
|
396
|
+
deferUpdate?: () => Promise<unknown>;
|
|
397
|
+
/** Open a modal in response to a button press (Fix 3b). */
|
|
398
|
+
showModal?: (modal: unknown) => Promise<unknown>;
|
|
399
|
+
/** Ack a slash command with an ephemeral ack. */
|
|
400
|
+
reply?: (options: unknown) => Promise<unknown>;
|
|
401
|
+
deferReply?: (options?: unknown) => Promise<unknown>;
|
|
402
|
+
[key: string]: unknown;
|
|
403
|
+
}
|
|
404
|
+
interface DiscordChannelLikeForInteraction {
|
|
405
|
+
id?: string;
|
|
406
|
+
type?: number;
|
|
407
|
+
isThread?: () => boolean;
|
|
408
|
+
isDMBased?: () => boolean;
|
|
409
|
+
[key: string]: unknown;
|
|
410
|
+
}
|
|
411
|
+
export interface ConnectDiscordArgs {
|
|
412
|
+
/** Bot token (Bot-prefix already stripped by the resolver). NEVER logged. */
|
|
413
|
+
botToken: string;
|
|
414
|
+
/** Account namespace stamped on inbounds (single-account → "default"). */
|
|
415
|
+
accountId?: string;
|
|
416
|
+
/**
|
|
417
|
+
* Optional proxy URL all Discord REST calls (+ the Gateway websocket) route
|
|
418
|
+
* through. Use it on networks where `discord.com` is blocked. When omitted the
|
|
419
|
+
* connection is DIRECT (unchanged default).
|
|
420
|
+
*/
|
|
421
|
+
proxyUrl?: string;
|
|
422
|
+
/** Called once `login` succeeds and the client is ready. */
|
|
423
|
+
onConnected?: () => void;
|
|
424
|
+
/** Called when the token is rejected — terminal, re-token required. */
|
|
425
|
+
onTokenInvalid?: () => void;
|
|
426
|
+
/** Called for every inbound message. */
|
|
427
|
+
onMessage: (msg: DiscordInboundMessage) => void;
|
|
428
|
+
/**
|
|
429
|
+
* Called for every inbound button press. The handler acks the press before
|
|
430
|
+
* this fires, so it only routes the normalized inbound (which carries
|
|
431
|
+
* `callbackQuery`). Optional — when omitted, presses are acked but not routed.
|
|
432
|
+
*/
|
|
433
|
+
onCallbackQuery?: (msg: DiscordInboundMessage) => void;
|
|
434
|
+
/**
|
|
435
|
+
* Called for every inbound reaction-add. The normalized inbound carries
|
|
436
|
+
* `reaction: { emojis, targetMessageId }` and no text. Optional.
|
|
437
|
+
*/
|
|
438
|
+
onReaction?: (msg: DiscordInboundMessage) => void;
|
|
439
|
+
/** Subsystem logger. */
|
|
440
|
+
log: (msg: string, meta?: Record<string, unknown>) => void;
|
|
441
|
+
/**
|
|
442
|
+
* TEST SEAM: supply the Client instead of building a real one. Production
|
|
443
|
+
* leaves this undefined and discord.js is lazy-imported. The second `proxyUrl`
|
|
444
|
+
* arg is the resolved proxy (undefined for a direct connection).
|
|
445
|
+
*/
|
|
446
|
+
clientFactory?: (botToken: string, proxyUrl?: string) => DiscordClientLike;
|
|
447
|
+
/** TEST SEAM: supply the builders (production lazy-imports discord.js). */
|
|
448
|
+
buildersFactory?: () => DiscordBuilders;
|
|
449
|
+
/** TEST SEAM: skip the real backoff sleep so reconnect tests run instantly. */
|
|
450
|
+
sleepImpl?: (ms: number) => Promise<void>;
|
|
451
|
+
/**
|
|
452
|
+
* Bot presence/activity to apply once the Gateway reaches READY (Phase 5). When
|
|
453
|
+
* set, the connection calls `client.user.setPresence(...)` on every
|
|
454
|
+
* (re)connect. Omitted → Discord's default presence (unchanged).
|
|
455
|
+
*/
|
|
456
|
+
presence?: DiscordPresencePayload | null;
|
|
457
|
+
/**
|
|
458
|
+
* TEST SEAM: override how presence is applied. Production calls
|
|
459
|
+
* `client.user.setPresence(payload)`; tests inject this to assert the mapped
|
|
460
|
+
* activity payload without a real client. Receives the resolved payload.
|
|
461
|
+
*/
|
|
462
|
+
setPresenceImpl?: (client: DiscordClientLike, payload: DiscordPresencePayload) => void;
|
|
463
|
+
/**
|
|
464
|
+
* READY-deadline in ms (Phase 5 reliability). After `login()` resolves the
|
|
465
|
+
* connection waits this long for `clientReady`; if it never fires the socket is
|
|
466
|
+
* destroyed and the supervise loop re-enters with backoff (an opened-but-never-
|
|
467
|
+
* READY socket is not trusted). Default ~20s; ≤0 disables the watchdog.
|
|
468
|
+
*/
|
|
469
|
+
readyTimeoutMs?: number;
|
|
470
|
+
}
|
|
471
|
+
export interface DiscordConnection {
|
|
472
|
+
/** The bot's user id once connected, else null (self id for mention/echo detection). */
|
|
473
|
+
selfId(): string | null;
|
|
474
|
+
/** The bot's username once connected, else null. */
|
|
475
|
+
selfName(): string | null;
|
|
476
|
+
/** Epoch ms of the most recent successful connect, else null. */
|
|
477
|
+
connectedAt(): number | null;
|
|
478
|
+
/**
|
|
479
|
+
* Epoch ms of the most recent INBOUND event of any kind, else null. Liveness
|
|
480
|
+
* signal: a Gateway can read "connected" while silently dead. Observability
|
|
481
|
+
* only — a quiet channel is legitimately idle, so this NEVER flips health.
|
|
482
|
+
*/
|
|
483
|
+
lastEventAt(): number | null;
|
|
484
|
+
/** True once `login` succeeded and the client is ready. */
|
|
485
|
+
isConnected(): boolean;
|
|
486
|
+
/** True once an auth error marked the token terminally invalid. */
|
|
487
|
+
isTokenInvalid(): boolean;
|
|
488
|
+
/** Send a single text message. Returns the posted message's id. */
|
|
489
|
+
sendText(channel: string, text: string, opts?: DiscordSendTextOpts): Promise<{
|
|
490
|
+
messageId: string;
|
|
491
|
+
}>;
|
|
492
|
+
/**
|
|
493
|
+
* Send a message carrying component `rows` — button grids (the native approval
|
|
494
|
+
* prompt / general buttons), SELECT-menu markers (Fix 3a), and/or a
|
|
495
|
+
* Components-V2 container marker (Fix 3c). `text` is the message content; the
|
|
496
|
+
* builders turn each row into the matching discord.js component. Text is sent
|
|
497
|
+
* verbatim (no markdown pass) so the caller controls formatting. When a V2
|
|
498
|
+
* container is present the `IsComponentsV2` flag is set and the text moves into
|
|
499
|
+
* a V2 text block (a V2 message cannot carry plain `content`).
|
|
500
|
+
*/
|
|
501
|
+
sendInteractive(channel: string, text: string, rows: DiscordComponentRow[], opts?: DiscordSendTextOpts): Promise<{
|
|
502
|
+
messageId: string;
|
|
503
|
+
}>;
|
|
504
|
+
/** Upload a media attachment via an AttachmentBuilder. */
|
|
505
|
+
sendMedia(channel: string, media: OutboundMedia, opts?: DiscordSendMediaOpts): Promise<void>;
|
|
506
|
+
/** React to a previous message with an emoji (unicode or `name:id` custom). */
|
|
507
|
+
react(channel: string, messageId: string, emoji: string): Promise<void>;
|
|
508
|
+
/** Remove EVERY reaction the bot itself placed on a message. Best-effort. */
|
|
509
|
+
removeOwnReactions(channel: string, messageId: string): Promise<void>;
|
|
510
|
+
/** Edit a previously-sent message's text. */
|
|
511
|
+
editMessageText(channel: string, messageId: string, text: string): Promise<void>;
|
|
512
|
+
/** Delete a message. */
|
|
513
|
+
deleteMessage(channel: string, messageId: string): Promise<void>;
|
|
514
|
+
/** Pin a message in a channel (Fix 2e). */
|
|
515
|
+
pinMessage(channel: string, messageId: string): Promise<void>;
|
|
516
|
+
/** Unpin a previously-pinned message (Fix 2e). */
|
|
517
|
+
unpinMessage(channel: string, messageId: string): Promise<void>;
|
|
518
|
+
/** Register the bot's application (slash) commands. Best-effort. */
|
|
519
|
+
registerCommands(commands: unknown[]): Promise<void>;
|
|
520
|
+
/** Show typing in a channel (Discord clears it after ~10s or on the next send). */
|
|
521
|
+
setComposing(channel: string, state: "composing" | "paused"): Promise<void>;
|
|
522
|
+
/** Read-receipt no-op (Discord bots can't mark-read). */
|
|
523
|
+
markRead(): Promise<void>;
|
|
524
|
+
/**
|
|
525
|
+
* Apply (or re-apply) a bot presence/activity to the live client (Phase 5).
|
|
526
|
+
* No-op when the client isn't ready or no payload is given. Used both by the
|
|
527
|
+
* on-ready auto-apply and by a live `set-presence` re-application.
|
|
528
|
+
*/
|
|
529
|
+
applyPresence(payload?: DiscordPresencePayload | null): void;
|
|
530
|
+
/**
|
|
531
|
+
* Create a thread off an existing message (`message.startThread` / the REST
|
|
532
|
+
* `POST /channels/{id}/messages/{id}/threads`) and return its id (Phase 5
|
|
533
|
+
* autoThread). On a create-race (another actor already threaded the message)
|
|
534
|
+
* it best-effort refetches the message and returns the existing thread id.
|
|
535
|
+
* Returns `null` when the thread can't be created.
|
|
536
|
+
*/
|
|
537
|
+
createThreadFromMessage(channelId: string, messageId: string, opts: {
|
|
538
|
+
name: string;
|
|
539
|
+
autoArchiveMinutes?: number;
|
|
540
|
+
}): Promise<string | null>;
|
|
541
|
+
/** Disconnect the Gateway + tear down. */
|
|
542
|
+
close(): Promise<void>;
|
|
543
|
+
}
|
|
544
|
+
export interface DiscordSendTextOpts {
|
|
545
|
+
/** Thread id — reply within this thread channel. */
|
|
546
|
+
threadId?: string;
|
|
547
|
+
/** Native reply target — the message id to reply under. */
|
|
548
|
+
replyToMessageId?: string;
|
|
549
|
+
/** Suppress the recipient's notification (SuppressNotifications flag) (Fix 2c). */
|
|
550
|
+
silent?: boolean;
|
|
551
|
+
}
|
|
552
|
+
export interface DiscordSendMediaOpts {
|
|
553
|
+
/** Thread id to upload into. */
|
|
554
|
+
threadId?: string;
|
|
555
|
+
/** Suppress the recipient's notification (SuppressNotifications flag) (Fix 2c). */
|
|
556
|
+
silent?: boolean;
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* A Discord auth failure → the token is wrong / revoked / reset. Re-tokening is
|
|
560
|
+
* the only fix; reconnecting with the same token loops forever. discord.js
|
|
561
|
+
* surfaces a bad token on login as a `TokenInvalid` error / a message containing
|
|
562
|
+
* "invalid token" / an "disallowed intents" privileged-intents rejection (which
|
|
563
|
+
* is also terminal until the operator fixes the bot's intent settings).
|
|
564
|
+
*/
|
|
565
|
+
export declare function isDiscordUnauthorized(err: unknown): boolean;
|
|
566
|
+
/** Strip a Discord token out of a string before it logs. */
|
|
567
|
+
export declare function redactDiscordToken(text: string, ...tokens: string[]): string;
|
|
568
|
+
export declare function connectDiscord(args: ConnectDiscordArgs): Promise<DiscordConnection>;
|
|
569
|
+
export { DISCORD_MESSAGE_LIMIT };
|
|
570
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/connection.ts"],"names":[],"mappings":"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"}
|