dsh-remote-plugin 0.6.4 → 0.6.6
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 +1 -1
- package/README.md +1 -1
- package/apk/dsh-remote.apk +0 -0
- package/gateway-stats.cjs +9 -2
- package/gateway.cjs +209 -9
- package/index.mjs +52 -12
- package/package.json +1 -1
- package/public/app.js +360 -36
- package/public/desktop/desktop.css +34 -3
- package/public/desktop/desktop.html +37 -7
- package/public/desktop/desktop.js +281 -27
- package/public/index.html +52 -11
- package/public/styles.css +38 -4
- package/public/update.json +12 -4
- package/public/version.json +1 -1
package/public/index.html
CHANGED
|
@@ -33,7 +33,14 @@
|
|
|
33
33
|
<div class="stat-strip" id="stat-strip"></div>
|
|
34
34
|
<div class="section-head">
|
|
35
35
|
<span data-i18n="nav.sessions">会话</span>
|
|
36
|
-
<
|
|
36
|
+
<div class="section-actions">
|
|
37
|
+
<select id="session-sort" class="session-sort" data-i18n-aria="sessions.sortLabel">
|
|
38
|
+
<option value="time" data-i18n="sessions.sortTime">按时间</option>
|
|
39
|
+
<option value="workspace" data-i18n="sessions.sortWorkspace">按工作区</option>
|
|
40
|
+
</select>
|
|
41
|
+
<button id="btn-new-workspace" class="mini-btn" data-i18n="home.newWorkspace">+ 工作区</button>
|
|
42
|
+
<button id="btn-new-session" class="mini-btn" data-i18n="home.newSession">+ 新会话</button>
|
|
43
|
+
</div>
|
|
37
44
|
</div>
|
|
38
45
|
<div id="session-list" class="session-list"></div>
|
|
39
46
|
<div id="home-empty" class="empty hidden" data-i18n="home.empty">暂无会话</div>
|
|
@@ -44,6 +51,7 @@
|
|
|
44
51
|
<div class="fs-head">
|
|
45
52
|
<button id="fs-up" class="icon-btn" data-i18n-title="fs.up" data-i18n-aria="fs.up">‹</button>
|
|
46
53
|
<div id="fs-path" class="fs-path" data-i18n="fs.loading">加载中…</div>
|
|
54
|
+
<button id="fs-new-workspace" class="mini-btn" data-i18n="fs.newWorkspace">新建工作区</button>
|
|
47
55
|
<button id="fs-upload-btn" class="mini-btn" data-i18n="fs.upload">上传</button>
|
|
48
56
|
<button id="fs-refresh" class="icon-btn" data-i18n-title="a11y.refresh" data-i18n-aria="a11y.refresh">⟳</button>
|
|
49
57
|
</div>
|
|
@@ -328,6 +336,13 @@
|
|
|
328
336
|
<div><div class="setting-name" data-i18n="settings.hostTitle">DSH 状态</div><div class="setting-desc" id="host-desc" data-i18n="settings.hostProbing">探测中…</div></div>
|
|
329
337
|
<button id="btn-host-describe" class="mini-btn" data-i18n="settings.probe">探测</button>
|
|
330
338
|
</div>
|
|
339
|
+
<div class="setting-row">
|
|
340
|
+
<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>
|
|
341
|
+
<div class="setting-actions">
|
|
342
|
+
<button id="btn-dsh-start" class="mini-btn" data-i18n="settings.dshStart">启动</button>
|
|
343
|
+
<button id="btn-dsh-restart" class="mini-btn" data-i18n="settings.dshRestart">重启</button>
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
331
346
|
<div class="setting-row">
|
|
332
347
|
<div><div class="setting-name" data-i18n="settings.updateTitle">检查更新</div><div class="setting-desc" id="update-desc" data-i18n="settings.updateLoading">加载中…</div>
|
|
333
348
|
<button id="btn-download-update" class="mini-btn hidden" style="margin-top:6px" data-i18n="settings.downloadUpdate">下载并安装更新</button>
|
|
@@ -418,6 +433,22 @@
|
|
|
418
433
|
</div>
|
|
419
434
|
</div>
|
|
420
435
|
|
|
436
|
+
<!-- 新建工作区模态 -->
|
|
437
|
+
<div id="modal-workspace" class="modal hidden">
|
|
438
|
+
<div class="modal-card">
|
|
439
|
+
<div class="modal-title" data-i18n="workspace.createTitle">新建工作区</div>
|
|
440
|
+
<div class="modal-body">
|
|
441
|
+
<p class="workspace-create-desc" data-i18n="workspace.createDesc">将在当前文件目录下创建文件夹,并自动打开新会话。</p>
|
|
442
|
+
<div class="workspace-create-location"><span data-i18n="workspace.parent">父目录</span><code id="workspace-parent-path">~</code></div>
|
|
443
|
+
<input id="workspace-name" class="fb-input" maxlength="120" autocomplete="off" data-i18n-placeholder="workspace.namePlaceholder" placeholder="例如:my-project">
|
|
444
|
+
</div>
|
|
445
|
+
<div class="modal-actions">
|
|
446
|
+
<button id="workspace-cancel" class="btn subtle" data-i18n="workspace.cancel">取消</button>
|
|
447
|
+
<button id="workspace-create" class="btn primary" data-i18n="workspace.create">创建并打开</button>
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
|
|
421
452
|
<!-- goal 模态 -->
|
|
422
453
|
<div id="modal-goal" class="modal hidden">
|
|
423
454
|
<div class="modal-card">
|
|
@@ -491,6 +522,7 @@
|
|
|
491
522
|
zh: {
|
|
492
523
|
'a11y.hostAdmin': '主机管理', 'a11y.refresh': '刷新', 'a11y.more': '更多操作', 'a11y.moreTitle': '指令/权限/模型',
|
|
493
524
|
'conn.on': '已连接', 'conn.off': '未连接', 'conn.reconnecting': '连接中断,正在重连…',
|
|
525
|
+
'conn.reconnectIn': '重连中 {n}s', 'conn.offline': '离线', 'conn.failed': '连接失败',
|
|
494
526
|
'conn.poll': '轮询', 'conn.pollTitle': '当前网络不支持实时推送,已降级为轮询(延迟数秒)',
|
|
495
527
|
'conn.titleGroup': '{group} · {url}({ms})',
|
|
496
528
|
'common.refreshing': '刷新中…',
|
|
@@ -501,8 +533,11 @@
|
|
|
501
533
|
'statsPage.peak': '高峰', 'statsPage.off': '空闲', 'statsPage.days': '近 {n} 天',
|
|
502
534
|
'statsPage.gatewayDown': '统计需要网关运行', 'statsPage.empty': '暂无统计,产生会话后自动聚合',
|
|
503
535
|
'statsPage.note': '注:本数据仅在使用 DeepSeek 官方 API 时估算;基于 token 计算,与官网账单可能有出入,一切以官网为准。统计自 2026-08-17 定价生效日起。',
|
|
504
|
-
'home.newSession': '+ 新会话', 'home.empty': '暂无会话', 'home.createFailed': '新建会话失败', 'home.created': '会话已创建',
|
|
536
|
+
'home.newSession': '+ 新会话', 'home.newWorkspace': '+ 工作区', 'home.empty': '暂无会话', 'home.createFailed': '新建会话失败', 'home.created': '会话已创建',
|
|
537
|
+
'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': '工作区已创建,但新会话未能打开',
|
|
538
|
+
'workspace.createTitle': '新建工作区', 'workspace.createDesc': '将在当前文件目录下创建文件夹,并自动打开新会话。', 'workspace.parent': '父目录', 'workspace.namePlaceholder': '例如:my-project', 'workspace.cancel': '取消', 'workspace.create': '创建并打开', 'workspace.nameRequired': '请输入工作区名称', 'workspace.created': '工作区已创建', 'workspace.sessionFailed': '目录已创建,但新会话打开失败:{msg}',
|
|
505
539
|
'sessions.running': '运行中', 'sessions.statRunning': '运行中', 'sessions.statPending': '待处理', 'sessions.statTotal': '会话总数',
|
|
540
|
+
'sessions.sortLabel': '会话排序', 'sessions.sortTime': '按时间', 'sessions.sortWorkspace': '按工作区', 'sessions.workspace': '工作区', 'sessions.workspaceUnknown': '未指定工作区',
|
|
506
541
|
'sessions.queueBadge': '队列 {n}', 'sessions.goalBadge': '目标·{phase}',
|
|
507
542
|
'sessions.cacheFallback': '网络不可用:显示本地缓存的会话列表',
|
|
508
543
|
'err.badResponse': '坏响应', 'err.dshError': 'DSH 返回错误', 'err.accessDenied': '访问被拒绝:请检查令牌',
|
|
@@ -569,11 +604,11 @@
|
|
|
569
604
|
'pending.title': '待处理', 'pending.count': '{n} 项', 'pending.approvalTitle': '🔧 {tool} 请求批准', 'pending.noReason': '无说明',
|
|
570
605
|
'pending.allow': '允许', 'pending.reject': '拒绝', 'pending.question': '❓ {question}',
|
|
571
606
|
'pending.questionCount': '共 {n} 个问题', 'pending.answer': '去回答', 'pending.empty': '暂无待处理事项',
|
|
572
|
-
'pending.allowed': '已允许', 'pending.rejected': '已拒绝', 'pending.stale': '审批已不在待处理状态',
|
|
607
|
+
'pending.allowed': '已允许', 'pending.rejected': '已拒绝', 'pending.stale': '审批已不在待处理状态', 'pending.submitFailed': '审批提交失败:{msg}',
|
|
573
608
|
'question.customPlaceholder': '其他 / 自定义回答(可选)', 'question.needAnswer': '请先选择或填写回答',
|
|
574
|
-
'question.submitted': '已提交回答', 'question.stale': '提问已不在待处理状态',
|
|
609
|
+
'question.submitted': '已提交回答', 'question.stale': '提问已不在待处理状态', 'question.submitFailed': '回答提交失败:{msg}',
|
|
575
610
|
'jobs.title': '后台任务', 'jobs.empty': '暂无后台任务',
|
|
576
|
-
'fs.loading': '加载中…', 'fs.up': '返回上级', 'fs.upload': '上传', 'fs.pause': '暂停', 'fs.resume': '继续', 'fs.cancel': '取消',
|
|
611
|
+
'fs.loading': '加载中…', 'fs.up': '返回上级', 'fs.newWorkspace': '新建工作区', 'fs.upload': '上传', 'fs.pause': '暂停', 'fs.resume': '继续', 'fs.cancel': '取消',
|
|
577
612
|
'fs.pullDown': '下拉刷新', 'fs.pullRelease': '松开刷新', 'fs.refreshing': '刷新中…',
|
|
578
613
|
'fs.noToken': '未设置令牌', 'fs.goSettings': '请先到「设置」页粘贴网关令牌',
|
|
579
614
|
'fs.notFound': '目录不存在', 'fs.forbidden': '路径不在允许范围内',
|
|
@@ -624,7 +659,7 @@
|
|
|
624
659
|
'peakRemind.peak0912': '高峰 9:00-12:00', 'peakRemind.off1214': '空闲 12:00-14:00',
|
|
625
660
|
'peakRemind.peak1418': '高峰 14:00-18:00', 'peakRemind.off1809': '空闲 18:00-次日 9:00',
|
|
626
661
|
'peakRemind.browserOnly': '峰谷提醒仅在 App 内有效',
|
|
627
|
-
'peakRemind.on': '峰谷提醒已开启', 'peakRemind.off': '峰谷提醒已关闭',
|
|
662
|
+
'peakRemind.on': '峰谷提醒已开启', 'peakRemind.off': '峰谷提醒已关闭', 'peakRemind.failed': '峰谷提醒服务启动失败,请重试',
|
|
628
663
|
'settings.bgTitle': '后台轮询', 'settings.bgDesc': '退后台后由前台服务定时拉取事件,待办审批/提问不遗漏',
|
|
629
664
|
'settings.bgIntervalTitle': '轮询间隔', 'settings.bgIntervalDesc': '灭屏后系统可能拉长间隔(Doze 平台限制)',
|
|
630
665
|
'settings.bgInterval30s': '30 秒', 'settings.bgInterval1m': '1 分钟', 'settings.bgInterval5m': '5 分钟', 'settings.bgInterval15m': '15 分钟',
|
|
@@ -645,6 +680,7 @@
|
|
|
645
680
|
'theme.panelTitle': '选择配色', 'theme.close': '关闭',
|
|
646
681
|
'settings.tokenTitle': '访问令牌', 'settings.change': '更换',
|
|
647
682
|
'settings.hostTitle': 'DSH 状态', 'settings.hostProbing': '探测中…', 'settings.probe': '探测', 'settings.probeFailed': '探测失败',
|
|
683
|
+
'settings.dshControlTitle': '远程启动 DSH', 'settings.dshControlProbing': '检查本机服务状态…', 'settings.dshRunning': '运行中', 'settings.dshStopped': '已停止', 'settings.dshUnsupported': '当前系统未配置可控的 DSH 服务', 'settings.dshStart': '启动', 'settings.dshRestart': '重启', 'settings.dshStarting': '正在{action} DSH…', 'settings.dshStarted': 'DSH 已{action}', 'settings.dshFailed': 'DSH 操作失败:{msg}',
|
|
648
684
|
'settings.hostDesc': 'DSH {version} · {cwd} · 附加会话 {n}',
|
|
649
685
|
'settings.updateTitle': '检查更新', 'settings.updateLoading': '加载中…', 'settings.downloadUpdate': '下载并安装更新', 'settings.check': '检查',
|
|
650
686
|
'settings.feedbackTitle': '反馈渠道', 'settings.feedbackDesc': 'GitHub / Gitee / B站:反馈 bug、提建议、唠嗑',
|
|
@@ -672,6 +708,7 @@
|
|
|
672
708
|
en: {
|
|
673
709
|
'a11y.hostAdmin': 'Host admin', 'a11y.refresh': 'Refresh', 'a11y.more': 'More actions', 'a11y.moreTitle': 'Commands / Permissions / Models',
|
|
674
710
|
'conn.on': 'Connected', 'conn.off': 'Offline', 'conn.reconnecting': 'Connection lost, reconnecting…',
|
|
711
|
+
'conn.reconnectIn': 'Reconnecting {n}s', 'conn.offline': 'Offline', 'conn.failed': 'Connection failed',
|
|
675
712
|
'conn.poll': 'Polling', 'conn.pollTitle': 'Realtime push is unavailable on this network; degraded to polling (a few seconds delay)',
|
|
676
713
|
'conn.titleGroup': '{group} · {url} ({ms})',
|
|
677
714
|
'common.refreshing': 'Refreshing…',
|
|
@@ -682,8 +719,11 @@
|
|
|
682
719
|
'statsPage.peak': 'Peak', 'statsPage.off': 'Off-peak', 'statsPage.days': 'Last {n} days',
|
|
683
720
|
'statsPage.gatewayDown': 'Stats require the gateway', 'statsPage.empty': 'No stats yet — they aggregate as sessions happen',
|
|
684
721
|
'statsPage.note': 'Note: estimates assume the official DeepSeek API. Token-based calculation may differ from the official bill; always defer to deepseek.com. Stats start from the 2026-08-17 pricing date.',
|
|
685
|
-
'home.newSession': '+ New session', 'home.empty': 'No sessions yet', 'home.createFailed': 'Failed to create session', 'home.created': 'Session created',
|
|
722
|
+
'home.newSession': '+ New session', 'home.newWorkspace': '+ Workspace', 'home.empty': 'No sessions yet', 'home.createFailed': 'Failed to create session', 'home.created': 'Session created',
|
|
723
|
+
'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',
|
|
724
|
+
'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}',
|
|
686
725
|
'sessions.running': 'Running', 'sessions.statRunning': 'Running', 'sessions.statPending': 'Pending', 'sessions.statTotal': 'Sessions',
|
|
726
|
+
'sessions.sortLabel': 'Session sort', 'sessions.sortTime': 'By time', 'sessions.sortWorkspace': 'By workspace', 'sessions.workspace': 'Workspace', 'sessions.workspaceUnknown': 'No workspace',
|
|
687
727
|
'sessions.queueBadge': 'Queue {n}', 'sessions.goalBadge': 'Goal·{phase}',
|
|
688
728
|
'sessions.cacheFallback': 'Network unavailable: showing cached session list',
|
|
689
729
|
'err.badResponse': 'Bad response', 'err.dshError': 'DSH returned an error', 'err.accessDenied': 'Access denied: check your token',
|
|
@@ -750,11 +790,11 @@
|
|
|
750
790
|
'pending.title': 'Inbox', 'pending.count': '{n} items', 'pending.approvalTitle': '🔧 {tool} requests approval', 'pending.noReason': 'No reason given',
|
|
751
791
|
'pending.allow': 'Allow', 'pending.reject': 'Reject', 'pending.question': '❓ {question}',
|
|
752
792
|
'pending.questionCount': '{n} questions', 'pending.answer': 'Answer', 'pending.empty': 'Nothing pending',
|
|
753
|
-
'pending.allowed': 'Allowed', 'pending.rejected': 'Rejected', 'pending.stale': 'Approval is no longer pending',
|
|
793
|
+
'pending.allowed': 'Allowed', 'pending.rejected': 'Rejected', 'pending.stale': 'Approval is no longer pending', 'pending.submitFailed': 'Approval failed: {msg}',
|
|
754
794
|
'question.customPlaceholder': 'Other / custom answer (optional)', 'question.needAnswer': 'Select or type an answer first',
|
|
755
|
-
'question.submitted': 'Answer submitted', 'question.stale': 'Question is no longer pending',
|
|
795
|
+
'question.submitted': 'Answer submitted', 'question.stale': 'Question is no longer pending', 'question.submitFailed': 'Answer failed: {msg}',
|
|
756
796
|
'jobs.title': 'Background jobs', 'jobs.empty': 'No background jobs',
|
|
757
|
-
'fs.loading': 'Loading…', 'fs.up': 'Up one level', 'fs.upload': 'Upload', 'fs.pause': 'Pause', 'fs.resume': 'Resume', 'fs.cancel': 'Cancel',
|
|
797
|
+
'fs.loading': 'Loading…', 'fs.up': 'Up one level', 'fs.newWorkspace': 'New workspace', 'fs.upload': 'Upload', 'fs.pause': 'Pause', 'fs.resume': 'Resume', 'fs.cancel': 'Cancel',
|
|
758
798
|
'fs.pullDown': 'Pull to refresh', 'fs.pullRelease': 'Release to refresh', 'fs.refreshing': 'Refreshing…',
|
|
759
799
|
'fs.noToken': 'No token set', 'fs.goSettings': 'Go to Settings and paste the gateway token first',
|
|
760
800
|
'fs.notFound': 'Directory not found', 'fs.forbidden': 'Path is outside the allowed roots',
|
|
@@ -805,7 +845,7 @@
|
|
|
805
845
|
'peakRemind.peak0912': 'Peak 9:00-12:00', 'peakRemind.off1214': 'Off-peak 12:00-14:00',
|
|
806
846
|
'peakRemind.peak1418': 'Peak 14:00-18:00', 'peakRemind.off1809': 'Off-peak 18:00-9:00 next day',
|
|
807
847
|
'peakRemind.browserOnly': 'Peak reminders only work in the app',
|
|
808
|
-
'peakRemind.on': 'Peak reminders enabled', 'peakRemind.off': 'Peak reminders disabled',
|
|
848
|
+
'peakRemind.on': 'Peak reminders enabled', 'peakRemind.off': 'Peak reminders disabled', 'peakRemind.failed': 'Could not start peak reminder service; try again',
|
|
809
849
|
'settings.bgTitle': 'Background polling', 'settings.bgDesc': 'A foreground service polls events while the app is in the background, so approvals/questions are not missed',
|
|
810
850
|
'settings.bgIntervalTitle': 'Polling interval', 'settings.bgIntervalDesc': 'Screen-off may stretch the interval (Doze platform limit)',
|
|
811
851
|
'settings.bgInterval30s': '30 seconds', 'settings.bgInterval1m': '1 minute', 'settings.bgInterval5m': '5 minutes', 'settings.bgInterval15m': '15 minutes',
|
|
@@ -826,6 +866,7 @@
|
|
|
826
866
|
'theme.panelTitle': 'Choose theme', 'theme.close': 'Close',
|
|
827
867
|
'settings.tokenTitle': 'Access token', 'settings.change': 'Change',
|
|
828
868
|
'settings.hostTitle': 'DSH status', 'settings.hostProbing': 'Probing…', 'settings.probe': 'Probe', 'settings.probeFailed': 'Probe failed',
|
|
869
|
+
'settings.dshControlTitle': 'Remote DSH control', 'settings.dshControlProbing': 'Checking local 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}',
|
|
829
870
|
'settings.hostDesc': 'DSH {version} · {cwd} · {n} attached sessions',
|
|
830
871
|
'settings.updateTitle': 'Check for updates', 'settings.updateLoading': 'Loading…', 'settings.downloadUpdate': 'Download & install update', 'settings.check': 'Check',
|
|
831
872
|
'settings.feedbackTitle': 'Feedback', 'settings.feedbackDesc': 'GitHub / Gitee / Bilibili: report bugs, suggest features, or just chat',
|
package/public/styles.css
CHANGED
|
@@ -120,9 +120,17 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
|
|
|
120
120
|
|
|
121
121
|
.section-head {
|
|
122
122
|
display: flex; align-items: center; justify-content: space-between;
|
|
123
|
-
margin: 14px 2px 8px; font-size: 13px; font-weight: 700; color: var(--dsr-muted);
|
|
123
|
+
gap: 8px; min-width: 0; margin: 14px 2px 8px; font-size: 13px; font-weight: 700; color: var(--dsr-muted);
|
|
124
124
|
letter-spacing: 1px;
|
|
125
125
|
}
|
|
126
|
+
.section-head > span:first-child { min-width: 0; }
|
|
127
|
+
.section-actions { display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-width: 0; flex-wrap: wrap; }
|
|
128
|
+
.session-sort {
|
|
129
|
+
min-width: 0; max-width: 112px; height: 30px; padding: 0 7px;
|
|
130
|
+
color: var(--dsr-muted); background: var(--dsr-panel); border: 1px solid var(--dsr-line);
|
|
131
|
+
border-radius: 8px; font: inherit; font-size: 11px; outline: none;
|
|
132
|
+
}
|
|
133
|
+
.session-sort:focus { border-color: var(--dsr-accent-line); color: var(--dsr-text); }
|
|
126
134
|
.section-head.small { margin-top: 6px; }
|
|
127
135
|
|
|
128
136
|
/* ---------- Token 统计(移动端) ---------- */
|
|
@@ -155,7 +163,7 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
|
|
|
155
163
|
.session-list { display: flex; flex-direction: column; gap: 8px; }
|
|
156
164
|
.session-card {
|
|
157
165
|
background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: var(--dsr-radius);
|
|
158
|
-
padding: 12px 13px; position: relative; overflow: hidden;
|
|
166
|
+
flex: 0 0 auto; padding: 12px 13px; position: relative; overflow: hidden;
|
|
159
167
|
}
|
|
160
168
|
.session-card:active { background: var(--dsr-panel-2); }
|
|
161
169
|
.session-card.current { border-color: var(--dsr-accent-line); box-shadow: 0 0 0 1px var(--dsr-accent-soft); }
|
|
@@ -164,6 +172,20 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
|
|
|
164
172
|
text-overflow: ellipsis; padding-right: 44px;
|
|
165
173
|
}
|
|
166
174
|
.sc-meta { display: flex; gap: 8px; align-items: center; margin-top: 4px; font-size: 12px; color: var(--dsr-muted); flex-wrap: wrap; }
|
|
175
|
+
.sc-workspace {
|
|
176
|
+
min-width: 0; margin-top: 5px; padding-right: 28px; color: var(--dsr-muted); font-size: 11px;
|
|
177
|
+
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
178
|
+
}
|
|
179
|
+
.session-group-label {
|
|
180
|
+
display: flex; align-items: center; gap: 6px; flex: 0 0 auto; min-width: 0; min-height: 28px;
|
|
181
|
+
box-sizing: border-box; margin: 8px 2px 0; padding: 6px 8px 4px; border-bottom: 1px solid var(--dsr-line);
|
|
182
|
+
color: var(--dsr-accent-strong); font-size: 11px; font-weight: 700;
|
|
183
|
+
}
|
|
184
|
+
.session-group-icon { flex: 0 0 auto; color: var(--dsr-accent-2); font-size: 12px; }
|
|
185
|
+
.session-group-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
186
|
+
.session-list.workspace-sorted .sc-workspace { display: none; }
|
|
187
|
+
.session-list.workspace-sorted .session-card { padding-top: 11px; padding-bottom: 11px; }
|
|
188
|
+
}
|
|
167
189
|
.sc-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--dsr-line); display: inline-block; }
|
|
168
190
|
.sc-dot.running { background: var(--dsr-warning); box-shadow: 0 0 8px var(--dsr-warning-line); animation: pulse 1.6s infinite; }
|
|
169
191
|
.sc-dot.pending { background: var(--dsr-accent-2); box-shadow: 0 0 8px var(--dsr-accent-2-line); }
|
|
@@ -404,9 +426,9 @@ body.in-session .main { padding-bottom: 84px; }
|
|
|
404
426
|
.job-state { font-size: 12px; color: var(--dsr-muted); margin-top: 3px; }
|
|
405
427
|
|
|
406
428
|
/* ---------- 文件传输 ---------- */
|
|
407
|
-
.fs-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
|
|
429
|
+
.fs-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
|
|
408
430
|
.fs-path {
|
|
409
|
-
flex: 1; min-width: 0; font-size: 12.5px; color: var(--dsr-muted);
|
|
431
|
+
flex: 1 1 150px; min-width: 0; font-size: 12.5px; color: var(--dsr-muted);
|
|
410
432
|
background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 10px;
|
|
411
433
|
padding: 8px 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
412
434
|
}
|
|
@@ -612,6 +634,9 @@ body.in-session .main { padding-bottom: 84px; }
|
|
|
612
634
|
}
|
|
613
635
|
.modal-title { font-size: 16px; font-weight: 700; margin-bottom: 10px; }
|
|
614
636
|
.modal-body { font-size: 14px; }
|
|
637
|
+
.workspace-create-desc { margin: 0 0 12px; color: var(--dsr-muted); line-height: 1.55; }
|
|
638
|
+
.workspace-create-location { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 10px; color: var(--dsr-muted); font-size: 12px; }
|
|
639
|
+
.workspace-create-location code { min-width: 0; flex: 1; padding: 7px 9px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsr-text); background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 9px; }
|
|
615
640
|
.modal-body .q-item { background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; padding: 11px 12px; margin-bottom: 10px; }
|
|
616
641
|
.modal-body .q-text { font-weight: 600; margin-bottom: 8px; }
|
|
617
642
|
.modal-body .q-option {
|
|
@@ -635,6 +660,15 @@ body.in-session .main { padding-bottom: 84px; }
|
|
|
635
660
|
@media (max-width: 720px) {
|
|
636
661
|
#btn-theme .t-label { display: none; }
|
|
637
662
|
#btn-theme .theme-swatch-dot { margin-right: 0; }
|
|
663
|
+
.section-actions { gap: 4px; }
|
|
664
|
+
.section-actions .session-sort { max-width: 98px; }
|
|
665
|
+
.section-actions .mini-btn { max-width: 92px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
666
|
+
.topbar { padding-left: 10px; padding-right: 10px; }
|
|
667
|
+
.topbar-right { gap: 4px; min-width: 0; }
|
|
668
|
+
.topbar-right .topbar-btn.icon-btn { width: 38px; height: 38px; }
|
|
669
|
+
.topbar-right .topbar-btn.conn-badge { max-width: 72px; padding-left: 8px; padding-right: 8px; overflow: hidden; text-overflow: ellipsis; }
|
|
670
|
+
.setting-row { align-items: flex-start; flex-wrap: wrap; }
|
|
671
|
+
.setting-row > .setting-actions { width: 100%; justify-content: flex-end; }
|
|
638
672
|
}
|
|
639
673
|
.theme-panel-list { display: flex; flex-direction: column; gap: 8px; }
|
|
640
674
|
.theme-option {
|
package/public/update.json
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.6.
|
|
2
|
+
"version": "0.6.6",
|
|
3
3
|
"apkUrl": "dsh-remote.apk",
|
|
4
|
-
"sha256": "
|
|
5
|
-
"releasedAt": "2026-08-
|
|
6
|
-
"notes": "
|
|
4
|
+
"sha256": "ddb80405e8b8b3183295bf150504621a0f900cd6507025600a33ab399d21f10b",
|
|
5
|
+
"releasedAt": "2026-08-21T07:09:29.907Z",
|
|
6
|
+
"notes": "新增新建工作区,按当前文件目录创建文件夹并自动打开会话;优化工作区排序分组、路径显示和小屏布局。",
|
|
7
7
|
"history": [
|
|
8
|
+
{
|
|
9
|
+
"version": "0.6.6",
|
|
10
|
+
"notes": "新增新建工作区,按当前文件目录创建文件夹并自动打开会话;优化工作区排序分组、路径显示和小屏布局。"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"version": "0.6.5",
|
|
14
|
+
"notes": "连接稳定性全面优化:25 秒心跳保活(WiFi 切换 / NAT 超时不再假活);60 秒无消息自动重连,指数退避重连(1s → 30s 上限 + 抖动);网关死连接自动清理(60 秒无数据双向销毁);断网自动检测与恢复(离线 / 重连中倒计时 / 连接失败状态可见);降级轮询恢复优化。"
|
|
15
|
+
},
|
|
8
16
|
{
|
|
9
17
|
"version": "0.6.4",
|
|
10
18
|
"notes": "扫码配对改为显式双按钮(拍照/相册),修复小米等 ROM 选择器错乱;会话历史加载超时放宽至 45 秒,失败可重试;网关端口自定义(插件管理页可改,环境变量仍优先)+ 启动前端口占用检测;峰谷计费提醒改前台服务驱动,后台按时必达;消息 Markdown 渲染(标题/代码块/列表/链接);修复 DSH 重启后网关上游端口不刷新(Issue #1);新增测试通知按钮。"
|
package/public/version.json
CHANGED