dsh-deepseek-web-login 0.2.1 → 0.3.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 +40 -0
- package/lib/client.js +180 -68
- package/lib/client.js.map +1 -1
- package/lib/index.js +76 -6
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/tools/panel-preview.mjs +237 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循大致语义化版本;日期为本地时间。
|
|
4
4
|
|
|
5
|
+
## 0.3.0 — 2026-09-26
|
|
6
|
+
|
|
7
|
+
> 上下文范围可调。原来硬编码 1M,现在能按需调小。
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
- **「上下文范围」滑块**(设置页 → 请求节流,紧邻「图片上限」)。档位:32K / 64K / 128K / 256K / 512K / 1M。
|
|
12
|
+
它声明的是**模型能装多少**(`contextWindow`)—— DSH 据此决定何时压缩或截断历史。
|
|
13
|
+
声明 1M 时,DSH 长期认为"还装得下"而迟迟不压,于是每轮都把整段转写重发;
|
|
14
|
+
对只跑短任务的人,这部分体量是白烧的。调小后 DSH 会更早动手。
|
|
15
|
+
⚠️ 它与「prompt 上限」是**两道独立阀门**:前者管"插件一次发多少字符",后者管"DSH 认为能装多少"。
|
|
16
|
+
两个都调小,请求体量才真的降下来。
|
|
17
|
+
改动**即时生效**,不需要重启 DSH。
|
|
18
|
+
|
|
19
|
+
### 说明
|
|
20
|
+
|
|
21
|
+
- 默认值仍是 1Mi(DeepSeek 网页端标称值)—— 不动这个开关的人,行为与之前完全一致。
|
|
22
|
+
|
|
23
|
+
## 0.2.2 — 2026-09-24
|
|
24
|
+
|
|
25
|
+
> 面板视觉重构。功能没变,但设置页整个翻新了一遍。
|
|
26
|
+
|
|
27
|
+
### 改进
|
|
28
|
+
|
|
29
|
+
- **去掉"卡片盒子"**:原来七个区块都是同一种描边圆角卡片,连堆在一起时盒子本身不表达任何层级,
|
|
30
|
+
只贡献视觉噪音 —— 现在改用「分区标题 + 负空间」分组,行分隔交给键值表自带的细线。
|
|
31
|
+
副产品:页面上唯一有实底的块只剩账号库,重要度自然凸显。
|
|
32
|
+
- **统一尺度**:字号从 5 档收敛、圆角从 6 档收敛到 3 档、间距改用统一的 5 档变量(`--r-*` / `--sp-*`)。
|
|
33
|
+
页面标题原来和正文只差 1px(14 vs 13),整页没有"起点",现在标题提到 15px/600 并加了轻负字距。
|
|
34
|
+
- **补齐交互状态**:按钮 hover 从"整体调透明度"(看着像被禁用)改成背景色变化 + 按下 1px 位移;
|
|
35
|
+
账号行补 hover 与「当前账号」主色淡底;全站补 `:focus-visible`(键盘可达)与 `prefers-reduced-motion` 保护。
|
|
36
|
+
- **开关打开态改用主色**:原来是红色 —— 一排红色开关看着像在报错。红色留给真正破坏性的动作。
|
|
37
|
+
- **徽章与警示底色不再写死 rgba**:改用 `color-mix` 从语义色现算,深浅两套主题都不会发脏。
|
|
38
|
+
- 说明文字限宽 64ch,长行不再拖满整张卡。
|
|
39
|
+
|
|
40
|
+
### 工程
|
|
41
|
+
|
|
42
|
+
- 新增 `tools/panel-preview.mjs`:从源码**现读**样式表 + 静态 DOM 快照,生成浅色/深色双栏预览 ——
|
|
43
|
+
改面板 UI 时不必启动 DSH 就能对照,且样式不会与源码漂移。
|
|
44
|
+
|
|
5
45
|
## 0.2.1 — 2026-09-24
|
|
6
46
|
|
|
7
47
|
> 工程版本,无功能改动。用途是把包发到 npm、并把发布流程从「本机手动」换成
|
package/lib/client.js
CHANGED
|
@@ -328,6 +328,23 @@ window.__ModuleLoader__.load({
|
|
|
328
328
|
--warn:var(--dsw-alias-state-warn-label,#9a6a00);
|
|
329
329
|
--err:var(--dsw-alias-state-error-primary,#d93025);
|
|
330
330
|
--mono:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);
|
|
331
|
+
/* ── 尺度层 ──────────────────────────────────────────────────────────
|
|
332
|
+
改造前的问题:fontSize 有 5 档(11/12/12.5/13/14)、圆角 6 档(6/8/10/12/999)、
|
|
333
|
+
间距散落 7 种值(2/4/6/8/9/10/12)。同一个界面里数字一多,眼睛就觉得"乱"却
|
|
334
|
+
说不出哪乱 —— 所以先把尺度收敛,下面所有组件只能引用这里的变量。 */
|
|
335
|
+
--r-lg:12px; /* 卡片等容器 */
|
|
336
|
+
--r-md:8px; /* 按钮 / 输入框 */
|
|
337
|
+
--r-sm:6px; /* 小组件(备注输入、归组下拉) */
|
|
338
|
+
--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;
|
|
339
|
+
|
|
340
|
+
/* 状态底色:从语义色现算,不再写死 rgba。
|
|
341
|
+
写死的 rgba 只对其中一档主题成立 —— 按浅色底调出来的那组绿/橙/红贴到深色底上会发脏。 */
|
|
342
|
+
--ok-weak:color-mix(in srgb,var(--ok) 15%,transparent);
|
|
343
|
+
--warn-weak:color-mix(in srgb,var(--warn) 16%,transparent);
|
|
344
|
+
--err-weak:color-mix(in srgb,var(--err) 14%,transparent);
|
|
345
|
+
--accent-weak:color-mix(in srgb,var(--accent) 12%,transparent);
|
|
346
|
+
--accent-hover:color-mix(in srgb,var(--accent) 88%,var(--fg));
|
|
347
|
+
|
|
331
348
|
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
|
|
332
349
|
font-size:13px;line-height:1.6;color:var(--fg);max-width:760px;padding:2px 0 12px;
|
|
333
350
|
-webkit-font-smoothing:antialiased;
|
|
@@ -337,133 +354,173 @@ font-size:13px;line-height:1.6;color:var(--fg);max-width:760px;padding:2px 0 12p
|
|
|
337
354
|
--fb-bg1:#212121;--fb-bg2:#2a2a2a;--fb-bd:#333333;--fb-bd2:#3d3d3d;
|
|
338
355
|
--fb-hover:#ffffff14;--fb-code:#1c1c1c}
|
|
339
356
|
}
|
|
340
|
-
|
|
341
|
-
|
|
357
|
+
/* 页面标题:整页唯一的 display 级文字。字重 600 + 轻微负字距 ——
|
|
358
|
+
原来是 14px/500,跟 13px 的正文只差 1px,整页因此没有"起点"。 */
|
|
359
|
+
.dsw-title{margin:0 0 4px;font-size:15px;font-weight:600;line-height:1.4;letter-spacing:-.01em;color:var(--fg)}
|
|
360
|
+
.dsw-sub{margin:0 0 var(--sp-5);font-size:12px;line-height:1.65;color:var(--fg2);max-width:64ch}
|
|
342
361
|
/* provider 名带连字符,万一折行会断成 deepseek- / web(看着像故障)—— 整词不拆 */
|
|
343
362
|
.dsw-nobreak{white-space:nowrap}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
.dsw-
|
|
349
|
-
|
|
350
|
-
.dsw-
|
|
351
|
-
|
|
352
|
-
.dsw-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
.dsw-
|
|
356
|
-
.dsw-
|
|
357
|
-
|
|
363
|
+
/* 分组不再用"七个一模一样的描边盒子"。
|
|
364
|
+
盒子本身不表达任何层级,连堆七张就是 AI 默认长相 —— 按 redesign 技能的判据,
|
|
365
|
+
card 只在 elevation 真的表达层级时才用(我们这里没有那种层级)。
|
|
366
|
+
数据密集面板的正解是「分区标题 + 负空间」:标题吃字重,分组吃间距,
|
|
367
|
+
行与行之间的细线交给 .dsw-kv 自己承担。这样页面上唯一有实底的块
|
|
368
|
+
就只剩账号行和反馈条,它们的重要度反而被衬出来了。 */
|
|
369
|
+
.dsw-card{background:transparent;border:0;border-radius:0;padding:0;margin:0 0 var(--sp-5)}
|
|
370
|
+
/* 分区标题:字重整 600。 */
|
|
371
|
+
.dsw-cardhead{display:flex;align-items:center;gap:var(--sp-2);margin:0 0 var(--sp-2);
|
|
372
|
+
font-size:13px;font-weight:600;letter-spacing:-.005em;color:var(--fg)}
|
|
373
|
+
.dsw-card > .name{margin:0 0 var(--sp-2);font-size:13px;font-weight:600;color:var(--fg)}
|
|
374
|
+
.dsw-row{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}
|
|
375
|
+
.dsw-badge{font-size:11px;font-weight:500;line-height:1.7;padding:1px 9px;border-radius:999px;
|
|
376
|
+
white-space:nowrap;font-variant-numeric:tabular-nums}
|
|
377
|
+
.dsw-badge.on{color:var(--ok);background:rgba(26,159,90,.15);background:var(--ok-weak)}
|
|
378
|
+
.dsw-badge.off{color:var(--warn);background:rgba(200,140,20,.16);background:var(--warn-weak)}
|
|
379
|
+
.dsw-badge.err{color:var(--err);background:rgba(217,48,37,.15);background:var(--err-weak)}
|
|
380
|
+
/* 按钮:hover 不再整体调 opacity —— 那会把文字一起变淡,看着像被禁用了。
|
|
381
|
+
改成背景微调 + 按下时 1px 位移(物理感);focus-visible 补上键盘可达性。 */
|
|
382
|
+
.dsw-btn{font:inherit;font-size:12px;font-weight:500;line-height:1.5;padding:6px 13px;
|
|
383
|
+
border-radius:var(--r-md);border:1px solid transparent;background:var(--accent);color:var(--on-accent);
|
|
384
|
+
cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .1s ease}
|
|
385
|
+
.dsw-btn:hover:not(:disabled){background:var(--accent-hover)}
|
|
386
|
+
.dsw-btn:active:not(:disabled){transform:translateY(1px)}
|
|
387
|
+
.dsw-btn:disabled{opacity:.45;cursor:not-allowed}
|
|
388
|
+
.dsw-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
|
358
389
|
.dsw-btn.ghost{background:transparent;border-color:var(--bd2);color:var(--fg)}
|
|
359
|
-
.dsw-btn.ghost:hover:not(:disabled){background:var(--hover);
|
|
390
|
+
.dsw-btn.ghost:hover:not(:disabled){background:var(--hover);border-color:var(--bd)}
|
|
360
391
|
.dsw-btn.danger{background:transparent;border-color:var(--bd2);color:var(--err)}
|
|
361
|
-
.dsw-btn.danger:hover:not(:disabled){background:
|
|
362
|
-
.dsw-btn.armed{background:var(--err);border-color:var(--err);color
|
|
363
|
-
.dsw-btn.armed:hover:not(:disabled){
|
|
392
|
+
.dsw-btn.danger:hover:not(:disabled){background:var(--err-weak);border-color:var(--err)}
|
|
393
|
+
.dsw-btn.armed{background:var(--err);border-color:var(--err);color:var(--on-accent)}
|
|
394
|
+
.dsw-btn.armed:hover:not(:disabled){background:color-mix(in srgb,var(--err) 88%,var(--fg))}
|
|
364
395
|
.dsw-input,.dsw-area{width:100%;box-sizing:border-box;font:inherit;font-size:12.5px;
|
|
365
|
-
background:var(--bg1);color:var(--fg);border:1px solid var(--bd2);border-radius:
|
|
396
|
+
background:var(--bg1);color:var(--fg);border:1px solid var(--bd2);border-radius:var(--r-md);padding:7px 10px;
|
|
366
397
|
outline:none;transition:border-color .15s ease,box-shadow .15s ease}
|
|
367
|
-
.dsw-input:focus,.dsw-area:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--
|
|
398
|
+
.dsw-input:focus,.dsw-area:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}
|
|
368
399
|
.dsw-area{min-height:68px;resize:vertical;font-family:var(--mono);font-size:12px;line-height:1.5}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
.dsw-kv
|
|
372
|
-
.dsw-kv
|
|
400
|
+
/* 键值表:标签提一档到次级色 —— 原来用三级色,深色主题下几乎读不出来。
|
|
401
|
+
行距 5→6px;分隔线只做分组暗示,不做表格线。 */
|
|
402
|
+
.dsw-kv{display:grid;grid-template-columns:auto 1fr;gap:0 var(--sp-3);margin:0;align-items:baseline}
|
|
403
|
+
.dsw-kv > *{padding:6px 0;border-top:1px solid var(--bd);min-width:0}
|
|
404
|
+
.dsw-kv > :nth-child(1),.dsw-kv > :nth-child(2){border-top:none;padding-top:2px}
|
|
405
|
+
.dsw-kv .k{color:var(--fg2);font-size:12px;white-space:nowrap}
|
|
373
406
|
.dsw-kv > *:not(.k){color:var(--fg);word-break:break-word}
|
|
374
|
-
.dsw-msg{margin-top:
|
|
375
|
-
border-left:3px solid var(--fg3);white-space:pre-wrap;max-height:240px;
|
|
376
|
-
font-size:12px;line-height:1.6;color:var(--fg)}
|
|
377
|
-
.dsw-msg.err{border-left-color:var(--err);color:var(--err)}
|
|
407
|
+
.dsw-msg{margin-top:var(--sp-3);padding:10px 12px;border-radius:var(--r-md);background:var(--bg2);
|
|
408
|
+
border:1px solid var(--bd);border-left:3px solid var(--fg3);white-space:pre-wrap;max-height:240px;
|
|
409
|
+
overflow:auto;font-size:12px;line-height:1.6;color:var(--fg)}
|
|
410
|
+
.dsw-msg.err{border-left-color:var(--err);color:color-mix(in srgb,var(--err) 78%,var(--fg))}
|
|
378
411
|
.dsw-msg.ok{border-left-color:var(--ok)}
|
|
379
|
-
.dsw-models{list-style:none;margin:
|
|
380
|
-
.dsw-models li{padding:
|
|
412
|
+
.dsw-models{list-style:none;margin:0;padding:0}
|
|
413
|
+
.dsw-models li{padding:10px 0;border-top:1px solid var(--bd)}
|
|
381
414
|
.dsw-models li:first-child{border-top:none;padding-top:2px}
|
|
382
415
|
.dsw-models .name{font-size:13px;font-weight:500;color:var(--fg)}
|
|
383
|
-
.dsw-models .id{color:var(--fg3);font-size:12px;margin-top:
|
|
384
|
-
|
|
385
|
-
.dsw-
|
|
386
|
-
.dsw-gate-
|
|
416
|
+
.dsw-models .id{color:var(--fg3);font-size:12px;margin-top:2px;word-break:break-word}
|
|
417
|
+
/* 说明文字:限宽 64ch —— 满宽的一行小字读起来很累,且会拖长整张卡。 */
|
|
418
|
+
.dsw-hint{color:var(--fg3);font-size:12px;line-height:1.7;margin:var(--sp-3) 0 0;max-width:64ch}
|
|
419
|
+
.dsw-gate-row{display:flex;align-items:center;gap:10px;margin:var(--sp-3) 0;flex-wrap:wrap}
|
|
420
|
+
.dsw-gate-label{color:var(--fg2);font-size:12px;min-width:52px;flex:0 0 auto}
|
|
387
421
|
.dsw-gate-value{font-size:12px;color:var(--fg);min-width:56px;text-align:right;font-variant-numeric:tabular-nums}
|
|
388
422
|
/* 「上下限」成对的一行:两个滑块并排,右边一个合成值(如「6~10 个」)。
|
|
389
423
|
—— 比"每个边界各占一行"省一半高度,而且两个边界的相对位置一眼能比出来。 */
|
|
390
|
-
.dsw-range-pair{flex:1 1 240px;display:flex;gap:
|
|
424
|
+
.dsw-range-pair{flex:1 1 240px;display:flex;gap:var(--sp-2);align-items:center;min-width:190px}
|
|
391
425
|
.dsw-gate-pair-value{font-size:12px;color:var(--fg);min-width:78px;text-align:right;font-variant-numeric:tabular-nums}
|
|
392
426
|
.dsw-switch{display:inline-flex;align-items:center;gap:9px;font-size:13px;color:var(--fg);cursor:pointer;user-select:none}
|
|
393
427
|
.dsw-switch input{position:absolute;opacity:0;width:0;height:0}
|
|
394
|
-
.dsw-switch-track{width:34px;height:20px;border-radius:999px;background:var(--bd2);position:relative;transition:background-color .
|
|
395
|
-
.dsw-switch-track::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .
|
|
396
|
-
|
|
428
|
+
.dsw-switch-track{width:34px;height:20px;border-radius:999px;background:var(--bd2);position:relative;transition:background-color .18s ease;flex:0 0 auto}
|
|
429
|
+
.dsw-switch-track::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.28);transition:transform .18s ease}
|
|
430
|
+
/* 打开态用主色 —— 改造前是 --err(红)。开关的"开"表达的是**状态**不是危险,
|
|
431
|
+
整排红色开关看着像报错。危险色留给真正会造成破坏的动作(armed 按钮)。 */
|
|
432
|
+
.dsw-switch input:checked + .dsw-switch-track{background:var(--accent)}
|
|
397
433
|
.dsw-switch input:checked + .dsw-switch-track::after{transform:translateX(14px)}
|
|
434
|
+
.dsw-switch input:focus-visible + .dsw-switch-track{outline:2px solid var(--accent);outline-offset:2px}
|
|
398
435
|
.dsw-range{-webkit-appearance:none;appearance:none;flex:1 1 160px;height:4px;border-radius:999px;background:var(--bd2);outline:none;cursor:pointer}
|
|
399
|
-
.dsw-range
|
|
436
|
+
.dsw-range:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
|
|
437
|
+
.dsw-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--accent);cursor:pointer;border:none;box-shadow:0 1px 3px rgba(0,0,0,.25)}
|
|
400
438
|
.dsw-preset{padding:4px 10px;font-size:12px}
|
|
401
439
|
.dsw-preset.active{background:var(--accent);border-color:transparent;color:var(--on-accent)}
|
|
402
|
-
.dsw-
|
|
403
|
-
.dsw-
|
|
404
|
-
|
|
440
|
+
.dsw-preset.active:hover{background:var(--accent-hover)}
|
|
441
|
+
.dsw-gate-msg{color:var(--fg3);font-size:12px;min-height:1.6em;margin:var(--sp-3) 0 0}
|
|
442
|
+
.dsw-code{display:block;margin:var(--sp-2) 0;padding:8px 10px;background:var(--code-bg);border:1px solid var(--bd);
|
|
443
|
+
border-radius:var(--r-sm);font-family:var(--mono);font-size:12px;line-height:1.5;color:var(--fg);
|
|
405
444
|
overflow-x:auto;white-space:pre}
|
|
406
445
|
.dsw-msg::-webkit-scrollbar,.dsw-code::-webkit-scrollbar,.dsw-area::-webkit-scrollbar{width:8px;height:8px}
|
|
407
446
|
.dsw-msg::-webkit-scrollbar-thumb,.dsw-code::-webkit-scrollbar-thumb,.dsw-area::-webkit-scrollbar-thumb{
|
|
408
447
|
background:var(--bd2);border-radius:4px}
|
|
409
448
|
/* ── 标签页:把原来一页到底的 7 张卡拆成 4 页 ────────────────────────
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
.dsw-tabs{display:inline-flex;gap:
|
|
413
|
-
padding:0
|
|
449
|
+
标签栏做成带边框的圆角容器。未选中态改用**颜色**表达(原来是 opacity .7 ——
|
|
450
|
+
透明度既压暗了文字又让 hover 没有明确的落点),当前页用下划线。 */
|
|
451
|
+
.dsw-tabs{display:inline-flex;gap:2px;border:1px solid var(--bd);border-radius:var(--r-md);
|
|
452
|
+
padding:0 var(--sp-2);margin:var(--sp-1) 0 var(--sp-4);background:var(--bg1)}
|
|
414
453
|
.dsw-tab{appearance:none;background:transparent;border:none;border-bottom:2px solid transparent;
|
|
415
|
-
padding:8px 14px;font:inherit;font-size:13px;color:var(--fg2);
|
|
416
|
-
transition:
|
|
417
|
-
.dsw-tab:hover{
|
|
418
|
-
.dsw-tab.active{
|
|
454
|
+
padding:8px 14px;font:inherit;font-size:13px;color:var(--fg2);cursor:pointer;
|
|
455
|
+
transition:color .15s ease,border-color .15s ease}
|
|
456
|
+
.dsw-tab:hover{color:var(--fg)}
|
|
457
|
+
.dsw-tab.active{color:var(--fg);font-weight:500;border-bottom-color:var(--fg)}
|
|
458
|
+
.dsw-tab:focus-visible{outline:2px solid var(--accent);outline-offset:-3px;border-radius:4px}
|
|
419
459
|
.dsw-pane[hidden]{display:none}
|
|
420
460
|
/* 二级(子页面)标签:**分段胶囊**。
|
|
421
461
|
刻意和一级标签长得不一样(一级是"下划线 + 大字号"),这样一眼能看出自己在第几层;
|
|
422
462
|
否则两层长得一样、用户会以为回到了同一层。 */
|
|
423
|
-
.dsw-subtabs{display:inline-flex;gap:2px;padding:3px;margin:0 0
|
|
463
|
+
.dsw-subtabs{display:inline-flex;gap:2px;padding:3px;margin:0 0 var(--sp-4);border-radius:999px;
|
|
424
464
|
background:var(--bg1);border:1px solid var(--bd)}
|
|
425
465
|
.dsw-subtab{appearance:none;border:0;background:transparent;font:inherit;font-size:12px;
|
|
426
466
|
font-weight:500;color:var(--fg2);padding:4px 14px;border-radius:999px;cursor:pointer;
|
|
427
467
|
transition:color .15s ease,background-color .15s ease}
|
|
428
468
|
.dsw-subtab:hover{color:var(--fg)}
|
|
469
|
+
.dsw-subtab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
|
429
470
|
/* 选中态:底色用 bg2 铺在 bg1 上,深色主题里这两档只差一点点,
|
|
430
471
|
所以必须再加一圈描边(bd2 比 bd 明显)才立得住 —— 实测深色下不加就跟没选中一样。 */
|
|
431
472
|
.dsw-subtab.active{background:var(--bg2);color:var(--fg);font-weight:600;
|
|
432
473
|
box-shadow:inset 0 0 0 1px var(--bd2)}
|
|
433
474
|
/* 调用台账 */
|
|
434
|
-
.dsw-spark{display:block;width:100%;height:40px;margin:
|
|
475
|
+
.dsw-spark{display:block;width:100%;height:40px;margin:var(--sp-2) 0 2px}
|
|
435
476
|
.dsw-spark rect{fill:var(--bd2)}
|
|
436
477
|
.dsw-spark rect.on{fill:var(--accent)}
|
|
437
478
|
.dsw-spark rect.bad{fill:var(--err)}
|
|
438
479
|
.dsw-path{font-family:var(--mono);font-size:11px;color:var(--fg2);word-break:break-all}
|
|
439
480
|
/* 账号库 */
|
|
440
|
-
.dsw-accounts{list-style:none;margin:
|
|
481
|
+
.dsw-accounts{list-style:none;margin:var(--sp-2) 0 0;padding:0;display:flex;flex-direction:column;gap:var(--sp-2)}
|
|
482
|
+
/* 账号行是可交互的整块 —— 必须给 hover 反馈。改造前它完全静态,鼠标扫过去没有任何回应。
|
|
483
|
+
当前账号再叠一层主色淡底,跟"只是鼠标划过"区分开。 */
|
|
484
|
+
/* 账号行:从"bg2 卡片里的凹陷块"改成"页面上的凸起块"。
|
|
485
|
+
卡片没了之后 bg1 跟页面同色看不见,必须换成 bg2 —— 顺带让账号库成为
|
|
486
|
+
页面上唯一有实底的一组,重要度自然凸显。 */
|
|
441
487
|
.dsw-account{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1px solid var(--bd);
|
|
442
|
-
border-radius:
|
|
443
|
-
|
|
488
|
+
border-radius:var(--r-md);padding:10px 12px;background:var(--bg2);
|
|
489
|
+
transition:background-color .15s ease,border-color .15s ease}
|
|
490
|
+
.dsw-account:hover{background:var(--hover)}
|
|
491
|
+
.dsw-account.active{border-color:var(--accent);background:var(--accent-weak)}
|
|
492
|
+
.dsw-account.active:hover{background:color-mix(in srgb,var(--accent) 16%,transparent)}
|
|
444
493
|
.dsw-account-main{flex:1 1 200px;min-width:0}
|
|
445
494
|
.dsw-account-title{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:13px;font-weight:500}
|
|
446
|
-
.dsw-account-meta{font-size:11px;color:var(--fg3);margin-top:3px;word-break:break-all}
|
|
447
|
-
.dsw-account-fix{display:flex;gap:
|
|
495
|
+
.dsw-account-meta{font-size:11px;color:var(--fg3);margin-top:3px;word-break:break-all;font-variant-numeric:tabular-nums}
|
|
496
|
+
.dsw-account-fix{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;margin-top:6px}
|
|
448
497
|
.dsw-account-actions{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
|
|
449
|
-
.dsw-labelinput{font:inherit;font-size:12px;padding:3px 7px;border-radius:
|
|
498
|
+
.dsw-labelinput{font:inherit;font-size:12px;padding:3px 7px;border-radius:var(--r-sm);border:1px solid var(--bd2);
|
|
450
499
|
background:var(--bg2);color:var(--fg);width:150px;margin-top:4px}
|
|
500
|
+
.dsw-labelinput:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
|
|
451
501
|
.dsw-limit{color:var(--warn)}
|
|
452
502
|
/* 分组:组标题行 + 组内缩进 + 归组下拉 */
|
|
453
|
-
.dsw-grouphead{display:flex;align-items:center;gap:
|
|
454
|
-
.dsw-grouphead .gname{font-weight:
|
|
455
|
-
.dsw-grouphead .gcount{color:var(--fg3);font-size:11px}
|
|
503
|
+
.dsw-grouphead{display:flex;align-items:center;gap:var(--sp-2);margin:var(--sp-3) 0 0;font-size:12px}
|
|
504
|
+
.dsw-grouphead .gname{font-weight:600}
|
|
505
|
+
.dsw-grouphead .gcount{color:var(--fg3);font-size:11px;font-variant-numeric:tabular-nums}
|
|
456
506
|
.dsw-grouphead .gtoggle{cursor:pointer;user-select:none;color:var(--fg2);width:12px;display:inline-block;text-align:center}
|
|
507
|
+
.dsw-grouphead .gtoggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}
|
|
457
508
|
.dsw-grouphead .gspacer{flex:1 1 auto}
|
|
458
509
|
.dsw-grouphead .dsw-btn{font-size:11px;padding:1px 7px}
|
|
459
510
|
.dsw-account.grouped{margin-left:14px}
|
|
460
|
-
.dsw-groupsel{font:inherit;font-size:11px;padding:2px 4px;border-radius:
|
|
511
|
+
.dsw-groupsel{font:inherit;font-size:11px;padding:2px 4px;border-radius:var(--r-sm);border:1px solid var(--bd2);
|
|
461
512
|
background:var(--bg2);color:var(--fg);max-width:110px}
|
|
513
|
+
.dsw-groupsel:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
|
|
462
514
|
/* 操作反馈:不归属任何一页,常驻在标签栏之上 */
|
|
463
|
-
.dsw-alert{margin:0 0
|
|
464
|
-
background:var(--
|
|
465
|
-
|
|
466
|
-
.dsw-alert.
|
|
515
|
+
.dsw-alert{margin:0 0 var(--sp-3);padding:9px 12px;border-radius:var(--r-md);border:1px solid var(--bd);
|
|
516
|
+
background:var(--bg2);white-space:pre-wrap;font-size:12px}
|
|
517
|
+
/* 整行染成纯错误色在深色底上会刺眼且发暗;混一点正文色压回来,色条仍然说明性质。 */
|
|
518
|
+
.dsw-alert.ok{border-left:3px solid var(--ok);color:color-mix(in srgb,var(--ok) 72%,var(--fg))}
|
|
519
|
+
.dsw-alert.err{border-left:3px solid var(--err);color:color-mix(in srgb,var(--err) 78%,var(--fg))}
|
|
520
|
+
/* 用户开了"减少动态效果"就别再让元素滑来滑去。 */
|
|
521
|
+
@media (prefers-reduced-motion:reduce){
|
|
522
|
+
.dsw-page *{transition-duration:.01ms !important}
|
|
523
|
+
}
|
|
467
524
|
`;
|
|
468
525
|
/** 短时间:今天只显示时分,其它显示月/日 时:分。 */
|
|
469
526
|
function shortTime(input) {
|
|
@@ -1470,6 +1527,53 @@ background:var(--bg1);white-space:pre-wrap;font-size:12px}
|
|
|
1470
1527
|
paintImageCap();
|
|
1471
1528
|
saveGate({ maxRefImages: Number(imgRange.value) });
|
|
1472
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
|
+
});
|
|
1473
1577
|
const cleanupRow = el("div", "dsw-gate-row");
|
|
1474
1578
|
cleanupRow.append(el("span", "dsw-gate-label", "会话清理"));
|
|
1475
1579
|
const cleanupBtns = {};
|
|
@@ -1907,6 +2011,14 @@ background:var(--bg1);white-space:pre-wrap;font-size:12px}
|
|
|
1907
2011
|
imgRange.step = "1";
|
|
1908
2012
|
imgRange.value = String(g.maxRefImages ?? g.maxRefImagesDefault ?? 24);
|
|
1909
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();
|
|
1910
2022
|
const mode = g.cleanup?.mode ?? "deferred";
|
|
1911
2023
|
for (const key of Object.keys(cleanupBtns)) cleanupBtns[key].classList.toggle("active", key === mode);
|
|
1912
2024
|
const showRanges = mode === "deferred";
|