dsh-deepseek-web-login 0.2.2 → 0.3.1
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 +42 -0
- package/lib/client.js +56 -1
- package/lib/client.js.map +1 -1
- package/lib/index.js +88 -12
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/tools/panel-preview.mjs +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,48 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循大致语义化版本;日期为本地时间。
|
|
4
4
|
|
|
5
|
+
## 0.3.1 — 2026-09-26
|
|
6
|
+
|
|
7
|
+
> 报错文案瘦身。功能没变,但限流与封禁的提示不再长篇解释。
|
|
8
|
+
|
|
9
|
+
### 改进
|
|
10
|
+
|
|
11
|
+
- **封禁提示只说到几时结束**:改为「DeepSeek 网页端已封禁本账号,X 解除(约 N 分钟)」。
|
|
12
|
+
原来那段 150 字的解释(登录态其实有效、建会话也正常、建议改用 API key、
|
|
13
|
+
刚跑过大量工具步骤的会话尤其容易被限……)全部移到代码注释 —— 用户看报错时只需要
|
|
14
|
+
「是什么 + 到几时结束」,解释会把这两件事淹没。
|
|
15
|
+
- **限流统一叫「网页版限流」**:账号节流(`发得太频繁`)与「同一账号同时只能生成一条消息」
|
|
16
|
+
两种情况共用这个前缀,后缀只保留成因 + 会自动重试。HTTP 限流的提示同样是这三个字。
|
|
17
|
+
- 设置页上的账号级限制提示同步收紧(去掉「只读调用不受影响」等补充)。
|
|
18
|
+
|
|
19
|
+
### 说明
|
|
20
|
+
|
|
21
|
+
- 结构化字段一个没动:`RATE_LIMIT` 分类、`providerRetryAfterMs`(解除时间很远时让重试策略
|
|
22
|
+
放弃空转)、`rateLimitKind` 均照旧 —— 只有文案层变短,重试行为与账号级限制记录不受影响。
|
|
23
|
+
|
|
24
|
+
### 工程
|
|
25
|
+
|
|
26
|
+
- `check-session-lifecycle` 的封禁文案断言原本绑死旧措辞(`/临时限制|muted/i`),
|
|
27
|
+
改为断意图(含「封禁/限制」+ 含「解除」),并新增**长度上限 80 字**阀门防止回退。
|
|
28
|
+
|
|
29
|
+
## 0.3.0 — 2026-09-26
|
|
30
|
+
|
|
31
|
+
> 上下文范围可调。原来硬编码 1M,现在能按需调小。
|
|
32
|
+
|
|
33
|
+
### 新增
|
|
34
|
+
|
|
35
|
+
- **「上下文范围」滑块**(设置页 → 请求节流,紧邻「图片上限」)。档位:32K / 64K / 128K / 256K / 512K / 1M。
|
|
36
|
+
它声明的是**模型能装多少**(`contextWindow`)—— DSH 据此决定何时压缩或截断历史。
|
|
37
|
+
声明 1M 时,DSH 长期认为"还装得下"而迟迟不压,于是每轮都把整段转写重发;
|
|
38
|
+
对只跑短任务的人,这部分体量是白烧的。调小后 DSH 会更早动手。
|
|
39
|
+
⚠️ 它与「prompt 上限」是**两道独立阀门**:前者管"插件一次发多少字符",后者管"DSH 认为能装多少"。
|
|
40
|
+
两个都调小,请求体量才真的降下来。
|
|
41
|
+
改动**即时生效**,不需要重启 DSH。
|
|
42
|
+
|
|
43
|
+
### 说明
|
|
44
|
+
|
|
45
|
+
- 默认值仍是 1Mi(DeepSeek 网页端标称值)—— 不动这个开关的人,行为与之前完全一致。
|
|
46
|
+
|
|
5
47
|
## 0.2.2 — 2026-09-24
|
|
6
48
|
|
|
7
49
|
> 面板视觉重构。功能没变,但设置页整个翻新了一遍。
|
package/lib/client.js
CHANGED
|
@@ -692,7 +692,7 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
|
|
|
692
692
|
}
|
|
693
693
|
const text = countdown(activeLimitUntilMs);
|
|
694
694
|
limitRow.style.display = "";
|
|
695
|
-
limitRow.textContent = text === "已解除" ? `账号级限制已解除(${shortTime(activeLimitUntilMs)})。` : `⚠️ 账号级限制:${text}(${shortTime(activeLimitUntilMs)}
|
|
695
|
+
limitRow.textContent = text === "已解除" ? `账号级限制已解除(${shortTime(activeLimitUntilMs)})。` : `⚠️ 账号级限制:${text}(${shortTime(activeLimitUntilMs)} 解除,期间生成会被拒)`;
|
|
696
696
|
};
|
|
697
697
|
const accountCard = el("div", "dsw-card");
|
|
698
698
|
accountCard.append(el("div", "dsw-cardhead", "当前账号"));
|
|
@@ -1527,6 +1527,53 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
|
|
|
1527
1527
|
paintImageCap();
|
|
1528
1528
|
saveGate({ maxRefImages: Number(imgRange.value) });
|
|
1529
1529
|
});
|
|
1530
|
+
const ctxRow = el("div", "dsw-gate-row");
|
|
1531
|
+
ctxRow.append(el("span", "dsw-gate-label", "上下文"));
|
|
1532
|
+
const ctxRange = el("input", "dsw-range");
|
|
1533
|
+
ctxRange.type = "range";
|
|
1534
|
+
ctxRange.min = "0";
|
|
1535
|
+
ctxRange.step = "1";
|
|
1536
|
+
ctxRange.setAttribute("aria-label", "对外声明的上下文窗口大小");
|
|
1537
|
+
ctxRange.title = "告诉 DSH 这个模型能装多少上下文;调小会让它更早压缩历史";
|
|
1538
|
+
const ctxValue = el("span", "dsw-gate-value", "—");
|
|
1539
|
+
ctxRow.append(ctxRange, ctxValue);
|
|
1540
|
+
gateCard.append(ctxRow);
|
|
1541
|
+
const ctxHint = el("p", "dsw-hint", "");
|
|
1542
|
+
gateCard.append(ctxHint);
|
|
1543
|
+
let ctxOptions = [
|
|
1544
|
+
32768,
|
|
1545
|
+
65536,
|
|
1546
|
+
131072,
|
|
1547
|
+
262144,
|
|
1548
|
+
524288,
|
|
1549
|
+
1048576
|
|
1550
|
+
];
|
|
1551
|
+
/** token 数转人话:1M / 512K / 128K …… 与「模型」页的写法保持一致。 */
|
|
1552
|
+
const formatCtxWindow = (tokens) => tokens >= 1048576 ? `${(tokens / 1048576).toFixed(0)}M` : `${Math.round(tokens / 1024)}K`;
|
|
1553
|
+
/** 把任意值吸附到最近的档位(配置里可能是旧值或手改过的值)。 */
|
|
1554
|
+
const nearestCtxIndex = (value) => {
|
|
1555
|
+
let best = 0;
|
|
1556
|
+
let bestDiff = Number.POSITIVE_INFINITY;
|
|
1557
|
+
ctxOptions.forEach((option, index) => {
|
|
1558
|
+
const diff = Math.abs(option - value);
|
|
1559
|
+
if (diff < bestDiff) {
|
|
1560
|
+
bestDiff = diff;
|
|
1561
|
+
best = index;
|
|
1562
|
+
}
|
|
1563
|
+
});
|
|
1564
|
+
return best;
|
|
1565
|
+
};
|
|
1566
|
+
const currentCtxTokens = () => ctxOptions[Number(ctxRange.value)] ?? ctxOptions[ctxOptions.length - 1];
|
|
1567
|
+
const paintContextWindow = () => {
|
|
1568
|
+
const tokens = currentCtxTokens();
|
|
1569
|
+
ctxValue.textContent = formatCtxWindow(tokens);
|
|
1570
|
+
ctxHint.textContent = tokens >= 1048576 ? "当前按 DeepSeek 标称的 1M 声明 —— DSH 会认为「还装得下」,尽量不压缩历史。如果你的任务都很短,可以调小以省下每轮重发的体量。" : `声明 ${formatCtxWindow(tokens)}:DSH 会更早压缩/截断历史,每轮重发的转写因此更短。这只是「声明值」,不改模型真实能力;调小只是让 DSH 早点动手。想彻底压住单次体量,上面的「prompt 上限」也要一起调。`;
|
|
1571
|
+
};
|
|
1572
|
+
ctxRange.addEventListener("input", paintContextWindow);
|
|
1573
|
+
ctxRange.addEventListener("change", () => {
|
|
1574
|
+
paintContextWindow();
|
|
1575
|
+
saveGate({ contextWindow: currentCtxTokens() });
|
|
1576
|
+
});
|
|
1530
1577
|
const cleanupRow = el("div", "dsw-gate-row");
|
|
1531
1578
|
cleanupRow.append(el("span", "dsw-gate-label", "会话清理"));
|
|
1532
1579
|
const cleanupBtns = {};
|
|
@@ -1964,6 +2011,14 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
|
|
|
1964
2011
|
imgRange.step = "1";
|
|
1965
2012
|
imgRange.value = String(g.maxRefImages ?? g.maxRefImagesDefault ?? 24);
|
|
1966
2013
|
paintImageCap();
|
|
2014
|
+
if (Array.isArray(g.contextWindowOptions) && g.contextWindowOptions.length > 0) {
|
|
2015
|
+
const parsedOptions = g.contextWindowOptions.map((value) => Number(value)).filter((value) => Number.isFinite(value) && value > 0);
|
|
2016
|
+
if (parsedOptions.length > 0) ctxOptions = parsedOptions;
|
|
2017
|
+
}
|
|
2018
|
+
ctxRange.min = "0";
|
|
2019
|
+
ctxRange.max = String(Math.max(0, ctxOptions.length - 1));
|
|
2020
|
+
ctxRange.value = String(nearestCtxIndex(Number(g.contextWindow ?? g.contextWindowDefault ?? ctxOptions[ctxOptions.length - 1])));
|
|
2021
|
+
paintContextWindow();
|
|
1967
2022
|
const mode = g.cleanup?.mode ?? "deferred";
|
|
1968
2023
|
for (const key of Object.keys(cleanupBtns)) cleanupBtns[key].classList.toggle("active", key === mode);
|
|
1969
2024
|
const showRanges = mode === "deferred";
|