dsh-remote-plugin 0.5.9 → 0.6.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/public/index.html CHANGED
@@ -20,6 +20,7 @@
20
20
  <span class="brand-name">DSH Remote</span>
21
21
  </div>
22
22
  <div class="topbar-right">
23
+ <button id="btn-donate" class="topbar-btn icon-btn" data-i18n-title="settings.donate" data-i18n-aria="settings.donate">🎁</button>
23
24
  <button id="btn-feedback" class="topbar-btn icon-btn" data-i18n-title="feedback.title" data-i18n-aria="feedback.title" aria-haspopup="menu" aria-expanded="false">💬</button>
24
25
  <button id="btn-refresh" class="topbar-btn icon-btn" data-i18n-title="a11y.refresh" data-i18n-aria="a11y.refresh">⟳</button>
25
26
  <span id="conn-badge" class="topbar-btn conn-badge off" data-i18n="conn.off">未连接</span>
@@ -91,18 +92,17 @@
91
92
  <div class="menu-group">
92
93
  <div class="menu-title" data-i18n="menu.commandsTitle">输入指令</div>
93
94
  <div class="menu-chips">
94
- <button class="menu-chip" data-cmd="/compact" data-i18n="menu.compact">/compact 压缩上下文</button>
95
- <button class="menu-chip" data-cmd="/goal" data-i18n="menu.goalView">/goal 查看目标</button>
96
- <button class="menu-chip" data-cmd="/goal pause" data-i18n="menu.goalPause">/goal 暂停</button>
97
- <button class="menu-chip" data-cmd="/goal resume" data-i18n="menu.goalResume">/goal 继续</button>
95
+ <button class="menu-chip" data-cmd="/compact" data-i18n="menu.compact">/compact 压缩对话历史</button>
96
+ <button class="menu-chip" data-cmd="/export" data-i18n="menu.export">/export 导出会话日志 ZIP</button>
97
+ <button class="menu-chip" data-cmd="/feedback" data-i18n="menu.feedback">/feedback 反馈当前会话</button>
98
+ <button class="menu-chip" data-cmd="/goal" data-i18n="menu.goal">/goal 设置/查看任务目标</button>
99
+ <button class="menu-chip" data-cmd="/permission" data-i18n="menu.permission">/permission 切换权限预设</button>
100
+ <button class="menu-chip" data-cmd="/plan" data-i18n="menu.plan">/plan 进入/退出计划模式</button>
98
101
  </div>
99
102
  </div>
100
- <div class="menu-group">
101
- <div class="menu-title" data-i18n="menu.permissionTitle">权限控制</div>
102
- <div class="menu-chips">
103
- <button class="menu-chip" data-cmd="/permission workspace-write" data-i18n="menu.permWorkspace">工作区写(免审批)</button>
104
- <button class="menu-chip danger" data-cmd="/permission danger-full-access" data-i18n="menu.permFull">完全访问(全部免审批)</button>
105
- </div>
103
+ <div class="menu-group hidden" id="preset-menu-group">
104
+ <div class="menu-title" data-i18n="presets.menuTitle">预设</div>
105
+ <div id="preset-menu-list" class="menu-chips"></div>
106
106
  </div>
107
107
  <div class="menu-group">
108
108
  <div class="menu-title"><span data-i18n="menu.modelTitle">模型切换</span> <button id="btn-model-refresh" class="mini-btn" style="padding:1px 8px" data-i18n="menu.refresh">刷新</button></div>
@@ -140,91 +140,195 @@
140
140
 
141
141
  <!-- 设置 -->
142
142
  <section id="view-settings" class="view hidden">
143
- <div class="settings-group">
144
- <div class="setting-row">
145
- <div><div class="setting-name" data-i18n="settings.servers">服务器地址(可多个)</div><div class="setting-desc" id="server-desc" data-i18n="servers.defaultDesc">默认 = 当前页面地址</div></div>
146
- <button id="btn-server-speed" class="mini-btn" data-i18n="settings.speedTest">测速</button>
147
- </div>
148
- <div class="group-bar">
149
- <label class="group-bar-label" data-i18n="groups.current">当前组</label>
150
- <div class="group-select" id="group-select">
151
- <button id="group-select-btn" class="group-select-btn" type="button" aria-haspopup="listbox">
152
- <span id="group-select-label">默认</span><span class="caret">▾</span>
153
- </button>
154
- <div id="group-select-menu" class="group-select-menu hidden"></div>
155
- </div>
156
- <button id="btn-group-add" class="mini-btn" data-i18n="groups.add">+ 组</button>
157
- </div>
158
- <div id="server-list" class="server-list"></div>
159
- <div class="server-add">
160
- <input id="server-input" type="url" placeholder="http://IP:8787">
161
- <button id="btn-server-add" class="mini-btn" data-i18n="settings.add">添加</button>
143
+ <div id="settings-home">
144
+ <div class="settings-group">
145
+ <div class="setting-row" data-settings-group="general" style="cursor:pointer">
146
+ <div><div class="setting-name" data-i18n="settings.groupGeneral">通用</div><div class="setting-desc" data-i18n="settings.groupGeneralDesc">显示工具调用、预设提示词</div></div>
147
+ <span class="sc-arrow">›</span>
148
+ </div>
149
+ <div class="setting-row" data-settings-group="servers" style="cursor:pointer">
150
+ <div><div class="setting-name" data-i18n="settings.groupServers">服务器</div><div class="setting-desc" data-i18n="settings.groupServersDesc">服务器地址、扫码连接</div></div>
151
+ <span class="sc-arrow">›</span>
152
+ </div>
153
+ <div class="setting-row" data-settings-group="notify" style="cursor:pointer">
154
+ <div><div class="setting-name" data-i18n="settings.groupNotify">通知</div><div class="setting-desc" data-i18n="settings.groupNotifyDesc">通知、提醒、后台轮询</div></div>
155
+ <span class="sc-arrow">›</span>
156
+ </div>
157
+ <div class="setting-row" data-settings-group="theme" style="cursor:pointer">
158
+ <div><div class="setting-name" data-i18n="settings.groupTheme">皮肤</div><div class="setting-desc" data-i18n="settings.groupThemeDesc">配色主题</div></div>
159
+ <span class="sc-arrow">›</span>
160
+ </div>
161
+ <div class="setting-row" data-settings-group="about" style="cursor:pointer">
162
+ <div><div class="setting-name" data-i18n="settings.groupAbout">关于</div><div class="setting-desc" data-i18n="settings.groupAboutDesc">DSH 状态、检查更新</div></div>
163
+ <span class="sc-arrow">›</span>
164
+ </div>
162
165
  </div>
163
- <div class="setting-row">
164
- <div><div class="setting-name" data-i18n="settings.scanTitle">扫码连接</div><div class="setting-desc" data-i18n="settings.scanDesc">拍照/相册本地解码(无谷歌服务依赖);也可系统相机扫码或手动粘贴</div></div>
165
- <button id="btn-scan-pair" class="mini-btn" data-i18n="settings.scan">扫码</button>
166
+ <div class="settings-group">
167
+ <div class="setting-row">
168
+ <div><div class="setting-name" data-i18n="settings.tokenTitle">访问令牌</div><div class="setting-desc" id="token-desc" data-i18n="token.notSet">未设置</div></div>
169
+ <button id="btn-change-token" class="mini-btn" data-i18n="settings.change">更换</button>
170
+ </div>
171
+ <div class="setting-row">
172
+ <div><div class="setting-name" data-i18n="settings.langTitle">语言 / Language</div><div class="setting-desc" data-i18n="settings.langDesc">界面语言,跟随系统或手动切换</div></div>
173
+ <button id="btn-lang" class="mini-btn">EN</button>
174
+ </div>
166
175
  </div>
167
- <div class="setting-row">
168
- <div><div class="setting-name" data-i18n="settings.notifyTitle">通知</div><div class="setting-desc" data-i18n="settings.notifyDesc">收到审批/提问时推送</div></div>
169
- <label class="switch"><input type="checkbox" id="opt-notify"><span class="slider"></span></label>
176
+ <div class="settings-group feedback-card">
177
+ <div class="setting-row">
178
+ <div><div class="setting-name" data-i18n="settings.feedbackTitle">反馈渠道</div><div class="setting-desc" data-i18n="settings.feedbackDesc">GitHub / Gitee / B站:反馈 bug、提建议、唠嗑</div></div>
179
+ </div>
180
+ <div class="feedback-links">
181
+ <a class="feedback-btn primary" href="https://github.com/Blank-not-black/dsh-Remote" target="_blank" rel="noopener">
182
+ <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8a8.01 8.01 0 0 0 5.47 7.59c.4.08.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
183
+ <span>GitHub</span>
184
+ </a>
185
+ <a class="feedback-btn" href="https://gitee.com/Blankneverfails/dsh-Remote" target="_blank" rel="noopener">
186
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="9" r="6"/><path d="M7.5 13.5 7 19a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l-.5-5.5"/><circle cx="10" cy="8.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14" cy="8.6" r=".5" fill="currentColor" stroke="none"/><path d="M11 10.8c.6.5 1.4.5 2 0"/></svg>
187
+ <span>Gitee</span>
188
+ </a>
189
+ <a class="feedback-btn" href="https://space.bilibili.com/419009275/dynamic" target="_blank" rel="noopener">
190
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="6" width="17" height="11" rx="2"/><path d="M8.5 3.5v3M15.5 3.5v3"/><circle cx="9.2" cy="10.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14.8" cy="10.6" r=".5" fill="currentColor" stroke="none"/><path d="M9.5 14c1.4 1 3.6 1 5 0"/></svg>
191
+ <span>B站</span>
192
+ </a>
193
+ </div>
170
194
  </div>
171
- <div class="setting-row">
172
- <div><div class="setting-name" data-i18n="settings.peakRemindTitle">峰谷计费提醒</div><div class="setting-desc" data-i18n="settings.peakRemindDesc">每天 9:00 / 12:00 / 14:00 / 18:00 推送峰谷切换(App 内有效)</div></div>
173
- <label class="switch"><input type="checkbox" id="opt-peak-remind"><span class="slider"></span></label>
195
+ <div class="settings-group">
196
+ <div class="setting-row">
197
+ <div><div class="setting-name" data-i18n="settings.resetTitle">清空本地数据</div><div class="setting-desc" data-i18n="settings.resetDesc">令牌与缓存</div></div>
198
+ <button id="btn-reset" class="mini-btn" data-i18n="settings.reset">重置</button>
199
+ </div>
174
200
  </div>
175
- <div class="setting-row">
176
- <div><div class="setting-name" data-i18n="settings.toolsTitle">显示工具调用</div><div class="setting-desc" data-i18n="settings.toolsDesc">关闭后隐藏 🔧/📦 工具调用与结果</div></div>
177
- <label class="switch"><input type="checkbox" id="opt-tools"><span class="slider"></span></label>
201
+ <p class="about" data-i18n="settings.about">DSH Remote · 局域网 / Tailscale 均可访问<br>仅作为 DSH 本机 3080 端口的带认证代理</p>
202
+ </div>
203
+
204
+ <div id="settings-page-general" class="settings-subpage hidden">
205
+ <div class="settings-group">
206
+ <div class="setting-row" data-settings-back style="cursor:pointer">
207
+ <button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
208
+ <div class="setting-name" data-i18n="settings.groupGeneral">通用</div>
209
+ </div>
178
210
  </div>
179
- <div class="setting-row">
180
- <div><div class="setting-name" data-i18n="settings.langTitle">语言 / Language</div><div class="setting-desc" data-i18n="settings.langDesc">界面语言,跟随系统或手动切换</div></div>
181
- <button id="btn-lang" class="mini-btn">EN</button>
211
+ <div class="settings-group">
212
+ <div class="setting-row">
213
+ <div><div class="setting-name" data-i18n="settings.toolsTitle">显示工具调用</div><div class="setting-desc" data-i18n="settings.toolsDesc">关闭后隐藏 🔧/📦 工具调用与结果</div></div>
214
+ <label class="switch"><input type="checkbox" id="opt-tools"><span class="slider"></span></label>
215
+ </div>
216
+ <div class="setting-row">
217
+ <div><div class="setting-name" data-i18n="presets.title">预设提示词</div><div class="setting-desc" data-i18n="presets.desc">常用提示词,对话界面一键插入(最多 20 条)</div></div>
218
+ <button id="btn-preset-add" class="mini-btn" data-i18n="presets.add">新增</button>
219
+ </div>
220
+ <div id="preset-list" class="server-list"></div>
182
221
  </div>
183
- <div class="setting-row">
184
- <div><div class="setting-name" data-i18n="settings.themeTitle">皮肤</div><div class="setting-desc" data-i18n="settings.themeDesc">默认深空 / 落日 / 易北爱乐厅 / 草原孤塔</div></div>
185
- <button id="btn-theme" class="mini-btn" style="min-width:104px">默认深空</button>
222
+ </div>
223
+
224
+ <div id="settings-page-servers" class="settings-subpage hidden">
225
+ <div class="settings-group">
226
+ <div class="setting-row" data-settings-back style="cursor:pointer">
227
+ <button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
228
+ <div class="setting-name" data-i18n="settings.groupServers">服务器</div>
229
+ </div>
186
230
  </div>
187
- <div class="setting-row">
188
- <div><div class="setting-name" data-i18n="settings.tokenTitle">访问令牌</div><div class="setting-desc" id="token-desc" data-i18n="token.notSet">未设置</div></div>
189
- <button id="btn-change-token" class="mini-btn" data-i18n="settings.change">更换</button>
231
+ <div class="settings-group">
232
+ <div class="setting-row">
233
+ <div><div class="setting-name" data-i18n="settings.servers">服务器地址(可多个)</div><div class="setting-desc" id="server-desc" data-i18n="servers.defaultDesc">默认 = 当前页面地址</div></div>
234
+ <button id="btn-server-speed" class="mini-btn" data-i18n="settings.speedTest">测速</button>
235
+ </div>
236
+ <div class="group-bar">
237
+ <label class="group-bar-label" data-i18n="groups.current">当前组</label>
238
+ <div class="group-select" id="group-select">
239
+ <button id="group-select-btn" class="group-select-btn" type="button" aria-haspopup="listbox">
240
+ <span id="group-select-label">默认</span><span class="caret">▾</span>
241
+ </button>
242
+ <div id="group-select-menu" class="group-select-menu hidden"></div>
243
+ </div>
244
+ <button id="btn-group-add" class="mini-btn" data-i18n="groups.add">+ 组</button>
245
+ </div>
246
+ <div id="server-list" class="server-list"></div>
247
+ <div class="server-add">
248
+ <input id="server-input" type="url" placeholder="http://IP:8787">
249
+ <button id="btn-server-add" class="mini-btn" data-i18n="settings.add">添加</button>
250
+ </div>
251
+ <div class="setting-row">
252
+ <div><div class="setting-name" data-i18n="settings.scanTitle">扫码连接</div><div class="setting-desc" data-i18n="settings.scanDesc">拍照/相册本地解码(无谷歌服务依赖);也可系统相机扫码或手动粘贴</div></div>
253
+ <button id="btn-scan-pair" class="mini-btn" data-i18n="settings.scan">扫码</button>
254
+ </div>
190
255
  </div>
191
- <div class="setting-row">
192
- <div><div class="setting-name" data-i18n="settings.hostTitle">DSH 状态</div><div class="setting-desc" id="host-desc" data-i18n="settings.hostProbing">探测中…</div></div>
193
- <button id="btn-host-describe" class="mini-btn" data-i18n="settings.probe">探测</button>
256
+ </div>
257
+
258
+ <div id="settings-page-notify" class="settings-subpage hidden">
259
+ <div class="settings-group">
260
+ <div class="setting-row" data-settings-back style="cursor:pointer">
261
+ <button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
262
+ <div class="setting-name" data-i18n="settings.groupNotify">通知</div>
263
+ </div>
194
264
  </div>
195
- <div class="setting-row">
196
- <div><div class="setting-name" data-i18n="settings.updateTitle">检查更新</div><div class="setting-desc" id="update-desc" data-i18n="settings.updateLoading">加载中…</div>
197
- <button id="btn-download-update" class="mini-btn hidden" style="margin-top:6px" data-i18n="settings.downloadUpdate">下载并安装更新</button>
198
- <button id="btn-update-expand" class="mini-btn hidden" style="margin-top:6px" data-i18n="update.expand">展开</button></div>
199
- <button id="btn-check-update" class="mini-btn" data-i18n="settings.check">检查</button>
265
+ <div class="settings-group">
266
+ <div class="setting-row">
267
+ <div><div class="setting-name" data-i18n="settings.notifyTitle">通知</div><div class="setting-desc" data-i18n="settings.notifyDesc">收到审批/提问时推送</div></div>
268
+ <label class="switch"><input type="checkbox" id="opt-notify"><span class="slider"></span></label>
269
+ </div>
270
+ <div class="setting-row">
271
+ <div><div class="setting-name" data-i18n="settings.peakRemindTitle">峰谷计费提醒</div><div class="setting-desc" data-i18n="settings.peakRemindDesc">每天 9:00 / 12:00 / 14:00 / 18:00 推送峰谷切换(App 内有效)</div></div>
272
+ <label class="switch"><input type="checkbox" id="opt-peak-remind"><span class="slider"></span></label>
273
+ </div>
274
+ <div class="setting-row">
275
+ <div><div class="setting-name" data-i18n="settings.bgTitle">后台轮询</div><div class="setting-desc" data-i18n="settings.bgDesc">退后台后由前台服务定时拉取事件,待办审批/提问不遗漏</div><div id="bg-auth-status" class="setting-desc hidden" data-i18n="settings.bgAuthFailed">登录失效:连续 3 次 401,后台轮询已停止</div></div>
276
+ <label class="switch"><input type="checkbox" id="opt-bg-poll"><span class="slider"></span></label>
277
+ </div>
278
+ <div class="setting-row">
279
+ <div><div class="setting-name" data-i18n="settings.bgIntervalTitle">轮询间隔</div><div class="setting-desc" data-i18n="settings.bgIntervalDesc">灭屏后系统可能拉长间隔(Doze 平台限制)</div></div>
280
+ <select id="bg-interval" style="padding:7px 9px;border-radius:10px;border:1px solid var(--dsr-line);background:var(--dsr-bg-2);color:var(--dsr-text);font:inherit">
281
+ <option value="0.5" data-i18n="settings.bgInterval30s">30 秒</option>
282
+ <option value="1" data-i18n="settings.bgInterval1m">1 分钟</option>
283
+ <option value="5" data-i18n="settings.bgInterval5m">5 分钟</option>
284
+ <option value="15" data-i18n="settings.bgInterval15m">15 分钟</option>
285
+ </select>
286
+ </div>
287
+ <div class="setting-row">
288
+ <div><div class="setting-name" data-i18n="settings.taskDoneTitle">任务结束通知</div><div class="setting-desc" data-i18n="settings.taskDoneDesc">任务/目标完成时推送“✅ 任务已完成”</div></div>
289
+ <label class="switch"><input type="checkbox" id="opt-task-done"><span class="slider"></span></label>
290
+ </div>
200
291
  </div>
201
292
  </div>
202
- <div class="settings-group feedback-card">
203
- <div class="setting-row">
204
- <div><div class="setting-name" data-i18n="settings.feedbackTitle">反馈渠道</div><div class="setting-desc" data-i18n="settings.feedbackDesc">GitHub / Gitee / B站:反馈 bug、提建议、唠嗑</div></div>
293
+
294
+ <div id="settings-page-theme" class="settings-subpage hidden">
295
+ <div class="settings-group">
296
+ <div class="setting-row" data-settings-back style="cursor:pointer">
297
+ <button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
298
+ <div class="setting-name" data-i18n="settings.groupTheme">皮肤</div>
299
+ </div>
205
300
  </div>
206
- <div class="feedback-links">
207
- <a class="feedback-btn primary" href="https://github.com/Blank-not-black/dsh-Remote" target="_blank" rel="noopener">
208
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8a8.01 8.01 0 0 0 5.47 7.59c.4.08.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
209
- <span>GitHub</span>
210
- </a>
211
- <a class="feedback-btn" href="https://gitee.com/Blankneverfails/dsh-Remote" target="_blank" rel="noopener">
212
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="9" r="6"/><path d="M7.5 13.5 7 19a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l-.5-5.5"/><circle cx="10" cy="8.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14" cy="8.6" r=".5" fill="currentColor" stroke="none"/><path d="M11 10.8c.6.5 1.4.5 2 0"/></svg>
213
- <span>Gitee</span>
214
- </a>
215
- <a class="feedback-btn" href="https://space.bilibili.com/419009275/dynamic" target="_blank" rel="noopener">
216
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="6" width="17" height="11" rx="2"/><path d="M8.5 3.5v3M15.5 3.5v3"/><circle cx="9.2" cy="10.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14.8" cy="10.6" r=".5" fill="currentColor" stroke="none"/><path d="M9.5 14c1.4 1 3.6 1 5 0"/></svg>
217
- <span>B站</span>
218
- </a>
301
+ <div class="settings-group">
302
+ <div class="setting-row">
303
+ <div><div class="setting-name" data-i18n="settings.themeTitle">皮肤</div><div class="setting-desc" data-i18n="settings.themeDesc">默认深空 / 落日 / 易北爱乐厅 / 草原孤塔</div></div>
304
+ <button id="btn-theme" class="mini-btn" style="min-width:104px">默认深空</button>
305
+ </div>
219
306
  </div>
220
307
  </div>
221
- <div class="settings-group">
222
- <div class="setting-row">
223
- <div><div class="setting-name" data-i18n="settings.resetTitle">清空本地数据</div><div class="setting-desc" data-i18n="settings.resetDesc">令牌与缓存</div></div>
224
- <button id="btn-reset" class="mini-btn" data-i18n="settings.reset">重置</button>
308
+
309
+ <div id="settings-page-about" class="settings-subpage hidden">
310
+ <div class="settings-group">
311
+ <div class="setting-row" data-settings-back style="cursor:pointer">
312
+ <button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
313
+ <div class="setting-name" data-i18n="settings.groupAbout">关于</div>
314
+ </div>
315
+ </div>
316
+ <div class="settings-group">
317
+ <div class="setting-row" data-donate-open style="cursor:pointer">
318
+ <div><div class="setting-name" data-i18n="settings.donate">赞赏支持</div><div class="setting-desc" data-i18n="settings.donateDesc">如果 dsh-remote 帮到了你,欢迎赞赏支持开发 ☕</div></div>
319
+ </div>
320
+ <div class="setting-row">
321
+ <div><div class="setting-name" data-i18n="settings.hostTitle">DSH 状态</div><div class="setting-desc" id="host-desc" data-i18n="settings.hostProbing">探测中…</div></div>
322
+ <button id="btn-host-describe" class="mini-btn" data-i18n="settings.probe">探测</button>
323
+ </div>
324
+ <div class="setting-row">
325
+ <div><div class="setting-name" data-i18n="settings.updateTitle">检查更新</div><div class="setting-desc" id="update-desc" data-i18n="settings.updateLoading">加载中…</div>
326
+ <button id="btn-download-update" class="mini-btn hidden" style="margin-top:6px" data-i18n="settings.downloadUpdate">下载并安装更新</button>
327
+ <button id="btn-update-expand" class="mini-btn hidden" style="margin-top:6px" data-i18n="update.expand">展开</button></div>
328
+ <button id="btn-check-update" class="mini-btn" data-i18n="settings.check">检查</button>
329
+ </div>
225
330
  </div>
226
331
  </div>
227
- <p class="about" data-i18n="settings.about">DSH Remote · 局域网 / Tailscale 均可访问<br>仅作为 DSH 本机 3080 端口的带认证代理</p>
228
332
  </section>
229
333
  </main>
230
334
 
@@ -341,6 +445,38 @@
341
445
  </div>
342
446
  </div>
343
447
 
448
+ <!-- 赞赏支持模态 -->
449
+ <div id="modal-donate" class="modal hidden">
450
+ <div class="modal-card">
451
+ <div class="modal-title" data-i18n="settings.donate">赞赏支持</div>
452
+ <div class="modal-body donate-body">
453
+ <img src="donate.png" alt="" class="donate-img" style="display:block;margin:0 auto;max-width:100%;max-height:60vh;border-radius:8px">
454
+ <p class="donate-thanks" data-i18n="settings.donateThanks" style="text-align:center;margin-top:12px">感谢你的支持 ☕</p>
455
+ </div>
456
+ <div class="modal-actions">
457
+ <button id="donate-close" class="btn subtle" data-i18n="modal.close">关闭</button>
458
+ </div>
459
+ </div>
460
+ </div>
461
+
462
+ <!-- 更新内容模态 -->
463
+ <div id="modal-notes" class="modal hidden">
464
+ <div class="modal-card">
465
+ <div class="modal-title"><span id="notes-version" class="muted"></span> <span data-i18n="notes.title">更新内容</span></div>
466
+ <div class="modal-body notes-body">
467
+ <div id="notes-pages" class="notes-pages" style="display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:12px;scrollbar-width:none;-ms-overflow-style:none;"></div>
468
+ <div class="notes-nav" style="display:flex;align-items:center;justify-content:center;gap:12px;margin-top:8px;">
469
+ <button id="notes-prev" class="mini-btn" aria-label="‹">‹</button>
470
+ <span id="notes-page" class="muted">1/1</span>
471
+ <button id="notes-next" class="mini-btn" aria-label="›">›</button>
472
+ </div>
473
+ </div>
474
+ <div class="modal-actions">
475
+ <button id="notes-close" class="btn subtle" data-i18n="notes.close">关闭</button>
476
+ </div>
477
+ </div>
478
+ </div>
479
+
344
480
  <div id="toast" class="toast hidden"></div>
345
481
 
346
482
  <script>
@@ -348,6 +484,7 @@
348
484
  zh: {
349
485
  'a11y.hostAdmin': '主机管理', 'a11y.refresh': '刷新', 'a11y.more': '更多操作', 'a11y.moreTitle': '指令/权限/模型',
350
486
  'conn.on': '已连接', 'conn.off': '未连接', 'conn.reconnecting': '连接中断,正在重连…',
487
+ 'conn.poll': '轮询', 'conn.pollTitle': '当前网络不支持实时推送,已降级为轮询(延迟数秒)',
351
488
  'conn.titleGroup': '{group} · {url}({ms})',
352
489
  'common.refreshing': '刷新中…',
353
490
  'nav.sessions': '会话', 'nav.files': '文件', 'nav.pending': '待办', 'nav.stats': '统计', 'nav.settings': '设置',
@@ -399,6 +536,7 @@
399
536
  'role.me': '我', 'role.dsh': 'DSH',
400
537
  'tool.default': '工具', 'tool.unknown': '未知工具', 'tool.result': '结果',
401
538
  'event.taskStart': '▶ 任务开始', 'event.taskEnd': '■ 任务结束',
539
+ 'event.systemReminder': '系统提示',
402
540
  'block.image': '图片', 'block.thinking': '🧠 思考过程', 'block.toolCall': '工具调用', 'block.toolResult': '工具结果', 'block.unknown': '块 · {type}',
403
541
  'truncated': '…(截断)',
404
542
  'stats.title': '本轮统计', 'stats.roundTitle': '本轮统计', 'stats.turnsSteps': '轮次 / 步骤',
@@ -415,9 +553,10 @@
415
553
  'models.loading': '模型加载中…', 'models.loadFailed': '模型列表加载失败:{msg}', 'models.unavailable': '不可用', 'models.none': '没有可用模型',
416
554
  'models.switchFailed': '切换模型失败', 'models.switched': '已切换模型:{model}',
417
555
  'models.effortFailed': '切换思考深度失败', 'models.effortSwitched': '思考深度:{effort}',
418
- 'menu.commandsTitle': '输入指令', 'menu.compact': '/compact 压缩上下文', 'menu.goalView': '/goal 查看目标',
419
- 'menu.goalPause': '/goal 暂停', 'menu.goalResume': '/goal 继续',
420
- 'menu.permissionTitle': '权限控制', 'menu.permWorkspace': '工作区写(免审批)', 'menu.permFull': '完全访问(全部免审批)',
556
+ 'menu.commandsTitle': '输入指令',
557
+ 'menu.compact': '/compact 压缩对话历史', 'menu.export': '/export 导出会话日志 ZIP',
558
+ 'menu.feedback': '/feedback 反馈当前会话', 'menu.goal': '/goal 设置/查看任务目标',
559
+ 'menu.permission': '/permission 切换权限预设', 'menu.plan': '/plan 进入/退出计划模式',
421
560
  'menu.modelTitle': '模型切换', 'menu.refresh': '刷新', 'menu.modelAuto': '点开时自动加载', 'menu.effortTitle': '思考深度',
422
561
  'composer.placeholder': '给 DSH 发消息…', 'composer.send': '发送',
423
562
  'pending.title': '待处理', 'pending.count': '{n} 项', 'pending.approvalTitle': '🔧 {tool} 请求批准', 'pending.noReason': '无说明',
@@ -450,8 +589,10 @@
450
589
  'update.latestV': '已是最新 v{version}', 'update.latestRemote': '最新版本 v{version}', 'update.latestToast': '已是最新版本',
451
590
  'update.checkFailedDesc': '检查失败:{msg}', 'update.checkFailed': '检查更新失败:{msg}',
452
591
  'update.downloadStarted': '开始下载,完成后会弹出安装页', 'update.downloadFailed': '无法启动下载:{msg}',
592
+ 'update.corrupted': '下载文件损坏,请重试', 'update.serverFileMissing': '服务器上还没有对应版本的文件,请稍后再试',
453
593
  'update.installUnsupported': '当前版本不支持 App 内安装,已转浏览器下载',
454
594
  'update.expand': '展开', 'update.collapse': '收起',
595
+ 'notes.title': '更新内容', 'notes.close': '关闭', 'notes.page': '{current}/{total}',
455
596
  'scan.imageLoadFailed': '图片加载失败', 'scan.decodeUnsupported': '当前设备不支持图片解码',
456
597
  'scan.browserHint': '浏览器请打开主机管理页,用手机相机扫码', 'scan.unsupported': '当前 App 版本不支持拍照扫码,请先更新 App',
457
598
  'scan.permissionDenied': '未授予相机权限',
@@ -459,6 +600,13 @@
459
600
  'scan.noPhoto': '没有拿到图片,请重试', 'scan.noQr': '未识别到二维码,请对准后重试',
460
601
  'scan.paired': '配对成功,正在连接', 'scan.pairedLink': '已通过二维码配对', 'scan.notPair': '这不是 DSH Remote 的配对二维码',
461
602
  'scan.cancelled': '已取消扫码', 'scan.failed': '扫码失败:{msg}',
603
+ 'settings.groupGeneral': '通用', 'settings.groupGeneralDesc': '显示工具调用、预设提示词',
604
+ 'settings.groupServers': '服务器', 'settings.groupServersDesc': '服务器地址、扫码连接',
605
+ 'settings.groupNotify': '通知', 'settings.groupNotifyDesc': '通知、提醒、后台轮询',
606
+ 'settings.groupTheme': '皮肤', 'settings.groupThemeDesc': '配色主题',
607
+ 'settings.groupAbout': '关于', 'settings.groupAboutDesc': 'DSH 状态、检查更新',
608
+ 'settings.donate': '赞赏支持', 'settings.donateDesc': '如果 dsh-remote 帮到了你,欢迎赞赏支持开发 ☕', 'settings.donateThanks': '感谢你的支持 ☕',
609
+ 'settings.back': '‹ 返回',
462
610
  'settings.servers': '服务器地址(可多个)', 'settings.speedTest': '测速', 'settings.add': '添加',
463
611
  'settings.scanTitle': '扫码连接', 'settings.scanDesc': '拍照/相册本地解码(无谷歌服务依赖);也可系统相机扫码或手动粘贴', 'settings.scan': '扫码',
464
612
  'settings.notifyTitle': '通知', 'settings.notifyDesc': '收到审批/提问时推送',
@@ -468,6 +616,19 @@
468
616
  'peakRemind.peak1418': '高峰 14:00-18:00', 'peakRemind.off1809': '空闲 18:00-次日 9:00',
469
617
  'peakRemind.browserOnly': '峰谷提醒仅在 App 内有效',
470
618
  'peakRemind.on': '峰谷提醒已开启', 'peakRemind.off': '峰谷提醒已关闭',
619
+ 'settings.bgTitle': '后台轮询', 'settings.bgDesc': '退后台后由前台服务定时拉取事件,待办审批/提问不遗漏',
620
+ 'settings.bgIntervalTitle': '轮询间隔', 'settings.bgIntervalDesc': '灭屏后系统可能拉长间隔(Doze 平台限制)',
621
+ 'settings.bgInterval30s': '30 秒', 'settings.bgInterval1m': '1 分钟', 'settings.bgInterval5m': '5 分钟', 'settings.bgInterval15m': '15 分钟',
622
+ 'settings.bgOn': '后台轮询已开启', 'settings.bgOff': '后台轮询已关闭',
623
+ 'settings.bgNativeOnly': '后台轮询仅 Android App 内可用', 'settings.bgNeedToken': '请先设置访问令牌',
624
+ 'settings.bgAuthFailed': '登录失效:连续 3 次 401,后台轮询已停止',
625
+ 'settings.taskDoneTitle': '任务结束通知', 'settings.taskDoneDesc': '任务/目标完成时推送“✅ 任务已完成”',
626
+ 'bg.eventTitle': 'dsh-remote:{n} 条新事件', 'bg.eventText': '点击查看',
627
+ 'presets.title': '预设提示词', 'presets.desc': '常用提示词,对话界面一键插入(最多 20 条)',
628
+ 'presets.add': '新增', 'presets.edit': '编辑', 'presets.delete': '删除', 'presets.empty': '暂无预设',
629
+ 'presets.menuTitle': '预设', 'presets.namePrompt': '预设名称(≤20 字):', 'presets.textPrompt': '预设内容(≤2000 字):',
630
+ 'presets.nameEmpty': '名称不能为空', 'presets.nameTooLong': '名称不能超过 20 字', 'presets.textTooLong': '内容不能超过 2000 字', 'presets.limit': '最多 20 条预设', 'presets.added': '预设已添加',
631
+ 'presets.confirmDelete': '删除预设「{name}」?', 'presets.saved': '预设已保存', 'presets.deleted': '预设已删除',
471
632
  'settings.toolsTitle': '显示工具调用', 'settings.toolsDesc': '关闭后隐藏 🔧/📦 工具调用与结果',
472
633
  'settings.langTitle': '语言 / Language', 'settings.langDesc': '界面语言,跟随系统或手动切换',
473
634
  'settings.themeTitle': '皮肤', 'settings.themeDesc': '默认深空 / 落日 / 易北爱乐厅 / 草原孤塔',
@@ -502,6 +663,7 @@
502
663
  en: {
503
664
  'a11y.hostAdmin': 'Host admin', 'a11y.refresh': 'Refresh', 'a11y.more': 'More actions', 'a11y.moreTitle': 'Commands / Permissions / Models',
504
665
  'conn.on': 'Connected', 'conn.off': 'Offline', 'conn.reconnecting': 'Connection lost, reconnecting…',
666
+ 'conn.poll': 'Polling', 'conn.pollTitle': 'Realtime push is unavailable on this network; degraded to polling (a few seconds delay)',
505
667
  'conn.titleGroup': '{group} · {url} ({ms})',
506
668
  'common.refreshing': 'Refreshing…',
507
669
  'nav.sessions': 'Sessions', 'nav.files': 'Files', 'nav.pending': 'Inbox', 'nav.stats': 'Stats', 'nav.settings': 'Settings',
@@ -553,6 +715,7 @@
553
715
  'role.me': 'Me', 'role.dsh': 'DSH',
554
716
  'tool.default': 'tool', 'tool.unknown': 'Unknown tool', 'tool.result': 'Result',
555
717
  'event.taskStart': '▶ Task started', 'event.taskEnd': '■ Task finished',
718
+ 'event.systemReminder': 'System reminder',
556
719
  'block.image': 'Image', 'block.thinking': '🧠 Thinking', 'block.toolCall': 'Tool call', 'block.toolResult': 'Tool result', 'block.unknown': 'Block · {type}',
557
720
  'truncated': '…(truncated)',
558
721
  'stats.title': 'This round', 'stats.roundTitle': 'This round', 'stats.turnsSteps': 'Turns / steps',
@@ -569,9 +732,10 @@
569
732
  'models.loading': 'Loading models…', 'models.loadFailed': 'Failed to load models: {msg}', 'models.unavailable': 'unavailable', 'models.none': 'No models available',
570
733
  'models.switchFailed': 'Model switch failed', 'models.switched': 'Switched model: {model}',
571
734
  'models.effortFailed': 'Failed to switch reasoning effort', 'models.effortSwitched': 'Reasoning effort: {effort}',
572
- 'menu.commandsTitle': 'Commands', 'menu.compact': '/compact compact context', 'menu.goalView': '/goal view goal',
573
- 'menu.goalPause': '/goal pause', 'menu.goalResume': '/goal resume',
574
- 'menu.permissionTitle': 'Permissions', 'menu.permWorkspace': 'Workspace write (auto-approve)', 'menu.permFull': 'Full access (auto-approve all)',
735
+ 'menu.commandsTitle': 'Commands',
736
+ 'menu.compact': '/compact Compress conversation history', 'menu.export': '/export Export session log ZIP',
737
+ 'menu.feedback': '/feedback Feedback current session', 'menu.goal': '/goal Set/view task goal',
738
+ 'menu.permission': '/permission Switch permission preset', 'menu.plan': '/plan Enter/exit plan mode',
575
739
  'menu.modelTitle': 'Model', 'menu.refresh': 'Refresh', 'menu.modelAuto': 'Auto-loads when opened', 'menu.effortTitle': 'Reasoning effort',
576
740
  'composer.placeholder': 'Message DSH…', 'composer.send': 'Send',
577
741
  'pending.title': 'Inbox', 'pending.count': '{n} items', 'pending.approvalTitle': '🔧 {tool} requests approval', 'pending.noReason': 'No reason given',
@@ -604,8 +768,10 @@
604
768
  'update.latestV': 'Up to date v{version}', 'update.latestRemote': 'Latest version v{version}', 'update.latestToast': 'Already up to date',
605
769
  'update.checkFailedDesc': 'Check failed: {msg}', 'update.checkFailed': 'Update check failed: {msg}',
606
770
  'update.downloadStarted': 'Downloading, the install page will open when ready', 'update.downloadFailed': 'Could not start download: {msg}',
771
+ 'update.corrupted': 'Downloaded file is corrupted, please retry', 'update.serverFileMissing': 'The file for this version is not on the server yet, please try again later',
607
772
  'update.installUnsupported': 'This version cannot install in-app, opening browser download',
608
773
  'update.expand': 'Expand', 'update.collapse': 'Collapse',
774
+ 'notes.title': 'What\'s New', 'notes.close': 'Close', 'notes.page': '{current}/{total}',
609
775
  'scan.imageLoadFailed': 'Image failed to load', 'scan.decodeUnsupported': 'This device cannot decode images',
610
776
  'scan.browserHint': 'In a browser, open the host admin page and scan with your phone camera', 'scan.unsupported': 'This app version cannot scan, please update first',
611
777
  'scan.permissionDenied': 'Camera permission not granted',
@@ -613,6 +779,13 @@
613
779
  'scan.noPhoto': 'No image received, try again', 'scan.noQr': 'No QR code detected, aim and try again',
614
780
  'scan.paired': 'Paired, connecting', 'scan.pairedLink': 'Paired via QR code', 'scan.notPair': 'Not a DSH Remote pairing QR code',
615
781
  'scan.cancelled': 'Scan cancelled', 'scan.failed': 'Scan failed: {msg}',
782
+ 'settings.groupGeneral': 'General', 'settings.groupGeneralDesc': 'Tool calls, prompt presets',
783
+ 'settings.groupServers': 'Servers', 'settings.groupServersDesc': 'Server address, scan to pair',
784
+ 'settings.groupNotify': 'Notifications', 'settings.groupNotifyDesc': 'Notifications, reminders, background polling',
785
+ 'settings.groupTheme': 'Theme', 'settings.groupThemeDesc': 'Color themes',
786
+ 'settings.groupAbout': 'About', 'settings.groupAboutDesc': 'DSH status, updates',
787
+ 'settings.donate': 'Support', 'settings.donateDesc': 'If dsh-remote has been helpful to you, feel free to support development with a coffee ☕', 'settings.donateThanks': 'Thanks for your support ☕',
788
+ 'settings.back': '‹ Back',
616
789
  'settings.servers': 'Servers (one or more)', 'settings.speedTest': 'Test', 'settings.add': 'Add',
617
790
  'settings.scanTitle': 'Scan to pair', 'settings.scanDesc': 'Photo/gallery QR decoding on device (no Google services); system camera or manual paste also work', 'settings.scan': 'Scan',
618
791
  'settings.notifyTitle': 'Notifications', 'settings.notifyDesc': 'Push on approvals / questions',
@@ -622,6 +795,19 @@
622
795
  'peakRemind.peak1418': 'Peak 14:00-18:00', 'peakRemind.off1809': 'Off-peak 18:00-9:00 next day',
623
796
  'peakRemind.browserOnly': 'Peak reminders only work in the app',
624
797
  'peakRemind.on': 'Peak reminders enabled', 'peakRemind.off': 'Peak reminders disabled',
798
+ 'settings.bgTitle': 'Background polling', 'settings.bgDesc': 'A foreground service polls events while the app is in the background, so approvals/questions are not missed',
799
+ 'settings.bgIntervalTitle': 'Polling interval', 'settings.bgIntervalDesc': 'Screen-off may stretch the interval (Doze platform limit)',
800
+ 'settings.bgInterval30s': '30 seconds', 'settings.bgInterval1m': '1 minute', 'settings.bgInterval5m': '5 minutes', 'settings.bgInterval15m': '15 minutes',
801
+ 'settings.bgOn': 'Background polling enabled', 'settings.bgOff': 'Background polling disabled',
802
+ 'settings.bgNativeOnly': 'Background polling is only available in the Android app', 'settings.bgNeedToken': 'Set an access token first',
803
+ 'settings.bgAuthFailed': 'Login expired: 3 consecutive 401s, background polling stopped',
804
+ 'settings.taskDoneTitle': 'Task done notifications', 'settings.taskDoneDesc': 'Show a “✅ Task complete” notification when a task or goal finishes',
805
+ 'bg.eventTitle': 'dsh-remote: {n} new events', 'bg.eventText': 'Tap to view',
806
+ 'presets.title': 'Prompt presets', 'presets.desc': 'Common prompts, insert into the composer in one tap (max 20)',
807
+ 'presets.add': 'Add', 'presets.edit': 'Edit', 'presets.delete': 'Delete', 'presets.empty': 'No presets yet',
808
+ 'presets.menuTitle': 'Presets', 'presets.namePrompt': 'Preset name (≤20 chars):', 'presets.textPrompt': 'Preset content (≤2000 chars):',
809
+ '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',
810
+ 'presets.confirmDelete': 'Delete preset "{name}"?', 'presets.saved': 'Preset saved', 'presets.deleted': 'Preset deleted',
625
811
  'settings.toolsTitle': 'Show tool calls', 'settings.toolsDesc': 'Hide 🔧/📦 tool calls and results when off',
626
812
  'settings.langTitle': 'Language / 语言', 'settings.langDesc': 'UI language, follows system or switch manually',
627
813
  'settings.themeTitle': 'Theme', 'settings.themeDesc': 'Default deep space / Sunset / Elbphilharmonie / Prairie Tower',
@@ -1,6 +1,7 @@
1
1
  {
2
- "version": "0.5.9",
2
+ "version": "0.6.1",
3
3
  "apkUrl": "dsh-remote.apk",
4
- "releasedAt": "2026-08-18T07:05:40.678Z",
5
- "notes": "反馈渠道升级:App 顶栏 / 桌面端侧边栏 / 管理页右上角三端入口;App 与桌面端「写反馈」弹层直接提交,网关转发到反馈收集器(DSH_REMOTE_FEEDBACK_URL 可覆盖,无 token 配置,成功后 1 分钟节流);管理页顶栏滚动置顶并适配窄屏;桌面端反馈按钮与导航项同层级。"
4
+ "sha256": "ee8292f6689ec539377a15da6b2f08a3c05fa943354a9107c0a3c5c596f0a1a9",
5
+ "releasedAt": "2026-08-18T17:20:46.562Z",
6
+ "notes": "admin 管理页新增赞赏入口;设置关于行去掉多余箭头;新版本首次打开弹“更新内容”(横向分页);过滤 system-reminder 伪用户消息;赞赏码三入口(README + 设置关于 + WebUI 主页按钮);斜杠命令桥接修复与 debug 定位(executed 状态可观测);命令菜单全命令化并点击填入输入框;斜杠命令改插件桥接执行;客户端斜杠命令真实执行;会话历史秒开 + RPC 20s 超时兜底;后台轮询只统计 AI 新消息;新增任务结束通知;设置界面五分组;修复 goal 完成态隐藏与会话切换残留"
6
7
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.5.9"
2
+ "version": "0.6.1"
3
3
  }