dsh-remote-plugin 0.6.17 → 0.6.18

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/public/styles.css CHANGED
@@ -166,30 +166,97 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
166
166
  .workspace-path-block { display: grid; gap: 6px; margin-top: 2px; color: var(--dsr-muted); font-size: 12px; }
167
167
 
168
168
  /* ---------- Token 统计(移动端) ---------- */
169
- .stats-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
170
- .scard { background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: var(--dsr-radius); padding: 10px 11px; min-width: 0; }
171
- .scard.span2 { grid-column: span 2; }
172
- .scard .v { font-size: 17px; font-weight: 700; line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
173
- .scard .k { font-size: 10px; color: var(--dsr-muted); margin-top: 2px; line-height: 1.4; }
174
- .bucket-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 3px 10px; margin-top: 6px; }
175
- .bucket-grid .b { display: flex; align-items: baseline; justify-content: space-between; gap: 6px; font-size: 10.5px; min-width: 0; }
176
- .bucket-grid .b .n { color: var(--dsr-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
177
- .bucket-grid .b .t { font-weight: 600; white-space: nowrap; }
178
- .stats-chart { display: flex; align-items: flex-end; gap: 7px; height: 190px; padding: 12px 12px 10px; margin-top: 10px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: var(--dsr-radius); overflow-x: auto; overflow-y: hidden; }
179
- .stats-legend { display: flex; gap: 12px; font-size: 10px; color: var(--dsr-muted); margin-top: 6px; }
180
- .stats-legend .lg { display: inline-flex; align-items: center; gap: 4px; }
181
- .stats-legend .sw { width: 8px; height: 8px; border-radius: 2px; display: inline-block; }
169
+ .stats-view { padding-bottom: 16px; }
170
+ .stats-page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin: 4px 2px 17px; }
171
+ .stats-page-copy { min-width: 0; }
172
+ .stats-eyebrow, .stats-panel-kicker { color: var(--dsr-accent-strong); font-size: 10px; font-weight: 800; letter-spacing: .14em; line-height: 1.2; }
173
+ .stats-page-head h1 { margin: 4px 0 4px; font-size: 26px; line-height: 1.15; letter-spacing: -.04em; text-wrap: balance; }
174
+ .stats-page-subtitle { margin: 0; color: var(--dsr-muted); font-size: 12px; line-height: 1.5; }
175
+ .stats-date-wrap { display: grid; gap: 2px; flex: 0 0 auto; justify-items: end; padding: 7px 10px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; }
176
+ .stats-date-label { color: var(--dsr-muted); font-size: 10px; white-space: nowrap; }
177
+ .stats-date { color: var(--dsr-text); font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
178
+ .stats-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 0 2px 12px; }
179
+ .stats-toolbar-label { color: var(--dsr-muted); font-size: 11px; font-weight: 650; }
180
+ .stats-mode-picker { display: inline-grid; grid-template-columns: 1fr 1fr; gap: 3px; padding: 3px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 11px; }
181
+ .stats-mode-btn { min-height: 30px; padding: 5px 10px; border: 1px solid transparent; border-radius: 8px; color: var(--dsr-muted); font-size: 11px; font-weight: 650; white-space: nowrap; }
182
+ .stats-mode-btn.active { color: var(--dsr-text); background: var(--dsr-accent-soft); border-color: var(--dsr-accent-line); box-shadow: 0 2px 8px var(--dsr-shadow); }
183
+ .stats-mode-btn:active { background: var(--dsr-panel-2); }
184
+ .stats-mode-btn:focus-visible { position: relative; z-index: 1; }
185
+ .stats-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
186
+ .scard { position: relative; min-width: 0; overflow: hidden; padding: 14px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 18px; box-shadow: 0 8px 24px var(--dsr-shadow); }
187
+ .scard::before { content: ''; position: absolute; inset: 0 0 auto; height: 2px; background: var(--dsr-line); }
188
+ .scard-primary { grid-column: 1 / -1; background: linear-gradient(140deg, var(--dsr-panel), var(--dsr-accent-soft)); }
189
+ .scard-primary::before { background: linear-gradient(90deg, var(--dsr-accent), var(--dsr-accent-2)); }
190
+ .scard-cost::before { background: var(--dsr-accent-2); }
191
+ .scard-share::before { background: var(--dsr-info); }
192
+ .scard-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-width: 0; }
193
+ .scard-label { display: inline-flex; align-items: center; gap: 7px; min-width: 0; color: var(--dsr-muted); font-size: 11px; font-weight: 700; }
194
+ .scard-label > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
195
+ .scard-icon { display: grid; place-items: center; width: 22px; height: 22px; flex: 0 0 auto; border-radius: 7px; color: var(--dsr-accent-strong); background: var(--dsr-accent-soft); font-size: 14px; font-weight: 800; }
196
+ .scard-icon.cost { color: var(--dsr-accent-2); background: var(--dsr-accent-2-soft); font-size: 12px; }
197
+ .scard-icon.share { color: var(--dsr-info); background: var(--dsr-info-soft); font-size: 12px; }
198
+ .scard-badge { max-width: 48%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsr-muted); font-size: 10px; font-variant-numeric: tabular-nums; }
199
+ .scard-value { margin-top: 11px; color: var(--dsr-text); font-size: 26px; font-weight: 800; line-height: 1.05; letter-spacing: -.035em; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
200
+ .scard-primary .scard-value { font-size: clamp(32px, 9vw, 42px); }
201
+ .scard-unit { margin-left: 6px; color: var(--dsr-muted); font-size: 11px; font-weight: 600; letter-spacing: 0; }
202
+ .scard-helper { margin-top: 7px; color: var(--dsr-muted); font-size: 10px; line-height: 1.4; }
203
+ .bucket-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-top: 14px; padding-top: 11px; border-top: 1px solid var(--dsr-line); }
204
+ .bucket-grid .b { display: grid; grid-template-columns: auto minmax(0, 1fr); grid-template-rows: auto auto; gap: 2px 5px; min-width: 0; }
205
+ .bucket-dot { width: 6px; height: 6px; margin-top: 3px; border-radius: 50%; background: var(--dsr-accent); }
206
+ .bucket-dot.input { background: var(--dsr-accent-strong); }
207
+ .bucket-dot.cache-read { background: var(--dsr-info); }
208
+ .bucket-dot.cache-write { background: var(--dsr-accent-2); }
209
+ .bucket-dot.output { background: var(--dsr-warning); }
210
+ .bucket-grid .n { min-width: 0; overflow: hidden; color: var(--dsr-muted); font-size: 10px; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; }
211
+ .bucket-grid .t { grid-column: 2; min-width: 0; overflow: hidden; color: var(--dsr-text); font-size: 12px; line-height: 1.2; font-weight: 700; font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; }
212
+ .stats-split { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-top: 14px; }
213
+ .stats-split-item { display: grid; gap: 5px; min-width: 0; padding: 8px; background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); border-radius: 10px; }
214
+ .stats-split-item span { display: flex; align-items: center; gap: 5px; min-width: 0; color: var(--dsr-muted); font-size: 10px; white-space: nowrap; }
215
+ .stats-split-item strong { overflow: hidden; color: var(--dsr-text); font-size: 12px; font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; }
216
+ .split-dot { width: 6px; height: 6px; flex: 0 0 auto; border-radius: 50%; background: var(--dsr-accent-strong); }
217
+ .split-dot.off { background: var(--dsr-accent-2); }
218
+ .share-layout { display: flex; align-items: center; gap: 10px; margin-top: 13px; }
219
+ .share-ring { position: relative; display: grid; place-items: center; width: 68px; height: 68px; flex: 0 0 auto; border-radius: 50%; background: conic-gradient(var(--dsr-info) var(--share), var(--dsr-bg-2) 0); }
220
+ .share-ring::after { content: ''; position: absolute; inset: 6px; border-radius: 50%; background: var(--dsr-panel); }
221
+ .share-ring span { position: relative; z-index: 1; color: var(--dsr-text); font-size: 15px; font-weight: 800; font-variant-numeric: tabular-nums; }
222
+ .share-copy { display: grid; gap: 2px; min-width: 0; }
223
+ .share-copy strong { font-size: 13px; }
224
+ .share-copy span, .share-copy small { color: var(--dsr-muted); font-size: 10px; line-height: 1.35; }
225
+ .share-copy small { font-variant-numeric: tabular-nums; }
226
+ .stats-panel { margin-top: 14px; padding: 14px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 18px; box-shadow: 0 8px 24px var(--dsr-shadow); }
227
+ .stats-panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; min-width: 0; margin-bottom: 12px; }
228
+ .stats-panel-title { margin: 3px 0 0; font-size: 16px; line-height: 1.2; letter-spacing: -.02em; }
229
+ .stats-legend { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 9px; min-width: 0; margin-top: 1px; color: var(--dsr-muted); font-size: 10px; }
230
+ .stats-legend .lg { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
231
+ .stats-legend .sw { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
182
232
  .stats-legend .sw.peak { background: var(--dsr-accent-strong); }
183
233
  .stats-legend .sw.off { background: var(--dsr-accent-2); }
184
- .stats-bar { flex: 1; min-width: 36px; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 4px; }
185
- .stats-bar .bars { width: 100%; max-width: 42px; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; border-radius: 6px 6px 0 0; overflow: hidden; background: var(--dsr-accent-soft); }
234
+ .stats-legend .sw.token { background: var(--dsr-accent); }
235
+ .stats-chart { display: flex; align-items: flex-end; gap: 7px; height: 190px; padding: 21px 2px 20px; overflow-x: auto; overflow-y: hidden; background-image: linear-gradient(to top, var(--dsr-line) 1px, transparent 1px); background-size: 100% 25%; border-radius: 10px; }
236
+ .stats-bar { display: flex; flex: 1 0 30px; flex-direction: column; align-items: center; justify-content: flex-end; gap: 4px; height: 100%; min-width: 30px; }
237
+ .stats-bar .bars { display: flex; width: 100%; max-width: 40px; height: 100%; flex-direction: column; justify-content: flex-end; overflow: hidden; border-radius: 7px 7px 3px 3px; background: var(--dsr-accent-soft); box-shadow: 0 4px 12px var(--dsr-shadow); }
186
238
  .stats-bar .seg { width: 100%; }
187
239
  .stats-bar .seg.peak { background: var(--dsr-accent-strong); }
188
240
  .stats-bar .seg.off { background: var(--dsr-accent-2); }
189
- .stats-bar .lbl { font-size: 9px; color: var(--dsr-muted); white-space: nowrap; }
190
- .stats-bar .val { font-size: 9px; color: var(--dsr-text); white-space: nowrap; }
191
- .stats-note { font-size: 11px; color: var(--dsr-muted); line-height: 1.6; margin-top: 8px; }
192
- .stats-empty { color: var(--dsr-muted); text-align: center; padding: 18px 0; font-size: 12px; }
241
+ .stats-bar .bars.token { background: linear-gradient(180deg, var(--dsr-accent-strong), var(--dsr-accent)); }
242
+ .stats-bar .lbl { color: var(--dsr-muted); font-size: 9px; font-variant-numeric: tabular-nums; white-space: nowrap; }
243
+ .stats-bar .val { min-height: 12px; color: var(--dsr-text); font-size: 9px; font-variant-numeric: tabular-nums; white-space: nowrap; }
244
+ .stats-empty { display: grid; flex: 1; place-items: center; min-height: 145px; color: var(--dsr-muted); text-align: center; font-size: 12px; }
245
+ .stats-note { margin: 14px 2px 0; padding: 10px 12px; color: var(--dsr-muted); background: var(--dsr-info-soft); border-left: 3px solid var(--dsr-info); border-radius: 0 10px 10px 0; font-size: 11px; line-height: 1.6; }
246
+
247
+ @media (max-width: 380px) {
248
+ .stats-page-head { gap: 8px; }
249
+ .stats-page-head h1 { font-size: 23px; }
250
+ .stats-date-wrap { padding: 6px 8px; }
251
+ .stats-toolbar { align-items: flex-start; flex-direction: column; gap: 6px; }
252
+ .stats-mode-picker { width: 100%; }
253
+ .stats-mode-btn { width: 100%; }
254
+ .scard { padding: 12px; }
255
+ .bucket-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
256
+ .stats-panel { padding: 12px; }
257
+ .stats-panel-head { display: block; }
258
+ .stats-legend { justify-content: flex-start; margin-top: 8px; }
259
+ }
193
260
 
194
261
  /* ---------- 会话列表 ---------- */
195
262
  .session-list { display: flex; flex-direction: column; gap: 8px; }
@@ -848,6 +915,7 @@ button.overview-attention-item, button.overview-session-item { cursor:pointer; }
848
915
  .server-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
849
916
  .server-note { font-size: 13px; word-break: break-all; }
850
917
  .server-url { flex: 1; min-width: 0; font-size: 11.5px; color: var(--dsr-muted); word-break: break-all; }
918
+ .server-token-badge { color: var(--dsr-muted); font-size: 10px; }
851
919
  .server-badge {
852
920
  flex-shrink: 0; font-size: 11px; padding: 1px 7px; border-radius: 999px;
853
921
  background: var(--dsr-accent-soft); color: var(--dsr-accent-strong);
@@ -1,10 +1,14 @@
1
1
  {
2
- "version": "0.6.17",
2
+ "version": "0.6.18",
3
3
  "apkUrl": "dsh-remote.apk",
4
- "sha256": "fb9c0cc12d1e6479d509f5755090aa95ddff904bbd213545b8eb547030e7d1a3",
5
- "releasedAt": "2026-08-28T05:53:18.723Z",
6
- "notes": "0.6.17:修复 host.describe 初次失败后总览误报 DSH 上游离线并增加恢复重试;识别 Docker、无 systemd 和插件内嵌等外部生命周期环境,隐藏不可用的 DSH 启停并给出明确提示;兼容 Caddy Basic Auth,避免管理 API 覆盖 Authorization 导致登录循环;支持通过环境变量或管理页手动补充 Docker 宿主、局域网和 Tailscale 地址并写入配对二维码;完整适配 Windows 盘符、UNC、多文件根和跨主机文件路径清理,并新增 Windows 原生 CI 安全门禁。",
4
+ "sha256": "f55ce7284c8f32308fb605bbec3fb432dc73521bb5486c40b48353343e9b63c4",
5
+ "releasedAt": "2026-08-29T06:47:44.726Z",
6
+ "notes": "0.6.18:新增独立 Token 量趋势统计并保留原有费用趋势;服务器连接身份改为地址加令牌,支持同地址不同令牌并兼容旧配置;投票在网关不可达时尝试直连公网收集器托底(需收集器允许 App/Web CORS);修复 Windows gateway-stats 调用 zstd 时弹出终端窗口的问题,并补充回归测试;同步完善相关模块文档。",
7
7
  "history": [
8
+ {
9
+ "version": "0.6.18",
10
+ "notes": "0.6.18:新增独立 Token 量趋势统计并保留原有费用趋势;服务器连接身份改为地址加令牌,支持同地址不同令牌并兼容旧配置;投票在网关不可达时尝试直连公网收集器托底(需收集器允许 App/Web CORS);修复 Windows 下 gateway-stats 调用 zstd 时弹出终端窗口的问题,并补充回归测试;同步完善相关模块文档。"
11
+ },
8
12
  {
9
13
  "version": "0.6.17",
10
14
  "notes": "0.6.17:修复 host.describe 初次失败后总览误报 DSH 上游离线并增加恢复重试;识别 Docker、无 systemd 和插件内嵌等外部生命周期环境,隐藏不可用的 DSH 启停并给出明确提示;兼容 Caddy Basic Auth,避免管理 API 覆盖 Authorization 导致登录循环;支持通过环境变量或管理页手动补充 Docker 宿主、局域网和 Tailscale 地址并写入配对二维码;完整适配 Windows 盘符、UNC、多文件根和跨主机文件路径清理,并新增 Windows 原生 CI 安全门禁。"
@@ -40,10 +44,6 @@
40
44
  {
41
45
  "version": "0.6.9",
42
46
  "notes": "0.6.9 正式版:全面优化网络连接稳定性,重构网关实时链路与连接管理;修复 downlink-only 心跳断联、网关重启风暴和 WebSocket 状态竞态;新增 VPN 友好 Ping/Pong、集中 mux/host collector、短时 WebSocket ticket、CORS 收紧与统计旁路优化。"
43
- },
44
- {
45
- "version": "0.6.8",
46
- "notes": "0.6.8 正式版:重构手机端、桌面端和插件管理界面;新增工作台、图片附件、历史公告和全屏输入;修复会话布局、系统提示裁切、主题图标对比度与全屏输入高度问题。"
47
47
  }
48
48
  ]
49
49
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.6.17"
2
+ "version": "0.6.18"
3
3
  }