dsh-connect-trae 3.9.2 → 3.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/lib/client.js +377 -120
- package/lib/index.d.ts +196 -1
- package/lib/index.js +530 -27
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,115 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.10.0 (2026-10-18)
|
|
4
|
+
|
|
5
|
+
> 本版把「账号在本机到底存了几份、删一个账号到底删掉了什么」讲清楚并做对:本机每个 Trae 登录都会
|
|
6
|
+
> 自动变成插件的一份副本,卡片只显示、也只使用副本;「删除」现在也真的落到 Trae 应用本身(连同它在
|
|
7
|
+
> `storage.json` 里的登录一起注销,改写前留备份、应用运行中则拒绝并点名)。另外修掉了一批让测速与
|
|
8
|
+
> 池子「看起来坏了」的问题:目标模型不在已启用列表时的假 4001、重启后立刻测速的 4001、一处点击
|
|
9
|
+
> 两条日志、一次整批等待才上屏。默认测试套件不再有 skipped。
|
|
10
|
+
|
|
11
|
+
### 新增
|
|
12
|
+
|
|
13
|
+
- **本机每个 Trae 登录都会自动变成插件的一份副本,卡片只显示、也只使用副本。** Trae 应用只有一个
|
|
14
|
+
登录槽,下次登录就把上一个覆盖掉;插件改为每次刷新(读账号列表)时把本机现有登录**镜像**成自己的
|
|
15
|
+
副本,因此换号不再丢号:已有副本的账号**不动**(副本里可能是插件刷新过、比应用更新的令牌);没有
|
|
16
|
+
副本的本机登录**补建**一份,写进该区域自己的凭据文件;卡片与账号池只列副本,来源统一显示「插件副本」。
|
|
17
|
+
镜像在插件加载时就跑一遍(三个面板各一次),不必等用户点开那个面板。
|
|
18
|
+
- **一张卡片上同时支持多号**:登录 A 号后刷新 → 生成 A 副本;在 Trae 里换 B 号后刷新 → A 的副本仍在、
|
|
19
|
+
B 也生成副本,池子里两个号都能用。
|
|
20
|
+
- **设置区写明了「登录一个号就刷新一次」这条规则。** 卡片顶部的账号说明与账号池设置区都提示:Trae 只有
|
|
21
|
+
一个登录位,登录任意账号后要刷新一次(打开卡片或点「重新检测账号」),插件才会把这次登录保存成副本;
|
|
22
|
+
没刷新就换号,上一个账号不会被保存——它会被 Trae 里的新登录覆盖。设置区是一条警示框,因为漏掉这一步
|
|
23
|
+
的代价是静默丢号。
|
|
24
|
+
- **导出 / 导入也只针对副本。** 导出写出去的是**插件自己保存的副本**令牌(`copyOf`),不再从合并视图里
|
|
25
|
+
取 Trae 应用那一份;导入的账号一律作为**插件副本**写入本区域的凭据文件,不触碰 Trae 的
|
|
26
|
+
`storage.json`。界面文案同步写明「账号副本」。
|
|
27
|
+
- **账号池的每一行只有一个销毁动作:「删除」。** 原来的「移除」被整体撤掉——它只改成员草稿、不动本机
|
|
28
|
+
凭据,和「删除」并排出现时是同一个坑的两条岔路,用户反复把它当成「删不掉」。删除 = 插件副本 +
|
|
29
|
+
Trae 应用登录一起清(见下一条)。路由 `?action=remove` 与 `removeOne` 仍保留不删:浏览器里可能还有
|
|
30
|
+
旧的 client bundle 在调它,删掉会让它们 503;新卡片不再使用。
|
|
31
|
+
|
|
32
|
+
### 变更
|
|
33
|
+
|
|
34
|
+
- **「删除」现在也落到本机:连 Trae 自己那份登录一起注销,并留备份。** 上一版只删插件自己写的
|
|
35
|
+
`~/.dsh/.trae-auth.*.json`,可账号同时也登录在 Trae 应用里(桌面 `storage.json` 的
|
|
36
|
+
`iCubeAuthInfo://icube.cloudide`),Trae 每次都会把它再报上来,于是行永远回来。现在 `deleteAccount`
|
|
37
|
+
先删自己那几份,再改写各版本 `storage.json`(删掉该键、从 `iCubeAuthInfo://usertag` 里摘掉该
|
|
38
|
+
userId、其余键原样保留),为此 `decrypt.ts` 补了 `encryptTraeStorageValue` / `traeStorageValueType`
|
|
39
|
+
(同一套固定盐值 AES-128-CBC,与解密器互为逆运算)。
|
|
40
|
+
- **应用开着就不写**:Trae 把 `storage.json` 放在内存里、退出时回写,运行中改写一定会被覆盖。新增
|
|
41
|
+
`src/trae-process.ts` 的 `probeRunningTraeApps`(macOS/Linux 读 `ps`,Windows 读 `tasklist` 保守判定),
|
|
42
|
+
运行中的版本进 `blockedApps`,卡片写明「先完全退出 X 再删」——这是用户能自己执行的下一步,而不是
|
|
43
|
+
一个读不懂的失败。进程名互为前缀(`Trae` vs `Trae CN`),匹配按最长优先并消费已匹配项,否则只开
|
|
44
|
+
Trae CN 时会误报国际版在运行。
|
|
45
|
+
- **可回退**:改写前在同目录留 `storage.json.dsh-backup-<时间戳>`,写后回读校验,`encoded` 还在就
|
|
46
|
+
视为失败(可能被别的写入者覆盖)。
|
|
47
|
+
- 返回值扩展为 `{deleted, stillSignedIn, hadCopy, signedOutApps, blockedApps}`;`deleted` 的语义从
|
|
48
|
+
「插件不再持有」升级为「**本机任何地方都不再持有**」。`stillSignedIn:true` 时卡片不再谎报成功,
|
|
49
|
+
而是按 `hadCopy` 区分「已删副本但仍登录在 Trae 里」与「本来就没有副本,只存在于应用登录」。
|
|
50
|
+
- 删除的进行中态是瞬时 in-flight 集合(沿用「成功后按钮不能一直转圈」的教训);设置落盘失败时报错且
|
|
51
|
+
**不**写成功日志——否则下一次刷新就把账号带回来,与日志互相打脸。
|
|
52
|
+
- **成员关系只有一个写者:卡片。** Host 侧的 `removeOne` 只忘掉这条测速记录(成员关系不在它那里),
|
|
53
|
+
卡片负责把 `regions.<面板>.pool.memberAccountIds` 落盘,写完读回校验;开关 / 目标模型 / 测试体积
|
|
54
|
+
一律按**已保存值**原样写回(它们是「改完要保存」的偏好,不该被一次移除顺带提交)。草稿的重置从
|
|
55
|
+
「整份设置一变就全量回滚」拆成**按字段**重置,因此这次落盘不会把用户正在编辑、尚未保存的开关或
|
|
56
|
+
目标模型悄悄改回去。
|
|
57
|
+
- **「派单中」只在池开启且这一行确实是池成员时显示。** 池子被清空时 Host 会故意回退到面板绑定的账号
|
|
58
|
+
继续计费,于是那个账号的 `current` 仍为 `true`,卡片照旧给它打上「派单中」,与同一屏上方「尚未勾选
|
|
59
|
+
任何池成员」互相打脸。手动模式(池关闭)下绑定就是答案,徽标照常显示。
|
|
60
|
+
- **无副本的残留成员行不再冒充正常账号。** 设置里仍保存、但本机已没有任何登录的成员(`reachable:false`)
|
|
61
|
+
原来有绿点和空白说明,读起来像「插件没建副本」。现在名字回退成 id、点变灰、带「本机无副本」标签
|
|
62
|
+
(`row.poolNoCopyTag`),一眼能认出是残留并点删除清掉。
|
|
63
|
+
|
|
64
|
+
### 修复
|
|
65
|
+
|
|
66
|
+
- **池子的「目标模型」不在已启用模型列表里时,测速会假报「上游不提供」。** Trae 把它答成
|
|
67
|
+
`4001 config_name rejected`,卡片再把它渲染成「所有已选成员当前均不可用」,于是每个账号都像是坏的。
|
|
68
|
+
根因是同一个模型在两套目录里各取一半:目标模型的下拉来自**完整**目录,而请求走的是**已启用**子集
|
|
69
|
+
(`enabledModelIds`)——子集里没有该模型的行,桥接层就拿不到它所属的 SOLO function,只能按默认
|
|
70
|
+
`solo_work_lite` 发送;`Doubao-Seed-Code` 只被 `solo_agent_remote` 收录,于是稳定的 4001。现在启动时的
|
|
71
|
+
wire 解析表**登记合并目录里的每一行**(`configName = wireConfigName ?? id`,并带上 `wireFunction`),
|
|
72
|
+
不再只登记「wire 名与显示 id 不同」的行;显示名回退按**先到先得**,避免同名(`Seed-Code`)互相覆盖。
|
|
73
|
+
桥接层另外在目录行只带 config_name、不带 function 时**从解析表借用 function**——仅当两边 config_name
|
|
74
|
+
一致,不一致时保留目录答案。
|
|
75
|
+
- **重启后立刻点测速不再 4001。** wire 表要等宿主刷新模型列表才会填上,这段时间里探针仍然只能按默认
|
|
76
|
+
function 发送。池子的「测速 / 一键测试」与「测试模型」现在在 wire 表未解析时先补一次目录发现:失败
|
|
77
|
+
不阻断,探针照旧报告上游的真实答案。
|
|
78
|
+
- **测速不再「卡住」:按行流式读取 + 3 分钟硬超时。** Host 的 `action=test` 本来就是一行一个账号的
|
|
79
|
+
NDJSON,卡片原来 `await response.text()` 才解析,等于整批跑完才一次性上屏;改 `testLinesOf()` 用
|
|
80
|
+
`response.body.getReader()` 边到边解析,每个账号测完立刻出现,`response.body` 缺失时回退 `text()`。
|
|
81
|
+
另外加 `TEST_TIMEOUT_MS = 180_000` + `AbortController`:连接被重启/断流吊住时(Host 重启后旧页面
|
|
82
|
+
开着的请求就是这种)按钮原来会永久禁用、只能刷新页面;现在到点自动取消、按钮恢复,日志给出
|
|
83
|
+
`row.poolLogTimeout`。
|
|
84
|
+
- **一次点击只记一条测速日志。** Host 的 `test` 流先逐账号推 `{row}`,末尾再推一份 `{rows}` 汇总重复
|
|
85
|
+
同样的行;卡片把两处都当新结果,于是一次点击出现两条「LaoDing:正常。」。现在按 `accountId` 去重,
|
|
86
|
+
第二次只刷新单元格、不再记日志(单号测速路径同样去重)。
|
|
87
|
+
- **移除之后按钮不再永远停在「移除中…」。** 移除成功后写下的标记,与按钮显示「移除中…」读的是同一个
|
|
88
|
+
状态,于是按钮从此一直是转圈的禁用态——点成功了也长得像点坏了。现在进行中的账号只在一个集合里停留
|
|
89
|
+
到本次请求结束,结束后按钮恢复。
|
|
90
|
+
- **幽灵成员没有存名字时不再渲染成空行。** 行名回退到它在设置里被索引的 id,用户才能找到并删掉那份副本。
|
|
91
|
+
|
|
92
|
+
### 构建
|
|
93
|
+
|
|
94
|
+
- **默认测试套件不再有 skipped。** 旧的 `tests/card-shot.spec.tsx` 是 `CARD_SHOT=1` 才跑的手动截图工具
|
|
95
|
+
(写 `/tmp/card-preview.html`、要靠 headless Chrome 量几何)。它被默认 glob 收集,导致 `pnpm test`
|
|
96
|
+
永远报 **1 skipped**,「全绿」因此不再等价于「全都跑了」。现移到 `tools/card-shot.tsx`(不匹配
|
|
97
|
+
`tests/**/*.spec.*`)、去掉 `describe.skipIf`、新增 `vitest.card.config.ts` 与 `pnpm card:shot`;
|
|
98
|
+
`tools/**/*.tsx` 纳入 `tsconfig.client.json`,仍受 typecheck 保护。
|
|
99
|
+
|
|
100
|
+
### 测试
|
|
101
|
+
|
|
102
|
+
- `auth` 两例锁定删除语义:① 「连应用登录一起删(并留下备份)」——断言 `signedOutApps:['cn']`、
|
|
103
|
+
插件副本与桌面登录都不再含该账号、目录里恰有一份 `dsh-backup`、之后再登录会被重新镜像;② 「应用
|
|
104
|
+
运行中拒绝并点名」——断言 `deleted:false` / `blockedApps:['cn']`、桌面文件原样、无备份、插件副本仍被删。
|
|
105
|
+
- 新增 `trae-process` 4 例覆盖进程名前缀歧义(只开 `Trae CN` 不误报国际版、只开 `Trae` 不误报 CN 等)。
|
|
106
|
+
- `solo-bridge` 3 例锁定 wire 表:给**每一行**都登记 function(含 id 即 config_name 的 `Doubao-Seed-Code`)、
|
|
107
|
+
同名显示名先到先得、目录行缺 function 时借用解析表的 function 且 config_name 不一致时不借。
|
|
108
|
+
- `card-pool` 覆盖:删除语义 9 例(无 `deleteSupported` 时不渲染删除、成功落盘与日志、`hadCopy` 两种
|
|
109
|
+
措辞、运行中提示退出应用且不写设置不刷新)、成员移除 6 例、徽标语义 3 例、流式与超时 2 例、日志去重、
|
|
110
|
+
幽灵成员名字回退、无副本行的标签。
|
|
111
|
+
- 全仓 **889** 例通过,0 skipped。
|
|
112
|
+
|
|
3
113
|
## 3.9.2 (2026-10-18)
|
|
4
114
|
|
|
5
115
|
### 新增
|