@spinabot/brigade 1.5.0 → 1.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.
Files changed (195) hide show
  1. package/dist/agents/agent-loop.d.ts.map +1 -1
  2. package/dist/agents/agent-loop.js +51 -1
  3. package/dist/agents/agent-loop.js.map +1 -1
  4. package/dist/agents/channels/bundled-channel-metas.d.ts +4 -0
  5. package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
  6. package/dist/agents/channels/bundled-channel-metas.js +22 -0
  7. package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
  8. package/dist/agents/channels/discord/account-config.d.ts +117 -0
  9. package/dist/agents/channels/discord/account-config.d.ts.map +1 -0
  10. package/dist/agents/channels/discord/account-config.js +260 -0
  11. package/dist/agents/channels/discord/account-config.js.map +1 -0
  12. package/dist/agents/channels/discord/adapter.d.ts +56 -0
  13. package/dist/agents/channels/discord/adapter.d.ts.map +1 -0
  14. package/dist/agents/channels/discord/adapter.js +526 -0
  15. package/dist/agents/channels/discord/adapter.js.map +1 -0
  16. package/dist/agents/channels/discord/approval-authorize.d.ts +43 -0
  17. package/dist/agents/channels/discord/approval-authorize.d.ts.map +1 -0
  18. package/dist/agents/channels/discord/approval-authorize.js +71 -0
  19. package/dist/agents/channels/discord/approval-authorize.js.map +1 -0
  20. package/dist/agents/channels/discord/approval-native.d.ts +68 -0
  21. package/dist/agents/channels/discord/approval-native.d.ts.map +1 -0
  22. package/dist/agents/channels/discord/approval-native.js +81 -0
  23. package/dist/agents/channels/discord/approval-native.js.map +1 -0
  24. package/dist/agents/channels/discord/command-menu.d.ts +49 -0
  25. package/dist/agents/channels/discord/command-menu.d.ts.map +1 -0
  26. package/dist/agents/channels/discord/command-menu.js +73 -0
  27. package/dist/agents/channels/discord/command-menu.js.map +1 -0
  28. package/dist/agents/channels/discord/components.d.ts +97 -0
  29. package/dist/agents/channels/discord/components.d.ts.map +1 -0
  30. package/dist/agents/channels/discord/components.js +131 -0
  31. package/dist/agents/channels/discord/components.js.map +1 -0
  32. package/dist/agents/channels/discord/connection.d.ts +387 -0
  33. package/dist/agents/channels/discord/connection.d.ts.map +1 -0
  34. package/dist/agents/channels/discord/connection.js +786 -0
  35. package/dist/agents/channels/discord/connection.js.map +1 -0
  36. package/dist/agents/channels/discord/draft-stream.d.ts +92 -0
  37. package/dist/agents/channels/discord/draft-stream.d.ts.map +1 -0
  38. package/dist/agents/channels/discord/draft-stream.js +213 -0
  39. package/dist/agents/channels/discord/draft-stream.js.map +1 -0
  40. package/dist/agents/channels/discord/format.d.ts +55 -0
  41. package/dist/agents/channels/discord/format.d.ts.map +1 -0
  42. package/dist/agents/channels/discord/format.js +247 -0
  43. package/dist/agents/channels/discord/format.js.map +1 -0
  44. package/dist/agents/channels/discord/inbound-extras.d.ts +220 -0
  45. package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -0
  46. package/dist/agents/channels/discord/inbound-extras.js +351 -0
  47. package/dist/agents/channels/discord/inbound-extras.js.map +1 -0
  48. package/dist/agents/channels/discord/index.d.ts +14 -0
  49. package/dist/agents/channels/discord/index.d.ts.map +1 -0
  50. package/dist/agents/channels/discord/index.js +14 -0
  51. package/dist/agents/channels/discord/index.js.map +1 -0
  52. package/dist/agents/channels/discord/media.d.ts +85 -0
  53. package/dist/agents/channels/discord/media.d.ts.map +1 -0
  54. package/dist/agents/channels/discord/media.js +242 -0
  55. package/dist/agents/channels/discord/media.js.map +1 -0
  56. package/dist/agents/channels/discord/module.d.ts +15 -0
  57. package/dist/agents/channels/discord/module.d.ts.map +1 -0
  58. package/dist/agents/channels/discord/module.js +22 -0
  59. package/dist/agents/channels/discord/module.js.map +1 -0
  60. package/dist/agents/channels/discord/plugin.d.ts +73 -0
  61. package/dist/agents/channels/discord/plugin.d.ts.map +1 -0
  62. package/dist/agents/channels/discord/plugin.js +303 -0
  63. package/dist/agents/channels/discord/plugin.js.map +1 -0
  64. package/dist/agents/channels/discord/probe.d.ts +93 -0
  65. package/dist/agents/channels/discord/probe.d.ts.map +1 -0
  66. package/dist/agents/channels/discord/probe.js +158 -0
  67. package/dist/agents/channels/discord/probe.js.map +1 -0
  68. package/dist/agents/channels/discord/reasoning-lane.d.ts +42 -0
  69. package/dist/agents/channels/discord/reasoning-lane.d.ts.map +1 -0
  70. package/dist/agents/channels/discord/reasoning-lane.js +68 -0
  71. package/dist/agents/channels/discord/reasoning-lane.js.map +1 -0
  72. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  73. package/dist/agents/channels/inbound-pipeline.js +65 -7
  74. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  75. package/dist/agents/channels/manager.d.ts.map +1 -1
  76. package/dist/agents/channels/manager.js +18 -0
  77. package/dist/agents/channels/manager.js.map +1 -1
  78. package/dist/agents/channels/sdk.d.ts +4 -0
  79. package/dist/agents/channels/sdk.d.ts.map +1 -1
  80. package/dist/agents/channels/sdk.js +4 -0
  81. package/dist/agents/channels/sdk.js.map +1 -1
  82. package/dist/agents/channels/slack/account-config.d.ts +172 -0
  83. package/dist/agents/channels/slack/account-config.d.ts.map +1 -0
  84. package/dist/agents/channels/slack/account-config.js +353 -0
  85. package/dist/agents/channels/slack/account-config.js.map +1 -0
  86. package/dist/agents/channels/slack/account-registry.d.ts +45 -0
  87. package/dist/agents/channels/slack/account-registry.d.ts.map +1 -0
  88. package/dist/agents/channels/slack/account-registry.js +58 -0
  89. package/dist/agents/channels/slack/account-registry.js.map +1 -0
  90. package/dist/agents/channels/slack/adapter.d.ts +66 -0
  91. package/dist/agents/channels/slack/adapter.d.ts.map +1 -0
  92. package/dist/agents/channels/slack/adapter.js +547 -0
  93. package/dist/agents/channels/slack/adapter.js.map +1 -0
  94. package/dist/agents/channels/slack/approval-authorize.d.ts +43 -0
  95. package/dist/agents/channels/slack/approval-authorize.d.ts.map +1 -0
  96. package/dist/agents/channels/slack/approval-authorize.js +71 -0
  97. package/dist/agents/channels/slack/approval-authorize.js.map +1 -0
  98. package/dist/agents/channels/slack/approval-native.d.ts +70 -0
  99. package/dist/agents/channels/slack/approval-native.d.ts.map +1 -0
  100. package/dist/agents/channels/slack/approval-native.js +85 -0
  101. package/dist/agents/channels/slack/approval-native.js.map +1 -0
  102. package/dist/agents/channels/slack/blocks.d.ts +125 -0
  103. package/dist/agents/channels/slack/blocks.d.ts.map +1 -0
  104. package/dist/agents/channels/slack/blocks.js +145 -0
  105. package/dist/agents/channels/slack/blocks.js.map +1 -0
  106. package/dist/agents/channels/slack/command-menu.d.ts +44 -0
  107. package/dist/agents/channels/slack/command-menu.d.ts.map +1 -0
  108. package/dist/agents/channels/slack/command-menu.js +66 -0
  109. package/dist/agents/channels/slack/command-menu.js.map +1 -0
  110. package/dist/agents/channels/slack/connection.d.ts +422 -0
  111. package/dist/agents/channels/slack/connection.d.ts.map +1 -0
  112. package/dist/agents/channels/slack/connection.js +1042 -0
  113. package/dist/agents/channels/slack/connection.js.map +1 -0
  114. package/dist/agents/channels/slack/directory-live.d.ts +129 -0
  115. package/dist/agents/channels/slack/directory-live.d.ts.map +1 -0
  116. package/dist/agents/channels/slack/directory-live.js +148 -0
  117. package/dist/agents/channels/slack/directory-live.js.map +1 -0
  118. package/dist/agents/channels/slack/draft-stream.d.ts +93 -0
  119. package/dist/agents/channels/slack/draft-stream.d.ts.map +1 -0
  120. package/dist/agents/channels/slack/draft-stream.js +218 -0
  121. package/dist/agents/channels/slack/draft-stream.js.map +1 -0
  122. package/dist/agents/channels/slack/format.d.ts +41 -0
  123. package/dist/agents/channels/slack/format.d.ts.map +1 -0
  124. package/dist/agents/channels/slack/format.js +271 -0
  125. package/dist/agents/channels/slack/format.js.map +1 -0
  126. package/dist/agents/channels/slack/inbound-extras.d.ts +179 -0
  127. package/dist/agents/channels/slack/inbound-extras.d.ts.map +1 -0
  128. package/dist/agents/channels/slack/inbound-extras.js +257 -0
  129. package/dist/agents/channels/slack/inbound-extras.js.map +1 -0
  130. package/dist/agents/channels/slack/index.d.ts +15 -0
  131. package/dist/agents/channels/slack/index.d.ts.map +1 -0
  132. package/dist/agents/channels/slack/index.js +15 -0
  133. package/dist/agents/channels/slack/index.js.map +1 -0
  134. package/dist/agents/channels/slack/media.d.ts +90 -0
  135. package/dist/agents/channels/slack/media.d.ts.map +1 -0
  136. package/dist/agents/channels/slack/media.js +215 -0
  137. package/dist/agents/channels/slack/media.js.map +1 -0
  138. package/dist/agents/channels/slack/module.d.ts +26 -0
  139. package/dist/agents/channels/slack/module.d.ts.map +1 -0
  140. package/dist/agents/channels/slack/module.js +67 -0
  141. package/dist/agents/channels/slack/module.js.map +1 -0
  142. package/dist/agents/channels/slack/plugin.d.ts +69 -0
  143. package/dist/agents/channels/slack/plugin.d.ts.map +1 -0
  144. package/dist/agents/channels/slack/plugin.js +318 -0
  145. package/dist/agents/channels/slack/plugin.js.map +1 -0
  146. package/dist/agents/channels/slack/probe.d.ts +72 -0
  147. package/dist/agents/channels/slack/probe.d.ts.map +1 -0
  148. package/dist/agents/channels/slack/probe.js +103 -0
  149. package/dist/agents/channels/slack/probe.js.map +1 -0
  150. package/dist/agents/channels/slack/proxy-agent.d.ts +30 -0
  151. package/dist/agents/channels/slack/proxy-agent.d.ts.map +1 -0
  152. package/dist/agents/channels/slack/proxy-agent.js +44 -0
  153. package/dist/agents/channels/slack/proxy-agent.js.map +1 -0
  154. package/dist/agents/channels/slack/reasoning-lane.d.ts +42 -0
  155. package/dist/agents/channels/slack/reasoning-lane.d.ts.map +1 -0
  156. package/dist/agents/channels/slack/reasoning-lane.js +68 -0
  157. package/dist/agents/channels/slack/reasoning-lane.js.map +1 -0
  158. package/dist/agents/channels/slack/user-directory.d.ts +69 -0
  159. package/dist/agents/channels/slack/user-directory.d.ts.map +1 -0
  160. package/dist/agents/channels/slack/user-directory.js +94 -0
  161. package/dist/agents/channels/slack/user-directory.js.map +1 -0
  162. package/dist/agents/channels/slack/webhook.d.ts +89 -0
  163. package/dist/agents/channels/slack/webhook.d.ts.map +1 -0
  164. package/dist/agents/channels/slack/webhook.js +228 -0
  165. package/dist/agents/channels/slack/webhook.js.map +1 -0
  166. package/dist/agents/channels/telegram/format.d.ts.map +1 -1
  167. package/dist/agents/channels/telegram/format.js +17 -1
  168. package/dist/agents/channels/telegram/format.js.map +1 -1
  169. package/dist/agents/channels/telegram/webhook.d.ts.map +1 -1
  170. package/dist/agents/channels/telegram/webhook.js +7 -1
  171. package/dist/agents/channels/telegram/webhook.js.map +1 -1
  172. package/dist/agents/extensions/modules/index.d.ts.map +1 -1
  173. package/dist/agents/extensions/modules/index.js +10 -0
  174. package/dist/agents/extensions/modules/index.js.map +1 -1
  175. package/dist/agents/tools/cron-tool.d.ts.map +1 -1
  176. package/dist/agents/tools/cron-tool.js +4 -1
  177. package/dist/agents/tools/cron-tool.js.map +1 -1
  178. package/dist/buildstamp.json +1 -1
  179. package/dist/core/auth-bridge.d.ts +1 -0
  180. package/dist/core/auth-bridge.d.ts.map +1 -1
  181. package/dist/core/auth-bridge.js +46 -1
  182. package/dist/core/auth-bridge.js.map +1 -1
  183. package/dist/core/server.d.ts.map +1 -1
  184. package/dist/core/server.js +40 -5
  185. package/dist/core/server.js.map +1 -1
  186. package/dist/cron/isolated-agent/run-executor.d.ts +11 -0
  187. package/dist/cron/isolated-agent/run-executor.d.ts.map +1 -1
  188. package/dist/cron/isolated-agent/run-executor.js +20 -4
  189. package/dist/cron/isolated-agent/run-executor.js.map +1 -1
  190. package/dist/cron/types.d.ts +8 -0
  191. package/dist/cron/types.d.ts.map +1 -1
  192. package/dist/system-prompt/assembler.d.ts.map +1 -1
  193. package/dist/system-prompt/assembler.js +4 -2
  194. package/dist/system-prompt/assembler.js.map +1 -1
  195. package/package.json +5 -1
@@ -0,0 +1,387 @@
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 } from "./components.js";
35
+ /**
36
+ * Jittered exponential backoff for reconnect attempt `attempt` (0-based). Thin
37
+ * wrapper over the neutral `nextBackoffDelay` helper — kept as a named export so
38
+ * `index.ts` + the connection tests have a stable entry point.
39
+ */
40
+ export declare function discordBackoffDelay(attempt: number): number;
41
+ /** Discord's hard per-message content limit (chars). Sends chunk under this. */
42
+ declare const DISCORD_MESSAGE_LIMIT = 2000;
43
+ /** A normalized inbound Discord message (text and/or attachments). Mirrors `SlackInboundMessage`. */
44
+ export interface DiscordInboundMessage {
45
+ /** Channel id (the conversation id). For a thread this is the thread channel id. */
46
+ conversationId: string;
47
+ /** Discord message id (snowflake) — surfaces for reply / edit / delete targeting. */
48
+ messageId?: string;
49
+ /** When Discord created the message (epoch ms). */
50
+ messageTimestampMs?: number;
51
+ /** Sender user id (snowflake). */
52
+ from: string;
53
+ /** Sender display name (nickname / global name / username). */
54
+ fromName?: string;
55
+ /** Plain message text (token-expanded). May be empty for attachment-only messages. */
56
+ text: string;
57
+ /** `direct` (DM) or `group` (guild text / thread). */
58
+ chatType: "direct" | "group";
59
+ /**
60
+ * Guild (server) id this message arrived in — feeds the route resolver's
61
+ * `binding.guild` (+ `guild+roles`) tier. Discord uses `guildId`, NOT `teamId`
62
+ * (that tier is Slack's workspace id); a Discord inbound never sets `teamId` so
63
+ * it can't collide with a Slack team binding.
64
+ */
65
+ guildId?: string;
66
+ /**
67
+ * The sending member's guild-role ids (ids only — never names). Populated for a
68
+ * guild message; empty/omitted for a DM. The resolver's `guild+roles` tier
69
+ * matches when ANY of these overlaps a binding's `roles[]`.
70
+ */
71
+ memberRoleIds?: string[];
72
+ /** Thread channel id, when the message belongs to a thread. */
73
+ threadId?: string;
74
+ /** User ids `<@…>`-mentioned (incl. the bot's own id when addressed). */
75
+ mentions?: string[];
76
+ /** Quoted-reply context, when this message replies to another. */
77
+ replyTo?: InboundReplyContext;
78
+ /**
79
+ * DEFERRED media download. The connection layer does NOT download eagerly —
80
+ * the pipeline invokes this ONLY after the access gate admits the sender, so a
81
+ * blocked stranger's attachment is never fetched. Resolves to an empty array
82
+ * for text-only messages.
83
+ */
84
+ resolveMedia?: () => Promise<InboundMediaAttachment[]>;
85
+ /**
86
+ * Inline-button callback context — present ONLY when this inbound is a button
87
+ * press rather than a typed message. `data` is the opaque payload the pressed
88
+ * button declared at send time (an approval-callback codec string OR a
89
+ * general-prefixed token); `callbackId` is the interaction id (so the press
90
+ * can be acked). Undefined for ordinary messages.
91
+ */
92
+ callbackQuery?: {
93
+ data: string;
94
+ callbackId: string;
95
+ };
96
+ /** True when this inbound is a message edit (text carries the NEW text). */
97
+ edited?: boolean;
98
+ /**
99
+ * Inbound reaction context — present ONLY when this inbound is a reaction-add.
100
+ * `emojis` are the newly-added reaction emoji name(s); `targetMessageId` is the
101
+ * message they landed on. Undefined for typed messages.
102
+ */
103
+ reaction?: {
104
+ emojis: string[];
105
+ targetMessageId: string;
106
+ };
107
+ /** Raw discord.js object (for adapters that need more). */
108
+ raw: unknown;
109
+ }
110
+ /**
111
+ * The minimal slice of discord.js's `Client` the connection drives. Declared as
112
+ * an interface (rather than importing the concrete class) so tests inject a fake
113
+ * with zero network — the runtime path builds a real `Client` and it
114
+ * structurally satisfies this shape.
115
+ */
116
+ export interface DiscordClientLike {
117
+ /** Subscribe a Gateway event handler (`messageCreate`, `interactionCreate`, …). */
118
+ on(event: string, handler: (...args: never[]) => unknown): unknown;
119
+ once(event: string, handler: (...args: never[]) => unknown): unknown;
120
+ /** Open the Gateway connection with the bot token. Rejects on an invalid token. */
121
+ login(token: string): Promise<string>;
122
+ /** Tear down the connection + websocket. */
123
+ destroy(): Promise<void> | void;
124
+ /** The bot user once ready (carries `.id` + `.username`), else null. */
125
+ user: {
126
+ id?: string;
127
+ username?: string;
128
+ } | null;
129
+ /** REST handle for application-command registration + raw calls. */
130
+ rest?: {
131
+ put(route: unknown, options?: {
132
+ body?: unknown;
133
+ }): Promise<unknown>;
134
+ };
135
+ /** Resolve a channel by id (used by outbound to fetch the send target). */
136
+ channels: {
137
+ fetch(id: string): Promise<DiscordSendChannelLike | null>;
138
+ };
139
+ /** Resolve a user by id (used to open a DM channel). */
140
+ users?: {
141
+ fetch(id: string): Promise<{
142
+ createDM(): Promise<DiscordSendChannelLike>;
143
+ } | null>;
144
+ };
145
+ }
146
+ /** The outbound surface a resolved channel exposes (send / typing). */
147
+ export interface DiscordSendChannelLike {
148
+ id?: string;
149
+ /** True for a text-capable channel (guild text, DM, thread). */
150
+ isTextBased?: () => boolean;
151
+ /**
152
+ * Post a message. `options` is discord.js `MessageCreateOptions` (content +
153
+ * optional `components` + `files` + `reply` + `allowedMentions`). Returns the
154
+ * sent message (carrying `.id`).
155
+ */
156
+ send(options: DiscordSendOptions): Promise<DiscordSentMessageLike>;
157
+ /** Fetch a message in this channel by id (for edit / delete / react). */
158
+ messages?: {
159
+ fetch(id: string): Promise<DiscordSentMessageLike | null>;
160
+ };
161
+ /** Show the typing indicator (best-effort). */
162
+ sendTyping?: () => Promise<unknown>;
163
+ }
164
+ /** A sent / fetched message handle the outbound path acts on. */
165
+ export interface DiscordSentMessageLike {
166
+ id?: string;
167
+ edit(options: DiscordSendOptions | string): Promise<DiscordSentMessageLike>;
168
+ delete(): Promise<unknown>;
169
+ react(emoji: string): Promise<unknown>;
170
+ /** The bot's own reactions live under `.reactions.cache`; used by removeOwnReactions. */
171
+ reactions?: {
172
+ cache?: Map<string, DiscordReactionLike> | Iterable<DiscordReactionLike>;
173
+ removeAll?: () => Promise<unknown>;
174
+ };
175
+ }
176
+ /** A reaction on a message (the subset removeOwnReactions reads). */
177
+ export interface DiscordReactionLike {
178
+ emoji?: {
179
+ name?: string | null;
180
+ id?: string | null;
181
+ };
182
+ /** True when the bot itself placed this reaction. */
183
+ me?: boolean;
184
+ /** Remove this reaction (optionally for a specific user). */
185
+ users?: {
186
+ remove(userId?: string): Promise<unknown>;
187
+ };
188
+ remove?: () => Promise<unknown>;
189
+ }
190
+ /**
191
+ * discord.js `AllowedMentionsTypes` parse values the connection sets. We
192
+ * deliberately NEVER include `"everyone"` so an agent / prompt-injected
193
+ * `@everyone` / `@here` in the content renders as plain text but does NOT
194
+ * notify everyone — while explicit `<@id>` user + `<@&roleid>` role pings still
195
+ * work (their type IS parsed).
196
+ */
197
+ export type DiscordAllowedMentionParse = "users" | "roles";
198
+ /**
199
+ * The `allowedMentions` shape the connection sets on every outbound send. `parse`
200
+ * whitelists which mention CLASSES notify (we use `["users", "roles"]`);
201
+ * omitting `"everyone"` is what kills the mass-ping vector. `repliedUser:false`
202
+ * stops a native reply from also pinging the replied-to author.
203
+ */
204
+ export interface DiscordAllowedMentions {
205
+ parse?: DiscordAllowedMentionParse[];
206
+ repliedUser?: boolean;
207
+ }
208
+ /** discord.js `MessageCreateOptions` subset the connection emits. */
209
+ export interface DiscordSendOptions {
210
+ content?: string;
211
+ components?: unknown[];
212
+ files?: unknown[];
213
+ reply?: {
214
+ messageReference: string;
215
+ failIfNotExists: boolean;
216
+ };
217
+ allowedMentions?: DiscordAllowedMentions;
218
+ }
219
+ /**
220
+ * The SAFE default `allowedMentions` applied to every outbound Discord send.
221
+ * `parse: ["users", "roles"]` lets explicit `<@id>` / `<@&roleid>` mentions ping
222
+ * as intended, while the absence of `"everyone"` means an `@everyone` / `@here`
223
+ * that slipped into the content (agent text or a prompt injection) renders as
224
+ * text and notifies no one. `repliedUser: false` keeps a native reply from
225
+ * pinging the author it answers. A fresh object is returned per call so a send
226
+ * can't mutate the shared default.
227
+ */
228
+ export declare function safeDiscordAllowedMentions(): DiscordAllowedMentions;
229
+ /** The builders the connection needs from discord.js (injected for tests). */
230
+ export interface DiscordBuilders {
231
+ /** Wrap `{ path, name }` into an `AttachmentBuilder`-shaped object. */
232
+ buildAttachment(path: string, name: string): unknown;
233
+ /** Turn a serializable button-row grid into discord.js `ActionRowBuilder[]`. */
234
+ buildComponentRows(rows: DiscordActionRow[]): unknown[];
235
+ }
236
+ /** A discord.js Interaction (the subset Brigade reads). */
237
+ export interface DiscordInteractionLike {
238
+ /** True for a button press (`isButton()`); a command interaction sets `isChatInputCommand()`. */
239
+ isButton?: () => boolean;
240
+ isChatInputCommand?: () => boolean;
241
+ /** The button's `custom_id` (button interactions). */
242
+ customId?: string;
243
+ /** Slash-command name (command interactions). */
244
+ commandName?: string;
245
+ /** The interaction id (acked via the reply/deferUpdate path). */
246
+ id?: string;
247
+ channelId?: string;
248
+ channel?: DiscordChannelLikeForInteraction | null;
249
+ guildId?: string | null;
250
+ user?: {
251
+ id?: string;
252
+ username?: string;
253
+ globalName?: string | null;
254
+ };
255
+ member?: {
256
+ nickname?: string | null;
257
+ } | null;
258
+ message?: {
259
+ id?: string;
260
+ };
261
+ /** Ack a button press silently (no visible change). */
262
+ deferUpdate?: () => Promise<unknown>;
263
+ /** Ack a slash command with an ephemeral ack. */
264
+ reply?: (options: unknown) => Promise<unknown>;
265
+ deferReply?: (options?: unknown) => Promise<unknown>;
266
+ [key: string]: unknown;
267
+ }
268
+ interface DiscordChannelLikeForInteraction {
269
+ id?: string;
270
+ type?: number;
271
+ isThread?: () => boolean;
272
+ isDMBased?: () => boolean;
273
+ [key: string]: unknown;
274
+ }
275
+ export interface ConnectDiscordArgs {
276
+ /** Bot token (Bot-prefix already stripped by the resolver). NEVER logged. */
277
+ botToken: string;
278
+ /** Account namespace stamped on inbounds (single-account → "default"). */
279
+ accountId?: string;
280
+ /**
281
+ * Optional proxy URL all Discord REST calls (+ the Gateway websocket) route
282
+ * through. Use it on networks where `discord.com` is blocked. When omitted the
283
+ * connection is DIRECT (unchanged default).
284
+ */
285
+ proxyUrl?: string;
286
+ /** Called once `login` succeeds and the client is ready. */
287
+ onConnected?: () => void;
288
+ /** Called when the token is rejected — terminal, re-token required. */
289
+ onTokenInvalid?: () => void;
290
+ /** Called for every inbound message. */
291
+ onMessage: (msg: DiscordInboundMessage) => void;
292
+ /**
293
+ * Called for every inbound button press. The handler acks the press before
294
+ * this fires, so it only routes the normalized inbound (which carries
295
+ * `callbackQuery`). Optional — when omitted, presses are acked but not routed.
296
+ */
297
+ onCallbackQuery?: (msg: DiscordInboundMessage) => void;
298
+ /**
299
+ * Called for every inbound reaction-add. The normalized inbound carries
300
+ * `reaction: { emojis, targetMessageId }` and no text. Optional.
301
+ */
302
+ onReaction?: (msg: DiscordInboundMessage) => void;
303
+ /** Subsystem logger. */
304
+ log: (msg: string, meta?: Record<string, unknown>) => void;
305
+ /**
306
+ * TEST SEAM: supply the Client instead of building a real one. Production
307
+ * leaves this undefined and discord.js is lazy-imported. The second `proxyUrl`
308
+ * arg is the resolved proxy (undefined for a direct connection).
309
+ */
310
+ clientFactory?: (botToken: string, proxyUrl?: string) => DiscordClientLike;
311
+ /** TEST SEAM: supply the builders (production lazy-imports discord.js). */
312
+ buildersFactory?: () => DiscordBuilders;
313
+ /** TEST SEAM: skip the real backoff sleep so reconnect tests run instantly. */
314
+ sleepImpl?: (ms: number) => Promise<void>;
315
+ }
316
+ export interface DiscordConnection {
317
+ /** The bot's user id once connected, else null (self id for mention/echo detection). */
318
+ selfId(): string | null;
319
+ /** The bot's username once connected, else null. */
320
+ selfName(): string | null;
321
+ /** Epoch ms of the most recent successful connect, else null. */
322
+ connectedAt(): number | null;
323
+ /**
324
+ * Epoch ms of the most recent INBOUND event of any kind, else null. Liveness
325
+ * signal: a Gateway can read "connected" while silently dead. Observability
326
+ * only — a quiet channel is legitimately idle, so this NEVER flips health.
327
+ */
328
+ lastEventAt(): number | null;
329
+ /** True once `login` succeeded and the client is ready. */
330
+ isConnected(): boolean;
331
+ /** True once an auth error marked the token terminally invalid. */
332
+ isTokenInvalid(): boolean;
333
+ /** Send a single text message. Returns the posted message's id. */
334
+ sendText(channel: string, text: string, opts?: DiscordSendTextOpts): Promise<{
335
+ messageId: string;
336
+ }>;
337
+ /**
338
+ * Send a message carrying component button `rows` (the native approval prompt /
339
+ * general buttons). `text` is the message content; `rows` is a serializable
340
+ * button grid the builders turn into ActionRows. Text is sent verbatim (no
341
+ * markdown pass) so the caller controls formatting.
342
+ */
343
+ sendInteractive(channel: string, text: string, rows: DiscordActionRow[], opts?: DiscordSendTextOpts): Promise<{
344
+ messageId: string;
345
+ }>;
346
+ /** Upload a media attachment via an AttachmentBuilder. */
347
+ sendMedia(channel: string, media: OutboundMedia, opts?: DiscordSendMediaOpts): Promise<void>;
348
+ /** React to a previous message with an emoji (unicode or `name:id` custom). */
349
+ react(channel: string, messageId: string, emoji: string): Promise<void>;
350
+ /** Remove EVERY reaction the bot itself placed on a message. Best-effort. */
351
+ removeOwnReactions(channel: string, messageId: string): Promise<void>;
352
+ /** Edit a previously-sent message's text. */
353
+ editMessageText(channel: string, messageId: string, text: string): Promise<void>;
354
+ /** Delete a message. */
355
+ deleteMessage(channel: string, messageId: string): Promise<void>;
356
+ /** Register the bot's application (slash) commands. Best-effort. */
357
+ registerCommands(commands: unknown[]): Promise<void>;
358
+ /** Show typing in a channel (Discord clears it after ~10s or on the next send). */
359
+ setComposing(channel: string, state: "composing" | "paused"): Promise<void>;
360
+ /** Read-receipt no-op (Discord bots can't mark-read). */
361
+ markRead(): Promise<void>;
362
+ /** Disconnect the Gateway + tear down. */
363
+ close(): Promise<void>;
364
+ }
365
+ export interface DiscordSendTextOpts {
366
+ /** Thread id — reply within this thread channel. */
367
+ threadId?: string;
368
+ /** Native reply target — the message id to reply under. */
369
+ replyToMessageId?: string;
370
+ }
371
+ export interface DiscordSendMediaOpts {
372
+ /** Thread id to upload into. */
373
+ threadId?: string;
374
+ }
375
+ /**
376
+ * A Discord auth failure → the token is wrong / revoked / reset. Re-tokening is
377
+ * the only fix; reconnecting with the same token loops forever. discord.js
378
+ * surfaces a bad token on login as a `TokenInvalid` error / a message containing
379
+ * "invalid token" / an "disallowed intents" privileged-intents rejection (which
380
+ * is also terminal until the operator fixes the bot's intent settings).
381
+ */
382
+ export declare function isDiscordUnauthorized(err: unknown): boolean;
383
+ /** Strip a Discord token out of a string before it logs. */
384
+ export declare function redactDiscordToken(text: string, ...tokens: string[]): string;
385
+ export declare function connectDiscord(args: ConnectDiscordArgs): Promise<DiscordConnection>;
386
+ export { DISCORD_MESSAGE_LIMIT };
387
+ //# 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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"}