dsh-deepseek-web-login 0.5.0 → 0.5.2

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
@@ -2,6 +2,47 @@
2
2
 
3
3
  本项目遵循大致语义化版本;日期为本地时间。
4
4
 
5
+ ## 0.5.2 — 2026-09-27
6
+
7
+ > 限流时也能自动换号接下去,不用再手动重发。
8
+
9
+ ### 改进
10
+
11
+ - **限流也能自动换号接下去**:以前限流是「20 秒退避 + **同一个账号**重试」——
12
+ 多半还是失败,整轮停下要你手动重发;而封禁早就有「短退避 + 换号」的救急路径,两者不对称。
13
+ 现在限流同样走这条路:**能换号 ⇒ 2 秒**退避,重发时自动换上别的账号继续跑。
14
+ - 面板的「上次自动换号」会说明**原因**(`,原账号刚被限流` / `,原账号不可用`)——
15
+ 按时间轮换与"原账号出问题提前换走"在观感上都是"任务突然变慢",后者还解释了为什么没等满间隔。
16
+
17
+ ### 说明
18
+
19
+ - 换号有两条约束,缺一不可:**窗口 3 分钟**(限流发生在 3 分钟以外就不再为它换号 ——
20
+ 那时多半早恢复了,不值得付全量重发的代价)与**冷却 3 分钟**(距上次换号不足 3 分钟不换)。
21
+ 冷却防的是最坏情况:万一多个账号接力被限流,没有它就会在几分钟内把账号库轮一遍。
22
+ - 换号时会**跳过同样刚被限流的账号**(切过去只会白搭一轮全量重发)。
23
+ - 限流时刻只记在**内存**里、不写进账号记录 —— 写进去会让界面把"刚才发太快了"
24
+ 显示成"账号受限",而且那记录会一直留着。
25
+ - **没开自动换号的用户行为完全不变**(依旧 20 秒退避)。
26
+
27
+ ## 0.5.1 — 2026-09-27
28
+
29
+ > 面板能看见「上次自动换号」了;另修两处与现状矛盾的说明。
30
+
31
+ ### 新增
32
+
33
+ - **「上次自动换号」显示**:自动换号之后,「防风控」页的自动换号说明里会多出一句
34
+ `上次自动换号:09:12(工作号 → xxx@gmail.com)`。
35
+ 换号那一轮会全量重发(体感是任务突然变慢),有了这行就能对上原因。
36
+ - 只记**自动**换号;手动切号不记(那是你自己的操作,不需要提示)。
37
+ - 只记录在内存里:重启后从"还没有记录"开始 —— 换号是运行时行为,留一份过期时间反而误导。
38
+ - 账号两端按账号库里的展示名显示(备注名优先,其次掩码账号,不泄露完整凭证信息)。
39
+
40
+ ### 修复
41
+
42
+ - 纠正两处**与现状矛盾**的说明:关于页那张卡片的标题原为「为什么没有「自动换号」」,
43
+ `src/accounts.ts` 的模块注释也写着"刻意不做自动轮换" —— 而「自动换号」从 0.4.0 起就有了。
44
+ 两处都改成"默认关闭"的表述,原有论据(机器行为特征 / 多号关联风险)全部保留。
45
+
5
46
  ## 0.5.0 — 2026-09-27
6
47
 
7
48
  > 新增「允许并行调用工具」开关,并把默认改成**一次只发一个工具调用**。
package/lib/client.js CHANGED
@@ -1632,10 +1632,15 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
1632
1632
  const swHint = el("p", "dsw-hint", "");
1633
1633
  gateCard.append(swHint);
1634
1634
  const currentSwitchMinutes = () => Math.max(0, Math.round(Number(swRange.value) || 0));
1635
+ /** 最近一次自动换号(后端只在**自动**切号时写;手动切不记)。null = 还没有过。 */
1636
+ let lastAutoSwitchInfo = null;
1635
1637
  const paintAutoSwitch = () => {
1636
1638
  const minutes = currentSwitchMinutes();
1637
1639
  swValue.textContent = minutes === 0 ? "关闭" : `${minutes} 分钟`;
1638
- swHint.textContent = minutes === 0 ? "关闭时不会自动换号 —— 当前账号一直用到你手动切换为止。" : `每 ${minutes} 分钟换到账号库里的下一个可用账号(失效或正在受限的会跳过;可用的不足两个就不换)。换号会让投喂链断掉:下一轮要全量重发,历史图也要重新上传 —— 间隔越短,这个代价出现得越频繁。`;
1640
+ const base = minutes === 0 ? "关闭时不会自动换号 —— 当前账号一直用到你手动切换为止。" : `每 ${minutes} 分钟换到账号库里的下一个可用账号(失效或正在受限的会跳过;可用的不足两个就不换)。换号会让投喂链断掉:下一轮要全量重发,历史图也要重新上传 —— 间隔越短,这个代价出现得越频繁。`;
1641
+ const last = lastAutoSwitchInfo;
1642
+ const why = last?.reason === "recently-throttled" ? ",原账号刚被限流" : last?.reason === "current-unusable" ? ",原账号不可用" : "";
1643
+ swHint.textContent = last ? `${base}上次自动换号:${shortTime(last.at)}(${last.from} → ${last.to}${why})。` : base;
1639
1644
  };
1640
1645
  swRange.addEventListener("input", paintAutoSwitch);
1641
1646
  swRange.addEventListener("change", () => {
@@ -2199,9 +2204,9 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
2199
2204
  for (const [key, value] of rows) pathsKv.append(el("div", "k", key), el("div", "dsw-path", value));
2200
2205
  };
2201
2206
  const riskCard = el("div", "dsw-card");
2202
- riskCard.append(el("div", "dsw-cardhead", "为什么没有「自动换号」"));
2203
- riskCard.append(el("p", "dsw-hint", "💡 账号库支持一键手动切换,但刻意不做自动轮换(检测到限流就自动换一个号继续发)。原因不是保守:"));
2204
- riskCard.append(el("p", "dsw-hint", "参考项目切的是「CLI 下次启动用哪个账号」——服务端看不到;而我们每次对话都实时发请求。真人不会在几分钟内换一个账号接着发消息,自动换号是极强的机器行为特征,与本插件在传输层指纹、随机间隔、会话清理上「降低机器可识别性」的努力直接冲突。"));
2207
+ riskCard.append(el("div", "dsw-cardhead", "关于「自动换号」(默认关闭)"));
2208
+ riskCard.append(el("p", "dsw-hint", "💡 账号库支持一键手动切换;「防风控」页的「自动换号」滑块可以让它按时间轮换 —— 但默认是关闭的,因为下面这些理由仍然成立:开它是在拿「降低机器特征」换「摊薄单账号密度」。"));
2209
+ riskCard.append(el("p", "dsw-hint", "参考项目切的是「CLI 下次启动用哪个账号」——服务端看不到;而我们每次对话都实时发请求。真人不会在几分钟内换一个账号接着发消息,自动换号是极强的机器行为特征,与本插件在传输层指纹、随机间隔、会话清理上「降低机器可识别性」的努力直接冲突。⇒ 所以它默认关闭,而且判据只看时间、不看限流状态(\"一被限流就换\"更糟:同一出口 IP 上多号交替活跃,更像有组织的规避)。"));
2205
2210
  riskCard.append(el("p", "dsw-hint", "另外:同一服务商会把多账号关联起来(同设备 / 同 IP / 同指纹 / 相近的行为模式)。一旦被判定为同一人的多开小号,处置通常比单账号超频更重,而且可能波及全部关联账号。所以账号库的目标是「在自己的多个正常账号之间切换更省事」,不是「靠轮换把限流绕过去」。"));
2206
2211
  aboutPane.append(riskCard);
2207
2212
  const applyTransportCard = (info) => {
@@ -2346,6 +2351,7 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
2346
2351
  swRange.min = String(swBounds.min);
2347
2352
  swRange.max = String(swBounds.max);
2348
2353
  swRange.value = String(g.autoSwitchMinutes ?? g.autoSwitchDefault ?? 0);
2354
+ lastAutoSwitchInfo = g.lastAutoSwitch ?? null;
2349
2355
  paintAutoSwitch();
2350
2356
  serialInput.checked = g.serialToolCalls === false;
2351
2357
  paintSerialTools();