feat: also parse markdown image links for Discord image sending
Support [name.png](/path) format in addition to [SendImage: /path]. LLMs naturally produce markdown links, so both patterns are recognized. Only absolute paths with image extensions are matched.
This commit is contained in:
@@ -303,19 +303,35 @@ export class DiscordChannel implements Channel {
|
|||||||
|
|
||||||
const textChannel = channel as TextChannel;
|
const textChannel = channel as TextChannel;
|
||||||
|
|
||||||
// Extract image attachments from [SendImage: /path] tags
|
// Extract image attachments from agent responses.
|
||||||
|
// Supports:
|
||||||
|
// [SendImage: /absolute/path] — explicit tag
|
||||||
|
// [name.png](/absolute/path/name.png) — markdown link with image extension
|
||||||
|
const IMAGE_EXTS = /\.(png|jpe?g|gif|webp|svg|bmp)$/i;
|
||||||
const SEND_IMAGE_RE = /\[SendImage:\s*(\/[^\]]+)\]/g;
|
const SEND_IMAGE_RE = /\[SendImage:\s*(\/[^\]]+)\]/g;
|
||||||
|
const MD_LINK_RE = /\[[^\]]*\]\((\/[^)]+)\)/g;
|
||||||
const imageFiles: string[] = [];
|
const imageFiles: string[] = [];
|
||||||
|
const seen = new Set<string>();
|
||||||
let match;
|
let match;
|
||||||
|
|
||||||
while ((match = SEND_IMAGE_RE.exec(text)) !== null) {
|
while ((match = SEND_IMAGE_RE.exec(text)) !== null) {
|
||||||
const imgPath = match[1].trim();
|
const imgPath = match[1].trim();
|
||||||
if (fs.existsSync(imgPath)) {
|
if (!seen.has(imgPath) && fs.existsSync(imgPath)) {
|
||||||
imageFiles.push(imgPath);
|
imageFiles.push(imgPath);
|
||||||
} else {
|
seen.add(imgPath);
|
||||||
logger.warn({ path: imgPath }, 'SendImage file not found, skipping');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let cleaned = text.replace(SEND_IMAGE_RE, '').trim();
|
while ((match = MD_LINK_RE.exec(text)) !== null) {
|
||||||
|
const imgPath = match[1].trim();
|
||||||
|
if (!seen.has(imgPath) && IMAGE_EXTS.test(imgPath) && fs.existsSync(imgPath)) {
|
||||||
|
imageFiles.push(imgPath);
|
||||||
|
seen.add(imgPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let cleaned = text
|
||||||
|
.replace(SEND_IMAGE_RE, '')
|
||||||
|
.replace(MD_LINK_RE, (full, p) => IMAGE_EXTS.test(p) && seen.has(p.trim()) ? '' : full)
|
||||||
|
.trim();
|
||||||
|
|
||||||
// Convert @username mentions to Discord mention format
|
// Convert @username mentions to Discord mention format
|
||||||
const mentionMap: Record<string, string> = {
|
const mentionMap: Record<string, string> = {
|
||||||
|
|||||||
Reference in New Issue
Block a user