@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.
Files changed (194) 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 +2 -0
  5. package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
  6. package/dist/agents/channels/bundled-channel-metas.js +11 -0
  7. package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
  8. package/dist/agents/channels/discord/account-config.d.ts +177 -0
  9. package/dist/agents/channels/discord/account-config.d.ts.map +1 -0
  10. package/dist/agents/channels/discord/account-config.js +349 -0
  11. package/dist/agents/channels/discord/account-config.js.map +1 -0
  12. package/dist/agents/channels/discord/adapter.d.ts +79 -0
  13. package/dist/agents/channels/discord/adapter.d.ts.map +1 -0
  14. package/dist/agents/channels/discord/adapter.js +693 -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/component-blocks.d.ts +108 -0
  29. package/dist/agents/channels/discord/component-blocks.d.ts.map +1 -0
  30. package/dist/agents/channels/discord/component-blocks.js +113 -0
  31. package/dist/agents/channels/discord/component-blocks.js.map +1 -0
  32. package/dist/agents/channels/discord/components.d.ts +175 -0
  33. package/dist/agents/channels/discord/components.d.ts.map +1 -0
  34. package/dist/agents/channels/discord/components.js +220 -0
  35. package/dist/agents/channels/discord/components.js.map +1 -0
  36. package/dist/agents/channels/discord/connection.d.ts +570 -0
  37. package/dist/agents/channels/discord/connection.d.ts.map +1 -0
  38. package/dist/agents/channels/discord/connection.js +1600 -0
  39. package/dist/agents/channels/discord/connection.js.map +1 -0
  40. package/dist/agents/channels/discord/directory-cache.d.ts +47 -0
  41. package/dist/agents/channels/discord/directory-cache.d.ts.map +1 -0
  42. package/dist/agents/channels/discord/directory-cache.js +131 -0
  43. package/dist/agents/channels/discord/directory-cache.js.map +1 -0
  44. package/dist/agents/channels/discord/directory-live.d.ts +61 -0
  45. package/dist/agents/channels/discord/directory-live.d.ts.map +1 -0
  46. package/dist/agents/channels/discord/directory-live.js +140 -0
  47. package/dist/agents/channels/discord/directory-live.js.map +1 -0
  48. package/dist/agents/channels/discord/draft-stream.d.ts +92 -0
  49. package/dist/agents/channels/discord/draft-stream.d.ts.map +1 -0
  50. package/dist/agents/channels/discord/draft-stream.js +213 -0
  51. package/dist/agents/channels/discord/draft-stream.js.map +1 -0
  52. package/dist/agents/channels/discord/format.d.ts +70 -0
  53. package/dist/agents/channels/discord/format.d.ts.map +1 -0
  54. package/dist/agents/channels/discord/format.js +303 -0
  55. package/dist/agents/channels/discord/format.js.map +1 -0
  56. package/dist/agents/channels/discord/guilds.d.ts +25 -0
  57. package/dist/agents/channels/discord/guilds.d.ts.map +1 -0
  58. package/dist/agents/channels/discord/guilds.js +46 -0
  59. package/dist/agents/channels/discord/guilds.js.map +1 -0
  60. package/dist/agents/channels/discord/inbound-extras.d.ts +377 -0
  61. package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -0
  62. package/dist/agents/channels/discord/inbound-extras.js +589 -0
  63. package/dist/agents/channels/discord/inbound-extras.js.map +1 -0
  64. package/dist/agents/channels/discord/index.d.ts +21 -0
  65. package/dist/agents/channels/discord/index.d.ts.map +1 -0
  66. package/dist/agents/channels/discord/index.js +21 -0
  67. package/dist/agents/channels/discord/index.js.map +1 -0
  68. package/dist/agents/channels/discord/media.d.ts +85 -0
  69. package/dist/agents/channels/discord/media.d.ts.map +1 -0
  70. package/dist/agents/channels/discord/media.js +242 -0
  71. package/dist/agents/channels/discord/media.js.map +1 -0
  72. package/dist/agents/channels/discord/modal-registry.d.ts +89 -0
  73. package/dist/agents/channels/discord/modal-registry.d.ts.map +1 -0
  74. package/dist/agents/channels/discord/modal-registry.js +104 -0
  75. package/dist/agents/channels/discord/modal-registry.js.map +1 -0
  76. package/dist/agents/channels/discord/modals.d.ts +100 -0
  77. package/dist/agents/channels/discord/modals.d.ts.map +1 -0
  78. package/dist/agents/channels/discord/modals.js +124 -0
  79. package/dist/agents/channels/discord/modals.js.map +1 -0
  80. package/dist/agents/channels/discord/module.d.ts +15 -0
  81. package/dist/agents/channels/discord/module.d.ts.map +1 -0
  82. package/dist/agents/channels/discord/module.js +22 -0
  83. package/dist/agents/channels/discord/module.js.map +1 -0
  84. package/dist/agents/channels/discord/permission-audit.d.ts +43 -0
  85. package/dist/agents/channels/discord/permission-audit.d.ts.map +1 -0
  86. package/dist/agents/channels/discord/permission-audit.js +192 -0
  87. package/dist/agents/channels/discord/permission-audit.js.map +1 -0
  88. package/dist/agents/channels/discord/plugin.d.ts +89 -0
  89. package/dist/agents/channels/discord/plugin.d.ts.map +1 -0
  90. package/dist/agents/channels/discord/plugin.js +372 -0
  91. package/dist/agents/channels/discord/plugin.js.map +1 -0
  92. package/dist/agents/channels/discord/probe.d.ts +115 -0
  93. package/dist/agents/channels/discord/probe.d.ts.map +1 -0
  94. package/dist/agents/channels/discord/probe.js +193 -0
  95. package/dist/agents/channels/discord/probe.js.map +1 -0
  96. package/dist/agents/channels/discord/reasoning-lane.d.ts +42 -0
  97. package/dist/agents/channels/discord/reasoning-lane.d.ts.map +1 -0
  98. package/dist/agents/channels/discord/reasoning-lane.js +68 -0
  99. package/dist/agents/channels/discord/reasoning-lane.js.map +1 -0
  100. package/dist/agents/channels/discord/rest-actions.d.ts +346 -0
  101. package/dist/agents/channels/discord/rest-actions.d.ts.map +1 -0
  102. package/dist/agents/channels/discord/rest-actions.js +559 -0
  103. package/dist/agents/channels/discord/rest-actions.js.map +1 -0
  104. package/dist/agents/channels/discord/rest-components.d.ts +122 -0
  105. package/dist/agents/channels/discord/rest-components.d.ts.map +1 -0
  106. package/dist/agents/channels/discord/rest-components.js +243 -0
  107. package/dist/agents/channels/discord/rest-components.js.map +1 -0
  108. package/dist/agents/channels/discord/security-audit.d.ts +29 -0
  109. package/dist/agents/channels/discord/security-audit.d.ts.map +1 -0
  110. package/dist/agents/channels/discord/security-audit.js +94 -0
  111. package/dist/agents/channels/discord/security-audit.js.map +1 -0
  112. package/dist/agents/channels/discord/security-doctor.d.ts +43 -0
  113. package/dist/agents/channels/discord/security-doctor.d.ts.map +1 -0
  114. package/dist/agents/channels/discord/security-doctor.js +83 -0
  115. package/dist/agents/channels/discord/security-doctor.js.map +1 -0
  116. package/dist/agents/channels/discord/status-issues.d.ts +37 -0
  117. package/dist/agents/channels/discord/status-issues.d.ts.map +1 -0
  118. package/dist/agents/channels/discord/status-issues.js +66 -0
  119. package/dist/agents/channels/discord/status-issues.js.map +1 -0
  120. package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts +57 -0
  121. package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts.map +1 -0
  122. package/dist/agents/channels/discord/subagent-thread-binding-store.js +98 -0
  123. package/dist/agents/channels/discord/subagent-thread-binding-store.js.map +1 -0
  124. package/dist/agents/channels/discord/subagent-thread-binding.d.ts +95 -0
  125. package/dist/agents/channels/discord/subagent-thread-binding.d.ts.map +1 -0
  126. package/dist/agents/channels/discord/subagent-thread-binding.js +208 -0
  127. package/dist/agents/channels/discord/subagent-thread-binding.js.map +1 -0
  128. package/dist/agents/channels/discord/system-events.d.ts +31 -0
  129. package/dist/agents/channels/discord/system-events.d.ts.map +1 -0
  130. package/dist/agents/channels/discord/system-events.js +74 -0
  131. package/dist/agents/channels/discord/system-events.js.map +1 -0
  132. package/dist/agents/channels/general-callback.d.ts +12 -0
  133. package/dist/agents/channels/general-callback.d.ts.map +1 -1
  134. package/dist/agents/channels/general-callback.js +18 -0
  135. package/dist/agents/channels/general-callback.js.map +1 -1
  136. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  137. package/dist/agents/channels/inbound-pipeline.js +70 -10
  138. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  139. package/dist/agents/channels/sdk.d.ts +2 -0
  140. package/dist/agents/channels/sdk.d.ts.map +1 -1
  141. package/dist/agents/channels/sdk.js +2 -0
  142. package/dist/agents/channels/sdk.js.map +1 -1
  143. package/dist/agents/extensions/modules/index.d.ts.map +1 -1
  144. package/dist/agents/extensions/modules/index.js +5 -0
  145. package/dist/agents/extensions/modules/index.js.map +1 -1
  146. package/dist/agents/extensions/types.d.ts +7 -0
  147. package/dist/agents/extensions/types.d.ts.map +1 -1
  148. package/dist/agents/extensions/types.js.map +1 -1
  149. package/dist/agents/subagent-announce-delivery.d.ts +10 -0
  150. package/dist/agents/subagent-announce-delivery.d.ts.map +1 -1
  151. package/dist/agents/subagent-announce-delivery.js +1 -0
  152. package/dist/agents/subagent-announce-delivery.js.map +1 -1
  153. package/dist/agents/subagent-completion-bridge.d.ts.map +1 -1
  154. package/dist/agents/subagent-completion-bridge.js +81 -0
  155. package/dist/agents/subagent-completion-bridge.js.map +1 -1
  156. package/dist/agents/subagent-spawn.d.ts.map +1 -1
  157. package/dist/agents/subagent-spawn.js +57 -4
  158. package/dist/agents/subagent-spawn.js.map +1 -1
  159. package/dist/agents/tools/cron-tool.d.ts.map +1 -1
  160. package/dist/agents/tools/cron-tool.js +4 -1
  161. package/dist/agents/tools/cron-tool.js.map +1 -1
  162. package/dist/agents/tools/discord-action-tool.d.ts +224 -0
  163. package/dist/agents/tools/discord-action-tool.d.ts.map +1 -0
  164. package/dist/agents/tools/discord-action-tool.js +848 -0
  165. package/dist/agents/tools/discord-action-tool.js.map +1 -0
  166. package/dist/agents/tools/registry.d.ts.map +1 -1
  167. package/dist/agents/tools/registry.js +21 -0
  168. package/dist/agents/tools/registry.js.map +1 -1
  169. package/dist/agents/tools/sessions/index.d.ts +8 -0
  170. package/dist/agents/tools/sessions/index.d.ts.map +1 -1
  171. package/dist/agents/tools/sessions/index.js +15 -3
  172. package/dist/agents/tools/sessions/index.js.map +1 -1
  173. package/dist/buildstamp.json +1 -1
  174. package/dist/cli/commands/channels.d.ts +2 -0
  175. package/dist/cli/commands/channels.d.ts.map +1 -1
  176. package/dist/cli/commands/channels.js +58 -1
  177. package/dist/cli/commands/channels.js.map +1 -1
  178. package/dist/core/auth-bridge.d.ts +1 -0
  179. package/dist/core/auth-bridge.d.ts.map +1 -1
  180. package/dist/core/auth-bridge.js +46 -1
  181. package/dist/core/auth-bridge.js.map +1 -1
  182. package/dist/core/server.d.ts.map +1 -1
  183. package/dist/core/server.js +18 -2
  184. package/dist/core/server.js.map +1 -1
  185. package/dist/cron/isolated-agent/run-executor.d.ts +11 -0
  186. package/dist/cron/isolated-agent/run-executor.d.ts.map +1 -1
  187. package/dist/cron/isolated-agent/run-executor.js +20 -4
  188. package/dist/cron/isolated-agent/run-executor.js.map +1 -1
  189. package/dist/cron/types.d.ts +8 -0
  190. package/dist/cron/types.d.ts.map +1 -1
  191. package/dist/system-prompt/assembler.d.ts.map +1 -1
  192. package/dist/system-prompt/assembler.js +4 -2
  193. package/dist/system-prompt/assembler.js.map +1 -1
  194. 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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"}