dsh-remote-plugin 0.6.17 → 0.6.19
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/apk/dsh-remote.apk +0 -0
- package/gateway-stats.cjs +3 -2
- package/package.json +1 -1
- package/public/admin.html +16 -17
- package/public/admin.js +6 -5
- package/public/app.js +293 -75
- package/public/desktop/desktop.css +52 -7
- package/public/desktop/desktop.html +39 -32
- package/public/desktop/desktop.js +186 -48
- package/public/index.html +89 -48
- package/public/motion.js +105 -17
- package/public/plugin.html +6 -5
- package/public/styles.css +143 -43
- package/public/theme-vars.css +244 -167
- package/public/theme.js +2 -2
- package/public/update.json +12 -12
- package/public/version.json +1 -1
|
@@ -8,6 +8,7 @@ html, body {
|
|
|
8
8
|
.hidden { display: none !important; }
|
|
9
9
|
.ds-app { position: fixed; inset: 0; display: flex; overflow: hidden; }
|
|
10
10
|
.ds-sidebar { width: 280px; flex: none; display: flex; flex-direction: column; border-right: 1px solid var(--dsr-line); background: linear-gradient(180deg, var(--dsr-panel), var(--dsr-bg)); box-shadow: 12px 0 34px var(--dsr-shadow); overflow: hidden; }
|
|
11
|
+
.ds-sidebar-backdrop { display: none; }
|
|
11
12
|
.ds-brand { display: flex; align-items: center; gap: 8px; padding: 17px 18px 12px; font-weight: 750; font-size: 15px; letter-spacing: .1px; }
|
|
12
13
|
.ds-logo { color: var(--dsr-accent-strong); }
|
|
13
14
|
.ds-brand-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
@@ -288,7 +289,30 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
288
289
|
.ds-session-cards:empty { display: none; }
|
|
289
290
|
.ds-card { background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; padding: 10px 12px; }
|
|
290
291
|
.ds-card-title { font-size: 11px; font-weight: 700; color: var(--dsr-muted); letter-spacing: .6px; margin-bottom: 6px; text-transform: uppercase; }
|
|
291
|
-
.ds-goal-
|
|
292
|
+
.ds-goal-disclosure { width: 100%; min-width: 0; display: flex; justify-content: flex-end; }
|
|
293
|
+
.ds-goal-disclosure .ds-goal-card { width: 100%; min-width: 0; }
|
|
294
|
+
.ds-goal-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 6px; }
|
|
295
|
+
.ds-goal-card-head .ds-card-title { min-width: 0; margin-bottom: 0; }
|
|
296
|
+
.ds-goal-collapse-btn,
|
|
297
|
+
.ds-goal-side-tab {
|
|
298
|
+
touch-action: manipulation; border: 1px solid var(--dsr-line); background: var(--dsr-bg-2); color: var(--dsr-muted);
|
|
299
|
+
font: inherit; cursor: pointer;
|
|
300
|
+
}
|
|
301
|
+
.ds-goal-collapse-btn { min-height: 32px; display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border-radius: 8px; font-size: 11.5px; }
|
|
302
|
+
.ds-goal-collapse-btn > span { color: var(--dsr-accent-strong); font-size: 17px; line-height: 1; }
|
|
303
|
+
.ds-goal-side-tab {
|
|
304
|
+
min-height: 42px; max-width: min(100%, 210px); display: inline-flex; align-items: center; gap: 7px; padding: 6px 12px 6px 10px;
|
|
305
|
+
border-right: 0; border-radius: 11px 0 0 11px; box-shadow: -5px 6px 18px var(--dsr-shadow); color: var(--dsr-text); font-size: 12px; font-weight: 700;
|
|
306
|
+
}
|
|
307
|
+
.ds-goal-side-tab > span:first-child { color: var(--dsr-accent-strong); font-size: 19px; line-height: 1; }
|
|
308
|
+
.ds-goal-side-tab small { min-width: 0; color: var(--dsr-muted); font-size: 10.5px; font-weight: 500; white-space: nowrap; }
|
|
309
|
+
.ds-goal-collapse-btn:hover,
|
|
310
|
+
.ds-goal-side-tab:hover { background: var(--dsr-panel-2); color: var(--dsr-text); }
|
|
311
|
+
.ds-goal-collapse-btn:active,
|
|
312
|
+
.ds-goal-side-tab:active { transform: translateY(1px); }
|
|
313
|
+
.ds-goal-collapse-btn:focus-visible,
|
|
314
|
+
.ds-goal-side-tab:focus-visible { outline: 2px solid var(--dsr-accent-strong); outline-offset: 2px; }
|
|
315
|
+
.ds-goal-obj { font-size: 13px; line-height: 1.55; word-break: break-word; overflow-wrap: anywhere; }
|
|
292
316
|
.ds-goal-phase { font-size: 11px; color: var(--dsr-muted); margin-top: 3px; }
|
|
293
317
|
.ds-goal-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
|
|
294
318
|
.ds-mini-btn { display: inline-flex; align-items: center; justify-content: center; min-height: 26px; padding: 2px 9px; border-radius: 7px; background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); color: var(--dsr-text); font: inherit; font-size: 11.5px; cursor: pointer; }
|
|
@@ -350,6 +374,10 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
350
374
|
.ds-settings { max-width: 720px; display: flex; flex-direction: column; gap: 10px; }
|
|
351
375
|
.ds-setting-row { display: flex; align-items: center; gap: 10px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; padding: 10px 14px; }
|
|
352
376
|
.ds-setting-row > div:first-child { flex: 1; min-width: 0; }
|
|
377
|
+
.ds-setting-link { width: 100%; color: var(--dsr-text); font: inherit; text-align: left; cursor: pointer; transition: background-color .18s ease, border-color .18s ease; }
|
|
378
|
+
.ds-setting-link:hover, .ds-setting-link:focus-visible { background: var(--dsr-bg-2); border-color: var(--dsr-accent-line); }
|
|
379
|
+
.ds-setting-link .ds-setting-arrow { transition: transform .18s ease, color .18s ease; }
|
|
380
|
+
.ds-setting-link:hover .ds-setting-arrow, .ds-setting-link:focus-visible .ds-setting-arrow { color: var(--dsr-accent-strong); transform: translateX(2px); }
|
|
353
381
|
.ds-setting-arrow,
|
|
354
382
|
#settings-home .ds-setting-row .ds-btn {
|
|
355
383
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -387,6 +415,7 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
387
415
|
.ds-server-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
|
388
416
|
.ds-server-note { font-size: 13px; word-break: break-all; }
|
|
389
417
|
.ds-server-url { font-size: 11.5px; color: var(--dsr-muted); word-break: break-all; }
|
|
418
|
+
.ds-server-token-badge { color: var(--dsr-muted); font-size: 10px; }
|
|
390
419
|
.ds-server-badge { flex-shrink: 0; font-size: 11px; padding: 1px 7px; border-radius: 999px; background: var(--dsr-accent-soft); color: var(--dsr-accent-strong); border: 1px solid var(--dsr-accent-line); white-space: nowrap; }
|
|
391
420
|
.ds-server-badge.good { background: var(--dsr-success-soft); color: var(--dsr-success); border-color: var(--dsr-success-line); }
|
|
392
421
|
.ds-server-badge.bad { background: var(--dsr-warning-soft); color: var(--dsr-warning); border-color: var(--dsr-warning-line); }
|
|
@@ -396,8 +425,8 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
396
425
|
.ds-mini:hover { color: var(--dsr-text); }
|
|
397
426
|
.ds-switch { position: relative; display: inline-block; width: 36px; height: 21px; flex-shrink: 0; }
|
|
398
427
|
.ds-switch input { opacity: 0; width: 0; height: 0; }
|
|
399
|
-
.ds-switch .ds-slider { position: absolute; inset: 0; border-radius: 999px; background: var(--dsr-panel-2); border: 1px solid var(--dsr-line); transition: .2s; }
|
|
400
|
-
.ds-switch .ds-slider::before { content: ''; position: absolute; width: 15px; height: 15px; border-radius: 50%; left: 2px; top: 2px; background: var(--dsr-muted); transition: .2s; }
|
|
428
|
+
.ds-switch .ds-slider { position: absolute; inset: 0; border-radius: 999px; background: var(--dsr-panel-2); border: 1px solid var(--dsr-line); transition: background-color .2s ease, border-color .2s ease; }
|
|
429
|
+
.ds-switch .ds-slider::before { content: ''; position: absolute; width: 15px; height: 15px; border-radius: 50%; left: 2px; top: 2px; background: var(--dsr-muted); transition: transform .2s ease, background-color .2s ease; }
|
|
401
430
|
.ds-switch input:checked + .ds-slider { background: var(--dsr-accent-soft); border-color: var(--dsr-accent); }
|
|
402
431
|
.ds-switch input:checked + .ds-slider::before { transform: translateX(15px); background: var(--dsr-accent); }
|
|
403
432
|
|
|
@@ -414,18 +443,21 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
414
443
|
.ds-stats-legend .sw { width: 9px; height: 9px; border-radius: 2px; display: inline-block; margin-right: 4px; }
|
|
415
444
|
.ds-stats-legend .sw.peak { background: var(--dsr-accent-strong); }
|
|
416
445
|
.ds-stats-legend .sw.off { background: var(--dsr-accent-2); }
|
|
446
|
+
.ds-stats-legend .sw.token { background: var(--dsr-accent); }
|
|
447
|
+
.ds-stats-chart-title { margin-top: 13px; font-size: 11px; font-weight: 650; color: var(--dsr-muted); }
|
|
417
448
|
.ds-stats-chart { display: flex; align-items: flex-end; gap: 8px; height: 200px; padding: 12px 14px 10px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; overflow-x: auto; }
|
|
418
449
|
.ds-stats-bar { flex: 1; min-width: 40px; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 5px; }
|
|
419
450
|
.ds-stats-bar .bars { width: 100%; max-width: 46px; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; border-radius: 6px 6px 0 0; overflow: hidden; background: var(--dsr-accent-soft); }
|
|
420
451
|
.ds-stats-bar .seg { width: 100%; }
|
|
421
452
|
.ds-stats-bar .seg.peak { background: var(--dsr-accent-strong); }
|
|
422
453
|
.ds-stats-bar .seg.off { background: var(--dsr-accent-2); }
|
|
454
|
+
.ds-stats-bar .bars.token { background: var(--dsr-accent); }
|
|
423
455
|
.ds-stats-bar .lbl { font-size: 10px; color: var(--dsr-muted); white-space: nowrap; }
|
|
424
456
|
.ds-stats-bar .val { font-size: 10px; white-space: nowrap; }
|
|
425
457
|
.ds-stats-note { font-size: 11px; color: var(--dsr-muted); line-height: 1.6; margin-top: 8px; }
|
|
426
458
|
|
|
427
459
|
/* 统计抽屉(右侧滑出) */
|
|
428
|
-
.ds-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 110; width: min(540px, 100vw); background: var(--dsr-panel); border-left: 1px solid var(--dsr-line); box-shadow: -12px 0 32px rgba(0,0,0,.35); display: flex; flex-direction: column; }
|
|
460
|
+
.ds-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 110; width: min(540px, 100vw); background: var(--dsr-panel); border-left: 1px solid var(--dsr-line); box-shadow: -12px 0 32px rgba(0,0,0,.35); display: flex; flex-direction: column; overscroll-behavior: contain; }
|
|
429
461
|
.ds-drawer.hidden { display: none; }
|
|
430
462
|
.ds-drawer-head { flex: none; display: flex; align-items: center; justify-content: space-between; padding: 13px 15px; border-bottom: 1px solid var(--dsr-line); font-weight: 700; font-size: 15px; }
|
|
431
463
|
.ds-drawer-body { flex: 1; min-height: 0; overflow-y: auto; padding: 14px 15px; scrollbar-width: thin; scrollbar-color: var(--dsr-line) transparent; }
|
|
@@ -449,7 +481,7 @@ button.ds-overview-attention-item, button.ds-overview-session-item { cursor:poin
|
|
|
449
481
|
/* 模态 */
|
|
450
482
|
.ds-modal { position: fixed; inset: 0; z-index: 120; background: rgba(0,0,0,.5); display: flex; align-items: center; justify-content: center; padding: 16px; }
|
|
451
483
|
.ds-modal.hidden { display: none; }
|
|
452
|
-
.ds-modal-card { width: min(520px, 100%); background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius:
|
|
484
|
+
.ds-modal-card { width: min(520px, 100%); background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 18px; padding: 18px; box-shadow: 0 22px 60px var(--dsr-shadow); overscroll-behavior: contain; }
|
|
453
485
|
.ds-modal-title { font-weight: 700; margin-bottom: 10px; }
|
|
454
486
|
.ds-modal-body { display: flex; flex-direction: column; gap: 10px; max-height: 60vh; overflow-y: auto; }
|
|
455
487
|
.ds-workspace-create-desc { margin: 0; color: var(--dsr-muted); line-height: 1.55; }
|
|
@@ -525,9 +557,22 @@ input:focus-visible, select:focus-visible, textarea:focus-visible {
|
|
|
525
557
|
.ds-btn:hover { filter: brightness(1.08); }
|
|
526
558
|
}
|
|
527
559
|
|
|
528
|
-
/* 窄屏回退:
|
|
560
|
+
/* 窄屏回退: 侧栏变为可关闭抽屉,保留完整导航与会话上下文。 */
|
|
529
561
|
@media (max-width: 1023px) {
|
|
530
|
-
.ds-sidebar {
|
|
562
|
+
.ds-sidebar {
|
|
563
|
+
position: fixed; inset: 0 auto 0 0; z-index: 90; display: flex;
|
|
564
|
+
width: min(320px, 86vw); max-width: 100%;
|
|
565
|
+
opacity: 0; pointer-events: none; transform: translateX(-104%);
|
|
566
|
+
transition: transform .24s ease, opacity .18s ease;
|
|
567
|
+
box-shadow: 18px 0 48px rgba(0,0,0,.38);
|
|
568
|
+
}
|
|
569
|
+
.ds-sidebar.mobile-open { opacity: 1; pointer-events: auto; transform: translateX(0); }
|
|
570
|
+
.ds-sidebar-backdrop {
|
|
571
|
+
position: fixed; inset: 0; z-index: 80; display: block;
|
|
572
|
+
border: 0; background: var(--dsr-overlay); cursor: default;
|
|
573
|
+
}
|
|
574
|
+
.ds-sidebar-backdrop.hidden { display: none; }
|
|
575
|
+
.ds-app.mobile-nav-open { overflow: hidden; }
|
|
531
576
|
#btn-mobile-nav { display: inline-flex; }
|
|
532
577
|
.ds-content { flex-direction: column; }
|
|
533
578
|
.ds-view { padding: 10px; overflow-y: auto; }
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>DSH Remote · 桌面</title>
|
|
7
|
-
<script>/* 首帧前应用皮肤 */ (function(){try{var t=localStorage.getItem('dshTheme');if(t!=='default'&&t!=='dark'&&t!=='light'&&t!=='neutral'){t=window.matchMedia('(prefers-color-scheme: light)').matches?'light':'default'}document.documentElement.setAttribute('data-theme',t)}catch(e){}})()</script>
|
|
7
|
+
<script>/* 首帧前应用皮肤 */ (function(){try{var t=localStorage.getItem('dshTheme');if(t!=='default'&&t!=='dark'&&t!=='light'&&t!=='neutral'&&t!=='mono'){t=window.matchMedia('(prefers-color-scheme: light)').matches?'light':'default'}document.documentElement.setAttribute('data-theme',t)}catch(e){}})()</script>
|
|
8
8
|
<link rel="stylesheet" href="../theme-vars.css">
|
|
9
9
|
<link rel="stylesheet" href="desktop.css">
|
|
10
10
|
</head>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
</div>
|
|
51
51
|
<button class="ds-nav-item" data-view="view-overview"><span class="ds-nav-ico">◌</span><span data-i18n="ds.overview">主页</span></button>
|
|
52
52
|
<button class="ds-nav-item" data-view="view-files"><span class="ds-nav-ico">⇅</span><span data-i18n="ds.files">文件传输</span></button>
|
|
53
|
-
<button class="ds-nav-item" data-view="view-settings"><span class="ds-nav-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><
|
|
53
|
+
<button class="ds-nav-item" data-view="view-settings"><span class="ds-nav-ico"><svg class="settings-gear" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.09a2 2 0 0 1 1 1.73v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.09a2 2 0 0 1-1-1.74v-.51a2 2 0 0 1 1-1.73l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2Z"/><circle cx="12" cy="12" r="3"/></svg></span><span data-i18n="ds.settings">设置</span></button>
|
|
54
54
|
<div class="ds-feedback">
|
|
55
55
|
<button id="btn-feedback" class="ds-feedback-btn" aria-haspopup="menu" aria-expanded="false" data-i18n-title="ds.feedback" data-i18n-aria="ds.feedback">
|
|
56
56
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12a8 8 0 0 1-8 8H5l-1.5 2L4 20a8 8 0 0 1-1-4 8 8 0 0 1 18-4Z"/></svg>
|
|
@@ -81,10 +81,11 @@
|
|
|
81
81
|
</div>
|
|
82
82
|
</div>
|
|
83
83
|
</aside>
|
|
84
|
+
<button id="ds-sidebar-backdrop" class="ds-sidebar-backdrop hidden" type="button" data-i18n-aria="ds.close" aria-label="关闭菜单"></button>
|
|
84
85
|
|
|
85
86
|
<div class="ds-main">
|
|
86
87
|
<header class="ds-topbar">
|
|
87
|
-
<button id="btn-mobile-nav" class="ds-icon-btn" data-i18n-aria="ds.menu" data-i18n-title="ds.menu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16"/></svg></button>
|
|
88
|
+
<button id="btn-mobile-nav" class="ds-icon-btn" aria-controls="ds-sidebar" aria-expanded="false" data-i18n-aria="ds.menu" data-i18n-title="ds.menu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16"/></svg></button>
|
|
88
89
|
<div class="ds-title" id="ds-title" data-i18n="ds.sessions">会话</div>
|
|
89
90
|
<span id="ds-session-status" class="ds-session-status hidden"></span>
|
|
90
91
|
<button id="btn-rename-session" class="ds-icon-btn hidden" data-i18n-title="ds.sessionRename" data-i18n-aria="ds.sessionRename">✎</button>
|
|
@@ -202,22 +203,22 @@
|
|
|
202
203
|
<div class="ds-section-label" data-i18n="ds.settings">设置</div>
|
|
203
204
|
<div id="settings-home">
|
|
204
205
|
<div class="ds-settings">
|
|
205
|
-
<
|
|
206
|
+
<button type="button" class="ds-setting-row ds-setting-link" data-settings-group="general">
|
|
206
207
|
<div><div class="ds-setting-name" data-i18n="ds.groupGeneral">通用</div><div class="ds-setting-desc" data-i18n="ds.groupGeneralDesc">工具调用、预设提示词</div></div>
|
|
207
208
|
<span class="ds-setting-arrow" aria-hidden="true">›</span>
|
|
208
|
-
</
|
|
209
|
-
<
|
|
209
|
+
</button>
|
|
210
|
+
<button type="button" class="ds-setting-row ds-setting-link" data-settings-group="servers">
|
|
210
211
|
<div><div class="ds-setting-name" data-i18n="ds.groupServers">服务器</div><div class="ds-setting-desc" data-i18n="ds.groupServersDesc">服务器地址</div></div>
|
|
211
212
|
<span class="ds-setting-arrow" aria-hidden="true">›</span>
|
|
212
|
-
</
|
|
213
|
-
<
|
|
213
|
+
</button>
|
|
214
|
+
<button type="button" class="ds-setting-row ds-setting-link" data-settings-group="theme">
|
|
214
215
|
<div><div class="ds-setting-name" data-i18n="ds.groupTheme">皮肤</div><div class="ds-setting-desc" data-i18n="ds.groupThemeDesc">配色主题</div></div>
|
|
215
216
|
<span class="ds-setting-arrow" aria-hidden="true">›</span>
|
|
216
|
-
</
|
|
217
|
-
<
|
|
217
|
+
</button>
|
|
218
|
+
<button type="button" class="ds-setting-row ds-setting-link" data-settings-group="about">
|
|
218
219
|
<div><div class="ds-setting-name" data-i18n="ds.groupAbout">关于</div><div class="ds-setting-desc" data-i18n="ds.groupAboutDesc">版本信息</div></div>
|
|
219
220
|
<span class="ds-setting-arrow" aria-hidden="true">›</span>
|
|
220
|
-
</
|
|
221
|
+
</button>
|
|
221
222
|
</div>
|
|
222
223
|
<div class="ds-settings">
|
|
223
224
|
<div class="ds-setting-row">
|
|
@@ -231,7 +232,7 @@
|
|
|
231
232
|
</div>
|
|
232
233
|
</div>
|
|
233
234
|
|
|
234
|
-
<div id="settings-page-general" class="ds-settings hidden">
|
|
235
|
+
<div id="settings-page-general" class="ds-settings hidden" data-motion-panel>
|
|
235
236
|
<div class="ds-setting-row" data-settings-back style="cursor:pointer">
|
|
236
237
|
<button class="ds-btn" data-i18n="ds.back">‹ 返回</button>
|
|
237
238
|
<div class="ds-setting-name" data-i18n="ds.groupGeneral">通用</div>
|
|
@@ -242,7 +243,7 @@
|
|
|
242
243
|
</div>
|
|
243
244
|
</div>
|
|
244
245
|
|
|
245
|
-
<div id="settings-page-servers" class="ds-settings hidden">
|
|
246
|
+
<div id="settings-page-servers" class="ds-settings hidden" data-motion-panel>
|
|
246
247
|
<div class="ds-setting-row" data-settings-back style="cursor:pointer">
|
|
247
248
|
<button class="ds-btn" data-i18n="ds.back">‹ 返回</button>
|
|
248
249
|
<div class="ds-setting-name" data-i18n="ds.groupServers">服务器</div>
|
|
@@ -266,18 +267,18 @@
|
|
|
266
267
|
</div>
|
|
267
268
|
</div>
|
|
268
269
|
|
|
269
|
-
<div id="settings-page-theme" class="ds-settings hidden">
|
|
270
|
+
<div id="settings-page-theme" class="ds-settings hidden" data-motion-panel>
|
|
270
271
|
<div class="ds-setting-row" data-settings-back style="cursor:pointer">
|
|
271
272
|
<button class="ds-btn" data-i18n="ds.back">‹ 返回</button>
|
|
272
273
|
<div class="ds-setting-name" data-i18n="ds.groupTheme">皮肤</div>
|
|
273
274
|
</div>
|
|
274
275
|
<div class="ds-setting-row">
|
|
275
|
-
<div><div class="ds-setting-name" data-i18n="ds.themeTitle">皮肤</div><div class="ds-setting-desc" data-i18n="ds.themeDesc"
|
|
276
|
+
<div><div class="ds-setting-name" data-i18n="ds.themeTitle">皮肤</div><div class="ds-setting-desc" data-i18n="ds.themeDesc">五套皮肤</div></div>
|
|
276
277
|
<button id="btn-theme" class="ds-btn">默认深空</button>
|
|
277
278
|
</div>
|
|
278
279
|
</div>
|
|
279
280
|
|
|
280
|
-
<div id="settings-page-about" class="ds-settings hidden">
|
|
281
|
+
<div id="settings-page-about" class="ds-settings hidden" data-motion-panel>
|
|
281
282
|
<div class="ds-setting-row" data-settings-back style="cursor:pointer">
|
|
282
283
|
<button class="ds-btn" data-i18n="ds.back">‹ 返回</button>
|
|
283
284
|
<div class="ds-setting-name" data-i18n="ds.groupAbout">关于</div>
|
|
@@ -303,8 +304,12 @@
|
|
|
303
304
|
</div>
|
|
304
305
|
<div class="ds-drawer-body">
|
|
305
306
|
<div class="ds-stat-grid" id="stats-cards"></div>
|
|
307
|
+
<div class="ds-stats-chart-title" data-i18n="ds.statsCostTrend">费用趋势</div>
|
|
306
308
|
<div id="stats-legend" class="ds-stats-legend"></div>
|
|
307
309
|
<div id="stats-chart" class="ds-stats-chart"></div>
|
|
310
|
+
<div class="ds-stats-chart-title" data-i18n="ds.statsTokenTrend">Token 量趋势</div>
|
|
311
|
+
<div id="stats-token-legend" class="ds-stats-legend"></div>
|
|
312
|
+
<div id="stats-token-chart" class="ds-stats-chart"></div>
|
|
308
313
|
<div id="stats-note" class="ds-stats-note"></div>
|
|
309
314
|
</div>
|
|
310
315
|
</div>
|
|
@@ -462,7 +467,7 @@
|
|
|
462
467
|
'ds.fsUp': '上级', 'ds.fsRoot': '允许根目录', 'ds.fsNewWorkspace': '新建工作区', 'ds.fsRefresh': '刷新', 'ds.fsEmpty': '目录为空',
|
|
463
468
|
'ds.workspaceCreateTitle': '新建工作区', 'ds.workspaceCreateDesc': '将在当前文件目录下创建文件夹,并自动打开新会话。', 'ds.workspaceParent': '父目录', 'ds.workspaceNamePlaceholder': '例如:my-project', 'ds.workspaceCreate': '创建并打开', 'ds.cancel': '取消', 'ds.workspaceNameRequired': '请输入工作区名称', 'ds.workspaceExists': '该目录已存在', 'ds.workspaceInvalidName': '名称不能包含路径分隔符', 'ds.workspaceCreateFailed': '创建工作区失败', 'ds.workspaceCreated': '工作区已创建', 'ds.workspaceCreatedNoSession': '工作区已创建,但新会话未能打开',
|
|
464
469
|
'ds.groupGeneral': '通用', 'ds.groupGeneralDesc': '工具调用、预设提示词',
|
|
465
|
-
'ds.groupServers': '服务器', 'ds.groupServersDesc': '
|
|
470
|
+
'ds.groupServers': '服务器', 'ds.groupServersDesc': '服务器地址与令牌',
|
|
466
471
|
'ds.groupNotify': '通知', 'ds.groupNotifyDesc': '通知与提醒',
|
|
467
472
|
'ds.groupTheme': '皮肤', 'ds.groupThemeDesc': '配色主题',
|
|
468
473
|
'ds.groupAbout': '关于', 'ds.groupAboutDesc': '版本信息',
|
|
@@ -471,7 +476,7 @@
|
|
|
471
476
|
'ds.back': '‹ 返回', 'ds.emptyGroup': '暂无设置项',
|
|
472
477
|
'ds.serversTitle': '服务器(分组)', 'ds.speedTest': '测速', 'ds.currentGroup': '当前组',
|
|
473
478
|
'ds.addGroup': '+ 组', 'ds.addServer': '添加', 'ds.tokenTitle': '访问令牌', 'ds.copyToken': '复制',
|
|
474
|
-
'ds.themeTitle': '皮肤', 'ds.themeDesc': '默认深空 / 落日 / 易北爱乐厅 / 草原孤塔', 'ds.langTitle': '语言 / Language',
|
|
479
|
+
'ds.themeTitle': '皮肤', 'ds.themeDesc': '默认深空 / 落日 / 易北爱乐厅 / 草原孤塔 / 黑曜白', 'ds.langTitle': '语言 / Language',
|
|
475
480
|
'ds.feedbackTitle': '反馈渠道', 'ds.feedbackDesc': 'GitHub / Gitee / B站:反馈 bug、提建议、唠嗑',
|
|
476
481
|
'ds.feedback': '反馈', 'ds.feedbackGithubDesc': '反馈 bug / 提建议', 'ds.feedbackGiteeDesc': '国内镜像,无需代理',
|
|
477
482
|
'ds.feedbackBiliDesc': 'UP 动态页交流', 'ds.feedbackCopyLink': '复制项目链接', 'ds.feedbackCopyDesc': '手动分享给朋友',
|
|
@@ -498,18 +503,18 @@
|
|
|
498
503
|
'ds.approvalBody': '{tool} · {server}', 'ds.approvalReason': '原因:{reason}',
|
|
499
504
|
'ds.allowed': '已允许', 'ds.rejected': '已拒绝', 'ds.ignored': '已忽略',
|
|
500
505
|
'ds.stale': '请求已失效', 'ds.pendingSubmitFailed': '提交失败:{msg}',
|
|
501
|
-
'ds.statsTodayTokens': '今日 Token', 'ds.statsTodayCost': '今日费用', 'ds.statsPeakShare': '高峰占比',
|
|
506
|
+
'ds.statsTodayTokens': '今日 Token', 'ds.statsTodayCost': '今日费用', 'ds.statsPeakShare': '高峰占比', 'ds.statsCostTrend': '费用趋势', 'ds.statsTokenTrend': 'Token 量趋势', 'ds.statsTokenTotal': 'Token 总量',
|
|
502
507
|
'ds.statsInput': '未缓存输入', 'ds.statsCacheRead': '缓存命中', 'ds.statsCacheWrite': '缓存写入', 'ds.statsOutput': '输出',
|
|
503
508
|
'ds.statsPeak': '高峰', 'ds.statsOff': '空闲', 'ds.statsDays': '近 {n} 天',
|
|
504
509
|
'ds.statsGatewayDown': '统计需要网关运行', 'ds.statsEmpty': '暂无统计',
|
|
505
|
-
'ds.statsNote': '
|
|
506
|
-
'ds.serversEmpty': '未添加备用服务器', 'ds.serversUntested': '未测速', 'ds.serversCurrent': ' · 当前',
|
|
510
|
+
'ds.statsNote': '注:Token 量按 DSH usage 事件记录,第三方 provider 需提供 usage 才能计入;费用仅对已知 DeepSeek 模型估算,与官网账单可能有出入,一切以官网为准。统计自 2026-08-17 定价生效日起。',
|
|
511
|
+
'ds.serversEmpty': '未添加备用服务器', 'ds.serversUntested': '未测速', 'ds.serversCurrent': ' · 当前', 'ds.serversTokenSet': '令牌已配置', 'ds.serversTokenMissing': '未配置令牌',
|
|
507
512
|
'ds.serversUnreachable': '不可达', 'ds.serversDelete': '删除', 'ds.serversEdit': '编辑',
|
|
508
513
|
'ds.serversNeedAddress': '请输入服务器地址', 'ds.serversBadProtocol': '地址需以 http:// 或 https:// 开头',
|
|
509
|
-
'ds.serversDuplicate': '
|
|
514
|
+
'ds.serversDuplicate': '相同地址和令牌已存在', 'ds.serversAdded': '已添加', 'ds.serversEdited': '已更新',
|
|
510
515
|
'ds.serversRemovedActive': '已删除当前服务器,重新测速…',
|
|
511
516
|
'ds.serversCurrentDesc': '当前:{group} · {url}({ms})',
|
|
512
|
-
'ds.serversPromptNote': '服务器备注(可留空):', 'ds.serversPromptEditUrl': '编辑服务器地址:',
|
|
517
|
+
'ds.serversPromptNote': '服务器备注(可留空):', 'ds.serversPromptEditUrl': '编辑服务器地址:', 'ds.serversPromptEditToken': '编辑服务器令牌(留空保持不变):',
|
|
513
518
|
'ds.serversPromptEditNote': '编辑备注({url}):', 'ds.serversPromptEditGroup': '所属组:',
|
|
514
519
|
'ds.serversManualSelected': '已切换至:{url}',
|
|
515
520
|
'ds.speedTesting': '正在测速…', 'ds.speedSwitched': '已切换到:{url}({ms}ms)',
|
|
@@ -522,7 +527,7 @@
|
|
|
522
527
|
'ds.groupsPromptRename': '重命名组「{group}」:', 'ds.groupsRenamed': '组已重命名',
|
|
523
528
|
'ds.groupsCannotDeleteDefault': '默认组不可删除',
|
|
524
529
|
'ds.groupsConfirmDelete': '删除组「{group}」?组内服务器将归入默认组。', 'ds.groupsDeleted': '组已删除',
|
|
525
|
-
'ds.theme.default': '默认深空', 'ds.theme.dark': '落日', 'ds.theme.light': '易北爱乐厅', 'ds.theme.neutral': '草原孤塔',
|
|
530
|
+
'ds.theme.default': '默认深空', 'ds.theme.dark': '落日', 'ds.theme.light': '易北爱乐厅', 'ds.theme.neutral': '草原孤塔', 'ds.theme.mono': '黑曜白',
|
|
526
531
|
'ds.role.me': '我', 'ds.role.dsh': 'DSH', 'ds.toolDefault': '工具',
|
|
527
532
|
'ds.eventSystemReminder': '系统提示',
|
|
528
533
|
'ds.questionOptions': '选项', 'ds.questionCustom': '自定义回答',
|
|
@@ -536,6 +541,7 @@
|
|
|
536
541
|
'presets.nameEmpty': '名称不能为空', 'presets.nameTooLong': '名称不能超过 20 字', 'presets.textTooLong': '内容不能超过 2000 字', 'presets.limit': '最多 20 条预设', 'presets.added': '预设已添加',
|
|
537
542
|
'presets.confirmDelete': '删除预设「{name}」?', 'presets.saved': '预设已保存', 'presets.deleted': '预设已删除',
|
|
538
543
|
'goal.title': '目标', 'goal.pause': '暂停', 'goal.resume': '继续', 'goal.complete': '完成', 'goal.edit': '改目标', 'goal.clear': '清除',
|
|
544
|
+
'goal.collapse': '收起目标到侧边', 'goal.collapseShort': '收起', 'goal.expand': '展开目标', 'goal.collapsedHint': '仍在运行',
|
|
539
545
|
'goal.none': '当前会话没有目标', 'goal.confirmClear': '清除当前目标?(不会删除会话)', 'goal.confirmComplete': '将目标标记为完成?',
|
|
540
546
|
'goal.actionFailed': '目标操作失败', 'goal.actionSubmitted': '目标操作已提交',
|
|
541
547
|
'goal.cannotEmpty': '目标不能为空', 'goal.updateFailed': '更新失败', 'goal.updated': '目标已更新', 'goal.editPrompt': '修改目标:',
|
|
@@ -564,7 +570,7 @@
|
|
|
564
570
|
'ds.fsUp': 'Up', 'ds.fsRoot': 'Allowed root', 'ds.fsNewWorkspace': 'New workspace', 'ds.fsRefresh': 'Refresh', 'ds.fsEmpty': 'Empty directory',
|
|
565
571
|
'ds.workspaceCreateTitle': 'New workspace', 'ds.workspaceCreateDesc': 'Create a folder in the current file directory and open a new session there.', 'ds.workspaceParent': 'Parent folder', 'ds.workspaceNamePlaceholder': 'For example: my-project', 'ds.workspaceCreate': 'Create & open', 'ds.cancel': 'Cancel', 'ds.workspaceNameRequired': 'Enter a workspace name', 'ds.workspaceExists': 'That folder already exists', 'ds.workspaceInvalidName': 'The name cannot contain path separators', 'ds.workspaceCreateFailed': 'Could not create workspace', 'ds.workspaceCreated': 'Workspace created', 'ds.workspaceCreatedNoSession': 'Workspace created, but the new session could not be opened',
|
|
566
572
|
'ds.groupGeneral': 'General', 'ds.groupGeneralDesc': 'Tool calls, prompt presets',
|
|
567
|
-
'ds.groupServers': 'Servers', 'ds.groupServersDesc': 'Server address',
|
|
573
|
+
'ds.groupServers': 'Servers', 'ds.groupServersDesc': 'Server address and token',
|
|
568
574
|
'ds.groupNotify': 'Notifications', 'ds.groupNotifyDesc': 'Notifications & reminders',
|
|
569
575
|
'ds.groupTheme': 'Theme', 'ds.groupThemeDesc': 'Color themes',
|
|
570
576
|
'ds.groupAbout': 'About', 'ds.groupAboutDesc': 'Version info',
|
|
@@ -573,7 +579,7 @@
|
|
|
573
579
|
'ds.back': '‹ Back', 'ds.emptyGroup': 'No settings here',
|
|
574
580
|
'ds.serversTitle': 'Servers (groups)', 'ds.speedTest': 'Test', 'ds.currentGroup': 'Current group',
|
|
575
581
|
'ds.addGroup': '+ Group', 'ds.addServer': 'Add', 'ds.tokenTitle': 'Access token', 'ds.copyToken': 'Copy',
|
|
576
|
-
'ds.themeTitle': 'Theme', 'ds.themeDesc': 'Deep Space / Sunset / Elbphilharmonie / Prairie Tower', 'ds.langTitle': 'Language',
|
|
582
|
+
'ds.themeTitle': 'Theme', 'ds.themeDesc': 'Deep Space / Sunset / Elbphilharmonie / Prairie Tower / Monochrome', 'ds.langTitle': 'Language',
|
|
577
583
|
'ds.feedbackTitle': 'Feedback', 'ds.feedbackDesc': 'GitHub / Gitee / Bilibili: report bugs, suggest features, or just chat',
|
|
578
584
|
'ds.feedback': 'Feedback', 'ds.feedbackGithubDesc': 'Report bugs · suggest features', 'ds.feedbackGiteeDesc': 'Mirror in China, no proxy needed',
|
|
579
585
|
'ds.feedbackBiliDesc': 'Chat on the UP\'s Bilibili page', 'ds.feedbackCopyLink': 'Copy project link', 'ds.feedbackCopyDesc': 'Share it manually',
|
|
@@ -600,18 +606,18 @@
|
|
|
600
606
|
'ds.approvalBody': '{tool} · {server}', 'ds.approvalReason': 'Reason: {reason}',
|
|
601
607
|
'ds.allowed': 'Allowed', 'ds.rejected': 'Rejected', 'ds.ignored': 'Ignored',
|
|
602
608
|
'ds.stale': 'Request is stale', 'ds.pendingSubmitFailed': 'Submit failed: {msg}',
|
|
603
|
-
'ds.statsTodayTokens': 'Tokens today', 'ds.statsTodayCost': 'Cost today', 'ds.statsPeakShare': 'Peak share',
|
|
609
|
+
'ds.statsTodayTokens': 'Tokens today', 'ds.statsTodayCost': 'Cost today', 'ds.statsPeakShare': 'Peak share', 'ds.statsCostTrend': 'Cost trend', 'ds.statsTokenTrend': 'Token volume trend', 'ds.statsTokenTotal': 'Total tokens',
|
|
604
610
|
'ds.statsInput': 'Uncached input', 'ds.statsCacheRead': 'Cache read', 'ds.statsCacheWrite': 'Cache write', 'ds.statsOutput': 'Output',
|
|
605
611
|
'ds.statsPeak': 'Peak', 'ds.statsOff': 'Off-peak', 'ds.statsDays': 'Last {n} days',
|
|
606
612
|
'ds.statsGatewayDown': 'Stats require the gateway', 'ds.statsEmpty': 'No stats yet',
|
|
607
|
-
'ds.statsNote': 'Note:
|
|
608
|
-
'ds.serversEmpty': 'No backup servers', 'ds.serversUntested': 'Untested', 'ds.serversCurrent': ' · current',
|
|
613
|
+
'ds.statsNote': 'Note: token volume uses DSH usage events; a third-party provider must expose usage to be counted. Costs are estimates for known DeepSeek models and may differ from the official bill; always defer to deepseek.com. Stats start from the 2026-08-17 pricing date.',
|
|
614
|
+
'ds.serversEmpty': 'No backup servers', 'ds.serversUntested': 'Untested', 'ds.serversCurrent': ' · current', 'ds.serversTokenSet': 'Token set', 'ds.serversTokenMissing': 'No token',
|
|
609
615
|
'ds.serversUnreachable': 'Unreachable', 'ds.serversDelete': 'Delete', 'ds.serversEdit': 'Edit',
|
|
610
616
|
'ds.serversNeedAddress': 'Enter a server address', 'ds.serversBadProtocol': 'Address must start with http:// or https://',
|
|
611
|
-
'ds.serversDuplicate': '
|
|
617
|
+
'ds.serversDuplicate': 'The same address and token already exist', 'ds.serversAdded': 'Added', 'ds.serversEdited': 'Updated',
|
|
612
618
|
'ds.serversRemovedActive': 'Removed active server, re-testing…',
|
|
613
619
|
'ds.serversCurrentDesc': 'Current: {group} · {url} ({ms})',
|
|
614
|
-
'ds.serversPromptNote': 'Server note (optional):', 'ds.serversPromptEditUrl': 'Edit server URL:',
|
|
620
|
+
'ds.serversPromptNote': 'Server note (optional):', 'ds.serversPromptEditUrl': 'Edit server URL:', 'ds.serversPromptEditToken': 'Edit server token (blank keeps the current token):',
|
|
615
621
|
'ds.serversPromptEditNote': 'Edit note ({url}):', 'ds.serversPromptEditGroup': 'Group:',
|
|
616
622
|
'ds.serversManualSelected': 'Switched to: {url}',
|
|
617
623
|
'ds.speedTesting': 'Testing servers…', 'ds.speedSwitched': 'Switched to: {url} ({ms}ms)',
|
|
@@ -624,7 +630,7 @@
|
|
|
624
630
|
'ds.groupsPromptRename': 'Rename group "{group}":', 'ds.groupsRenamed': 'Group renamed',
|
|
625
631
|
'ds.groupsCannotDeleteDefault': 'The default group cannot be deleted',
|
|
626
632
|
'ds.groupsConfirmDelete': 'Delete group "{group}"? Its servers move to the default group.', 'ds.groupsDeleted': 'Group deleted',
|
|
627
|
-
'ds.theme.default': 'Deep Space', 'ds.theme.dark': 'Sunset', 'ds.theme.light': 'Elbphilharmonie', 'ds.theme.neutral': 'Prairie Tower',
|
|
633
|
+
'ds.theme.default': 'Deep Space', 'ds.theme.dark': 'Sunset', 'ds.theme.light': 'Elbphilharmonie', 'ds.theme.neutral': 'Prairie Tower', 'ds.theme.mono': 'Monochrome',
|
|
628
634
|
'ds.role.me': 'Me', 'ds.role.dsh': 'DSH', 'ds.toolDefault': 'tool',
|
|
629
635
|
'ds.eventSystemReminder': 'System reminder',
|
|
630
636
|
'ds.questionOptions': 'Options', 'ds.questionCustom': 'Custom answer',
|
|
@@ -638,6 +644,7 @@
|
|
|
638
644
|
'presets.nameEmpty': 'Name cannot be empty', 'presets.nameTooLong': 'Name must be ≤20 characters', 'presets.textTooLong': 'Content must be ≤2000 characters', 'presets.limit': 'At most 20 presets', 'presets.added': 'Preset added',
|
|
639
645
|
'presets.confirmDelete': 'Delete preset "{name}"?', 'presets.saved': 'Preset saved', 'presets.deleted': 'Preset deleted',
|
|
640
646
|
'goal.title': 'Goal', 'goal.pause': 'Pause', 'goal.resume': 'Resume', 'goal.complete': 'Complete', 'goal.edit': 'Edit goal', 'goal.clear': 'Clear',
|
|
647
|
+
'goal.collapse': 'Collapse goal to the side', 'goal.collapseShort': 'Collapse', 'goal.expand': 'Expand goal', 'goal.collapsedHint': 'Still running',
|
|
641
648
|
'goal.none': 'This session has no goal', 'goal.confirmClear': 'Clear the current goal? (the session stays)', 'goal.confirmComplete': 'Mark the goal as completed?',
|
|
642
649
|
'goal.actionFailed': 'Goal action failed', 'goal.actionSubmitted': 'Goal action submitted',
|
|
643
650
|
'goal.cannotEmpty': 'Goal cannot be empty', 'goal.updateFailed': 'Update failed', 'goal.updated': 'Goal updated', 'goal.editPrompt': 'Edit goal:',
|