dsh-remote-plugin 0.6.11 → 0.6.12
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/README.en.md +3 -2
- package/README.md +3 -2
- package/apk/dsh-remote.apk +0 -0
- package/gateway.cjs +466 -65
- package/index.mjs +3 -2
- package/package.json +1 -1
- package/public/announcements.json +8 -0
- package/public/app.js +270 -35
- package/public/index.html +50 -12
- package/public/styles.css +41 -2
- package/public/update.json +9 -9
- package/public/version.json +1 -1
package/public/index.html
CHANGED
|
@@ -196,6 +196,17 @@
|
|
|
196
196
|
</div>
|
|
197
197
|
</div>
|
|
198
198
|
|
|
199
|
+
<section id="overview-announcement-board" class="overview-board" aria-labelledby="overview-board-title">
|
|
200
|
+
<div class="overview-board-head">
|
|
201
|
+
<div>
|
|
202
|
+
<div class="overview-eyebrow" data-i18n="overview.communityEyebrow">COMMUNITY BOARD</div>
|
|
203
|
+
<h2 id="overview-board-title" data-i18n="overview.communityTitle">公告与投票</h2>
|
|
204
|
+
</div>
|
|
205
|
+
<button id="overview-announcement-history" class="mini-btn" type="button" data-i18n="overview.communityHistory">历史公告</button>
|
|
206
|
+
</div>
|
|
207
|
+
<div id="overview-announcement-list" class="overview-announcement-list" aria-live="polite"></div>
|
|
208
|
+
</section>
|
|
209
|
+
|
|
199
210
|
<div class="overview-section-head"><span data-i18n="overview.attention">需要你处理</span><span id="overview-attention-count" class="overview-section-meta"></span></div>
|
|
200
211
|
<div id="overview-attention-list" class="overview-attention-list"></div>
|
|
201
212
|
|
|
@@ -228,23 +239,18 @@
|
|
|
228
239
|
<div class="settings-group">
|
|
229
240
|
<div class="setting-row" data-settings-group="general" style="cursor:pointer">
|
|
230
241
|
<div><div class="setting-name" data-i18n="settings.groupGeneral">通用</div><div class="setting-desc" data-i18n="settings.groupGeneralDesc">显示工具调用、预设提示词</div></div>
|
|
231
|
-
<span class="sc-arrow">›</span>
|
|
232
242
|
</div>
|
|
233
243
|
<div class="setting-row" data-settings-group="servers" style="cursor:pointer">
|
|
234
244
|
<div><div class="setting-name" data-i18n="settings.groupServers">服务器</div><div class="setting-desc" data-i18n="settings.groupServersDesc">服务器地址、扫码连接</div></div>
|
|
235
|
-
<span class="sc-arrow">›</span>
|
|
236
245
|
</div>
|
|
237
246
|
<div class="setting-row" data-settings-group="notify" style="cursor:pointer">
|
|
238
247
|
<div><div class="setting-name" data-i18n="settings.groupNotify">通知</div><div class="setting-desc" data-i18n="settings.groupNotifyDesc">通知、提醒、后台轮询</div></div>
|
|
239
|
-
<span class="sc-arrow">›</span>
|
|
240
248
|
</div>
|
|
241
249
|
<div class="setting-row" data-settings-group="theme" style="cursor:pointer">
|
|
242
250
|
<div><div class="setting-name" data-i18n="settings.groupTheme">皮肤</div><div class="setting-desc" data-i18n="settings.groupThemeDesc">配色主题</div></div>
|
|
243
|
-
<span class="sc-arrow">›</span>
|
|
244
251
|
</div>
|
|
245
252
|
<div class="setting-row" data-settings-group="about" style="cursor:pointer">
|
|
246
253
|
<div><div class="setting-name" data-i18n="settings.groupAbout">关于</div><div class="setting-desc" data-i18n="settings.groupAboutDesc">DSH 状态、检查更新</div></div>
|
|
247
|
-
<span class="sc-arrow">›</span>
|
|
248
254
|
</div>
|
|
249
255
|
</div>
|
|
250
256
|
<div class="settings-group">
|
|
@@ -424,7 +430,7 @@
|
|
|
424
430
|
<button id="btn-host-describe" class="mini-btn" data-i18n="settings.probe">探测</button>
|
|
425
431
|
</div>
|
|
426
432
|
<div class="setting-row">
|
|
427
|
-
<div><div class="setting-name" data-i18n="settings.dshControlTitle">远程启动 DSH</div><div class="setting-desc" id="dsh-control-desc" data-i18n="settings.dshControlProbing">检查本机服务状态…</div></div>
|
|
433
|
+
<div><div class="setting-name" data-i18n="settings.dshControlTitle">远程启动 DSH</div><div class="setting-desc expanded" id="dsh-control-desc" data-i18n="settings.dshControlProbing">检查本机服务状态…</div><div id="dsh-control-steps" class="dsh-control-steps hidden" aria-live="polite"></div></div>
|
|
428
434
|
<div class="setting-actions">
|
|
429
435
|
<button id="btn-dsh-start" class="mini-btn" data-i18n="settings.dshStart">启动</button>
|
|
430
436
|
<button id="btn-dsh-restart" class="mini-btn" data-i18n="settings.dshRestart">重启</button>
|
|
@@ -553,6 +559,20 @@
|
|
|
553
559
|
</div>
|
|
554
560
|
</div>
|
|
555
561
|
|
|
562
|
+
<!-- 反馈发送成功确认 -->
|
|
563
|
+
<div id="modal-feedback-success" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="feedback-success-title">
|
|
564
|
+
<div class="modal-card feedback-success-card">
|
|
565
|
+
<div class="feedback-success-icon" aria-hidden="true">
|
|
566
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 12 4 4 8-9"/></svg>
|
|
567
|
+
</div>
|
|
568
|
+
<div id="feedback-success-title" class="modal-title feedback-success-title" data-i18n="feedback.successTitle">反馈发送成功</div>
|
|
569
|
+
<div class="modal-body feedback-success-body" data-i18n="feedback.successBody">服务器已确认收到这条反馈,感谢你的帮助。</div>
|
|
570
|
+
<div class="modal-actions">
|
|
571
|
+
<button id="feedback-success-confirm" class="btn primary" data-i18n="feedback.successConfirm">知道了</button>
|
|
572
|
+
</div>
|
|
573
|
+
</div>
|
|
574
|
+
</div>
|
|
575
|
+
|
|
556
576
|
<!-- 新建工作区模态 -->
|
|
557
577
|
<div id="modal-workspace" class="modal hidden" role="dialog" aria-modal="true">
|
|
558
578
|
<div class="modal-card">
|
|
@@ -576,6 +596,10 @@
|
|
|
576
596
|
<div class="modal-body">
|
|
577
597
|
<label class="field-label" for="new-session-workspace" data-i18n="newSession.workspace">选择工作区</label>
|
|
578
598
|
<select id="new-session-workspace" class="workspace-select full" data-i18n-aria="workspace.select"></select>
|
|
599
|
+
<div class="workspace-name-block">
|
|
600
|
+
<span data-i18n="newSession.name">工作区名称</span>
|
|
601
|
+
<strong id="new-session-workspace-name"></strong>
|
|
602
|
+
</div>
|
|
579
603
|
<div class="workspace-path-block">
|
|
580
604
|
<span data-i18n="newSession.path">工作区地址</span>
|
|
581
605
|
<code id="new-session-workspace-path" class="workspace-path-scroll"></code>
|
|
@@ -742,6 +766,8 @@
|
|
|
742
766
|
'overview.activeSessions': '活跃会话', 'overview.connectionMode': '连接模式', 'overview.ws': '实时 WS', 'overview.poll': '降级轮询', 'overview.noActivity': '暂无后台活动', 'overview.noSession': '暂无会话',
|
|
743
767
|
'overview.refresh': '刷新总览', 'overview.none': '暂无事项', 'overview.pendingCount': '{n} 项待处理', 'overview.activeCount': '{n} 个活跃会话',
|
|
744
768
|
'overview.action.openSession': '打开最近会话', 'overview.action.newSession': '新建会话', 'overview.action.attention': '处理待办', 'overview.action.connect': '去设置连接', 'overview.action.refresh': '重新检查连接',
|
|
769
|
+
'overview.communityEyebrow': 'COMMUNITY BOARD', 'overview.communityTitle': '公告与投票', 'overview.communityHistory': '历史公告', 'overview.communityEmpty': '暂无未读公告',
|
|
770
|
+
'overview.communityPoll': '投票', 'overview.communityNotice': '公告', 'overview.communityNew': '新', 'overview.communityVote': '参与投票', 'overview.communityView': '查看公告', 'overview.communityVoted': '已参与',
|
|
745
771
|
'statsPage.title': 'Token 统计',
|
|
746
772
|
'statsPage.todayTokens': '今日 Token', 'statsPage.todayCost': '今日费用', 'statsPage.peakShare': '高峰占比',
|
|
747
773
|
'statsPage.input': '未缓存输入', 'statsPage.cacheRead': '缓存命中', 'statsPage.cacheWrite': '缓存写入', 'statsPage.output': '输出',
|
|
@@ -753,7 +779,7 @@
|
|
|
753
779
|
'workspace.createTitle': '新建工作区', 'workspace.createDesc': '将在当前文件目录下创建文件夹,并自动打开新会话。', 'workspace.parent': '父目录', 'workspace.namePlaceholder': '例如:my-project', 'workspace.cancel': '取消', 'workspace.create': '创建并打开', 'workspace.nameRequired': '请输入工作区名称', 'workspace.exists': '该目录已存在', 'workspace.invalidName': '名称不能包含路径分隔符', 'workspace.createFailed': '创建工作区失败:{msg}', 'workspace.created': '工作区已创建', 'workspace.createdNoSession': '工作区已创建,但新会话未能打开',
|
|
754
780
|
'workspace.createTitle': '新建工作区', 'workspace.createDesc': '将在当前文件目录下创建文件夹,并自动打开新会话。', 'workspace.parent': '父目录', 'workspace.namePlaceholder': '例如:my-project', 'workspace.cancel': '取消', 'workspace.create': '创建并打开', 'workspace.nameRequired': '请输入工作区名称', 'workspace.created': '工作区已创建', 'workspace.sessionFailed': '目录已创建,但新会话打开失败:{msg}',
|
|
755
781
|
'workspace.current': '当前工作区', 'workspace.select': '选择工作区', 'workspace.all': '全部工作区', 'workspace.ungrouped': '未分组会话', 'workspace.files': '查看文件', 'workspace.allPath': '显示全部 DSH 工作区中的会话',
|
|
756
|
-
'newSession.title': '新建会话', 'newSession.workspace': '选择工作区', 'newSession.path': '工作区地址', 'newSession.create': '创建会话', 'newSession.noWorkspaces': '还没有 DSH 工作区,请先新建工作区。', 'newSession.chooseWorkspace': '请先选择工作区',
|
|
782
|
+
'newSession.title': '新建会话', 'newSession.workspace': '选择工作区', 'newSession.name': '工作区名称', 'newSession.path': '工作区地址', 'newSession.create': '创建会话', 'newSession.noWorkspaces': '还没有 DSH 工作区,请先新建工作区。', 'newSession.chooseWorkspace': '请先选择工作区',
|
|
757
783
|
'sessions.running': '运行中', 'sessions.statRunning': '运行中', 'sessions.statPending': '待处理', 'sessions.statTotal': '会话总数',
|
|
758
784
|
'sessions.sortLabel': '会话排序', 'sessions.sortTime': '按时间', 'sessions.sortWorkspace': '按工作区', 'sessions.workspace': '工作区', 'sessions.workspaceUnknown': '未指定工作区',
|
|
759
785
|
'sessions.queueBadge': '队列 {n}', 'sessions.goalBadge': '目标·{phase}',
|
|
@@ -831,7 +857,7 @@
|
|
|
831
857
|
'fs.workspace': 'DSH 工作区', 'fs.root': '文件根目录', 'fs.previewTitle': '文件预览', 'fs.previewLoading': '正在加载文件…', 'fs.previewFailed': '无法预览:{msg}', 'fs.previewUnsupported': '该文件类型暂不支持预览', 'fs.previewTooLarge': '文件超过 1 MB,请下载后查看', 'fs.source': '源码', 'fs.preview': '预览', 'fs.download': '下载',
|
|
832
858
|
'fs.pullDown': '下拉刷新', 'fs.pullRelease': '松开刷新', 'fs.refreshing': '刷新中…',
|
|
833
859
|
'fs.noToken': '未设置令牌', 'fs.goSettings': '请先到「设置」页粘贴网关令牌',
|
|
834
|
-
'fs.notFound': '目录不存在', 'fs.forbidden': '
|
|
860
|
+
'fs.notFound': '目录不存在', 'fs.forbidden': '路径不在允许范围内;DSH 已登记工作区会自动放行,其他目录请配置 DSH_REMOTE_FS_ROOT',
|
|
835
861
|
'fs.loadFailed': '加载失败:{msg}', 'fs.loadFailedToast': '文件列表加载失败:{msg}',
|
|
836
862
|
'fs.emptyDir': '空目录', 'fs.dir': '目录',
|
|
837
863
|
'fs.downloadStarted': '开始下载到「下载/dsh-remote」目录', 'fs.downloadFailed': '无法启动下载:{msg}',
|
|
@@ -901,7 +927,11 @@
|
|
|
901
927
|
'theme.panelTitle': '选择配色', 'theme.close': '关闭',
|
|
902
928
|
'settings.tokenTitle': '访问令牌', 'settings.change': '更换',
|
|
903
929
|
'settings.hostTitle': 'DSH 状态', 'settings.hostProbing': '探测中…', 'settings.probe': '探测', 'settings.probeFailed': '探测失败',
|
|
904
|
-
'settings.dshControlTitle': '远程启动 DSH', 'settings.dshControlProbing': '
|
|
930
|
+
'settings.dshControlTitle': '远程启动 DSH', 'settings.dshControlProbing': '正在向网关查询本机 systemd 服务…', 'settings.dshRunning': '运行中', 'settings.dshStopped': '已停止', 'settings.dshUnsupported': '当前系统未配置可控的 DSH 服务', 'settings.dshStart': '启动', 'settings.dshRestart': '重启', 'settings.dshStarting': '正在{action} DSH…', 'settings.dshStarted': 'DSH 已{action}', 'settings.dshFailed': 'DSH 操作失败:{msg}',
|
|
931
|
+
'settings.dshRunningDetail': '运行中 · {service} · PID {pid} · {state}', 'settings.dshStoppedDetail': '已停止 · {service} · {state}', 'settings.dshStatusFailed': '服务状态查询失败:{msg}',
|
|
932
|
+
'settings.dshStageQueued': '请求已到达网关,等待检查服务', 'settings.dshStageChecking': '正在检查 systemd 用户服务 {service}', 'settings.dshStageCommand': '服务已确认,正在提交{action}命令', 'settings.dshStageWaitingService': '命令已接受,等待服务进程运行({seconds} 秒)', 'settings.dshStageWaitingUpstream': '服务进程已运行,等待 DSH HTTP 接口恢复({seconds} 秒)', 'settings.dshStageWaitingEvents': 'DSH HTTP 已恢复,等待实时消息通道连接({seconds} 秒)',
|
|
933
|
+
'settings.dshSuccessDetail': 'DSH {action}成功 · PID {pid} · HTTP {status} · 用时 {seconds} 秒', 'settings.dshAlreadyRunning': 'DSH 已在运行 · PID {pid}', 'settings.dshResultUnknown': '与网关的连接在操作中断开,最终结果未知;请重新进入此页查看服务状态',
|
|
934
|
+
'settings.dshErrorServiceNotFound': '未找到 systemd 用户服务 {service},请先安装或配置 DSH_REMOTE_DSH_SERVICE', 'settings.dshErrorInvalidService': 'DSH 服务名配置不合法', 'settings.dshErrorSystemctlNotFound': '系统中找不到 systemctl', 'settings.dshErrorSystemdUnavailable': '无法连接当前用户的 systemd 会话', 'settings.dshErrorPermissionDenied': '当前用户无权控制 DSH 服务', 'settings.dshErrorCommandTimeout': 'systemctl 命令执行超时', 'settings.dshErrorCommandFailed': 'systemctl 拒绝或未能执行 DSH 控制命令', 'settings.dshErrorServiceFailed': 'DSH 服务启动后进入 failed 状态', 'settings.dshErrorServiceTimeout': 'DSH 服务未在限时内进入运行状态', 'settings.dshErrorUpstreamTimeout': 'DSH 进程已运行,但 HTTP 接口未在限时内恢复', 'settings.dshErrorEventsTimeout': 'DSH 服务和 HTTP 已恢复,但实时消息通道未在限时内连接', 'settings.dshErrorOperationNotFound': '网关找不到该操作,可能在期间重启过', 'settings.dshErrorOperationProgress': '已有一个 DSH 启停操作正在执行', 'settings.dshErrorGeneric': '{msg}', 'settings.dshErrorDetail': '详情:{detail}',
|
|
905
935
|
'settings.hostDesc': 'DSH {version} · {cwd} · 附加会话 {n}',
|
|
906
936
|
'settings.updateTitle': '检查更新', 'settings.updateLoading': '加载中…', 'settings.downloadUpdate': '下载并安装更新', 'settings.check': '检查',
|
|
907
937
|
'settings.feedbackTitle': '反馈渠道', 'settings.feedbackDesc': 'GitHub / Gitee / B站:反馈 bug、提建议、唠嗑',
|
|
@@ -915,6 +945,7 @@
|
|
|
915
945
|
'feedback.cancel': '取消', 'feedback.submit': '提交',
|
|
916
946
|
'feedback.empty': '请填写描述内容', 'feedback.tooLong': '描述不能超过 2000 字',
|
|
917
947
|
'feedback.submitted': '已提交,感谢反馈',
|
|
948
|
+
'feedback.successTitle': '反馈发送成功', 'feedback.successBody': '服务器已确认收到这条反馈,感谢你的帮助。', 'feedback.successConfirm': '知道了',
|
|
918
949
|
'feedback.rateLimited': '提交太频繁,请稍后再试', 'feedback.rateLimitedAt': '提交太频繁,请 {n} 秒后再试', 'feedback.submitFailed': '提交失败:{msg}', 'feedback.networkError': '网络错误',
|
|
919
950
|
'settings.resetTitle': '清空本地数据', 'settings.resetDesc': '令牌与缓存', 'settings.reset': '重置',
|
|
920
951
|
'settings.confirmReset': '清除本地令牌、服务器与缓存?', 'settings.notifyDenied': '通知权限未开启',
|
|
@@ -943,6 +974,8 @@
|
|
|
943
974
|
'overview.activeSessions': 'Active sessions', 'overview.connectionMode': 'Connection mode', 'overview.ws': 'Live WS', 'overview.poll': 'Degraded polling', 'overview.noActivity': 'No background activity', 'overview.noSession': 'No sessions yet',
|
|
944
975
|
'overview.refresh': 'Refresh overview', 'overview.none': 'Nothing pending', 'overview.pendingCount': '{n} pending', 'overview.activeCount': '{n} active sessions',
|
|
945
976
|
'overview.action.openSession': 'Open recent session', 'overview.action.newSession': 'New session', 'overview.action.attention': 'Review pending', 'overview.action.connect': 'Set up connection', 'overview.action.refresh': 'Check connection',
|
|
977
|
+
'overview.communityEyebrow': 'COMMUNITY BOARD', 'overview.communityTitle': 'Announcements & polls', 'overview.communityHistory': 'History', 'overview.communityEmpty': 'No unread announcements',
|
|
978
|
+
'overview.communityPoll': 'Poll', 'overview.communityNotice': 'Notice', 'overview.communityNew': 'New', 'overview.communityVote': 'Vote now', 'overview.communityView': 'View notice', 'overview.communityVoted': 'Voted',
|
|
946
979
|
'statsPage.title': 'Token stats',
|
|
947
980
|
'statsPage.todayTokens': 'Tokens today', 'statsPage.todayCost': 'Cost today', 'statsPage.peakShare': 'Peak share',
|
|
948
981
|
'statsPage.input': 'Uncached input', 'statsPage.cacheRead': 'Cache read', 'statsPage.cacheWrite': 'Cache write', 'statsPage.output': 'Output',
|
|
@@ -954,7 +987,7 @@
|
|
|
954
987
|
'workspace.createTitle': 'New workspace', 'workspace.createDesc': 'Create a folder in the current file directory and open a new session there.', 'workspace.parent': 'Parent folder', 'workspace.namePlaceholder': 'For example: my-project', 'workspace.cancel': 'Cancel', 'workspace.create': 'Create & open', 'workspace.nameRequired': 'Enter a workspace name', 'workspace.exists': 'That folder already exists', 'workspace.invalidName': 'The name cannot contain path separators', 'workspace.createFailed': 'Could not create workspace: {msg}', 'workspace.created': 'Workspace created', 'workspace.createdNoSession': 'Workspace created, but the new session could not be opened',
|
|
955
988
|
'workspace.createTitle': 'New workspace', 'workspace.createDesc': 'Create a folder in the current file directory and open a new session there.', 'workspace.parent': 'Parent folder', 'workspace.namePlaceholder': 'For example: my-project', 'workspace.cancel': 'Cancel', 'workspace.create': 'Create & open', 'workspace.nameRequired': 'Enter a workspace name', 'workspace.created': 'Workspace created', 'workspace.sessionFailed': 'Folder created, but the new session could not be opened: {msg}',
|
|
956
989
|
'workspace.current': 'Current workspace', 'workspace.select': 'Select workspace', 'workspace.all': 'All workspaces', 'workspace.ungrouped': 'Ungrouped sessions', 'workspace.files': 'View files', 'workspace.allPath': 'Showing sessions from every DSH workspace',
|
|
957
|
-
'newSession.title': 'New session', 'newSession.workspace': 'Choose workspace', 'newSession.path': 'Workspace path', 'newSession.create': 'Create session', 'newSession.noWorkspaces': 'No DSH workspaces yet. Create a workspace first.', 'newSession.chooseWorkspace': 'Choose a workspace first',
|
|
990
|
+
'newSession.title': 'New session', 'newSession.workspace': 'Choose workspace', 'newSession.name': 'Workspace name', 'newSession.path': 'Workspace path', 'newSession.create': 'Create session', 'newSession.noWorkspaces': 'No DSH workspaces yet. Create a workspace first.', 'newSession.chooseWorkspace': 'Choose a workspace first',
|
|
958
991
|
'sessions.running': 'Running', 'sessions.statRunning': 'Running', 'sessions.statPending': 'Pending', 'sessions.statTotal': 'Sessions',
|
|
959
992
|
'sessions.sortLabel': 'Session sort', 'sessions.sortTime': 'By time', 'sessions.sortWorkspace': 'By workspace', 'sessions.workspace': 'Workspace', 'sessions.workspaceUnknown': 'No workspace',
|
|
960
993
|
'sessions.queueBadge': 'Queue {n}', 'sessions.goalBadge': 'Goal·{phase}',
|
|
@@ -1032,7 +1065,7 @@
|
|
|
1032
1065
|
'fs.workspace': 'DSH workspace', 'fs.root': 'File root', 'fs.previewTitle': 'File preview', 'fs.previewLoading': 'Loading file…', 'fs.previewFailed': 'Could not preview: {msg}', 'fs.previewUnsupported': 'This file type cannot be previewed', 'fs.previewTooLarge': 'File is larger than 1 MB; download it to view', 'fs.source': 'Source', 'fs.preview': 'Preview', 'fs.download': 'Download',
|
|
1033
1066
|
'fs.pullDown': 'Pull to refresh', 'fs.pullRelease': 'Release to refresh', 'fs.refreshing': 'Refreshing…',
|
|
1034
1067
|
'fs.noToken': 'No token set', 'fs.goSettings': 'Go to Settings and paste the gateway token first',
|
|
1035
|
-
'fs.notFound': 'Directory not found', 'fs.forbidden': 'Path is outside the allowed roots',
|
|
1068
|
+
'fs.notFound': 'Directory not found', 'fs.forbidden': 'Path is outside the allowed roots. Registered DSH workspaces are allowed automatically; configure DSH_REMOTE_FS_ROOT for other directories.',
|
|
1036
1069
|
'fs.loadFailed': 'Load failed: {msg}', 'fs.loadFailedToast': 'Failed to load file list: {msg}',
|
|
1037
1070
|
'fs.emptyDir': 'Empty directory', 'fs.dir': 'Directory',
|
|
1038
1071
|
'fs.downloadStarted': 'Downloading to "Download/dsh-remote"', 'fs.downloadFailed': 'Could not start download: {msg}',
|
|
@@ -1102,7 +1135,11 @@
|
|
|
1102
1135
|
'theme.panelTitle': 'Choose theme', 'theme.close': 'Close',
|
|
1103
1136
|
'settings.tokenTitle': 'Access token', 'settings.change': 'Change',
|
|
1104
1137
|
'settings.hostTitle': 'DSH status', 'settings.hostProbing': 'Probing…', 'settings.probe': 'Probe', 'settings.probeFailed': 'Probe failed',
|
|
1105
|
-
'settings.dshControlTitle': 'Remote DSH control', 'settings.dshControlProbing': '
|
|
1138
|
+
'settings.dshControlTitle': 'Remote DSH control', 'settings.dshControlProbing': 'Querying the gateway for the local systemd service…', 'settings.dshRunning': 'Running', 'settings.dshStopped': 'Stopped', 'settings.dshUnsupported': 'No controllable DSH service is configured', 'settings.dshStart': 'Start', 'settings.dshRestart': 'Restart', 'settings.dshStarting': '{action}ing DSH…', 'settings.dshStarted': 'DSH {action}ed', 'settings.dshFailed': 'DSH operation failed: {msg}',
|
|
1139
|
+
'settings.dshRunningDetail': 'Running · {service} · PID {pid} · {state}', 'settings.dshStoppedDetail': 'Stopped · {service} · {state}', 'settings.dshStatusFailed': 'Service status query failed: {msg}',
|
|
1140
|
+
'settings.dshStageQueued': 'Request reached the gateway; waiting to inspect the service', 'settings.dshStageChecking': 'Checking systemd user service {service}', 'settings.dshStageCommand': 'Service confirmed; submitting the {action} command', 'settings.dshStageWaitingService': 'Command accepted; waiting for the service process ({seconds}s)', 'settings.dshStageWaitingUpstream': 'Service process is running; waiting for the DSH HTTP endpoint ({seconds}s)', 'settings.dshStageWaitingEvents': 'DSH HTTP is ready; waiting for the realtime message channels ({seconds}s)',
|
|
1141
|
+
'settings.dshSuccessDetail': 'DSH {action} succeeded · PID {pid} · HTTP {status} · {seconds}s', 'settings.dshAlreadyRunning': 'DSH is already running · PID {pid}', 'settings.dshResultUnknown': 'The gateway connection was interrupted during the operation, so the final result is unknown. Reopen this page to check the service state.',
|
|
1142
|
+
'settings.dshErrorServiceNotFound': 'systemd user service {service} was not found. Install it or configure DSH_REMOTE_DSH_SERVICE first.', 'settings.dshErrorInvalidService': 'The configured DSH service name is invalid', 'settings.dshErrorSystemctlNotFound': 'systemctl is not available on this host', 'settings.dshErrorSystemdUnavailable': 'Could not connect to the current user systemd session', 'settings.dshErrorPermissionDenied': 'The current user cannot control the DSH service', 'settings.dshErrorCommandTimeout': 'The systemctl command timed out', 'settings.dshErrorCommandFailed': 'systemctl rejected or could not run the DSH control command', 'settings.dshErrorServiceFailed': 'The DSH service entered the failed state after startup', 'settings.dshErrorServiceTimeout': 'The DSH service did not enter the running state before timeout', 'settings.dshErrorUpstreamTimeout': 'The DSH process is running, but its HTTP endpoint did not recover before timeout', 'settings.dshErrorEventsTimeout': 'The DSH service and HTTP endpoint recovered, but the realtime message channels did not reconnect before timeout', 'settings.dshErrorOperationNotFound': 'The gateway no longer knows this operation; it may have restarted', 'settings.dshErrorOperationProgress': 'Another DSH start/restart operation is already running', 'settings.dshErrorGeneric': '{msg}', 'settings.dshErrorDetail': 'Detail: {detail}',
|
|
1106
1143
|
'settings.hostDesc': 'DSH {version} · {cwd} · {n} attached sessions',
|
|
1107
1144
|
'settings.updateTitle': 'Check for updates', 'settings.updateLoading': 'Loading…', 'settings.downloadUpdate': 'Download & install update', 'settings.check': 'Check',
|
|
1108
1145
|
'settings.feedbackTitle': 'Feedback', 'settings.feedbackDesc': 'GitHub / Gitee / Bilibili: report bugs, suggest features, or just chat',
|
|
@@ -1116,6 +1153,7 @@
|
|
|
1116
1153
|
'feedback.cancel': 'Cancel', 'feedback.submit': 'Submit',
|
|
1117
1154
|
'feedback.empty': 'Please fill in the description', 'feedback.tooLong': 'Description must be ≤2000 characters',
|
|
1118
1155
|
'feedback.submitted': 'Submitted — thanks!',
|
|
1156
|
+
'feedback.successTitle': 'Feedback sent', 'feedback.successBody': 'The server confirmed receipt of your feedback. Thank you for helping improve DSH Remote.', 'feedback.successConfirm': 'Got it',
|
|
1119
1157
|
'feedback.rateLimited': 'Too frequent, try again later', 'feedback.rateLimitedAt': 'Too frequent, try again in {n}s', 'feedback.submitFailed': 'Submit failed: {msg}', 'feedback.networkError': 'Network error',
|
|
1120
1158
|
'settings.resetTitle': 'Clear local data', 'settings.resetDesc': 'Token and caches', 'settings.reset': 'Reset',
|
|
1121
1159
|
'settings.confirmReset': 'Clear local token, servers and caches?', 'settings.notifyDenied': 'Notification permission not granted',
|
package/public/styles.css
CHANGED
|
@@ -149,10 +149,16 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
|
|
|
149
149
|
.workspace-select.full { margin: 7px 0 10px; }
|
|
150
150
|
.workspace-path-scroll {
|
|
151
151
|
display: block; min-width: 0; overflow-x: auto; overflow-y: hidden; white-space: nowrap;
|
|
152
|
-
scrollbar-width: thin;
|
|
152
|
+
scrollbar-width: thin; touch-action: pan-x; overscroll-behavior-inline: contain;
|
|
153
|
+
color: var(--dsr-text); background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); border-radius: 9px;
|
|
153
154
|
padding: 7px 9px; font-size: 11.5px; user-select: text;
|
|
154
155
|
}
|
|
155
156
|
.workspace-nav > .workspace-path-scroll { grid-column: 1 / -1; }
|
|
157
|
+
.workspace-name-block { display: grid; gap: 6px; margin: 2px 0 10px; color: var(--dsr-muted); font-size: 12px; }
|
|
158
|
+
.workspace-name-block strong {
|
|
159
|
+
min-width: 0; padding: 8px 10px; color: var(--dsr-text); background: var(--dsr-panel); border: 1px solid var(--dsr-line);
|
|
160
|
+
border-radius: 9px; font-size: 14px; line-height: 1.45; overflow-wrap: anywhere; user-select: text;
|
|
161
|
+
}
|
|
156
162
|
.workspace-path-block { display: grid; gap: 6px; margin-top: 2px; color: var(--dsr-muted); font-size: 12px; }
|
|
157
163
|
|
|
158
164
|
/* ---------- Token 统计(移动端) ---------- */
|
|
@@ -519,9 +525,25 @@ body.in-session .main { padding-bottom: 0; }
|
|
|
519
525
|
.overview-eyebrow { color:var(--dsr-accent-strong); font-size:10px; font-weight:800; letter-spacing:1.7px; line-height:1.3; }
|
|
520
526
|
.overview-title { margin:3px 0 2px; font-size:25px; line-height:1.18; letter-spacing:-.4px; }
|
|
521
527
|
.overview-subtitle { margin:0; color:var(--dsr-muted); font-size:12px; }
|
|
522
|
-
.overview-refresh { width:34px; height:34px; padding:0; border-radius:11px; font-size:18px; line-height:1; }
|
|
528
|
+
.overview-refresh { width:34px; height:34px; padding:0; display:grid; place-items:center; border-radius:11px; font-size:18px; line-height:1; }
|
|
523
529
|
.overview-refresh { color: var(--dsr-accent-strong); }
|
|
524
530
|
.overview-refresh svg { width:17px; height:17px; display:block; }
|
|
531
|
+
.overview-board { margin-bottom:14px; padding:14px; border:1px solid var(--dsr-accent-line); border-radius:16px; background:linear-gradient(145deg,var(--dsr-accent-soft),var(--dsr-panel) 55%,var(--dsr-bg-2)); box-shadow:0 8px 22px var(--dsr-shadow); }
|
|
532
|
+
.overview-board-head { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:11px; }
|
|
533
|
+
.overview-board-head h2 { margin:3px 0 0; color:var(--dsr-text); font-size:18px; line-height:1.25; letter-spacing:-.2px; }
|
|
534
|
+
.overview-announcement-list { display:grid; gap:8px; }
|
|
535
|
+
.overview-announcement-card { width:100%; min-width:0; display:block; padding:12px; border:1px solid var(--dsr-line); border-radius:13px; background:var(--dsr-bg-2); color:var(--dsr-text); text-align:left; cursor:pointer; }
|
|
536
|
+
.overview-announcement-card.poll { border-color:var(--dsr-accent-line); }
|
|
537
|
+
.overview-announcement-card:active { background:var(--dsr-panel-2); }
|
|
538
|
+
.overview-announcement-meta { display:flex; align-items:center; gap:7px; min-width:0; margin-bottom:7px; color:var(--dsr-muted); font-size:10.5px; }
|
|
539
|
+
.overview-announcement-badge { flex:0 0 auto; padding:2px 7px; border-radius:999px; background:var(--dsr-panel); border:1px solid var(--dsr-line); color:var(--dsr-muted); font-size:10px; font-weight:750; }
|
|
540
|
+
.overview-announcement-card.poll .overview-announcement-badge { background:var(--dsr-accent-soft); border-color:var(--dsr-accent-line); color:var(--dsr-accent-strong); }
|
|
541
|
+
.overview-announcement-new { flex:0 0 auto; padding:1px 6px; border-radius:999px; background:var(--dsr-error-soft); color:var(--dsr-error); font-size:9.5px; font-weight:800; }
|
|
542
|
+
.overview-announcement-date { min-width:0; margin-left:auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
543
|
+
.overview-announcement-title { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:13.5px; font-weight:750; }
|
|
544
|
+
.overview-announcement-copy { display:-webkit-box; margin-top:4px; overflow:hidden; -webkit-box-orient:vertical; -webkit-line-clamp:2; color:var(--dsr-muted); font-size:11.5px; line-height:1.55; }
|
|
545
|
+
.overview-announcement-footer { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:10px; padding-top:8px; border-top:1px solid var(--dsr-line); color:var(--dsr-accent-strong); font-size:11px; font-weight:700; }
|
|
546
|
+
.overview-announcement-footer span:last-child { flex:0 0 auto; font-size:16px; font-weight:500; }
|
|
525
547
|
.overview-pulse-card { position:relative; overflow:hidden; display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px 12px; align-items:center; padding:14px; margin-bottom:14px; border:1px solid var(--dsr-accent-line); border-radius:16px; background:linear-gradient(135deg,var(--dsr-panel),var(--dsr-bg-2)); box-shadow:0 10px 26px var(--dsr-shadow); }
|
|
526
548
|
.overview-pulse-card::after { content:""; position:absolute; width:110px; height:110px; right:-45px; top:-55px; border-radius:50%; background:var(--dsr-accent-soft); filter:blur(3px); pointer-events:none; }
|
|
527
549
|
.overview-pulse-copy { min-width:0; align-self:start; }
|
|
@@ -660,6 +682,13 @@ button.overview-attention-item, button.overview-session-item { cursor:pointer; }
|
|
|
660
682
|
.setting-desc.expanded { white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; }
|
|
661
683
|
.setting-select { min-width: 112px; max-width: 145px; padding: 7px 9px; border-radius: 10px; border: 1px solid var(--dsr-line); background: var(--dsr-bg-2); color: var(--dsr-text); font: inherit; font-size: 12px; }
|
|
662
684
|
.setting-actions { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
|
|
685
|
+
.dsh-control-steps { display:flex; flex-direction:column; gap:5px; margin-top:8px; padding:8px 9px; border:1px solid var(--dsr-line); border-radius:10px; background:var(--dsr-bg-2); }
|
|
686
|
+
.dsh-control-step { display:grid; grid-template-columns:16px minmax(0,1fr); gap:6px; align-items:start; color:var(--dsr-muted); font-size:11px; line-height:1.45; }
|
|
687
|
+
.dsh-control-step.current { color:var(--dsr-accent-strong); }
|
|
688
|
+
.dsh-control-step.success { color:var(--dsr-success); }
|
|
689
|
+
.dsh-control-step.failed { color:var(--dsr-error); }
|
|
690
|
+
.dsh-control-step-mark { text-align:center; font-weight:800; }
|
|
691
|
+
.dsh-control-step-detail { grid-column:2; color:var(--dsr-muted); white-space:pre-wrap; overflow-wrap:anywhere; }
|
|
663
692
|
.about { text-align: center; color: var(--dsr-muted); font-size: 12px; margin-top: 16px; line-height: 1.8; }
|
|
664
693
|
|
|
665
694
|
/* 多服务器列表(分组) */
|
|
@@ -860,6 +889,16 @@ button.overview-attention-item, button.overview-session-item { cursor:pointer; }
|
|
|
860
889
|
}
|
|
861
890
|
.fb-textarea:focus, .fb-input:focus { border-color: var(--dsr-accent-line); }
|
|
862
891
|
.fb-input { min-height: 42px; }
|
|
892
|
+
.feedback-success-card { max-width: 360px; text-align: center; padding: 22px 20px 18px; }
|
|
893
|
+
.feedback-success-icon {
|
|
894
|
+
width: 52px; height: 52px; display: grid; place-items: center; margin: 0 auto 13px; border-radius: 50%;
|
|
895
|
+
color: var(--dsr-success); background: var(--dsr-success-soft); border: 1px solid var(--dsr-success-line);
|
|
896
|
+
}
|
|
897
|
+
.feedback-success-icon svg { width: 28px; height: 28px; }
|
|
898
|
+
.feedback-success-title { margin-bottom: 8px; font-size: 18px; }
|
|
899
|
+
.feedback-success-body { color: var(--dsr-muted); line-height: 1.65; }
|
|
900
|
+
.feedback-success-card .modal-actions { justify-content: stretch; }
|
|
901
|
+
.feedback-success-card .modal-actions .btn { flex: 1; min-height: 42px; }
|
|
863
902
|
|
|
864
903
|
/* ---------- 模态 ---------- */
|
|
865
904
|
.modal {
|
package/public/update.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.6.
|
|
2
|
+
"version": "0.6.12",
|
|
3
3
|
"apkUrl": "dsh-remote.apk",
|
|
4
|
-
"sha256": "
|
|
5
|
-
"releasedAt": "2026-08-
|
|
6
|
-
"notes": "0.6.
|
|
4
|
+
"sha256": "99211eee40cd121fce38fb3a9a3b85a5fcfde28546bccdac246574b38d6adb3f",
|
|
5
|
+
"releasedAt": "2026-08-23T14:05:30.412Z",
|
|
6
|
+
"notes": "0.6.12:修复远程启动和重启 DSH 时统一报 HTTP 502 且无法确认结果的问题;改为异步追踪 systemd 服务检查、命令提交、进程启动、DSH HTTP 恢复和 mux/host 实时通道重连阶段,成功时显示 PID、HTTP 状态和用时,失败时区分服务不存在、systemd 不可用、权限不足、命令失败、服务失败、启动超时、HTTP 恢复超时和实时通道恢复超时;优化工作区会话筛选、文件预览和应用内选择器;新增中央投票公告与反馈成功确认;主页公告栏常驻并在无未读公告时显示空状态,同时修正设置页异常右箭头、主页刷新图标居中和周末谷时提醒。",
|
|
7
7
|
"history": [
|
|
8
|
+
{
|
|
9
|
+
"version": "0.6.12",
|
|
10
|
+
"notes": "0.6.12:修复远程启动和重启 DSH 时统一报 HTTP 502 且无法确认结果的问题;改为异步追踪 systemd 服务检查、命令提交、进程启动、DSH HTTP 恢复和 mux/host 实时通道重连阶段,成功时显示 PID、HTTP 状态和用时,失败时区分服务不存在、systemd 不可用、权限不足、命令失败、服务失败、启动超时、HTTP 恢复超时和实时通道恢复超时;优化工作区会话筛选、文件预览和应用内选择器;新增中央投票公告与反馈成功确认;主页公告栏常驻并在无未读公告时显示空状态,同时修正设置页异常右箭头、主页刷新图标居中和周末谷时提醒。"
|
|
11
|
+
},
|
|
8
12
|
{
|
|
9
13
|
"version": "0.6.11",
|
|
10
|
-
"notes": "0.6.11 正式版:新增按 DSH 工作区筛选、切换和创建会话,文件页支持切换工作区并直接预览常见文本与 Markdown
|
|
14
|
+
"notes": "0.6.11 正式版:新增按 DSH 工作区筛选、切换和创建会话,文件页支持切换工作区并直接预览常见文本与 Markdown;修复工作区筛选未正确收敛会话、工作区位于默认文件根外时无法查看,以及新会话工作区名称与完整路径显示异常;新增投票公告及隐私化汇总;统一手机端应用内选择抽屉;周末全天按谷时并修复重复峰谷提醒;插件侧栏图标采用亮色背景并随插件自身四套皮肤切换配色;加强网关安装、连接与故障排查引导。"
|
|
11
15
|
},
|
|
12
16
|
{
|
|
13
17
|
"version": "0.6.10",
|
|
@@ -40,10 +44,6 @@
|
|
|
40
44
|
{
|
|
41
45
|
"version": "0.6.3",
|
|
42
46
|
"notes": "修复 DSH 重启后网关 upstream 端口不刷新(Issue #1):/health 增加 upstream/upstreamOk/pid 探测;插件 ensureGateway 检测上游变化或不可达时自动杀旧网关并按新 DSH_UPSTREAM 重启;启动/刷新写插件日志与 PID 文件。"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"version": "0.6.2",
|
|
46
|
-
"notes": "桌面端 WebUI:设置页清理与输入区饱满化;新增会话功能(goal/todo/subagent/模型切换/思考深度);预设提示词管理与空状态引导;更新弹窗改为按正式版逐版展示历史(App/桌面端);移除通知分组;聊天宽度约 680px、输入框按钮对齐。"
|
|
47
47
|
}
|
|
48
48
|
]
|
|
49
49
|
}
|
package/public/version.json
CHANGED