discord: allow embeds/components in message tool send

This commit is contained in:
Solvely-Colin 2026-01-29 14:12:06 +00:00
parent 37ffd3463b
commit ca2ab303ba
5 changed files with 40 additions and 0 deletions

View File

@ -233,11 +233,16 @@ export async function handleDiscordMessagingAction(
const replyTo = readStringParam(params, "replyTo"); const replyTo = readStringParam(params, "replyTo");
const embeds = const embeds =
Array.isArray(params.embeds) && params.embeds.length > 0 ? params.embeds : undefined; Array.isArray(params.embeds) && params.embeds.length > 0 ? params.embeds : undefined;
const components =
Array.isArray(params.components) && params.components.length > 0
? params.components
: undefined;
const result = await sendMessageDiscord(to, content, { const result = await sendMessageDiscord(to, content, {
...(accountId ? { accountId } : {}), ...(accountId ? { accountId } : {}),
mediaUrl, mediaUrl,
replyTo, replyTo,
embeds, embeds,
components,
}); });
return jsonResult({ ok: true, result }); return jsonResult({ ok: true, result });
} }

View File

@ -87,6 +87,30 @@ function buildSendSchema(options: { includeButtons: boolean; includeCards: boole
}, },
), ),
), ),
embeds: Type.Optional(
Type.Array(
Type.Object(
{},
{
additionalProperties: true,
description:
"Provider-specific embed objects (Discord embeds, etc.). Passed through to the channel adapter when supported.",
},
),
),
),
components: Type.Optional(
Type.Array(
Type.Object(
{},
{
additionalProperties: true,
description:
"Provider-specific message components (Discord buttons/selects, etc.). Passed through when supported.",
},
),
),
),
}; };
if (!options.includeButtons) delete props.buttons; if (!options.includeButtons) delete props.buttons;
if (!options.includeCards) delete props.card; if (!options.includeCards) delete props.card;

View File

@ -37,6 +37,7 @@ export async function handleDiscordMessageAction(
const mediaUrl = readStringParam(params, "media", { trim: false }); const mediaUrl = readStringParam(params, "media", { trim: false });
const replyTo = readStringParam(params, "replyTo"); const replyTo = readStringParam(params, "replyTo");
const embeds = Array.isArray(params.embeds) ? params.embeds : undefined; const embeds = Array.isArray(params.embeds) ? params.embeds : undefined;
const components = Array.isArray(params.components) ? params.components : undefined;
return await handleDiscordAction( return await handleDiscordAction(
{ {
action: "sendMessage", action: "sendMessage",
@ -46,6 +47,7 @@ export async function handleDiscordMessageAction(
mediaUrl: mediaUrl ?? undefined, mediaUrl: mediaUrl ?? undefined,
replyTo: replyTo ?? undefined, replyTo: replyTo ?? undefined,
embeds, embeds,
components,
}, },
cfg, cfg,
); );

View File

@ -29,6 +29,7 @@ type DiscordSendOpts = {
replyTo?: string; replyTo?: string;
retry?: RetryConfig; retry?: RetryConfig;
embeds?: unknown[]; embeds?: unknown[];
components?: unknown[];
}; };
export async function sendMessageDiscord( export async function sendMessageDiscord(
@ -63,6 +64,7 @@ export async function sendMessageDiscord(
request, request,
accountInfo.config.maxLinesPerMessage, accountInfo.config.maxLinesPerMessage,
opts.embeds, opts.embeds,
opts.components,
chunkMode, chunkMode,
); );
} else { } else {
@ -74,6 +76,7 @@ export async function sendMessageDiscord(
request, request,
accountInfo.config.maxLinesPerMessage, accountInfo.config.maxLinesPerMessage,
opts.embeds, opts.embeds,
opts.components,
chunkMode, chunkMode,
); );
} }

View File

@ -232,6 +232,7 @@ async function sendDiscordText(
request: DiscordRequest, request: DiscordRequest,
maxLinesPerMessage?: number, maxLinesPerMessage?: number,
embeds?: unknown[], embeds?: unknown[],
components?: unknown[],
chunkMode?: ChunkMode, chunkMode?: ChunkMode,
) { ) {
if (!text.trim()) { if (!text.trim()) {
@ -252,6 +253,7 @@ async function sendDiscordText(
content: chunks[0], content: chunks[0],
message_reference: messageReference, message_reference: messageReference,
...(embeds?.length ? { embeds } : {}), ...(embeds?.length ? { embeds } : {}),
...(components?.length ? { components } : {}),
}, },
}) as Promise<{ id: string; channel_id: string }>, }) as Promise<{ id: string; channel_id: string }>,
"text", "text",
@ -268,6 +270,7 @@ async function sendDiscordText(
content: chunk, content: chunk,
message_reference: isFirst ? messageReference : undefined, message_reference: isFirst ? messageReference : undefined,
...(isFirst && embeds?.length ? { embeds } : {}), ...(isFirst && embeds?.length ? { embeds } : {}),
...(isFirst && components?.length ? { components } : {}),
}, },
}) as Promise<{ id: string; channel_id: string }>, }) as Promise<{ id: string; channel_id: string }>,
"text", "text",
@ -289,6 +292,7 @@ async function sendDiscordMedia(
request: DiscordRequest, request: DiscordRequest,
maxLinesPerMessage?: number, maxLinesPerMessage?: number,
embeds?: unknown[], embeds?: unknown[],
components?: unknown[],
chunkMode?: ChunkMode, chunkMode?: ChunkMode,
) { ) {
const media = await loadWebMedia(mediaUrl); const media = await loadWebMedia(mediaUrl);
@ -309,6 +313,7 @@ async function sendDiscordMedia(
content: caption || undefined, content: caption || undefined,
message_reference: messageReference, message_reference: messageReference,
...(embeds?.length ? { embeds } : {}), ...(embeds?.length ? { embeds } : {}),
...(components?.length ? { components } : {}),
files: [ files: [
{ {
data: media.buffer, data: media.buffer,
@ -329,6 +334,7 @@ async function sendDiscordMedia(
request, request,
maxLinesPerMessage, maxLinesPerMessage,
undefined, undefined,
undefined,
chunkMode, chunkMode,
); );
} }