From 8502775042e1a1d60b5d923f5bfe89a00a02ad16 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 26 Jun 2026 15:56:22 +0800 Subject: [PATCH] Fix UUID leaking as user display name in agent context resolveUserAddressName now filters UUID-format strings (same as wx_*), preventing user.id from being used as a display name when nickname/ displayName is absent. buildSessionMemoryEntries always calls ensureUserMemoryProfile when userContext is available so stale profiles with UUID display names are auto-healed on next session init. Co-Authored-By: Claude Sonnet 4.6 --- user-memory-profile.mjs | 11 ++++++----- user-publish.mjs | 9 ++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/user-memory-profile.mjs b/user-memory-profile.mjs index bf6310d..7abbd5b 100644 --- a/user-memory-profile.mjs +++ b/user-memory-profile.mjs @@ -154,11 +154,12 @@ export function buildSessionMemoryEntries({ return entries; } - const profile = - loadUserMemoryProfile(workingDir) ?? - (userContext?.userId - ? ensureUserMemoryProfile(workingDir, userContext) - : null); + // Always call ensureUserMemoryProfile when userContext is available so that + // stale displayName values (e.g. UUID written before nickname was resolved) + // are healed on the next session init. + const profile = userContext?.userId + ? ensureUserMemoryProfile(workingDir, userContext) + : loadUserMemoryProfile(workingDir); const addressName = resolveUserAddressName({ displayName: profile?.displayName ?? userContext?.displayName, diff --git a/user-publish.mjs b/user-publish.mjs index 8e5bfb3..274840b 100644 --- a/user-publish.mjs +++ b/user-publish.mjs @@ -24,13 +24,16 @@ function renderBrandingBlock(userAddressName) { } /** Preferred name when addressing the user in chat (display name > username > slug). */ +const INTERNAL_ID_PATTERN = + /^wx_[a-z0-9_]{4,64}$|^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; + export function resolveUserAddressName({ displayName, username, slug } = {}) { const preferred = String(displayName ?? '').trim(); - if (preferred) return preferred; + if (preferred && !INTERNAL_ID_PATTERN.test(preferred)) return preferred; const uname = String(username ?? '').trim(); - if (uname && !/^wx_[a-z0-9_]{4,64}$/i.test(uname)) return uname; + if (uname && !INTERNAL_ID_PATTERN.test(uname)) return uname; const fallback = String(slug ?? '').trim(); - if (fallback && !/^wx_[a-z0-9_]{4,64}$/i.test(fallback)) return fallback; + if (fallback && !INTERNAL_ID_PATTERN.test(fallback)) return fallback; return '用户'; }