From bc8f1c353f815db5dba3148a5fddcb3767f5e825 Mon Sep 17 00:00:00 2001 From: liangxu Date: Fri, 8 May 2026 19:59:58 +0800 Subject: [PATCH] fix(desktop): handle deepseek phone-number login in account name extractor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phone-number logins return id_profile=null, mobile_number="177******08", and email="" (empty string, not null). The previous fallback used `??`, which only short-circuits on null/undefined, so an empty email string clobbered the mobile_number fallback and the displayName ended up null — leaving the DeepSeek card stuck on the "${label} 会话" placeholder. Switch to a truthy pickString helper that requires a non-empty trimmed string before accepting a candidate, and prefer mobile_number over email so the masked phone number shows up exactly the way DeepSeek's own sidebar renders it. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../adapters/deepseek/account-identity.ts | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/desktop-client/src/main/adapters/deepseek/account-identity.ts b/apps/desktop-client/src/main/adapters/deepseek/account-identity.ts index 8fcb98d..9f6f4e6 100644 --- a/apps/desktop-client/src/main/adapters/deepseek/account-identity.ts +++ b/apps/desktop-client/src/main/adapters/deepseek/account-identity.ts @@ -17,7 +17,12 @@ function normalizeText(value: unknown): string | null { // DeepSeek (chat.deepseek.com) 没有 Redux/Pinia/window state,登录态只有 localStorage // 里的 `userToken`(JSON 包了 value 字段)。账号信息要走 /api/v0/users/current, // 用 Authorization: Bearer 调。Cookie 不带 token,因此只能在页面上下文里 -// 执行 fetch(自带 token),返回 biz_data.id_profile.{name, picture}。 +// 执行 fetch(自带 token)。 +// +// 不同登录方式响应差异较大: +// 微信登录: id_profile = { provider: 'WECHAT', name: '阿白', picture: '...' } +// 手机登录: id_profile = null, mobile_number = '177******08'(其它字段是空串而非 null) +// 所以这里 fallback 必须用 truthy 判断而不是 ??,否则空串会击穿后续兜底。 // // probe 通常在隐藏窗口、刚加载完就跑,React app 可能还没把 userToken 写入 localStorage, // 所以要 poll 一下直到 token 出现,再调 API。 @@ -60,14 +65,16 @@ export async function readDeepseekAccountIdentity( }); if (!response.ok) return null; const payload = await response.json().catch(() => null); - const profile = payload?.data?.biz_data?.id_profile ?? null; const bizData = payload?.data?.biz_data ?? null; - const name = profile?.name ?? bizData?.email ?? bizData?.mobile_number ?? null; - const picture = profile?.picture ?? null; - return { - displayName: typeof name === 'string' ? name : null, - avatarUrl: typeof picture === 'string' ? picture : null, - }; + const profile = bizData?.id_profile ?? null; + const pickString = (value) => + typeof value === 'string' && value.trim() ? value : null; + const name = + pickString(profile?.name) ?? + pickString(bizData?.mobile_number) ?? + pickString(bizData?.email); + const picture = pickString(profile?.picture); + return { displayName: name, avatarUrl: picture }; } catch { return null; }