dsh-connect-trae 4.4.4 → 4.4.5

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 CHANGED
@@ -1,5 +1,117 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.4.5 (2026-10-23)
4
+
5
+ > **模型列表不再倒出官方已下架的历史配置:按 Trae IDE 名册退役 12 行、改钉 6 行,
6
+ > 剩下的按通道分组、固定顺序、默认只看常用通道。**
7
+ >
8
+ > 合并自 PR #55,修 issue #52。报告人问「为啥 trae 的模型数量这么爆炸」并提醒「拿 code 的
9
+ > 模型请求 solo 的潜在风险」——查下来是同一个洞:插件列的是 12 个目录 function 的**并集**
10
+ > (46 行),而 Trae 客户端**一次只渲染一个 function**(14–24 行)。本版接入第三条上游信号
11
+ > (IDE 名册的 `is_invisible_to_user`),把「官方还展不展示」这个问题交回上游自己回答,
12
+ > 目录 **46 → 34 行**(本机 CN 账号实测),一行都没删错、一次都没猜。
13
+
14
+ ### 修复
15
+
16
+ - **模型列表不再把官方已下架的历史配置倒出来,并把钉错通道的行改回官方通道**(`fix(catalog)`,issue #52)。
17
+ 报告人问「为啥 trae 的模型数量这么爆炸」,同时提醒「拿 code 的模型请求 solo」。查下来是**同一个洞**:
18
+ 插件列的是 12 个目录 function 的**并集**(46 行),而 Trae 客户端**一次只渲染一个 function**(14–24 行);
19
+ #46 为了让带日期的快照可见,给「能调但骨架没收录」的行开了提升通道,而这条通道**没有上限** ——
20
+ `isPromotableWireModel` 只问「能不能调、有没有真名字」,不问「官方还展不展示」。
21
+ - **接入了第三条上游信号**:`batch_get_detail_param`(IDE 选择器渲染的那份名册)里的
22
+ `is_invisible_to_user`。端点与请求体本来就为 #46 备好了(`src/model-detail.ts`),缺的只是一个
23
+ client 与解析器 —— 现在在 `src/official-roster.ts`。
24
+ - **它是逐 (config, function) 的「模式名册」,不是生命周期标记**。实测 2026-10-23:
25
+ `DeepSeek-V4-Pro` 在 `solo_work_remote` 下被隐藏(那个模式展示的是 `-Official` 那份),
26
+ 但在 `chat_v3` / `solo_coder` 下是可见的;`glm-5` 在 `solo_work_remote` / `solo_agent_remote`
27
+ 隐藏、在 `solo_work_lite` / `solo_coder` 可见。把它读成「模型下架了」会**误删 6 个在用模型**,
28
+ 所以判定分三种:
29
+ - **退役**:所有 `llm_utils_chat` 接受的 function 都隐藏它(`glm-4.7` 只在
30
+ `code_review_summary` 可见 —— 那是代码评审的助手配置,不是对话通道)。这类共 **12 行**,
31
+ 正是截图里「尾部整屏的老模型」。
32
+ - **改钉**:自己的通道隐藏、但别的对话通道展示。改用官方自己那个通道,而不是我们先前猜的
33
+ 并集首个 —— 这正好回答「拿 code 的模型请求 solo」:`Doubao-Seed-2.0-Code` / `glm-5.1` /
34
+ `qwen-3.5` 落到 `solo_coder`,`glm-5` / `DeepSeek-V4-Flash` / `DeepSeek-V4-Pro` 落到
35
+ `solo_work_lite`(按 `TRAE_DIRECTORY_FUNCTIONS` 的优先级选,不按文档顺序,所以两次刷新结果一致)。
36
+ 共 **6 行**。
37
+ - **保留**:名册没提到这个 config(实测 `kimi-k2.8-preview`、`qwen3.8-flash` 只存在于 Remote
38
+ 目录的 `chat_v3` 分组)、只把它当工具配置、或压根没有对话通道能判 —— **沉默不是判决**。
39
+ - **默认开启而且是 fail-open 的**,这是敢不设开关的理由:名册读不到(受限网络、没有 `X-Ide-Token`
40
+ 的设备身份、超时、HTTP 非 2xx、文档为空)就返回 `undefined`,一行都不动。它只是给一次**已经成功**
41
+ 的刷新做减噪,永远不会把刷新搞失败。名册成功读一次缓存 10 分钟,失败也缓存同样时长,
42
+ 避免每次刷新都赔一个超时。
43
+ - **`config_switch` 只记录不判决**:这个字段的语义没实测过,拿它删模型风险太大。
44
+ - **实测**(本机 CN 账号,只读探针,零额度):名册 105 configs / 544 pairs,耗时 343 ms;
45
+ `46 → 34`(退役 12、改钉 6),通道分布 `solo_work_remote=20 solo_coder=7 solo_work_lite=3
46
+ chat_v3=2 solo_agent_remote=1 默认=1`。
47
+ - **测试**:`tests/official-roster.spec.ts`(23 条)覆盖解析器容错、三种判决、按通道优先级选目标、
48
+ `wireConfigName` 而非显示 id 取值、大小写不敏感、工具配置不算模型、fail-open、缓存窗口,
49
+ 以及一条走真实 `mergeTraeModelSources` 的端到端;全量 `1042 条 / 82 文件` 通过。
50
+
51
+ - **模型区按通道分组、可搜索、顺序固定**(`feat(client)`,issue #52 P0)。
52
+ 上一段修的是「多出来的行」,这一段修的是「剩下的行怎么摆」。报告里那半句「一屏平铺、顺序乱」
53
+ 有两个独立的成因:
54
+ - **顺序原本不是排出来的,是到达顺序**。旧卡片直接渲染合并结果的顺序,而 `src/solo-remote.ts`
55
+ 自己写着分组顺序**每次调用都可能不同** —— 同一个账号刷新两次,同样的行可以排出两个样子。
56
+ 现在顺序是**行的集合的纯函数**:先按区域自己的通道优先级(`solo_work_remote` →
57
+ `solo_work_lite` → `solo_agent_remote` → `chat_v3` → `solo_coder`),组内按显示名排序
58
+ (大小写不敏感,内嵌版本号按**数字**比较,所以 `GLM-5.10` 排在 `GLM-5.9` 之后),
59
+ 同名再按 id 兜底 —— 因此结果是全序,与到达顺序无关。
60
+ - **「一屏」看不出这是一份并集**。现在每行归到**它会被调用的那个通道**下,表头写明是哪个模式、
61
+ 有多少行:本机 CN 账号实测 34 行 → 6 组(`solo_work_remote` 20 / `solo_coder` 7 /
62
+ `solo_work_lite` 3 / `chat_v3` 2 / `solo_agent_remote` 1 / 未标注 1),
63
+ 而不是 34 行平铺。分组用小 `<details>`,默认全开 —— 默认折叠会把用户特意来找的模型藏起来。
64
+ - **搜索框**匹配显示名、id 与 **config_name**(排查 `4001 config_name rejected` 的人手上拿的是
65
+ 上游名,而它正好在 `DeepSeek-V4-Flash` 这类行上与屏幕上的名字不同)。搜索**只是视图**:
66
+ 「测试所有模型」与批量上下文按钮仍然作用于**整个目录**,不会因为搜索框里有字而悄悄缩小范围
67
+ (那是要花额度的动作)。开始搜索会把折起来的组重新展开一次。
68
+ - **排序写在两处,各管一半**:发现流程排一次(`lastCatalog` 因此有序,DSH 自己的模型选择器
69
+ 按目录顺序渲染,也一并变稳),卡片再排一次(升级前保存的目录同样被扶正,不必先刷新一次)。
70
+ - 通道优先级表从 `solo.ts` 搬到纯模块 `src/model-order.ts` 并**由 `solo.ts` 反向重新导出** ——
71
+ 卡片要 import 它,而 `solo.ts` 带着 `node:crypto`。两份拷贝会让「线上先问哪个通道」与
72
+ 「界面上先画哪个通道」悄悄分叉,而分叉是不可见的。
73
+ - **测试**:`tests/model-order.spec.ts`(21 条:通道优先级、组内排序、版本号数字比较、
74
+ 无通道行排最后、未知通道归位、与到达顺序无关、同名兜底、不改入参、分组不丢不重、搜索三种匹配)
75
+ 与 `tests/card-model-groups.spec.tsx`(7 条:渲染顺序、组头计数、搜索计数、按 config_name 命中、
76
+ 无匹配提示、**搜索时「测试所有」仍覆盖全量**、折叠与搜索重新展开)。全量 `1070 条 / 84 文件` 通过。
77
+
78
+ - **模型列表默认只看「常用通道」,并把藏起来的已启用模型说出来**(`feat(client)`,issue #52 P2)。
79
+ 诊断里设想的是三档(`当前通道 / 常用通道组 / 全部`),P1 落地后重新数一遍只剩两档站得住:
80
+ - **「常用通道组」= 全部**。P1 已经退役了所有「任何对话通道都不展示」的 config,剩下的每一行
81
+ 都至少有一个对话通道在展示它,这一档没有内容。
82
+ - **「当前通道」= 20 行,会藏掉在用的 `glm-5`**。它的真实含义是「只留第一优先的
83
+ `solo_work_remote`」;`glm-5` 只由 `solo_work_lite` 提供,不是 `-Official` 那份的影子。
84
+ 为了「看起来像客户端」而把在用的模型从默认视图里拿掉,不划算。
85
+
86
+ 所以是两档,默认 **24**(`solo_work_remote` + `solo_work_lite` + 未标注行),「全部」**34**
87
+ (再加 `solo_coder` 7 / `chat_v3` 2 / `solo_agent_remote` 1)。24 同时落在客户端「每个模式
88
+ 展示 14–24 个」的上沿 —— 默认视图第一次和报告人拿来比较的那个列表是同一个量级,而**一行都没删**。
89
+ - **视图只影响绘制**:「一键测试所有」「整区切到 Max」「全部恢复默认上下文」仍作用于完整目录。
90
+ 这些动作花额度或改设置,若因为屏幕少了 10 行就缩小范围,用户会以为「都测过了」。
91
+ - **被藏起来的「已启用」行必须说出来**:默认视图藏 10 行,用户之前勾选过的那些勾选框就不在
92
+ 屏幕上了。保存路径本来就安全(写的是 state 里的 `activeEnabledIds`,不是从渲染出的 checkbox 读),
93
+ 但不说的话,数一遍勾选框只会得出「那些模型被关了」。列表下方固定一行
94
+ 「另有 N 个已启用的模型不在此视图内 —— 查看全部」。
95
+ - **搜索不撒谎**:搜索在视图内进行(全局搜索会和眼前的组头矛盾),所以空结果分两种 ——
96
+ 「没有匹配」与「常用通道内没有,全部目录里有 N 个」+ 一键切过去。搜 `kimi` 时
97
+ `kimi-k2.5` 就在 `solo_coder` 组里,混成一句是搜索框最不该犯的错。
98
+ - **视图控件只在真有行被排除时才渲染**:一个能在两个相同列表之间切换的开关,比没有更糟。
99
+ - **按下态用 `bg-layer-3` 压在 `bg-layer-2` 轨道上**。第一版写的是 `bg-layer-1`,
100
+ `card-styles.spec.tsx` 立刻拒了 —— 那不是 DSH 定义的 token,回退值会在两个主题里同时生效,
101
+ 正是这个测试存在的理由。
102
+ - **顺带**:`row.modelsChannelDefault` 字样改成「未标注模式(走 solo_work_lite)」,把这行的
103
+ 真实调用路径写出来,而不是含糊的「默认通道」。
104
+ - **实测截图**(真机 34 行目录、真卡片组件、中文文案):默认态 20+3+1 三组 24 行,
105
+ 「另有 1 个已启用的模型不在此视图内」;切到全部后按下态与组数一同变化。
106
+ - **测试**:`tests/model-order.spec.ts` +5 条(`solo_work_*` 保留、未标注行按默认通道归入常用、
107
+ `all` 保持顺序且返回副本、按 region 判定、常用通道必须是该 region 优先级表的子集)与
108
+ `tests/card-model-groups.spec.tsx` +5 条(默认范围与计数、切换与 `aria-pressed`、
109
+ 视图外命中提示与跳转、已启用行被藏时的提示与勾选状态、无可排除行时不渲染控件);
110
+ 原有 7 条按默认范围调整(涉及专用通道的断言先切「全部」)。全量 `1080 条 / 84 文件` 通过。
111
+ - **体积实测**(发版时在 main 基线上对照,更正 PR 描述里「与 4.4.4 一致」的说法):
112
+ client 387.12 → **412.87 kB**、index 438.67 → **457.48 kB** —— 增长来自两个新模块与
113
+ 分组 UI,属预期。
114
+
3
115
  ## 4.4.4 (2026-10-23)
4
116
 
5
117
  > **同价的会员分支不再被读成第二重折扣;顺手补上官方客户端渲染链路的取证。**
@@ -623,7 +735,6 @@
623
735
  文档时显示「正在加载账号」而不是「未登录」引导、迟到的首屏文档不会覆盖已在屏的完整文档。
624
736
  - 全仓 **902** 例通过,0 skipped。
625
737
 
626
-
627
738
  ## 3.10.1 (2026-10-19)
628
739
 
629
740
  > 「一键签到所有账号」下线。Trae 限制**每台设备每天只能签到一次**:本机任一账号签过之后,这个按钮
@@ -1047,7 +1158,6 @@
1047
1158
  上一轮的双向适配结论原样成立。
1048
1159
  - 线上请求体探针在真实 rc.2 栈上复跑,结果与 rc.1 一致。
1049
1160
 
1050
-
1051
1161
  ## 3.7.0 (2026-10-17)
1052
1162
 
1053
1163
  > **对齐 DSH 0.2.1-rc.1。** 宿主把 `@earendil-works/pi-ai` 从 `^0.85.1` 抬到 `^1.1.0`,
@@ -1746,7 +1856,6 @@
1746
1856
 
1747
1857
  <img src="docs/assets/dsh-connect-trae-composer-credits.png" width="536" alt="Trae credits panel: a table of accounts with their general balance, and the composer readout below" />
1748
1858
 
1749
-
1750
1859
  ## 2.14.0 (2026-10-07)
1751
1860
 
1752
1861
  > **积分浮层改为表格:本区域每个账号一行、只列通用积分、点行即可切换账号。**
@@ -2624,7 +2733,6 @@ Tr ← 我们的行只剩开头两个字母
2624
2733
  - **顺带修掉一处链接会在 npm 页 404 的问题**:本次新增的「未验证项」指引用户去看 `docs/WINDOWS_TOKEN_PROBE.md`,但 `package.json` 的 `files` 白名单(`RELEASING.md` 有明确记载,属有意的包体控制)只放行 `docs/assets/` 下那张截图,**所有 `docs/*.md` 都不进 npm 包**——写成相对 Markdown 链接会在 npm 页面上 404。既有引用(`docs/IMPLEMENTATION_PLAN.md` 等)用的是反引号纯文本故不受影响,本次改为指向 GitHub 的绝对链接(实测 HTTP 200)。
2625
2734
  - `RELEASING.md` 的打包内容清单同步更新(新增 `scripts/verify-windows.mjs`),并记下两条纪律:该脚本必须随包(否则用户无法执行验证步骤)、`docs/*.md` 不进包故 README 引用必须用绝对链接。
2626
2735
 
2627
-
2628
2736
  ## 2.3.0 (2026-09-25)
2629
2737
 
2630
2738
  ### Breaking Changes