dsh-remote-plugin 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apk/dsh-remote.apk +0 -0
- package/gateway.cjs +119 -1
- package/index.mjs +10 -1
- package/package.json +1 -1
- package/public/app.js +419 -39
- package/public/desktop/desktop.css +45 -2
- package/public/desktop/desktop.html +40 -0
- package/public/desktop/desktop.js +283 -17
- package/public/desktop/i18n.js +33 -1
- package/public/index.html +58 -2
- package/public/styles.css +44 -0
- package/public/update.json +8 -4
- package/public/version.json +1 -1
package/public/index.html
CHANGED
|
@@ -31,6 +31,13 @@
|
|
|
31
31
|
<!-- 会话列表 -->
|
|
32
32
|
<section id="view-home" class="view">
|
|
33
33
|
<div class="stat-strip" id="stat-strip"></div>
|
|
34
|
+
<div id="workbench-bar" class="workbench-bar unbound">
|
|
35
|
+
<button id="wb-toggle" class="wb-toggle" type="button" aria-expanded="false">
|
|
36
|
+
<span id="wb-label" class="wb-label" data-i18n="wb.unbound">未绑定工作台</span>
|
|
37
|
+
<span class="wb-chevron" aria-hidden="true">▾</span>
|
|
38
|
+
</button>
|
|
39
|
+
<div id="wb-panel" class="wb-panel hidden"></div>
|
|
40
|
+
</div>
|
|
34
41
|
<div class="section-head">
|
|
35
42
|
<span data-i18n="nav.sessions">会话</span>
|
|
36
43
|
<div class="section-actions">
|
|
@@ -107,6 +114,11 @@
|
|
|
107
114
|
<button class="menu-chip" data-cmd="/permission" data-i18n="menu.permission">/permission 切换权限预设</button>
|
|
108
115
|
<button class="menu-chip" data-cmd="/plan" data-i18n="menu.plan">/plan 进入/退出计划模式</button>
|
|
109
116
|
</div>
|
|
117
|
+
<div class="menu-chips hidden" id="permission-submenu">
|
|
118
|
+
<button class="menu-chip perm-opt" data-perm="read-only" data-i18n="perm.readOnly">read-only</button>
|
|
119
|
+
<button class="menu-chip perm-opt" data-perm="workspace-write" data-i18n="perm.workspaceWrite">workspace-write</button>
|
|
120
|
+
<button class="menu-chip perm-opt" data-perm="danger-full-access" data-i18n="perm.dangerFullAccess">danger-full-access</button>
|
|
121
|
+
</div>
|
|
110
122
|
</div>
|
|
111
123
|
<div class="menu-group hidden" id="preset-menu-group">
|
|
112
124
|
<div class="menu-title" data-i18n="presets.menuTitle">预设</div>
|
|
@@ -221,6 +233,13 @@
|
|
|
221
233
|
<div><div class="setting-name" data-i18n="settings.toolsTitle">显示工具调用</div><div class="setting-desc" data-i18n="settings.toolsDesc">关闭后隐藏 🔧/📦 工具调用与结果</div></div>
|
|
222
234
|
<label class="switch"><input type="checkbox" id="opt-tools"><span class="slider"></span></label>
|
|
223
235
|
</div>
|
|
236
|
+
<div class="setting-row">
|
|
237
|
+
<div><div class="setting-name" data-i18n="settings.mobileEnterTitle">手机回车行为</div><div class="setting-desc" data-i18n="settings.mobileEnterDesc">选择手机端按 Enter 时换行或直接发送</div></div>
|
|
238
|
+
<select id="mobile-enter-action" class="setting-select">
|
|
239
|
+
<option value="newline" data-i18n="settings.mobileEnterNewline">回车换行</option>
|
|
240
|
+
<option value="send" data-i18n="settings.mobileEnterSend">回车发送</option>
|
|
241
|
+
</select>
|
|
242
|
+
</div>
|
|
224
243
|
<div class="setting-row">
|
|
225
244
|
<div><div class="setting-name" data-i18n="presets.title">预设提示词</div><div class="setting-desc" data-i18n="presets.desc">常用提示词,对话界面一键插入(最多 20 条)</div></div>
|
|
226
245
|
<button id="btn-preset-add" class="mini-btn" data-i18n="presets.add">新增</button>
|
|
@@ -449,6 +468,21 @@
|
|
|
449
468
|
</div>
|
|
450
469
|
</div>
|
|
451
470
|
|
|
471
|
+
<div id="modal-archive" class="modal hidden">
|
|
472
|
+
<div class="modal-card archive-modal-card">
|
|
473
|
+
<div class="modal-title" data-i18n="session.archiveTitle">确认归档会话</div>
|
|
474
|
+
<p class="archive-modal-desc" data-i18n="session.archiveDesc">归档后会话将从普通列表隐藏,但不会删除对话记录。</p>
|
|
475
|
+
<div class="archive-summary">
|
|
476
|
+
<div class="archive-summary-row"><span data-i18n="session.archiveConversation">对话</span><strong id="archive-session-title"></strong></div>
|
|
477
|
+
<div class="archive-summary-row"><span data-i18n="session.archiveWorkspace">工作区</span><code id="archive-session-workspace"></code></div>
|
|
478
|
+
</div>
|
|
479
|
+
<div class="modal-actions">
|
|
480
|
+
<button id="archive-cancel" class="btn subtle" data-i18n="session.archiveCancel">取消</button>
|
|
481
|
+
<button id="archive-confirm" class="btn archive-confirm-btn" data-i18n="session.archiveConfirmAction">确认归档</button>
|
|
482
|
+
</div>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
|
|
452
486
|
<!-- goal 模态 -->
|
|
453
487
|
<div id="modal-goal" class="modal hidden">
|
|
454
488
|
<div class="modal-card">
|
|
@@ -515,6 +549,20 @@
|
|
|
515
549
|
</div>
|
|
516
550
|
</div>
|
|
517
551
|
|
|
552
|
+
<!-- 远程公告模态 -->
|
|
553
|
+
<div id="modal-announcement" class="modal hidden" role="dialog" aria-modal="true">
|
|
554
|
+
<div class="modal-card announcement-card">
|
|
555
|
+
<div class="announcement-kicker" data-i18n="announcement.label">公告</div>
|
|
556
|
+
<div id="announcement-title" class="modal-title"></div>
|
|
557
|
+
<div id="announcement-content" class="modal-body announcement-content"></div>
|
|
558
|
+
<a id="announcement-action" class="announcement-action hidden" target="_blank" rel="noopener"></a>
|
|
559
|
+
<div class="modal-actions">
|
|
560
|
+
<button id="announcement-later" class="btn subtle" data-i18n="announcement.later">稍后再看</button>
|
|
561
|
+
<button id="announcement-confirm" class="btn primary" data-i18n="announcement.gotIt">知道了</button>
|
|
562
|
+
</div>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
|
|
518
566
|
<div id="toast" class="toast hidden"></div>
|
|
519
567
|
|
|
520
568
|
<script>
|
|
@@ -534,6 +582,7 @@
|
|
|
534
582
|
'statsPage.gatewayDown': '统计需要网关运行', 'statsPage.empty': '暂无统计,产生会话后自动聚合',
|
|
535
583
|
'statsPage.note': '注:本数据仅在使用 DeepSeek 官方 API 时估算;基于 token 计算,与官网账单可能有出入,一切以官网为准。统计自 2026-08-17 定价生效日起。',
|
|
536
584
|
'home.newSession': '+ 新会话', 'home.newWorkspace': '+ 工作区', 'home.empty': '暂无会话', 'home.createFailed': '新建会话失败', 'home.created': '会话已创建',
|
|
585
|
+
'wb.unbound': '未绑定工作台', 'wb.bound': '绑定 {title}', 'wb.noProjects': '暂无项目', 'wb.noSessions': '暂无会话', 'wb.newSession': '新会话', 'wb.flatHidden': '工作台会话已收起({n} 个)', 'wb.archivedHidden': '------隐藏已归档会话------', 'wb.archivedShown': '------显示已归档会话------',
|
|
537
586
|
'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
587
|
'workspace.createTitle': '新建工作区', 'workspace.createDesc': '将在当前文件目录下创建文件夹,并自动打开新会话。', 'workspace.parent': '父目录', 'workspace.namePlaceholder': '例如:my-project', 'workspace.cancel': '取消', 'workspace.create': '创建并打开', 'workspace.nameRequired': '请输入工作区名称', 'workspace.created': '工作区已创建', 'workspace.sessionFailed': '目录已创建,但新会话打开失败:{msg}',
|
|
539
588
|
'sessions.running': '运行中', 'sessions.statRunning': '运行中', 'sessions.statPending': '待处理', 'sessions.statTotal': '会话总数',
|
|
@@ -569,7 +618,7 @@
|
|
|
569
618
|
'stream.error': '事件流错误:{msg}',
|
|
570
619
|
'session.loading': '加载中…', 'session.unknown': '未知会话', 'session.running': '运行中', 'session.interrupted': '已中断',
|
|
571
620
|
'session.stop': '停止', 'session.history': '对话', 'session.errorMsg': '会话出错:{msg}',
|
|
572
|
-
'session.confirmStop': '停止当前会话正在运行的任务?', 'session.stopFailed': '停止失败', 'session.stopRequested': '已请求停止',
|
|
621
|
+
'session.confirmStop': '停止当前会话正在运行的任务?', 'session.stopFailed': '停止失败', 'session.stopRequested': '已请求停止', 'session.archive': '归档', 'session.archiveConfirm': '归档这个会话?归档后可在“显示已归档会话”中打开。', 'session.archiveFailed': '归档失败:{msg}', 'session.archived': '会话已归档', 'session.archiveTitle': '确认归档会话', 'session.archiveDesc': '归档后会话将从普通列表隐藏,但不会删除对话记录。', 'session.archiveConversation': '对话', 'session.archiveWorkspace': '工作区', 'session.archiveCancel': '取消', 'session.archiveConfirmAction': '确认归档',
|
|
573
622
|
'notify.approvalTitle': '工具审批', 'notify.approvalBody': '{tool} 需要批准', 'notify.questionTitle': 'DSH 提问', 'notify.questionBody': '需要你回答',
|
|
574
623
|
'notify.permissionFailed': '通知权限申请失败:{msg}',
|
|
575
624
|
'history.loading': '加载历史…', 'history.cacheFallback': '网络不可用:显示本地缓存的历史', 'history.loadFailed': '加载历史失败:{msg}', 'history.retry': '重试',
|
|
@@ -599,6 +648,7 @@
|
|
|
599
648
|
'menu.compact': '/compact 压缩对话历史', 'menu.export': '/export 导出会话日志 ZIP',
|
|
600
649
|
'menu.feedback': '/feedback 反馈当前会话', 'menu.goal': '/goal 设置/查看任务目标',
|
|
601
650
|
'menu.permission': '/permission 切换权限预设', 'menu.plan': '/plan 进入/退出计划模式',
|
|
651
|
+
'perm.readOnly': 'read-only', 'perm.workspaceWrite': 'workspace-write', 'perm.dangerFullAccess': 'danger-full-access',
|
|
602
652
|
'menu.modelTitle': '模型切换', 'menu.refresh': '刷新', 'menu.modelAuto': '点开时自动加载', 'menu.effortTitle': '思考深度',
|
|
603
653
|
'composer.placeholder': '给 DSH 发消息…', 'composer.send': '发送',
|
|
604
654
|
'pending.title': '待处理', 'pending.count': '{n} 项', 'pending.approvalTitle': '🔧 {tool} 请求批准', 'pending.noReason': '无说明',
|
|
@@ -674,6 +724,7 @@
|
|
|
674
724
|
'presets.nameEmpty': '名称不能为空', 'presets.nameTooLong': '名称不能超过 20 字', 'presets.textTooLong': '内容不能超过 2000 字', 'presets.limit': '最多 20 条预设', 'presets.added': '预设已添加',
|
|
675
725
|
'presets.confirmDelete': '删除预设「{name}」?', 'presets.saved': '预设已保存', 'presets.deleted': '预设已删除',
|
|
676
726
|
'settings.toolsTitle': '显示工具调用', 'settings.toolsDesc': '关闭后隐藏 🔧/📦 工具调用与结果',
|
|
727
|
+
'settings.mobileEnterTitle': '手机回车行为', 'settings.mobileEnterDesc': '选择手机端按 Enter 时换行或直接发送', 'settings.mobileEnterNewline': '回车换行', 'settings.mobileEnterSend': '回车发送',
|
|
677
728
|
'settings.langTitle': '语言 / Language', 'settings.langDesc': '界面语言,跟随系统或手动切换',
|
|
678
729
|
'settings.themeTitle': '皮肤', 'settings.themeDesc': '默认深空 / 落日 / 易北爱乐厅 / 草原孤塔',
|
|
679
730
|
'theme.default': '默认深空', 'theme.dark': '落日', 'theme.light': '易北爱乐厅', 'theme.neutral': '草原孤塔',
|
|
@@ -702,6 +753,7 @@
|
|
|
702
753
|
'modal.approvalTitle': '工具审批', 'modal.reject': '拒绝', 'modal.allowOnce': '允许一次',
|
|
703
754
|
'modal.questionTitle': 'DSH 需要你回答', 'modal.later': '稍后', 'modal.submit': '提交',
|
|
704
755
|
'modal.goalTitle': '目标控制', 'modal.close': '关闭', 'modal.updateGoal': '更新目标',
|
|
756
|
+
'announcement.label': '公告', 'announcement.later': '稍后再看', 'announcement.gotIt': '知道了', 'announcement.open': '查看详情',
|
|
705
757
|
'modal.statsTitle': '本轮统计',
|
|
706
758
|
'time.justNow': '刚刚', 'time.minAgo': ' 分钟前', 'time.hourAgo': ' 小时前'
|
|
707
759
|
},
|
|
@@ -720,6 +772,7 @@
|
|
|
720
772
|
'statsPage.gatewayDown': 'Stats require the gateway', 'statsPage.empty': 'No stats yet — they aggregate as sessions happen',
|
|
721
773
|
'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.',
|
|
722
774
|
'home.newSession': '+ New session', 'home.newWorkspace': '+ Workspace', 'home.empty': 'No sessions yet', 'home.createFailed': 'Failed to create session', 'home.created': 'Session created',
|
|
775
|
+
'wb.unbound': 'No workbench bound', 'wb.bound': 'Bound {title}', 'wb.noProjects': 'No projects', 'wb.noSessions': 'No sessions', 'wb.newSession': 'New session', 'wb.flatHidden': 'Workbench sessions folded ({n})', 'wb.archivedHidden': '------ Hide archived ------', 'wb.archivedShown': '------ Show archived ------',
|
|
723
776
|
'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
777
|
'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}',
|
|
725
778
|
'sessions.running': 'Running', 'sessions.statRunning': 'Running', 'sessions.statPending': 'Pending', 'sessions.statTotal': 'Sessions',
|
|
@@ -755,7 +808,7 @@
|
|
|
755
808
|
'stream.error': 'Event stream error: {msg}',
|
|
756
809
|
'session.loading': 'Loading…', 'session.unknown': 'Unknown session', 'session.running': 'Running', 'session.interrupted': 'Interrupted',
|
|
757
810
|
'session.stop': 'Stop', 'session.history': 'Conversation', 'session.errorMsg': 'Session error: {msg}',
|
|
758
|
-
'session.confirmStop': 'Stop the currently running task in this session?', 'session.stopFailed': 'Stop failed', 'session.stopRequested': 'Stop requested',
|
|
811
|
+
'session.confirmStop': 'Stop the currently running task in this session?', 'session.stopFailed': 'Stop failed', 'session.stopRequested': 'Stop requested', 'session.archive': 'Archive', 'session.archiveConfirm': 'Archive this session? You can open it from “Show archived”.', 'session.archiveFailed': 'Archive failed: {msg}', 'session.archived': 'Session archived', 'session.archiveTitle': 'Confirm archive', 'session.archiveDesc': 'The session will be hidden from the normal list, but its conversation will not be deleted.', 'session.archiveConversation': 'Conversation', 'session.archiveWorkspace': 'Workspace', 'session.archiveCancel': 'Cancel', 'session.archiveConfirmAction': 'Archive session',
|
|
759
812
|
'notify.approvalTitle': 'Tool approval', 'notify.approvalBody': '{tool} needs approval', 'notify.questionTitle': 'DSH question', 'notify.questionBody': 'Needs your answer',
|
|
760
813
|
'notify.permissionFailed': 'Notification permission failed: {msg}',
|
|
761
814
|
'history.loading': 'Loading history…', 'history.cacheFallback': 'Network unavailable: showing cached history', 'history.loadFailed': 'Failed to load history: {msg}', 'history.retry': 'Retry',
|
|
@@ -785,6 +838,7 @@
|
|
|
785
838
|
'menu.compact': '/compact Compress conversation history', 'menu.export': '/export Export session log ZIP',
|
|
786
839
|
'menu.feedback': '/feedback Feedback current session', 'menu.goal': '/goal Set/view task goal',
|
|
787
840
|
'menu.permission': '/permission Switch permission preset', 'menu.plan': '/plan Enter/exit plan mode',
|
|
841
|
+
'perm.readOnly': 'read-only', 'perm.workspaceWrite': 'workspace-write', 'perm.dangerFullAccess': 'danger-full-access',
|
|
788
842
|
'menu.modelTitle': 'Model', 'menu.refresh': 'Refresh', 'menu.modelAuto': 'Auto-loads when opened', 'menu.effortTitle': 'Reasoning effort',
|
|
789
843
|
'composer.placeholder': 'Message DSH…', 'composer.send': 'Send',
|
|
790
844
|
'pending.title': 'Inbox', 'pending.count': '{n} items', 'pending.approvalTitle': '🔧 {tool} requests approval', 'pending.noReason': 'No reason given',
|
|
@@ -860,6 +914,7 @@
|
|
|
860
914
|
'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',
|
|
861
915
|
'presets.confirmDelete': 'Delete preset "{name}"?', 'presets.saved': 'Preset saved', 'presets.deleted': 'Preset deleted',
|
|
862
916
|
'settings.toolsTitle': 'Show tool calls', 'settings.toolsDesc': 'Hide 🔧/📦 tool calls and results when off',
|
|
917
|
+
'settings.mobileEnterTitle': 'Mobile Enter behavior', 'settings.mobileEnterDesc': 'Choose whether Enter inserts a newline or sends', 'settings.mobileEnterNewline': 'Enter = newline', 'settings.mobileEnterSend': 'Enter = send',
|
|
863
918
|
'settings.langTitle': 'Language / 语言', 'settings.langDesc': 'UI language, follows system or switch manually',
|
|
864
919
|
'settings.themeTitle': 'Theme', 'settings.themeDesc': 'Default deep space / Sunset / Elbphilharmonie / Prairie Tower',
|
|
865
920
|
'theme.default': 'Default', 'theme.dark': 'Sunset', 'theme.light': 'Elbphilharmonie', 'theme.neutral': 'Prairie Tower',
|
|
@@ -888,6 +943,7 @@
|
|
|
888
943
|
'modal.approvalTitle': 'Tool approval', 'modal.reject': 'Reject', 'modal.allowOnce': 'Allow once',
|
|
889
944
|
'modal.questionTitle': 'DSH needs your answer', 'modal.later': 'Later', 'modal.submit': 'Submit',
|
|
890
945
|
'modal.goalTitle': 'Goal control', 'modal.close': 'Close', 'modal.updateGoal': 'Update goal',
|
|
946
|
+
'announcement.label': 'Announcement', 'announcement.later': 'Later', 'announcement.gotIt': 'Got it', 'announcement.open': 'View details',
|
|
891
947
|
'modal.statsTitle': 'This round',
|
|
892
948
|
'time.justNow': 'just now', 'time.minAgo': ' min ago', 'time.hourAgo': ' hr ago'
|
|
893
949
|
}
|
package/public/styles.css
CHANGED
|
@@ -196,8 +196,38 @@ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
|
|
|
196
196
|
}
|
|
197
197
|
.sc-badge.goal-active { background: var(--dsr-info-soft); color: var(--dsr-info); border-color: var(--dsr-info-line); }
|
|
198
198
|
.sc-arrow { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); color: var(--dsr-muted); }
|
|
199
|
+
.session-swipe { position: relative; overflow: hidden; border-radius: var(--dsr-radius); background: var(--dsr-error); touch-action: pan-y; }
|
|
200
|
+
.session-swipe .session-card { position: relative; z-index: 1; transform: translateX(var(--swipe-x, 0)); transition: transform .18s ease; }
|
|
201
|
+
.session-swipe.revealed .session-card { transform: translateX(-92px); }
|
|
202
|
+
.sc-archive-btn { position: absolute; inset: 0 0 0 auto; z-index: 0; width: 92px; display: grid; place-items: center; padding: 0; background: var(--dsr-error); color: #fff; font-size: 13px; font-weight: 700; }
|
|
203
|
+
.sc-archive-btn:active { filter: brightness(.9); }
|
|
199
204
|
.empty { text-align: center; color: var(--dsr-muted); padding: 34px 0; }
|
|
200
205
|
|
|
206
|
+
/* ---------- 工作台与归档会话 ---------- */
|
|
207
|
+
.workbench-bar { margin: 0 0 2px; border-radius: var(--dsr-radius); overflow: hidden; }
|
|
208
|
+
.workbench-bar .wb-toggle {
|
|
209
|
+
width: 100%; display: flex; align-items: center; gap: 8px; padding: 10px 13px;
|
|
210
|
+
font: inherit; text-align: left; border: 1px solid var(--dsr-line);
|
|
211
|
+
background: var(--dsr-panel); color: var(--dsr-text);
|
|
212
|
+
}
|
|
213
|
+
.workbench-bar.unbound .wb-toggle { color: var(--dsr-muted); cursor: default; }
|
|
214
|
+
.workbench-bar.unbound .wb-chevron { visibility: hidden; }
|
|
215
|
+
.workbench-bar.bound .wb-toggle { background: var(--dsr-accent-soft); border-color: var(--dsr-accent-line); color: var(--dsr-accent-strong); font-weight: 600; }
|
|
216
|
+
.wb-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
217
|
+
.wb-chevron { flex-shrink: 0; font-size: 11px; color: var(--dsr-muted); transition: transform .15s ease; }
|
|
218
|
+
.workbench-bar.bound .wb-toggle[aria-expanded="true"] .wb-chevron { transform: rotate(180deg); }
|
|
219
|
+
.wb-panel { background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); border-top: none; border-radius: 0 0 var(--dsr-radius) var(--dsr-radius); padding: 8px; display: flex; flex-direction: column; gap: 6px; }
|
|
220
|
+
.wb-project { background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 10px; overflow: hidden; }
|
|
221
|
+
.wb-project-head { display: flex; align-items: center; gap: 7px; padding: 9px 10px; cursor: pointer; }
|
|
222
|
+
.wb-project-title { flex: 1; min-width: 0; font-size: 13.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
223
|
+
.wb-new { padding: 3px 9px; font-size: 12px; }
|
|
224
|
+
.wb-sessions { display: flex; flex-direction: column; gap: 4px; padding: 0 6px 6px; }
|
|
225
|
+
.wb-session { width: 100%; display: flex; align-items: center; gap: 8px; background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); border-radius: 8px; padding: 7px 9px; text-align: left; color: var(--dsr-text); font: inherit; }
|
|
226
|
+
.wb-session-title { flex: 1; min-width: 0; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
227
|
+
.wb-session-meta { flex-shrink: 0; font-size: 11px; color: var(--dsr-muted); }
|
|
228
|
+
.wb-empty { font-size: 12px; color: var(--dsr-muted); text-align: center; padding: 10px 0; }
|
|
229
|
+
.archived-toggle { width: 100%; display: block; text-align: center; padding: 9px 0; margin-top: 2px; border-radius: 9px; background: var(--dsr-panel); border: 1px dashed var(--dsr-line); color: var(--dsr-muted); font-size: 12px; }
|
|
230
|
+
|
|
201
231
|
/* ---------- 会话详情 ---------- */
|
|
202
232
|
body.in-session { overflow: hidden; height: 100vh; height: 100dvh; }
|
|
203
233
|
body.in-session .topbar { display: none; }
|
|
@@ -482,6 +512,7 @@ body.in-session .main { padding-bottom: 84px; }
|
|
|
482
512
|
.setting-name { font-size: 14.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
483
513
|
.setting-desc { font-size: 12px; color: var(--dsr-muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
484
514
|
.setting-desc.expanded { white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; }
|
|
515
|
+
.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; }
|
|
485
516
|
.setting-actions { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
|
|
486
517
|
.about { text-align: center; color: var(--dsr-muted); font-size: 12px; margin-top: 16px; line-height: 1.8; }
|
|
487
518
|
|
|
@@ -648,6 +679,19 @@ body.in-session .main { padding-bottom: 84px; }
|
|
|
648
679
|
border: 1px solid var(--dsr-line); border-radius: 10px; padding: 9px 11px; font: inherit; outline: none;
|
|
649
680
|
}
|
|
650
681
|
.modal-actions { display: flex; gap: 9px; margin-top: 14px; }
|
|
682
|
+
.archive-modal-desc { margin: 0 0 12px; color: var(--dsr-muted); line-height: 1.55; }
|
|
683
|
+
.archive-summary { border: 1px solid var(--dsr-line); border-radius: 12px; background: var(--dsr-panel); padding: 10px 12px; }
|
|
684
|
+
.archive-summary-row { display: grid; grid-template-columns: 62px minmax(0, 1fr); gap: 10px; align-items: start; padding: 6px 0; font-size: 13px; }
|
|
685
|
+
.archive-summary-row + .archive-summary-row { border-top: 1px solid var(--dsr-line); }
|
|
686
|
+
.archive-summary-row > span { color: var(--dsr-muted); }
|
|
687
|
+
.archive-summary-row strong, .archive-summary-row code { min-width: 0; color: var(--dsr-text); overflow-wrap: anywhere; word-break: break-word; }
|
|
688
|
+
.archive-confirm-btn { flex: 1; padding: 11px 14px; border-radius: 12px; font-size: 15px; font-weight: 700; border: 1px solid var(--dsr-error); background: var(--dsr-error); color: #fff; }
|
|
689
|
+
.archive-confirm-btn:active { filter: brightness(.9); }
|
|
690
|
+
.announcement-card { border-top: 3px solid var(--dsr-accent); }
|
|
691
|
+
.announcement-kicker { color: var(--dsr-accent-strong); font-size: 12px; font-weight: 700; letter-spacing: .04em; margin-bottom: 6px; }
|
|
692
|
+
.announcement-content { line-height: 1.7; overflow-wrap: anywhere; word-break: break-word; }
|
|
693
|
+
.announcement-action { display: inline-block; margin-top: 12px; color: var(--dsr-accent-strong); font-size: 13px; font-weight: 600; text-decoration: none; }
|
|
694
|
+
.announcement-action:hover { text-decoration: underline; }
|
|
651
695
|
.kv { display: flex; justify-content: space-between; gap: 10px; font-size: 13px; padding: 3px 0; }
|
|
652
696
|
.kv .k { color: var(--dsr-muted); } .kv .v { word-break: break-all; text-align: right; }
|
|
653
697
|
|
package/public/update.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.6.
|
|
2
|
+
"version": "0.6.7",
|
|
3
3
|
"apkUrl": "dsh-remote.apk",
|
|
4
|
-
"sha256": "
|
|
5
|
-
"releasedAt": "2026-08-
|
|
6
|
-
"notes": "
|
|
4
|
+
"sha256": "c2cb5b68c8fef1eabe4e1e669f03d41815b923d5568e325bb04d5d7a1fbd122a",
|
|
5
|
+
"releasedAt": "2026-08-21T10:34:07.760Z",
|
|
6
|
+
"notes": "修复手机端左滑归档松手后按钮不固定;新增云端公告弹窗,支持按 App 版本和有效期定向发布;新增工作台绑定与项目级会话;新增手机端左滑归档和二次确认;新增手机回车行为设置;新增归档会话折叠和 /permission 参数选择。",
|
|
7
7
|
"history": [
|
|
8
|
+
{
|
|
9
|
+
"version": "0.6.7",
|
|
10
|
+
"notes": "修复手机端左滑归档松手后按钮不固定;新增云端公告弹窗,支持按 App 版本和有效期定向发布;新增工作台绑定与项目级会话;新增手机端左滑归档和二次确认;新增手机回车行为设置;新增归档会话折叠和 /permission 参数选择。"
|
|
11
|
+
},
|
|
8
12
|
{
|
|
9
13
|
"version": "0.6.6",
|
|
10
14
|
"notes": "新增新建工作区,按当前文件目录创建文件夹并自动打开会话;优化工作区排序分组、路径显示和小屏布局。"
|
package/public/version.json
CHANGED