From 95f82154f76a66b1fec3679bf288523e225ef715 Mon Sep 17 00:00:00 2001 From: Tyler Yust Date: Tue, 20 Jan 2026 02:01:09 -0800 Subject: [PATCH] feat: extend BlueBubbles attachment handling by adding support for reply context, allowing users to reference previous messages in media attachments --- extensions/bluebubbles/src/attachments.ts | 14 +++++++++++++- extensions/bluebubbles/src/media-send.ts | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/extensions/bluebubbles/src/attachments.ts b/extensions/bluebubbles/src/attachments.ts index 1729f27fe..b264ca04d 100644 --- a/extensions/bluebubbles/src/attachments.ts +++ b/extensions/bluebubbles/src/attachments.ts @@ -111,9 +111,12 @@ export async function sendBlueBubblesAttachment(params: { filename: string; contentType?: string; caption?: string; + replyToMessageGuid?: string; + replyToPartIndex?: number; opts?: BlueBubblesAttachmentOpts; }): Promise { - const { to, buffer, filename, contentType, caption, opts = {} } = params; + const { to, buffer, filename, contentType, caption, replyToMessageGuid, replyToPartIndex, opts = {} } = + params; const { baseUrl, password } = resolveAccount(opts); const target = resolveSendTarget(to); @@ -167,6 +170,15 @@ export async function sendBlueBubblesAttachment(params: { addField("tempGuid", `temp-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`); addField("method", "private-api"); + const trimmedReplyTo = replyToMessageGuid?.trim(); + if (trimmedReplyTo) { + addField("selectedMessageGuid", trimmedReplyTo); + addField( + "partIndex", + typeof replyToPartIndex === "number" ? String(replyToPartIndex) : "0", + ); + } + // Add optional caption if (caption) { addField("message", caption); diff --git a/extensions/bluebubbles/src/media-send.ts b/extensions/bluebubbles/src/media-send.ts index 66a67e5d2..254cecafd 100644 --- a/extensions/bluebubbles/src/media-send.ts +++ b/extensions/bluebubbles/src/media-send.ts @@ -139,6 +139,7 @@ export async function sendBlueBubblesMedia(params: { buffer, filename: resolvedFilename ?? "attachment", contentType: resolvedContentType ?? undefined, + replyToMessageGuid: replyToId?.trim() || undefined, opts: { cfg, accountId,