From 66eaf7680d0152577a7d9d488f5105b6ecae2f18 Mon Sep 17 00:00:00 2001 From: gongzhiyong Date: Sun, 12 Apr 2026 15:01:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20sanitize=20thread=20titles=20=E2=80=94?= =?UTF-8?q?=20reject=20UUID/hash/empty=20values,=20fallback=20to=20?= =?UTF-8?q?=E6=96=B0=E5=AF=B9=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- langgraph/src/components/ThreadSidebar.tsx | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/langgraph/src/components/ThreadSidebar.tsx b/langgraph/src/components/ThreadSidebar.tsx index e16fef9..aa20170 100644 --- a/langgraph/src/components/ThreadSidebar.tsx +++ b/langgraph/src/components/ThreadSidebar.tsx @@ -37,6 +37,13 @@ function getLocalTitle(threadId: string): string | null { } } +// Reject titles that look like UUIDs, short hashes, or empty strings +const BAD_TITLE = /^[0-9a-f-]{8,}$/i; +function sanitizeTitle(s: unknown): string | null { + if (typeof s !== "string" || !s.trim() || BAD_TITLE.test(s.trim())) return null; + return s.trim(); +} + function groupByDate(threads: ThreadItem[]): { label: string; threads: ThreadItem[] }[] { const now = new Date(); const groups: Record = {}; @@ -101,10 +108,10 @@ export function ThreadSidebar({ const filtered = threads.filter((t) => { const label = - getLocalTitle(t.thread_id) ?? - (t.metadata?.title as string) ?? - (t.metadata?.firstMessage as string) ?? - t.thread_id; + sanitizeTitle(getLocalTitle(t.thread_id)) ?? + sanitizeTitle(t.metadata?.title) ?? + sanitizeTitle(t.metadata?.firstMessage) ?? + "新对话"; return label.toLowerCase().includes(searchQuery.toLowerCase()); }); @@ -190,9 +197,9 @@ export function ThreadSidebar({ {groupThreads.map((t) => { const isActive = t.thread_id === currentThreadId; const itemLabel = - getLocalTitle(t.thread_id) ?? - (t.metadata?.title as string) ?? - (t.metadata?.firstMessage as string) ?? + sanitizeTitle(getLocalTitle(t.thread_id)) ?? + sanitizeTitle(t.metadata?.title) ?? + sanitizeTitle(t.metadata?.firstMessage) ?? "新对话"; const displayLabel = itemLabel.length > 16 ? itemLabel.slice(0, 16) + "…"