dsh-deepseek-web-login 0.6.9 → 0.6.11

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,63 @@
2
2
 
3
3
  本项目遵循大致语义化版本;日期为本地时间。
4
4
 
5
+ ## 0.6.11 — 2026-09-30
6
+
7
+ **清理策略按投喂模式分开:链式模式不自动清理、改为手动;链式下也不再按轮数轮换会话。**
8
+
9
+ 用户的原话:「全量模式跟链式模式的清理应该分开来算……全量模式下可以自动清理,但是链式模式
10
+ 应该来个选项自己手动清理。不然以后链式还没结束,就已经清理了,当然在网页版上面不会有上下文。」
11
+
12
+ 三条改动:
13
+
14
+ 1. **链式模式下不按轮数轮换会话**(`effectiveReuseLimit`)。原来 `sessionReuseTurns` 默认 20 ——
15
+ 全量模式下轮换是对的(每轮都是根消息,会话只是"壳"),但**链式下会话就是链的载体**:
16
+ 轮换 = 每 20 轮定期把上下文清掉,模型那边真的会断。现在链式下上限取 ∞;
17
+ 用户显式设成 0(每次新会话)时不改写他。
18
+ 2. **链式模式下清理只手动**(`SessionCleaner.setManualOnly`)。自动到点删队列这条路在链式下关闭,
19
+ 队列只攒着;全量模式保持原来的「延迟 / 立即 / 不删」三档。
20
+ ⚠️ 只拦**自动**那一路:`flush()` 是显式动作,任何时候照样执行。
21
+ 3. **面板新增「立即清理」**(`POST /cleanup`:`清掉当前网页端会话` + 立刻清空待删队列)。
22
+ 链式模式下没有自动清理,所以必须给一个"现在就把网页端弄干净"的动作;清完之后下一轮会
23
+ 重新当链首(全量发一次)。
24
+
25
+ 另外:切换投喂模式时会**同步**清理策略(链式 ⇒ 手动;全量 ⇒ 自动),不用重启。
26
+
27
+ ⚠️ 仍未解决(需要先确认能力):"每个 DSH 会话各用一个网页端会话"。DSH 目前没有把会话身份交给
28
+ 适配器(请求头只有 `config / adapterDefaults / tools`;会话日志里 `sessionId` / `conversationId`
29
+ 出现 0 次),所以现在只能做到"不污染、不造分支",做不到"按窗口各用各的会话"。
30
+
31
+ ## 0.6.10 — 2026-09-30
32
+
33
+ **修「换个窗口聊天就把上下文清一次」:重开链时不再往复用来的会话里塞根消息。**
34
+
35
+ 现场(用户截图 + 网页端界面):DeepSeek 网页端里,同一个用户消息气泡(内容就是我们那份
36
+ `# Tool Calling Protocol` 提示词)下面出现 **`5 / 5` 的版本翻页 + 「修改 / 重新生成」入口** ——
37
+ 也就是插件在那条消息下反复造了兄弟分支;用户那边的观感是"换个窗口它就把上下文清了一遍,
38
+ 还老是去调网页端的『修改』"。
39
+
40
+ 根因(代码 + 实机状态双证):
41
+
42
+ 1. 网页端会话槽与投喂链都是**账号级单槽**(`reuseSlot` / `contextChain`),不区分 DSH 会话 ——
43
+ 这是既有设计,不是本次引入的。所以"换窗口"时,新窗口的请求会**落进上一个窗口的网页端会话**。
44
+ 2. 落进去之后,链判据必然不满足(历史不是严格追加 / head 变了 / 会话轮换 / 同一步重试),
45
+ 于是走 `decideFeed` 的 `restart` 分支:**发全量 prompt + `parent_message_id: null`**。
46
+ `null` 是「根消息」语义,而那个会话**已经有内容** ⇒ 网页端把这条根渲染成同一位置的
47
+ 又一个兄弟版本(`n / n`),分叉的对象恰好是我们那份巨大的提示词。实机当时是
48
+ `entries=46`(该会话里已经挂着一段 46 条的链)而 `parentId=6` 的错位状态。
49
+
50
+ 改法:**要发根消息 + 当前会话是复用来的 ⇒ 换一个干净会话**(旧会话交回给它自己的清理)。
51
+ 判据抽成纯函数 `needsFreshSession(feed, reused, mode)`,有用例守,并守住"宿主真的调用了它"。
52
+
53
+ ⚠️ 刻意**只在链式模式下生效**:全量模式里"每轮都是根消息"本来就是常态,若也一律换会话,
54
+ 就变成**每轮多建 + 多删一个会话**(+2 个请求/轮)—— 请求密度本身就是风控关注点,
55
+ 不能为只有链式模式才有的问题付这个代价(这一条也被用例钉住了)。
56
+
57
+ ⚠️ 已知边界(本版**没**解决,需要先确认能力):真正做到"每个 DSH 会话各用一个网页端会话"
58
+ 需要 DSH 把会话身份交给适配器;目前查到的请求头里只有 `config / adapterDefaults / tools`,
59
+ 没有会话 id。本版的效果是"不再污染别人的会话、不再造兄弟分支",代价是切换窗口时该窗口会
60
+ 新开一个网页端会话(旧的会被回收)。
61
+
5
62
  ## 0.6.9 — 2026-09-30
6
63
 
7
64
  **补丁版:修好诊断工具(`tools/inspect-session.mjs`)在官方桌面端上的静默失效。**
package/lib/client.js CHANGED
@@ -1756,6 +1756,26 @@ background:var(--bg2);white-space:pre-wrap;font-size:12px}
1756
1756
  cleanupRow.append(btn);
1757
1757
  }
1758
1758
  gateCard.append(cleanupRow);
1759
+ const cleanupNowRow = el("div", "dsw-gate-row");
1760
+ cleanupNowRow.append(el("span", "dsw-gate-label", "立即清理"));
1761
+ const cleanupNowBtn = el("button", "dsw-btn ghost", "清掉当前网页端会话");
1762
+ const cleanupNowHint = el("span", "dsw-hint", "");
1763
+ cleanupNowBtn.addEventListener("click", () => {
1764
+ cleanupNowBtn.disabled = true;
1765
+ cleanupNowHint.textContent = "清理中…";
1766
+ api("/cleanup", {
1767
+ method: "POST",
1768
+ body: "{}"
1769
+ }).then((result) => {
1770
+ cleanupNowHint.textContent = result?.cleared ? `已退出会话 ${String(result.cleared).slice(0, 8)}…,队列剩 ${result?.pending ?? 0} 个;下一轮会重新当链首(全量发一次)` : `没有在用会话;队列剩 ${result?.pending ?? 0} 个`;
1771
+ }).catch((error) => {
1772
+ cleanupNowHint.textContent = `清理失败:${error?.message ?? error}`;
1773
+ }).finally(() => {
1774
+ cleanupNowBtn.disabled = false;
1775
+ });
1776
+ });
1777
+ cleanupNowRow.append(cleanupNowBtn, cleanupNowHint);
1778
+ gateCard.append(cleanupNowRow);
1759
1779
  const cleanupHint = el("p", "dsw-hint", "");
1760
1780
  gateCard.append(cleanupHint);
1761
1781
  const cleanupRanges = el("div");