Skip to content

[Fix] Trae 本机凭据探测补齐 Linux/macOS:Ubuntu 下能解密却被判「客户端未安装」,无法导入 - #62

Closed
JasonXX89 wants to merge 1 commit into
techysy:mainfrom
JasonXX89:fix/trae-local-detect-linux-macos
Closed

JasonXX89 wants to merge 1 commit into
techysy:mainfrom
JasonXX89:fix/trae-local-detect-linux-macos

Conversation

@JasonXX89

@JasonXX89 JasonXX89 commented Nov 11, 2026 •

Copy link
Copy Markdown

问题场景(Ubuntu 实测)

我在 Ubuntu 24.04.1 LTS 桌面装 Trae CN(deb 官方包),CD 面板提示「本机未安装 Trae 客户端」,无法走本机导入 —— 但凭据其实是完整可解的。

根因

traeLocal.js 的平台分支只补了一半:

  • traeDataDir() / tcDecrypt() 的 Linux 路径本来就是通的(实测 ~/.config/Trae CN/User/globalStorage/storage.json 的 iCubeAuthInfo://icube.cloudide 信封可正常解出 uid/token,信封头 tc 与 Windows 一致);
  • 但 detectTrae() 暴露给 /api/status 的三个字段硬编码 win32-only:
    • clientPathOf() → 非 win32 恒 null → clientInstalled=false、cnInstalled/intlInstalled=false(面板判定未安装,导入入口不给开)
    • traeRunning()/traeRunningCached() → 依赖 tasklist.exe/winProc,非 win32 恒 false

结果出现自相矛盾的探测态:signedIn: true + clientInstalled: false —— 这正是「扫不出登录凭证」的直接原因。

改动(src/traeLocal.js,+100 -8,零新依赖,win32 行为不变)

  1. clientPathOf() 新增 darwin(/Applications/<name>.app,含用户级)与 linux(PATH 常见目录 kebab-case bin,如 trae-cn/trae;查不到再按 .desktop 的 Name= 匹配变体名解析 Exec= 兜底,适配 deb 装到 /usr/share/trae-cn/ 的场景)
  2. 新增 unixTraePids():Linux 读 /proc/<pid>/exe、macOS pgrep -x;traeRunning() 与 traeRunningCached() 的 unix 分支改走它(/proc 读取足够轻,可承受 status 轮询)
  3. terminateTrae() 补 unix 信号路径(SIGTERM → 轮询 → SIGKILL),nap() 非 win32 用 sleep 子进程替代 Atomics.wait

本机验证(Ubuntu 24.04.1 LTS + Trae CN 2.3.92182)

修复前 detectTrae(): clientInstalled:false, clientPath:null, running:false(signedIn:true 矛盾)
修复后 detectTrae(): clientPath=/usr/share/trae-cn/trae-cn, clientInstalled:true, cnInstalled:true
running/terminate: 以真实 exe 名伪装进程实测 true → terminate closed:true → false,全链通过
导入链路: creditdaddy import 官方管线入库后 verifyTraeAccount/fetchTraeQuota 服务端验真成功

已知边界(如实说明)

deviceIdOf() 维持不动:Linux 客户端 storage.json 只有 icube-dc:aha-<hash> 没有 16 位纯数字条目(实测本机 + state.vscdb/ahanet 全扫),签到用的 x-device-id 在 Linux 侧仍拿不到 —— 属客户端平台差异而非 CD 缺陷,故 liveToAccount() 返回 meta.deviceId: undefined 由上层降级。如果这会影响签到口径,需要另开 issue 讨论 Linux 的设备号来源。

Linux 下 traeDataDir() 与 tcDecrypt 本已工作(storage.json 的
iCubeAuthInfo://icube.cloudide 可正常解出凭据),但 detectTrae() 的
clientInstalled/clientPath/running 三个字段硬编码 win32-only,导致
/api/status 的 traeClient 判定为未安装、面板不给本机导入入口。

- clientPathOf(): 新增 darwin(/Applications/<name>.app)与 linux
  (PATH 常见目录 kebab-case bin + .desktop Name 匹配解析 Exec 兜底)
- traeRunning()/traeRunningCached(): unix 走 unixTraePids()
  (Linux 读 /proc/<pid>/exe,macOS pgrep -x),不再恒 false
- terminateTrae(): unix SIGTERM→轮询→SIGKILL,nap 在非 win32
  用 sleep 子进程替代 Atomics.wait
- deviceId 口径不变:Linux 客户端 storage.json 只落 aha-<hash> 无
  纯数字 icube-dc 条目,维持 null 由上层降级提示(实测本机验证)

验证(Ubuntu 26.04 + Trae CN 2.3.92182 deb):
detectTrae 修复前 clientInstalled:false/signedIn:true 矛盾态 →
修复后 clientPath=/usr/share/trae-cn/trae-cn、clientInstalled:true;
伪装 /proc exe 名实测 running true→terminate closed true→false 全链
无新依赖,win32 行为零改动。
@techysy

techysy commented Nov 11, 2026

Copy link
Copy Markdown
Owner

已审阅并合并到 main(合并提交 0e6477e),随下一版本发出。

审查结论:改动质量高——

  • 根因分析准确(clientPathOf/traeRunning 硬编码 win32-only 导致 signedIn:true + clientInstalled:false 的自相矛盾探测态);
  • Linux 三层探测(PATH kebab-case bin → .desktop Name= 匹配解析 Exec → 校验存在)与 macOS 双路径合理;/proc 读 exe 的运行检测足够轻、可承受 status 轮询;
  • terminateTrae 的 SIGTERM → 轮询 → SIGKILL 降级正确,nap() 用 sleep 子进程替代 Atomics.wait 处理得当;
  • 已知边界(Linux 无 16 位数字 deviceId,签到 x-device-id 拿不到)如实说明并留给上层降级——这是正确的边界处理,Linux 签到设备号来源确实值得另开 issue 讨论。

合并说明:你的分支基于 v1.7.2 tag 提交(97dc460),不含今天的 4 笔 UI 提交——合并时已核对,只取 src/traeLocal.js 的真改动,其余文件的基点差异未混入。建议以后从最新 main 拉分支,可以省去这类核对。

本地全量测试 442/442 通过。

@techysy

techysy commented Nov 11, 2026

Copy link
Copy Markdown
Owner

已合并到 main(0e6477e),关闭本 PR。感谢高质量的贡献——根因定位、分层探测设计、边界如实说明都是范本级的。

@techysy techysy closed this Nov 11, 2026
techysy added a commit that referenced this pull request Nov 11, 2026
[Fix] Trae 本机凭据探测补齐 Linux/macOS:Ubuntu 下能解密却被判「客户端未安装」,无法导入

(合并时仅取 src/traeLocal.js——PR 分支基于 v1.7.2 tag 提交、不含今天 4 笔 UI 提交,
自动合并已正确以 main 为准;其余文件的差异为基点噪音,已核对未混入)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants