From d3b712ef7ab431d4554c69be4e0e7f864ed5c5fa Mon Sep 17 00:00:00 2001 From: Pascal Date: Sun, 7 Dec 2025 10:10:03 +0100 Subject: [PATCH 1/4] webui: copy text from pasted attachments when message is empty --- .../app/chat/ChatMessages/ChatMessage.svelte | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte index 96ed56a7758..196a845880c 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte @@ -86,8 +86,30 @@ editedContent = message.content; } + function getAttachmentTextContent(attachment: DatabaseMessageExtra | undefined) { + if (!attachment) { + return null; + } + + if ('content' in attachment && typeof attachment.content === 'string') { + return attachment.content; + } + + return null; + } + async function handleCopy() { - await copyToClipboard(message.content, 'Message copied to clipboard'); + let textToCopy = message.content; + + if (!message.content.trim() && message.extra?.length === 1) { + const attachmentText = getAttachmentTextContent(message.extra[0]); + + if (attachmentText?.trim()) { + textToCopy = attachmentText; + } + } + + await copyToClipboard(textToCopy, 'Message copied to clipboard'); onCopy?.(message); } From f4ae84e08c87de112f1448c844c3f7557dc5c62f Mon Sep 17 00:00:00 2001 From: Pascal Date: Sun, 7 Dec 2025 11:12:05 +0100 Subject: [PATCH 2/4] webui: copy prompt and all attachments with empty line separators --- .../app/chat/ChatMessages/ChatMessage.svelte | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte index 196a845880c..308a122d4e4 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte @@ -86,28 +86,23 @@ editedContent = message.content; } - function getAttachmentTextContent(attachment: DatabaseMessageExtra | undefined) { - if (!attachment) { - return null; - } - - if ('content' in attachment && typeof attachment.content === 'string') { - return attachment.content; - } - - return null; - } - async function handleCopy() { - let textToCopy = message.content; + const promptContent = message.content.trim(); + const attachmentTexts = message.extra + ?.map((attachment) => { + if ('content' in attachment && typeof attachment.content === 'string') { + return attachment.content; + } + + return null; + }) + .filter((content): content is string => Boolean(content?.trim())); - if (!message.content.trim() && message.extra?.length === 1) { - const attachmentText = getAttachmentTextContent(message.extra[0]); + const partsToCopy = [promptContent ? message.content : null, ...(attachmentTexts ?? [])].filter( + Boolean + ) as string[]; - if (attachmentText?.trim()) { - textToCopy = attachmentText; - } - } + const textToCopy = partsToCopy.length ? partsToCopy.join('\n\n') : message.content; await copyToClipboard(textToCopy, 'Message copied to clipboard'); onCopy?.(message); From e285fb825c0d38a561f4dd433687f77b5d6bf659 Mon Sep 17 00:00:00 2001 From: Pascal Date: Sun, 7 Dec 2025 18:21:30 +0100 Subject: [PATCH 3/4] webui: add explicit TypeScript types to copy handler lambdas --- .../lib/components/app/chat/ChatMessages/ChatMessage.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte index 308a122d4e4..19aa6d9ed30 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte @@ -1,5 +1,6 @@