fix(frontend): Fix uploaded file metadata in message copy (#3944)

* fix uploaded file metadata copy

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Nan Gao 2026-07-05 04:04:14 +02:00 committed by GitHub
parent 12eda6c701
commit c05c1899b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 7 deletions

View File

@ -37,6 +37,7 @@ import { useI18n } from "@/core/i18n/hooks";
import { import {
extractContentFromMessage, extractContentFromMessage,
extractReasoningContentFromMessage, extractReasoningContentFromMessage,
getMessageCopyData,
parseUploadedFiles, parseUploadedFiles,
stripUploadedFilesTag, stripUploadedFilesTag,
type FileInMessage, type FileInMessage,
@ -162,13 +163,7 @@ export function MessageListItem({
)} )}
> >
<div className="pointer-events-auto flex gap-1"> <div className="pointer-events-auto flex gap-1">
<CopyButton <CopyButton clipboardData={getMessageCopyData(message)} />
clipboardData={
extractContentFromMessage(message) ??
extractReasoningContentFromMessage(message) ??
""
}
/>
{feedback !== undefined && runId && threadId && ( {feedback !== undefined && runId && threadId && (
<FeedbackButtons <FeedbackButtons
threadId={threadId} threadId={threadId}

View File

@ -277,6 +277,17 @@ export function getAssistantTurnCopyData(
); );
} }
export function getMessageCopyData(message: Message) {
const content = extractContentFromMessage(message);
if (message.type === "human") {
return stripUploadedFilesTag(content);
}
if (content.length > 0) {
return content;
}
return extractReasoningContentFromMessage(message) ?? "";
}
export function extractTextFromMessage(message: Message) { export function extractTextFromMessage(message: Message) {
if (typeof message.content === "string") { if (typeof message.content === "string") {
return ( return (

View File

@ -5,6 +5,7 @@ import {
extractContentFromMessage, extractContentFromMessage,
extractTextFromMessage, extractTextFromMessage,
extractReasoningContentFromMessage, extractReasoningContentFromMessage,
getMessageCopyData,
getAssistantTurnCopyData, getAssistantTurnCopyData,
getAssistantTurnUsageMessages, getAssistantTurnUsageMessages,
getMessageGroups, getMessageGroups,
@ -246,6 +247,17 @@ describe("inline <think> tag splitting", () => {
}); });
describe("human message internal context stripping", () => { describe("human message internal context stripping", () => {
test("strips uploaded file context from copy data", () => {
const message = {
id: "human-with-upload",
type: "human",
content:
"<uploaded_files>\nThe following files were uploaded in this message:\n\n- paper.pdf (1.0 MB)\n Path: /mnt/user-data/uploads/paper.pdf\n</uploaded_files>\n\nSummarize this paper",
} as Message;
expect(getMessageCopyData(message)).toBe("Summarize this paper");
});
test("strips slash skill activation context from display content", () => { test("strips slash skill activation context from display content", () => {
const content = const content =
"<slash_skill_activation>\n<skill_content># Secret SKILL.md</skill_content>\n</slash_skill_activation>\nreal user task"; "<slash_skill_activation>\n<skill_content># Secret SKILL.md</skill_content>\n</slash_skill_activation>\nreal user task";