@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,589 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure extractors that turn a discord.js message / reaction / interaction into
|
|
3
|
+
* the normalized fields Brigade's `InboundMessage` carries. No network, no side
|
|
4
|
+
* effects — every function here is deterministic over its argument so they're
|
|
5
|
+
* trivial to unit-test without a live gateway.
|
|
6
|
+
*
|
|
7
|
+
* Discord's wire shape (rich discord.js objects, not raw JSON like Slack's
|
|
8
|
+
* Events API) differs from Slack/Telegram in load-bearing ways, so the logic is
|
|
9
|
+
* a Brigade-native re-implementation that models the SHAPE of
|
|
10
|
+
* `slack/inbound-extras.ts` (raw payload → normalized signals) while speaking
|
|
11
|
+
* Discord semantics:
|
|
12
|
+
*
|
|
13
|
+
* - Text arrives as `message.content` peppered with Discord TOKENS: `<@123>`
|
|
14
|
+
* / `<@!123>` (user/member), `<@&456>` (role), `<#789>` (channel),
|
|
15
|
+
* `<:name:111>` / `<a:name:111>` (custom emoji). {@link extractDiscordText}
|
|
16
|
+
* expands user/channel/role mentions into readable plain text the agent can
|
|
17
|
+
* parse (`@alex`, `#general`), resolving names via an injected cache when one
|
|
18
|
+
* is supplied (the cached guild/client primes them in the background).
|
|
19
|
+
* - The bot is "addressed" when its own user id appears as a `<@123>` mention.
|
|
20
|
+
* {@link extractDiscordMentions} surfaces the bot's id when addressed so the
|
|
21
|
+
* central group ACL admits the message — exactly as Slack surfaces the bot's
|
|
22
|
+
* id. Every OTHER user mention is surfaced too.
|
|
23
|
+
* - Channel kind: a DM channel → `direct`; a guild text channel / thread →
|
|
24
|
+
* `group` (see {@link discordChannelType}).
|
|
25
|
+
* - Threads ride on the channel being a thread (`threadId` = the thread
|
|
26
|
+
* channel id); the parent text channel is the conversation root.
|
|
27
|
+
* - Reply context rides on `message.reference.messageId`.
|
|
28
|
+
* - Attachments arrive as `message.attachments` (each a CDN `url` + metadata);
|
|
29
|
+
* the connection layer DEFERS the byte download until the access gate admits
|
|
30
|
+
* the sender (mirrors Slack/Telegram's deferred-media discipline).
|
|
31
|
+
*
|
|
32
|
+
* Brigade's CENTRAL inbound pipeline owns the actual ACL / mention / routing
|
|
33
|
+
* decision — these helpers only surface the raw signals it reads.
|
|
34
|
+
*/
|
|
35
|
+
/* ───────────────────────── small helpers ───────────────────────── */
|
|
36
|
+
/**
|
|
37
|
+
* Reject control-byte payloads (a binary blob masquerading as text). Tab / LF /
|
|
38
|
+
* CR are allowed; any other C0 control char marks the run as non-text and it's
|
|
39
|
+
* dropped so the agent never ingests raw binary. Mirrors Slack's
|
|
40
|
+
* `isBinaryContent`.
|
|
41
|
+
*/
|
|
42
|
+
function isBinaryContent(text) {
|
|
43
|
+
for (let i = 0; i < text.length; i++) {
|
|
44
|
+
const code = text.charCodeAt(i);
|
|
45
|
+
if (code <= 0x1f && code !== 0x09 && code !== 0x0a && code !== 0x0d)
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/** Normalize a discord.js Collection / Map / iterable / array into a plain array. */
|
|
51
|
+
function toArray(coll) {
|
|
52
|
+
if (!coll)
|
|
53
|
+
return [];
|
|
54
|
+
if (Array.isArray(coll))
|
|
55
|
+
return coll;
|
|
56
|
+
if (coll instanceof Map)
|
|
57
|
+
return [...coll.values()];
|
|
58
|
+
// A discord.js Collection extends Map, so the branch above catches it; this is
|
|
59
|
+
// the generic-iterable fallback for any other shape.
|
|
60
|
+
if (typeof coll[Symbol.iterator] === "function")
|
|
61
|
+
return [...coll];
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
/* ───────────────────────── token expansion ───────────────────────── */
|
|
65
|
+
/**
|
|
66
|
+
* Expand the Discord message TOKENS in a run of text into readable plain text:
|
|
67
|
+
* - `<@123>` / `<@!123>` → `@alex` (resolved name) or `@123`
|
|
68
|
+
* - `<@&456>` → `@role` (resolved) or `@&456`
|
|
69
|
+
* - `<#789>` → `#general` (resolved) or `#789`
|
|
70
|
+
* - `<:name:111>` / `<a:name:111>` → `:name:` (the readable emoji shortcode)
|
|
71
|
+
*
|
|
72
|
+
* Names resolve via the injected lookups (the connection primes them from the
|
|
73
|
+
* cached guild/client); without a resolver the bare id is surfaced. Pure +
|
|
74
|
+
* deterministic.
|
|
75
|
+
*/
|
|
76
|
+
export function expandDiscordTokens(text, resolve) {
|
|
77
|
+
if (!text)
|
|
78
|
+
return "";
|
|
79
|
+
return text.replace(/<(a?):([A-Za-z0-9_]{2,32}):\d+>|<@&(\d+)>|<@!?(\d+)>|<#(\d+)>/g, (whole, _anim, emojiName, roleId, userId, channelId) => {
|
|
80
|
+
if (typeof emojiName === "string" && emojiName)
|
|
81
|
+
return `:${emojiName}:`;
|
|
82
|
+
if (typeof roleId === "string" && roleId) {
|
|
83
|
+
const name = resolve?.role?.(roleId);
|
|
84
|
+
return name ? `@${name}` : `@&${roleId}`;
|
|
85
|
+
}
|
|
86
|
+
if (typeof userId === "string" && userId) {
|
|
87
|
+
const name = resolve?.user?.(userId);
|
|
88
|
+
return name ? `@${name}` : `@${userId}`;
|
|
89
|
+
}
|
|
90
|
+
if (typeof channelId === "string" && channelId) {
|
|
91
|
+
const name = resolve?.channel?.(channelId);
|
|
92
|
+
return name ? `#${name}` : `#${channelId}`;
|
|
93
|
+
}
|
|
94
|
+
return whole;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The agent-facing plain text of a Discord message. Token-expanded (mentions /
|
|
99
|
+
* channels / roles / emoji → readable text). Binary blobs are dropped to "".
|
|
100
|
+
*/
|
|
101
|
+
export function extractDiscordText(message, resolve) {
|
|
102
|
+
const raw = typeof message.content === "string" ? message.content : "";
|
|
103
|
+
if (!raw || isBinaryContent(raw))
|
|
104
|
+
return "";
|
|
105
|
+
return expandDiscordTokens(raw, resolve).trim();
|
|
106
|
+
}
|
|
107
|
+
/* ───────────────────────── embeds / stickers / forwards (assembled text) ───────────────────────── */
|
|
108
|
+
const FORWARD_REFERENCE_TYPE = 1;
|
|
109
|
+
/**
|
|
110
|
+
* True when the message is a FORWARD (reference kind `1`) rather than a reply
|
|
111
|
+
* (kind `0` / absent). discord.js exposes the kind on `reference.type`; the raw
|
|
112
|
+
* gateway shape carries it on `messageReference.type`. Used so a forward isn't
|
|
113
|
+
* mistaken for a reply by the reply-context resolver.
|
|
114
|
+
*/
|
|
115
|
+
export function isDiscordForward(message) {
|
|
116
|
+
const t = message.reference?.type ?? message.messageReference?.type;
|
|
117
|
+
return typeof t === "number" && t === FORWARD_REFERENCE_TYPE;
|
|
118
|
+
}
|
|
119
|
+
/** A short author label for a forwarded snapshot (globalName → username → id). */
|
|
120
|
+
function snapshotAuthorLabel(author) {
|
|
121
|
+
if (!author)
|
|
122
|
+
return undefined;
|
|
123
|
+
const display = author.globalName ?? author.global_name ?? undefined;
|
|
124
|
+
if (typeof display === "string" && display.trim())
|
|
125
|
+
return display.trim();
|
|
126
|
+
const username = author.username;
|
|
127
|
+
if (typeof username === "string" && username.trim())
|
|
128
|
+
return username.trim();
|
|
129
|
+
return typeof author.id === "string" && author.id ? author.id : undefined;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The first embed's text folded into a readable run: `title` + `description` +
|
|
133
|
+
* (a bare `url` when neither carries it). Returns "" when the message has no
|
|
134
|
+
* embed text. Pure + deterministic.
|
|
135
|
+
*/
|
|
136
|
+
export function extractDiscordEmbedText(message) {
|
|
137
|
+
const embed = Array.isArray(message.embeds) ? message.embeds[0] : undefined;
|
|
138
|
+
if (!embed)
|
|
139
|
+
return "";
|
|
140
|
+
const title = typeof embed.title === "string" ? embed.title.trim() : "";
|
|
141
|
+
const description = typeof embed.description === "string" ? embed.description.trim() : "";
|
|
142
|
+
const url = typeof embed.url === "string" ? embed.url.trim() : "";
|
|
143
|
+
const parts = [];
|
|
144
|
+
if (title)
|
|
145
|
+
parts.push(title);
|
|
146
|
+
if (description)
|
|
147
|
+
parts.push(description);
|
|
148
|
+
// Surface the link only when there's no title/description carrying it already.
|
|
149
|
+
if (url && parts.length === 0)
|
|
150
|
+
parts.push(url);
|
|
151
|
+
return parts.join("\n");
|
|
152
|
+
}
|
|
153
|
+
/** The sticker items on a message (the `.stickers` collection, then raw `sticker_items`). */
|
|
154
|
+
export function resolveInboundStickers(message) {
|
|
155
|
+
const fromCollection = toArray(message.stickers ?? undefined).filter((s) => Boolean(s) && typeof s === "object");
|
|
156
|
+
if (fromCollection.length > 0)
|
|
157
|
+
return fromCollection;
|
|
158
|
+
const raw = Array.isArray(message.sticker_items) ? message.sticker_items : [];
|
|
159
|
+
return raw.filter((s) => Boolean(s) && typeof s === "object");
|
|
160
|
+
}
|
|
161
|
+
/** A `<sticker: name>` placeholder line per sticker, joined by newlines. Returns "" when none. */
|
|
162
|
+
export function extractDiscordStickerText(message) {
|
|
163
|
+
const stickers = resolveInboundStickers(message);
|
|
164
|
+
if (stickers.length === 0)
|
|
165
|
+
return "";
|
|
166
|
+
return stickers
|
|
167
|
+
.map((s) => {
|
|
168
|
+
const name = typeof s.name === "string" && s.name.trim() ? s.name.trim() : "sticker";
|
|
169
|
+
return `<sticker: ${name}>`;
|
|
170
|
+
})
|
|
171
|
+
.join("\n");
|
|
172
|
+
}
|
|
173
|
+
/** The forwarded-message snapshots on a message (discord.js Collection or raw array). */
|
|
174
|
+
export function resolveDiscordSnapshots(message) {
|
|
175
|
+
const fromCollection = toArray(message.messageSnapshots ?? undefined).filter((s) => Boolean(s) && typeof s === "object");
|
|
176
|
+
if (fromCollection.length > 0)
|
|
177
|
+
return fromCollection;
|
|
178
|
+
const raw = Array.isArray(message.message_snapshots) ? message.message_snapshots : [];
|
|
179
|
+
return raw.filter((s) => Boolean(s) && typeof s === "object");
|
|
180
|
+
}
|
|
181
|
+
/** The plain text of ONE forwarded snapshot's inner message (content → sticker → embed). */
|
|
182
|
+
function snapshotInnerText(snap, resolve) {
|
|
183
|
+
const content = typeof snap.content === "string" && !isBinaryContent(snap.content) ? expandDiscordTokens(snap.content, resolve).trim() : "";
|
|
184
|
+
const stickerText = extractDiscordStickerText(snap);
|
|
185
|
+
const embedText = extractDiscordEmbedText(snap);
|
|
186
|
+
return content || stickerText || embedText || "";
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The `[Forwarded from <author>]` block(s) for any forwarded snapshots on the
|
|
190
|
+
* message. Each snapshot becomes a heading + its inner text. A forward whose
|
|
191
|
+
* snapshot has no text still surfaces the heading so the agent learns a forward
|
|
192
|
+
* happened. Returns "" when the message carries no forward snapshots.
|
|
193
|
+
*/
|
|
194
|
+
export function extractDiscordForwardedText(message, resolve) {
|
|
195
|
+
const snapshots = resolveDiscordSnapshots(message);
|
|
196
|
+
if (snapshots.length === 0)
|
|
197
|
+
return "";
|
|
198
|
+
const blocks = [];
|
|
199
|
+
for (const snap of snapshots) {
|
|
200
|
+
const inner = snap.message ?? undefined;
|
|
201
|
+
const author = inner ? snapshotAuthorLabel(inner.author) : undefined;
|
|
202
|
+
const heading = author ? `[Forwarded from ${author}]` : "[Forwarded message]";
|
|
203
|
+
const text = inner ? snapshotInnerText(inner, resolve) : "";
|
|
204
|
+
blocks.push(text ? `${heading}\n${text}` : heading);
|
|
205
|
+
}
|
|
206
|
+
return blocks.join("\n\n");
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The full agent-facing text Brigade routes for a Discord message. The message
|
|
210
|
+
* `content` leads (token-expanded); when content is empty we FALL BACK to the
|
|
211
|
+
* first embed's title/description so an embed-only message isn't dropped. A
|
|
212
|
+
* `<sticker: name>` placeholder is APPENDED for any stickers, and a
|
|
213
|
+
* `[Forwarded from …]` block is APPENDED for any forwarded snapshots — so a
|
|
214
|
+
* sticker-only or forward-only message carries real text instead of "".
|
|
215
|
+
*
|
|
216
|
+
* Pure + deterministic; the connection passes a `resolve` lookup so mention
|
|
217
|
+
* tokens expand to readable names.
|
|
218
|
+
*/
|
|
219
|
+
export function assembleDiscordText(message, resolve) {
|
|
220
|
+
const content = extractDiscordText(message, resolve);
|
|
221
|
+
const parts = [];
|
|
222
|
+
if (content) {
|
|
223
|
+
parts.push(content);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
const embedText = extractDiscordEmbedText(message);
|
|
227
|
+
if (embedText)
|
|
228
|
+
parts.push(embedText);
|
|
229
|
+
}
|
|
230
|
+
const stickerText = extractDiscordStickerText(message);
|
|
231
|
+
if (stickerText)
|
|
232
|
+
parts.push(stickerText);
|
|
233
|
+
const forwardedText = extractDiscordForwardedText(message, resolve);
|
|
234
|
+
if (forwardedText)
|
|
235
|
+
parts.push(forwardedText);
|
|
236
|
+
return parts.join("\n").trim();
|
|
237
|
+
}
|
|
238
|
+
/* ───────────────────────── chat type + thread + reply ───────────────────────── */
|
|
239
|
+
/** Discord channel-type enum values Brigade distinguishes. */
|
|
240
|
+
const CHANNEL_TYPE_DM = 1;
|
|
241
|
+
const CHANNEL_TYPE_GROUP_DM = 3;
|
|
242
|
+
const THREAD_TYPE_VALUES = new Set([10, 11, 12]); // announcement / public / private thread
|
|
243
|
+
/** True when a discord.js channel is a thread (uses `isThread()` when present, else the type enum). */
|
|
244
|
+
export function isThreadChannel(channel) {
|
|
245
|
+
if (!channel)
|
|
246
|
+
return false;
|
|
247
|
+
if (typeof channel.isThread === "function")
|
|
248
|
+
return channel.isThread();
|
|
249
|
+
return typeof channel.type === "number" && THREAD_TYPE_VALUES.has(channel.type);
|
|
250
|
+
}
|
|
251
|
+
/** True when a discord.js channel is a DM (uses `isDMBased()` when present, else the type enum). */
|
|
252
|
+
export function isDmChannel(channel) {
|
|
253
|
+
if (!channel)
|
|
254
|
+
return false;
|
|
255
|
+
if (typeof channel.isDMBased === "function")
|
|
256
|
+
return channel.isDMBased();
|
|
257
|
+
return channel.type === CHANNEL_TYPE_DM || channel.type === CHANNEL_TYPE_GROUP_DM;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Discord channel → Brigade chat type. A 1:1 DM → `direct`; a guild text channel
|
|
261
|
+
* or a thread → `group`. A group DM (rare for bots) → `group`. When no channel
|
|
262
|
+
* object is available, a missing `guildId` implies a DM.
|
|
263
|
+
*/
|
|
264
|
+
export function discordChannelType(message) {
|
|
265
|
+
const channel = message.channel;
|
|
266
|
+
if (channel) {
|
|
267
|
+
if (isDmChannel(channel) && channel.type !== CHANNEL_TYPE_GROUP_DM)
|
|
268
|
+
return "direct";
|
|
269
|
+
return "group";
|
|
270
|
+
}
|
|
271
|
+
// No channel object: a message with no guild is a DM.
|
|
272
|
+
return message.guildId ? "group" : "direct";
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* The thread channel id when the message landed in a thread, else undefined. The
|
|
276
|
+
* thread's own channel id is the thread id (Discord threads ARE channels).
|
|
277
|
+
*/
|
|
278
|
+
export function discordThreadId(message) {
|
|
279
|
+
const channel = message.channel;
|
|
280
|
+
if (channel && isThreadChannel(channel)) {
|
|
281
|
+
return typeof channel.id === "string" ? channel.id : typeof message.channelId === "string" ? message.channelId : undefined;
|
|
282
|
+
}
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Reply-context (what message this inbound quotes), when it's a reply. Discord
|
|
287
|
+
* carries `message.reference.messageId` (the replied-to message id) but does NOT
|
|
288
|
+
* inline that message's text — so the context surfaces the parent message id and
|
|
289
|
+
* leaves `body` undefined (the connection can fetch the parent if it needs the
|
|
290
|
+
* excerpt). Returns undefined for a non-reply.
|
|
291
|
+
*
|
|
292
|
+
* When discord.js already resolved the reply parent (`message.referencedMessage`,
|
|
293
|
+
* which rides inline on a Gateway reply MESSAGE_CREATE), the parent's author id is
|
|
294
|
+
* captured SYNCHRONOUSLY into `from`. This matters because the central pipeline's
|
|
295
|
+
* group-addressing `isReplyToBot` depends on `replyTo.from === selfId` — if `from`
|
|
296
|
+
* were populated ONLY by the async body-backfill (connection.ts), a guild
|
|
297
|
+
* reply-to-bot whose backfill fetch failed would lose its implicit-mention
|
|
298
|
+
* admission and be dropped. The async backfill still fills `body` (the excerpt).
|
|
299
|
+
*/
|
|
300
|
+
export function extractDiscordReplyContext(message) {
|
|
301
|
+
// A FORWARD (reference kind 1) also carries a `reference.messageId`, but it's a
|
|
302
|
+
// forward — its content rides in the snapshot, not a quoted reply. Don't surface
|
|
303
|
+
// it as reply context (the assembled text already carries the forwarded block).
|
|
304
|
+
if (isDiscordForward(message))
|
|
305
|
+
return undefined;
|
|
306
|
+
const ref = message.reference;
|
|
307
|
+
const id = ref?.messageId;
|
|
308
|
+
if (typeof id !== "string" || !id)
|
|
309
|
+
return undefined;
|
|
310
|
+
const out = { messageId: id };
|
|
311
|
+
// Synchronously resolve the parent author from the already-cached referenced
|
|
312
|
+
// message when discord.js handed one — no async fetch needed.
|
|
313
|
+
const parentAuthorId = message.referencedMessage?.author?.id;
|
|
314
|
+
if (typeof parentAuthorId === "string" && parentAuthorId)
|
|
315
|
+
out.from = parentAuthorId;
|
|
316
|
+
return out;
|
|
317
|
+
}
|
|
318
|
+
/* ───────────────────────── mentions ───────────────────────── */
|
|
319
|
+
/**
|
|
320
|
+
* Channel-native ids of users addressed in this message. Brigade's central group
|
|
321
|
+
* ACL treats a group message as "addressed to the bot" when the bot's own id
|
|
322
|
+
* appears in `mentions`; without this a group message never reaches the agent.
|
|
323
|
+
* So when the bot's own `<@id>` mention appears in the text we surface the bot's
|
|
324
|
+
* id (passed in). Every OTHER user mention is surfaced too so the pipeline sees
|
|
325
|
+
* who else was tagged.
|
|
326
|
+
*
|
|
327
|
+
* We scan BOTH the resolved `message.mentions.users` collection (when present)
|
|
328
|
+
* AND the raw `<@id>` / `<@!id>` tokens in the content, unioned + deduped — the
|
|
329
|
+
* collection is authoritative on a live message, the token scan is the fallback
|
|
330
|
+
* for a fake / a partial.
|
|
331
|
+
*
|
|
332
|
+
* @param botUserId the bot's own user id, surfaced when the bot is mentioned so
|
|
333
|
+
* the ACL admits the group message.
|
|
334
|
+
*/
|
|
335
|
+
export function extractDiscordMentions(message, botUserId) {
|
|
336
|
+
const out = [];
|
|
337
|
+
const seen = new Set();
|
|
338
|
+
let botMentioned = false;
|
|
339
|
+
const push = (id) => {
|
|
340
|
+
if (!id || seen.has(id))
|
|
341
|
+
return;
|
|
342
|
+
if (botUserId && id === botUserId) {
|
|
343
|
+
botMentioned = true;
|
|
344
|
+
return; // the bot's own id is pushed LAST (after the addressed check)
|
|
345
|
+
}
|
|
346
|
+
seen.add(id);
|
|
347
|
+
out.push(id);
|
|
348
|
+
};
|
|
349
|
+
for (const u of toArray(message.mentions?.users)) {
|
|
350
|
+
if (typeof u?.id === "string")
|
|
351
|
+
push(u.id);
|
|
352
|
+
}
|
|
353
|
+
const content = typeof message.content === "string" ? message.content : "";
|
|
354
|
+
const re = /<@!?(\d+)>/g;
|
|
355
|
+
let m;
|
|
356
|
+
while ((m = re.exec(content)) !== null) {
|
|
357
|
+
if (m[1])
|
|
358
|
+
push(m[1]);
|
|
359
|
+
}
|
|
360
|
+
if (botMentioned && botUserId) {
|
|
361
|
+
out.push(botUserId);
|
|
362
|
+
}
|
|
363
|
+
return out;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* The guild-role ids the sending member holds, surfaced so the 8-tier route
|
|
367
|
+
* resolver's `binding.guild+roles` tier can match. Role NAMES are never used —
|
|
368
|
+
* only ids. Returns `[]` for a DM (no member) or when no roles resolve.
|
|
369
|
+
*
|
|
370
|
+
* Handles the three shapes the `member.roles` value can take:
|
|
371
|
+
* - discord.js `GuildMemberRoleManager` — a `.cache` Collection (Map subclass)
|
|
372
|
+
* keyed by role id; we read the keys (the role ids).
|
|
373
|
+
* - a plain array / iterable of role-id strings (a fake / partial).
|
|
374
|
+
* - absent / null (a DM, or a message with no resolved member) → `[]`.
|
|
375
|
+
*
|
|
376
|
+
* Pure + deterministic; deduped, with the `@everyone` role (whose id equals the
|
|
377
|
+
* guild id and is implicit for everyone) left in as-is — the resolver only
|
|
378
|
+
* matches ids a binding explicitly lists, so a stray everyone id is harmless.
|
|
379
|
+
*/
|
|
380
|
+
export function extractDiscordMemberRoleIds(message) {
|
|
381
|
+
const roles = message.member?.roles;
|
|
382
|
+
if (!roles)
|
|
383
|
+
return [];
|
|
384
|
+
const out = [];
|
|
385
|
+
const seen = new Set();
|
|
386
|
+
const push = (id) => {
|
|
387
|
+
if (typeof id !== "string")
|
|
388
|
+
return;
|
|
389
|
+
const trimmed = id.trim();
|
|
390
|
+
if (!trimmed || seen.has(trimmed))
|
|
391
|
+
return;
|
|
392
|
+
seen.add(trimmed);
|
|
393
|
+
out.push(trimmed);
|
|
394
|
+
};
|
|
395
|
+
// Plain string array / iterable of ids (a fake or a partial).
|
|
396
|
+
if (Array.isArray(roles)) {
|
|
397
|
+
for (const id of roles)
|
|
398
|
+
push(id);
|
|
399
|
+
return out;
|
|
400
|
+
}
|
|
401
|
+
// A `GuildMemberRoleManager` exposes `.cache` (a Collection ⊂ Map keyed by id).
|
|
402
|
+
const cache = roles.cache;
|
|
403
|
+
if (cache) {
|
|
404
|
+
if (cache instanceof Map) {
|
|
405
|
+
for (const key of cache.keys())
|
|
406
|
+
push(key);
|
|
407
|
+
return out;
|
|
408
|
+
}
|
|
409
|
+
if (typeof cache[Symbol.iterator] === "function") {
|
|
410
|
+
// A Collection iterates `[key, value]` pairs; a bare value-iterable yields
|
|
411
|
+
// role-ish objects. Read the id off whichever shape arrives.
|
|
412
|
+
for (const item of cache) {
|
|
413
|
+
if (Array.isArray(item))
|
|
414
|
+
push(item[0]);
|
|
415
|
+
else if (item && typeof item === "object" && "id" in item)
|
|
416
|
+
push(item.id);
|
|
417
|
+
else
|
|
418
|
+
push(item);
|
|
419
|
+
}
|
|
420
|
+
return out;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// A bare iterable of ids on the manager itself (some fakes).
|
|
424
|
+
if (typeof roles[Symbol.iterator] === "function") {
|
|
425
|
+
for (const id of roles)
|
|
426
|
+
push(id);
|
|
427
|
+
}
|
|
428
|
+
return out;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* A short display name for the sender. A guild nickname wins (most specific),
|
|
432
|
+
* then the member/global display name, then the username, then the raw id.
|
|
433
|
+
*/
|
|
434
|
+
export function buildDiscordSenderName(message) {
|
|
435
|
+
const nickname = message.member?.nickname;
|
|
436
|
+
if (typeof nickname === "string" && nickname.trim())
|
|
437
|
+
return nickname.trim();
|
|
438
|
+
const memberDisplay = message.member?.displayName;
|
|
439
|
+
if (typeof memberDisplay === "string" && memberDisplay.trim())
|
|
440
|
+
return memberDisplay.trim();
|
|
441
|
+
const author = message.author;
|
|
442
|
+
const display = author?.displayName ?? author?.globalName;
|
|
443
|
+
if (typeof display === "string" && display.trim())
|
|
444
|
+
return display.trim();
|
|
445
|
+
const username = author?.username;
|
|
446
|
+
if (typeof username === "string" && username.trim())
|
|
447
|
+
return username.trim();
|
|
448
|
+
return typeof author?.id === "string" ? author.id : undefined;
|
|
449
|
+
}
|
|
450
|
+
/* ───────────────────────── media detection ───────────────────────── */
|
|
451
|
+
/** The Discord voice-message flag bit (1 << 13). discord.js exposes `flags.has(...)`; we also accept the raw number. */
|
|
452
|
+
const VOICE_MESSAGE_FLAG = 1 << 13;
|
|
453
|
+
/** A downloadable attachment is one carrying a url. */
|
|
454
|
+
function isDownloadableAttachment(a) {
|
|
455
|
+
return Boolean(a && (a.url || a.proxyURL));
|
|
456
|
+
}
|
|
457
|
+
/** discord.js sticker `format` / raw `format_type` enum: 1=PNG, 2=APNG, 3=Lottie, 4=GIF. */
|
|
458
|
+
const STICKER_FORMAT_PNG = 1;
|
|
459
|
+
const STICKER_FORMAT_APNG = 2;
|
|
460
|
+
const STICKER_FORMAT_LOTTIE = 3;
|
|
461
|
+
const STICKER_FORMAT_GIF = 4;
|
|
462
|
+
/** The CDN host stickers download from — already in the SSRF host allowlist (`media.discordapp.net`). */
|
|
463
|
+
const STICKER_ASSET_BASE_URL = "https://media.discordapp.net/stickers";
|
|
464
|
+
/**
|
|
465
|
+
* The downloadable CDN URL + content-type for ONE sticker, derived from its
|
|
466
|
+
* `format` enum. PNG/APNG → `.png`, GIF → `.gif`, Lottie (vector) → `.json`
|
|
467
|
+
* (the raw Lottie animation; we don't rasterize). The host is `media.discordapp.net`,
|
|
468
|
+
* already covered by the inbound SSRF allowlist. Returns null when the sticker
|
|
469
|
+
* has no id.
|
|
470
|
+
*/
|
|
471
|
+
export function stickerToAttachment(sticker) {
|
|
472
|
+
const id = typeof sticker.id === "string" ? sticker.id.trim() : "";
|
|
473
|
+
if (!id)
|
|
474
|
+
return null;
|
|
475
|
+
const format = typeof sticker.format === "number" ? sticker.format : typeof sticker.format_type === "number" ? sticker.format_type : STICKER_FORMAT_PNG;
|
|
476
|
+
const baseName = typeof sticker.name === "string" && sticker.name.trim() ? sticker.name.trim().replace(/[^A-Za-z0-9_-]/g, "_") : `sticker-${id}`;
|
|
477
|
+
let ext;
|
|
478
|
+
let contentType;
|
|
479
|
+
switch (format) {
|
|
480
|
+
case STICKER_FORMAT_GIF:
|
|
481
|
+
ext = "gif";
|
|
482
|
+
contentType = "image/gif";
|
|
483
|
+
break;
|
|
484
|
+
case STICKER_FORMAT_LOTTIE:
|
|
485
|
+
ext = "json";
|
|
486
|
+
contentType = "application/json";
|
|
487
|
+
break;
|
|
488
|
+
case STICKER_FORMAT_APNG:
|
|
489
|
+
case STICKER_FORMAT_PNG:
|
|
490
|
+
default:
|
|
491
|
+
ext = "png";
|
|
492
|
+
contentType = "image/png";
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
return {
|
|
496
|
+
id,
|
|
497
|
+
name: `${baseName}.${ext}`,
|
|
498
|
+
url: `${STICKER_ASSET_BASE_URL}/${id}.${ext}`,
|
|
499
|
+
contentType,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
/** Sticker assets on a message, mapped to downloadable attachment descriptors. */
|
|
503
|
+
export function resolveInboundStickerAttachments(message) {
|
|
504
|
+
const out = [];
|
|
505
|
+
for (const sticker of resolveInboundStickers(message)) {
|
|
506
|
+
const att = stickerToAttachment(sticker);
|
|
507
|
+
if (att)
|
|
508
|
+
out.push(att);
|
|
509
|
+
}
|
|
510
|
+
return out;
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Downloadable attachments carried INSIDE forwarded snapshots (attachments +
|
|
514
|
+
* stickers of each forwarded message). A forward arrives as a frozen snapshot,
|
|
515
|
+
* so its media never appears on `message.attachments` — it has to be pulled out
|
|
516
|
+
* of the snapshot.
|
|
517
|
+
*/
|
|
518
|
+
export function resolveForwardedAttachments(message) {
|
|
519
|
+
const out = [];
|
|
520
|
+
for (const snap of resolveDiscordSnapshots(message)) {
|
|
521
|
+
const inner = snap.message;
|
|
522
|
+
if (!inner)
|
|
523
|
+
continue;
|
|
524
|
+
for (const a of toArray(inner.attachments ?? undefined)) {
|
|
525
|
+
if (isDownloadableAttachment(a))
|
|
526
|
+
out.push(a);
|
|
527
|
+
}
|
|
528
|
+
out.push(...resolveInboundStickerAttachments(inner));
|
|
529
|
+
}
|
|
530
|
+
return out;
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Cheap presence probe — does this message carry ANY downloadable media? Walks
|
|
534
|
+
* direct attachments, stickers, AND forwarded-snapshot media but never touches
|
|
535
|
+
* the network, so the connection layer can DEFER the actual download until AFTER
|
|
536
|
+
* the central access gate admits the sender (mirrors Slack/Telegram).
|
|
537
|
+
*/
|
|
538
|
+
export function hasInboundMedia(message) {
|
|
539
|
+
if (toArray(message.attachments).some(isDownloadableAttachment))
|
|
540
|
+
return true;
|
|
541
|
+
if (resolveInboundStickers(message).length > 0)
|
|
542
|
+
return true;
|
|
543
|
+
if (resolveForwardedAttachments(message).length > 0)
|
|
544
|
+
return true;
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* The full list of downloadable attachments to fetch for a message: direct
|
|
549
|
+
* attachments, sticker assets (downloaded from the Discord sticker CDN), and any
|
|
550
|
+
* media carried inside forwarded snapshots.
|
|
551
|
+
*/
|
|
552
|
+
export function resolveInboundAttachments(message) {
|
|
553
|
+
const direct = toArray(message.attachments).filter(isDownloadableAttachment);
|
|
554
|
+
const stickers = resolveInboundStickerAttachments(message);
|
|
555
|
+
const forwarded = resolveForwardedAttachments(message);
|
|
556
|
+
return [...direct, ...stickers, ...forwarded];
|
|
557
|
+
}
|
|
558
|
+
/** True when an attachment carries the Discord voice-message flag. */
|
|
559
|
+
function isVoiceAttachment(a) {
|
|
560
|
+
const flags = a.flags;
|
|
561
|
+
if (typeof flags === "number")
|
|
562
|
+
return (flags & VOICE_MESSAGE_FLAG) !== 0;
|
|
563
|
+
if (flags && typeof flags.has === "function") {
|
|
564
|
+
try {
|
|
565
|
+
return Boolean(flags.has(VOICE_MESSAGE_FLAG));
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return false;
|
|
572
|
+
}
|
|
573
|
+
/** The Brigade media-kind of a Discord attachment, from its contentType / filename / voice flag. */
|
|
574
|
+
export function resolveDiscordAttachmentKind(a) {
|
|
575
|
+
if (isVoiceAttachment(a))
|
|
576
|
+
return "voice";
|
|
577
|
+
const mime = (a.contentType ?? "").toLowerCase();
|
|
578
|
+
const name = (a.name ?? "").toLowerCase();
|
|
579
|
+
const ext = name.includes(".") ? name.slice(name.lastIndexOf(".") + 1) : "";
|
|
580
|
+
if (mime.startsWith("image/") || /^(png|jpg|jpeg|gif|webp|bmp|heic)$/.test(ext))
|
|
581
|
+
return "image";
|
|
582
|
+
if (mime.startsWith("video/") || /^(mp4|mov|webm|mkv|avi)$/.test(ext))
|
|
583
|
+
return "video";
|
|
584
|
+
if (mime.startsWith("audio/") || /^(mp3|m4a|ogg|wav|flac|aac)$/.test(ext)) {
|
|
585
|
+
return ext === "ogg" || ext === "m4a" ? "voice" : "audio";
|
|
586
|
+
}
|
|
587
|
+
return "document";
|
|
588
|
+
}
|
|
589
|
+
//# sourceMappingURL=inbound-extras.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-extras.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/inbound-extras.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Discord channel — public surface. */
|
|
2
|
+
export { createDiscordAdapter, buildReactionNote, DISCORD_CAPABILITIES, type CreateDiscordAdapterOptions, type DiscordAdapter, } from "./adapter.js";
|
|
3
|
+
export { listDiscordAccountIds, resolveDiscordAccount, resolveDiscordAutoThread, resolveDiscordBotToken, resolveDiscordPresence, resolveDiscordProxyUrl, discordChannelEnabled, discordLiveStreamEnabled, discordReactionNotifications, discordStreamThrottleMs, discordSurfaceReasoning, discordThreadIdleTtlMs, maskProxyUrl, stripBotPrefix, DISCORD_BOT_TOKEN_ENV_VAR, DISCORD_CHANNEL_ID, DISCORD_DEFAULT_ACCOUNT_ID, type DiscordAutoThreadNameMode, type DiscordPresenceActivityType, type DiscordPresenceStatus, type DiscordReactionNotificationMode, type ResolvedDiscordAccount, type ResolvedDiscordAutoThread, type ResolvedDiscordPresence, } from "./account-config.js";
|
|
4
|
+
export { buildDiscordApprovalMessage, buildDiscordApprovalText, parseDiscordApprovalAction, type DiscordApprovalMessage, } from "./approval-native.js";
|
|
5
|
+
export { resolveDiscordApprover } from "./approval-authorize.js";
|
|
6
|
+
export { buildDiscordApprovalRows, buildDiscordButtonRows, sanitizeDiscordCustomId, DISCORD_BUTTON_STYLE, DISCORD_BUTTONS_PER_ROW, DISCORD_CUSTOM_ID_MAX_CHARS, DISCORD_MAX_ROWS, type DiscordActionRow, type DiscordButtonSpec, } from "./components.js";
|
|
7
|
+
export { buildDiscordCommandManifest, normalizeDiscordCommandName, type DiscordApplicationCommand, } from "./command-menu.js";
|
|
8
|
+
export { connectDiscord, discordBackoffDelay, isDiscordUnauthorized, redactDiscordToken, sanitizeThreadName, type ConnectDiscordArgs, type DiscordConnection, type DiscordInboundMessage, type DiscordPresencePayload, } from "./connection.js";
|
|
9
|
+
export { downloadDiscordAttachment, buildDiscordAttachment, isAllowedDiscordAttachmentUrl, type DiscordOutboundAttachment, } from "./media.js";
|
|
10
|
+
export { markdownToDiscord, discordTextIsEmpty, DISCORD_MESSAGE_LIMIT } from "./format.js";
|
|
11
|
+
export { createDiscordPlugin, type DiscordPluginDeps, type DiscordPluginHandle } from "./plugin.js";
|
|
12
|
+
export { probeDiscord, decodeMessageContentIntent, decodePrivilegedIntents, MESSAGE_CONTENT_DISABLED_WARNING, type DiscordPrivilegedIntents, type DiscordProbeResult, type DiscordProbeBot, type MessageContentIntentState, type PrivilegedIntentState, } from "./probe.js";
|
|
13
|
+
export { listDiscordGuilds, type DiscordGuildSummary } from "./guilds.js";
|
|
14
|
+
export { listDiscordDirectoryPeers, listDiscordDirectoryGroups, type DiscordDirectoryEntry, type DiscordDirectoryQuery, } from "./directory-live.js";
|
|
15
|
+
export { auditDiscordChannelPermissions, type DiscordChannelPermissionResult, type DiscordPermissionAuditResult, } from "./permission-audit.js";
|
|
16
|
+
export { collectDiscordStatusIssues, type DiscordStatusAccount } from "./status-issues.js";
|
|
17
|
+
export { collectDiscordSecurityAuditFindings } from "./security-audit.js";
|
|
18
|
+
export { isDiscordMutableAllowEntry, scanDiscordNumericIdHazards, type DiscordNumericIdHazard, } from "./security-doctor.js";
|
|
19
|
+
export { collectConfiguredDiscordChannelIds, type DiscordProbeWithAudit } from "./plugin.js";
|
|
20
|
+
export { discordModule } from "./module.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EACN,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,cAAc,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,sBAAsB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACN,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,2BAA2B,EAC3B,2BAA2B,EAC3B,KAAK,yBAAyB,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,yBAAyB,GAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EACN,YAAY,EACZ,0BAA0B,EAC1B,uBAAuB,EACvB,gCAAgC,EAChC,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EACN,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,8BAA8B,EAC9B,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,GACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EACN,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,sBAAsB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kCAAkC,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|