dsh-remote-plugin 0.6.15 → 0.6.16
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 +112 -7
- package/package.json +1 -1
- package/public/admin.html +46 -1
- package/public/admin.js +79 -9
- package/public/announcements.json +33 -0
- package/public/app.js +850 -35
- package/public/index.html +95 -7
- package/public/styles.css +76 -0
- package/public/update.json +8 -8
- package/public/version.json +1 -1
package/public/index.html
CHANGED
|
@@ -244,6 +244,12 @@
|
|
|
244
244
|
<div class="setting-row" data-settings-group="general" style="cursor:pointer">
|
|
245
245
|
<div><div class="setting-name" data-i18n="settings.groupGeneral">通用</div><div class="setting-desc" data-i18n="settings.groupGeneralDesc">显示工具调用、预设提示词</div></div>
|
|
246
246
|
</div>
|
|
247
|
+
<div class="setting-row" data-settings-group="model" style="cursor:pointer">
|
|
248
|
+
<div><div class="setting-name" data-i18n="settings.groupModel">模型</div><div class="setting-desc" data-i18n="settings.groupModelDesc">提供方、API 密钥和模型目录</div></div>
|
|
249
|
+
</div>
|
|
250
|
+
<div class="setting-row" data-settings-group="tests" style="cursor:pointer">
|
|
251
|
+
<div><div class="setting-name" data-i18n="settings.groupTests">功能测试</div><div class="setting-desc" data-i18n="settings.groupTestsDesc">验证 Android 和 DSH 原生能力</div></div>
|
|
252
|
+
</div>
|
|
247
253
|
<div class="setting-row" data-settings-group="servers" style="cursor:pointer">
|
|
248
254
|
<div><div class="setting-name" data-i18n="settings.groupServers">服务器</div><div class="setting-desc" data-i18n="settings.groupServersDesc">服务器地址、扫码连接</div></div>
|
|
249
255
|
</div>
|
|
@@ -322,6 +328,58 @@
|
|
|
322
328
|
</div>
|
|
323
329
|
</div>
|
|
324
330
|
|
|
331
|
+
<div id="settings-page-model" class="settings-subpage hidden">
|
|
332
|
+
<div class="settings-group">
|
|
333
|
+
<div class="setting-row" data-settings-back style="cursor:pointer">
|
|
334
|
+
<button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
|
|
335
|
+
<div class="setting-name" data-i18n="settings.groupModel">模型</div>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
<div class="settings-group model-settings-shell">
|
|
339
|
+
<div class="model-settings-head">
|
|
340
|
+
<div>
|
|
341
|
+
<div class="setting-name" data-i18n="settings.modelTitle">模型</div>
|
|
342
|
+
<div class="setting-desc expanded" data-i18n="settings.modelIntro">填入各提供方的 API 密钥即可使用其模型。</div>
|
|
343
|
+
</div>
|
|
344
|
+
<div class="setting-actions">
|
|
345
|
+
<button id="btn-model-settings-open" class="mini-btn" type="button" data-i18n="settings.modelOpenConfig">打开配置文件</button>
|
|
346
|
+
<button id="btn-model-settings-refresh" class="mini-btn" type="button" data-i18n="settings.modelRefresh">刷新</button>
|
|
347
|
+
</div>
|
|
348
|
+
</div>
|
|
349
|
+
<div id="model-settings-status" class="model-settings-status muted" data-i18n="settings.modelLoading">加载模型配置…</div>
|
|
350
|
+
<div id="model-settings-list" class="model-settings-list"></div>
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
|
|
354
|
+
<div id="settings-page-tests" class="settings-subpage hidden">
|
|
355
|
+
<div class="settings-group">
|
|
356
|
+
<div class="setting-row" data-settings-back style="cursor:pointer">
|
|
357
|
+
<button class="mini-btn" data-i18n="settings.back">‹ 返回</button>
|
|
358
|
+
<div class="setting-name" data-i18n="settings.groupTests">功能测试</div>
|
|
359
|
+
</div>
|
|
360
|
+
</div>
|
|
361
|
+
<div class="settings-group feature-test-shell">
|
|
362
|
+
<div class="feature-test-head">
|
|
363
|
+
<div>
|
|
364
|
+
<div class="setting-name" data-i18n="settings.asrTestTitle">ASR 模型测试(小米手机)</div>
|
|
365
|
+
<div class="setting-desc expanded" data-i18n="settings.asrTestDesc">使用 Android 系统 SpeechRecognizer 验证小米/系统云端语音识别,不上传测试日志。</div>
|
|
366
|
+
</div>
|
|
367
|
+
</div>
|
|
368
|
+
<div class="feature-test-note" data-i18n="settings.asrTestInstruction">请保持页面在前台,朗读一段中文,包含停顿、数字和英文 API 名称。测试约 60 秒,会自动记录 partial、最终结果、重建 session 和错误。</div>
|
|
369
|
+
<div class="feature-test-actions">
|
|
370
|
+
<button id="btn-asr-test-start" class="mini-btn primary" type="button" data-i18n="settings.asrTestStart">开始测试</button>
|
|
371
|
+
<button id="btn-asr-test-stop" class="mini-btn" type="button" data-i18n="settings.asrTestStop" disabled>停止测试</button>
|
|
372
|
+
<button id="btn-asr-test-copy" class="mini-btn" type="button" data-i18n="settings.asrTestCopy" disabled>复制日志</button>
|
|
373
|
+
<button id="btn-asr-test-clear" class="mini-btn" type="button" data-i18n="settings.asrTestClear">清空日志</button>
|
|
374
|
+
<button id="btn-asr-test-permission" class="mini-btn hidden" type="button" data-i18n="settings.asrTestPermissionSettings">权限设置</button>
|
|
375
|
+
<button id="btn-asr-test-engine" class="mini-btn hidden" type="button" data-i18n="settings.asrTestEngineSettings">语音引擎设置</button>
|
|
376
|
+
</div>
|
|
377
|
+
<div id="asr-test-status" class="feature-test-status muted" role="status" data-i18n="settings.asrTestNativeOnly">仅 Android App 可用</div>
|
|
378
|
+
<div id="asr-test-summary" class="feature-test-summary"></div>
|
|
379
|
+
<pre id="asr-test-log" class="feature-test-log" data-i18n="settings.asrTestLogEmpty">暂无测试日志</pre>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
|
|
325
383
|
<div id="settings-page-servers" class="settings-subpage hidden">
|
|
326
384
|
<div class="settings-group">
|
|
327
385
|
<div class="setting-row" data-settings-back style="cursor:pointer">
|
|
@@ -434,7 +492,7 @@
|
|
|
434
492
|
<button id="btn-host-describe" class="mini-btn" data-i18n="settings.probe">探测</button>
|
|
435
493
|
</div>
|
|
436
494
|
<div class="setting-row">
|
|
437
|
-
<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>
|
|
495
|
+
<div><div class="setting-name"><span data-i18n="settings.dshControlTitle">远程启动 DSH</span><span class="dsh-experimental-badge" data-i18n="settings.dshExperimental">Windows 实验性</span></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>
|
|
438
496
|
<div class="setting-actions">
|
|
439
497
|
<button id="btn-dsh-start" class="mini-btn" data-i18n="settings.dshStart">启动</button>
|
|
440
498
|
<button id="btn-dsh-restart" class="mini-btn" data-i18n="settings.dshRestart">重启</button>
|
|
@@ -944,13 +1002,28 @@
|
|
|
944
1002
|
'scan.paired': '配对成功,正在连接', 'scan.pairedLink': '已通过二维码配对', 'scan.notPair': '这不是 DSH Remote 的配对二维码',
|
|
945
1003
|
'scan.cancelled': '已取消扫码', 'scan.failed': '扫码失败:{msg}',
|
|
946
1004
|
'settings.groupGeneral': '通用', 'settings.groupGeneralDesc': '显示工具调用、预设提示词',
|
|
1005
|
+
'settings.groupModel': '模型', 'settings.groupModelDesc': '提供方、API 密钥和模型目录',
|
|
1006
|
+
'settings.groupTests': '功能测试', 'settings.groupTestsDesc': '验证 Android 和 DSH 原生能力',
|
|
947
1007
|
'settings.groupServers': '服务器', 'settings.groupServersDesc': '服务器地址、扫码连接',
|
|
948
1008
|
'settings.groupNotify': '通知', 'settings.groupNotifyDesc': '通知、提醒、后台轮询',
|
|
949
1009
|
'settings.groupTheme': '皮肤', 'settings.groupThemeDesc': '配色主题',
|
|
950
1010
|
'settings.groupAbout': '关于', 'settings.groupAboutDesc': 'DSH 状态、检查更新',
|
|
951
1011
|
'settings.donate': '赞赏支持', 'settings.donateDesc': '如果 dsh-remote 帮到了你,欢迎赞赏支持开发 ☕', 'settings.donateThanks': '感谢你的支持 ☕',
|
|
952
1012
|
'settings.back': '‹ 返回',
|
|
1013
|
+
'settings.modelTitle': '模型', 'settings.modelIntro': '填入各提供方的 API 密钥即可使用其模型。', 'settings.modelRefresh': '刷新', 'settings.modelOpenConfig': '打开配置文件',
|
|
1014
|
+
'settings.modelLoading': '加载模型配置…', 'settings.modelUnavailable': '模型配置暂不可用:{msg}', 'settings.modelEmpty': '当前 DSH 未声明可配置的提供方', 'settings.modelReadOnly': '当前配置只读',
|
|
1015
|
+
'settings.modelConfigured': '已配置', 'settings.modelMissing': '未配置', 'settings.modelEdit': '编辑', 'settings.modelSave': '保存', 'settings.modelSaving': '保存中…', 'settings.modelCancel': '取消',
|
|
1016
|
+
'settings.modelApiKey': 'API 密钥', 'settings.modelApiKeyPlaceholder': '输入 API 密钥(留空保持不变)', 'settings.modelApiKeyStored': '已保存的密钥,留空保持不变', 'settings.modelClearKey': '清除密钥',
|
|
1017
|
+
'settings.modelBaseUrl': 'API 地址', 'settings.modelBaseUrlPlaceholder': '提供方默认', 'settings.modelProtocol': '协议', 'settings.modelDisplayName': '显示名称',
|
|
1018
|
+
'settings.modelCatalog': '模型目录', 'settings.modelCatalogHint': '模型选择器使用以下模型;不修改则使用提供方默认目录', 'settings.modelFetch': '获取可用模型', 'settings.modelFetching': '获取中…',
|
|
1019
|
+
'settings.modelReasoning': '思考深度档位', 'settings.modelReasoningHint': '按模型配置可选档位;实际请求参数由 DSH 提供方适配器解释', 'settings.modelReasoningAdd': '添加档位', 'settings.modelReasoningClear': '清除档位', 'settings.modelReasoningRemove': '删除档位', 'settings.modelReasoningId': '档位值', 'settings.modelReasoningName': '显示名称', 'settings.modelReasoningDescription': '说明(可选)', 'settings.modelReasoningEmpty': '未配置档位,使用提供方默认行为', 'settings.modelReasoningDefault': '默认档位', 'settings.modelReasoningProviderDefault': '使用提供方默认', 'settings.modelReasoningIdRequired': '思考档位值不能为空', 'settings.modelReasoningInvalid': '思考档位值仅支持字母、数字、点、下划线、冒号和连字符', 'settings.modelReasoningDuplicate': '同一模型的思考档位值不能重复', 'settings.modelReasoningDefaultInvalid': '默认思考档位必须是已配置的档位', 'settings.modelReasoningLimit': '每个模型最多配置 {count} 个思考档位',
|
|
1020
|
+
'settings.modelFetchFailed': '获取模型失败:{msg}', 'settings.modelFetchEmpty': '提供方没有返回可用模型', 'settings.modelAdd': '添加模型', 'settings.modelId': '模型 ID', 'settings.modelIdRequired': '模型 ID 不能为空', 'settings.modelName': '名称(可选)', 'settings.modelRemove': '删除模型',
|
|
1021
|
+
'settings.modelNoModels': '暂无自定义模型,当前使用提供方默认目录', 'settings.modelCandidates': '发现的模型', 'settings.modelSelectAll': '全选', 'settings.modelSelectNone': '取消全选', 'settings.modelAddSelected': '加入选中模型',
|
|
1022
|
+
'settings.modelAdded': '已加入模型目录', 'settings.modelSaved': '模型配置已保存', 'settings.modelSaveFailed': '保存模型配置失败:{msg}', 'settings.modelOpenConfigFailed': '打开配置文件失败:{msg}', 'settings.modelOpenedConfig': '已请求打开 DSH 配置文件',
|
|
1023
|
+
'settings.modelLive': '保存后立即生效', 'settings.modelRestart': '保存后需重启 DSH 才生效',
|
|
1024
|
+
'settings.asrTestTitle': 'ASR 模型测试(小米手机)', 'settings.asrTestDesc': '使用 Android 系统 SpeechRecognizer 验证小米/系统云端语音识别,不上传测试日志。', 'settings.asrTestInstruction': '请保持页面在前台,朗读一段中文,包含停顿、数字和英文 API 名称。测试约 60 秒,会自动记录 partial、最终结果、重建 session 和错误。', 'settings.asrTestStart': '开始测试', 'settings.asrTestStop': '停止测试', 'settings.asrTestCopy': '复制日志', 'settings.asrTestClear': '清空日志', 'settings.asrTestPermissionSettings': '权限设置', 'settings.asrTestNativeOnly': '仅 Android App 可用', 'settings.asrTestWebUnsupported': '浏览器不支持原生 ASR 诊断,请在 Android App 中打开。', 'settings.asrTestConsent': '测试会使用麦克风,并可能将音频发送给 Android 系统默认语音识别服务。是否继续?', 'settings.asrTestStarted': 'ASR 测试已开始,请朗读测试内容', 'settings.asrTestStopped': 'ASR 测试已停止', 'settings.asrTestRestarting': '识别 session 重建中…', 'settings.asrTestPermission': '正在请求麦克风权限…', 'settings.asrTestPermissionDenied': '未授予麦克风权限,无法测试 ASR', 'settings.asrTestPermissionError': '系统语音识别服务未获麦克风授权,请打开权限设置后重试', 'settings.asrTestUnavailable': '当前设备没有可用的系统语音识别服务', 'settings.asrTestBusy': '已有 ASR 测试正在运行', 'settings.asrTestCopyOk': '测试日志已复制', 'settings.asrTestCopyFailed': '复制测试日志失败', 'settings.asrTestLogEmpty': '暂无测试日志', 'settings.asrTestMeta': '设备信息', 'settings.asrTestSummary': '测试摘要', 'settings.asrTestEvent': '事件日志', 'settings.asrTestCloud': '系统默认识别服务可能使用云端 ASR;本测试不上传日志', 'settings.asrTestStatus': '状态:{status}',
|
|
953
1025
|
'settings.servers': '服务器地址(可多个)', 'settings.speedTest': '测速', 'settings.add': '添加',
|
|
1026
|
+
'settings.asrTestEngineSettings': '语音引擎设置',
|
|
954
1027
|
'settings.scanTitle': '扫码连接', 'settings.scanDesc': '实时相机识别二维码,也可拍照/相册本地解码;无需谷歌服务', 'settings.scan': '扫码',
|
|
955
1028
|
'settings.notifyTitle': '通知', 'settings.notifyDesc': '收到审批/提问时推送', 'settings.announcementHistoryTitle': '历史公告', 'settings.announcementHistoryDesc': '查看以前收到的公告', 'settings.announcementHistory': '查看记录',
|
|
956
1029
|
'settings.testNotifyTitle': '测试通知', 'settings.testNotifyDesc': '立即排一条 3 秒后的本地通知,用于排查系统通知限制', 'settings.testNotify': '发送测试通知',
|
|
@@ -982,11 +1055,11 @@
|
|
|
982
1055
|
'theme.panelTitle': '选择配色', 'theme.close': '关闭',
|
|
983
1056
|
'settings.tokenTitle': '访问令牌', 'settings.change': '更换',
|
|
984
1057
|
'settings.hostTitle': 'DSH 状态', 'settings.hostProbing': '探测中…', 'settings.probe': '探测', 'settings.probeFailed': '探测失败',
|
|
985
|
-
'settings.dshControlTitle': '远程启动 DSH', 'settings.dshControlProbing': '正在向网关查询本机
|
|
1058
|
+
'settings.dshControlTitle': '远程启动 DSH', 'settings.dshExperimental': 'Windows 实验性', 'settings.dshControlProbing': '正在向网关查询本机 DSH 服务…', 'settings.dshRunning': '运行中', 'settings.dshStopped': '已停止', 'settings.dshUnsupported': '当前系统未配置可控的 DSH 服务', 'settings.dshStart': '启动', 'settings.dshRestart': '重启', 'settings.dshStarting': '正在{action} DSH…', 'settings.dshStarted': 'DSH 已{action}', 'settings.dshFailed': 'DSH 操作失败:{msg}',
|
|
986
1059
|
'settings.dshRunningDetail': '运行中 · {service} · PID {pid} · {state}', 'settings.dshStoppedDetail': '已停止 · {service} · {state}', 'settings.dshStatusFailed': '服务状态查询失败:{msg}',
|
|
987
|
-
'settings.dshStageQueued': '请求已到达网关,等待检查服务', 'settings.dshStageChecking': '正在检查
|
|
1060
|
+
'settings.dshStageQueued': '请求已到达网关,等待检查服务', 'settings.dshStageChecking': '正在检查 DSH 服务 {service}', 'settings.dshStageCommand': '服务已确认,正在提交{action}命令', 'settings.dshStageWaitingService': '命令已接受,等待服务进程运行({seconds} 秒)', 'settings.dshStageWaitingUpstream': '服务进程已运行,等待 DSH HTTP 接口恢复({seconds} 秒)', 'settings.dshStageWaitingEvents': 'DSH HTTP 已恢复,等待实时消息通道连接({seconds} 秒)',
|
|
988
1061
|
'settings.dshSuccessDetail': 'DSH {action}成功 · PID {pid} · HTTP {status} · 用时 {seconds} 秒', 'settings.dshAlreadyRunning': 'DSH 已在运行 · PID {pid}', 'settings.dshResultUnknown': '与网关的连接在操作中断开,最终结果未知;请重新进入此页查看服务状态',
|
|
989
|
-
'settings.dshErrorServiceNotFound': '未找到
|
|
1062
|
+
'settings.dshErrorServiceNotFound': '未找到 DSH 服务 {service},请先安装或配置 DSH_REMOTE_DSH_SERVICE', 'settings.dshErrorInvalidService': 'DSH 服务名配置不合法', 'settings.dshErrorSystemctlNotFound': '系统中找不到 systemctl', 'settings.dshErrorSystemdUnavailable': '无法连接当前用户的 systemd 会话', 'settings.dshErrorServiceControlNotFound': '系统中找不到 sc.exe', 'settings.dshErrorServiceDisabled': 'Windows DSH 服务已被禁用', 'settings.dshErrorServiceStopTimeout': 'Windows DSH 服务停止超时', 'settings.dshErrorStatusParseFailed': '无法解析 Windows DSH 服务状态', 'settings.dshErrorPermissionDenied': '当前用户无权控制 DSH 服务', 'settings.dshErrorCommandTimeout': '服务控制命令超时', 'settings.dshErrorCommandFailed': '服务控制命令失败', '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}',
|
|
990
1063
|
'settings.hostDesc': 'DSH {version} · {cwd} · 附加会话 {n}',
|
|
991
1064
|
'settings.updateTitle': '检查更新', 'settings.updateLoading': '加载中…', 'settings.downloadUpdate': '下载并安装更新', 'settings.check': '检查',
|
|
992
1065
|
'settings.feedbackTitle': '反馈渠道', 'settings.feedbackDesc': 'GitHub / Gitee / B站:反馈 bug、提建议、唠嗑',
|
|
@@ -1156,13 +1229,28 @@
|
|
|
1156
1229
|
'scan.paired': 'Paired, connecting', 'scan.pairedLink': 'Paired via QR code', 'scan.notPair': 'Not a DSH Remote pairing QR code',
|
|
1157
1230
|
'scan.cancelled': 'Scan cancelled', 'scan.failed': 'Scan failed: {msg}',
|
|
1158
1231
|
'settings.groupGeneral': 'General', 'settings.groupGeneralDesc': 'Tool calls, prompt presets',
|
|
1232
|
+
'settings.groupModel': 'Models', 'settings.groupModelDesc': 'Providers, API keys, and model catalogs',
|
|
1233
|
+
'settings.groupTests': 'Feature tests', 'settings.groupTestsDesc': 'Check Android and DSH native capabilities',
|
|
1159
1234
|
'settings.groupServers': 'Servers', 'settings.groupServersDesc': 'Server address, scan to pair',
|
|
1160
1235
|
'settings.groupNotify': 'Notifications', 'settings.groupNotifyDesc': 'Notifications, reminders, background polling',
|
|
1161
1236
|
'settings.groupTheme': 'Theme', 'settings.groupThemeDesc': 'Color themes',
|
|
1162
1237
|
'settings.groupAbout': 'About', 'settings.groupAboutDesc': 'DSH status, updates',
|
|
1163
1238
|
'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 ☕',
|
|
1164
1239
|
'settings.back': '‹ Back',
|
|
1240
|
+
'settings.modelTitle': 'Models', 'settings.modelIntro': 'Add a provider API key to use its models.', 'settings.modelRefresh': 'Refresh', 'settings.modelOpenConfig': 'Open config file',
|
|
1241
|
+
'settings.modelLoading': 'Loading model configuration…', 'settings.modelUnavailable': 'Model configuration unavailable: {msg}', 'settings.modelEmpty': 'DSH did not declare any configurable providers', 'settings.modelReadOnly': 'Configuration is read-only',
|
|
1242
|
+
'settings.modelConfigured': 'Configured', 'settings.modelMissing': 'Not configured', 'settings.modelEdit': 'Edit', 'settings.modelSave': 'Save', 'settings.modelSaving': 'Saving…', 'settings.modelCancel': 'Cancel',
|
|
1243
|
+
'settings.modelApiKey': 'API key', 'settings.modelApiKeyPlaceholder': 'Enter an API key (blank keeps the current key)', 'settings.modelApiKeyStored': 'A key is stored; blank keeps it', 'settings.modelClearKey': 'Clear key',
|
|
1244
|
+
'settings.modelBaseUrl': 'API URL', 'settings.modelBaseUrlPlaceholder': 'Provider default', 'settings.modelProtocol': 'Protocol', 'settings.modelDisplayName': 'Display name',
|
|
1245
|
+
'settings.modelCatalog': 'Model catalog', 'settings.modelCatalogHint': 'The model picker uses this list; leave it unchanged to use the provider catalog', 'settings.modelFetch': 'Fetch available models', 'settings.modelFetching': 'Fetching…',
|
|
1246
|
+
'settings.modelReasoning': 'Reasoning effort', 'settings.modelReasoningHint': 'Define selectable efforts per model; the DSH provider adapter interprets the request value', 'settings.modelReasoningAdd': 'Add effort', 'settings.modelReasoningClear': 'Clear efforts', 'settings.modelReasoningRemove': 'Remove effort', 'settings.modelReasoningId': 'Effort value', 'settings.modelReasoningName': 'Display name', 'settings.modelReasoningDescription': 'Description (optional)', 'settings.modelReasoningEmpty': 'No efforts configured; use the provider default behavior', 'settings.modelReasoningDefault': 'Default effort', 'settings.modelReasoningProviderDefault': 'Provider default', 'settings.modelReasoningIdRequired': 'Effort value cannot be empty', 'settings.modelReasoningInvalid': 'Effort values may contain only letters, numbers, dots, underscores, colons, and hyphens', 'settings.modelReasoningDuplicate': 'Effort values must be unique per model', 'settings.modelReasoningDefaultInvalid': 'The default effort must be one of the configured efforts', 'settings.modelReasoningLimit': 'Each model can have at most {count} reasoning efforts',
|
|
1247
|
+
'settings.modelFetchFailed': 'Could not fetch models: {msg}', 'settings.modelFetchEmpty': 'The provider returned no models', 'settings.modelAdd': 'Add model', 'settings.modelId': 'Model ID', 'settings.modelIdRequired': 'Model ID cannot be empty', 'settings.modelName': 'Name (optional)', 'settings.modelRemove': 'Remove model',
|
|
1248
|
+
'settings.modelNoModels': 'No custom models; using the provider default catalog', 'settings.modelCandidates': 'Discovered models', 'settings.modelSelectAll': 'Select all', 'settings.modelSelectNone': 'Clear selection', 'settings.modelAddSelected': 'Add selected models',
|
|
1249
|
+
'settings.modelAdded': 'Models added to the catalog', 'settings.modelSaved': 'Model configuration saved', 'settings.modelSaveFailed': 'Could not save model configuration: {msg}', 'settings.modelOpenConfigFailed': 'Could not open config file: {msg}', 'settings.modelOpenedConfig': 'Requested DSH config file',
|
|
1250
|
+
'settings.modelLive': 'Takes effect immediately', 'settings.modelRestart': 'Restart DSH to apply',
|
|
1251
|
+
'settings.asrTestTitle': 'ASR model test (Xiaomi)', 'settings.asrTestDesc': 'Use Android SpeechRecognizer to test Xiaomi/system cloud speech recognition. Test logs are not uploaded.', 'settings.asrTestInstruction': 'Keep this page in the foreground and read Chinese text containing pauses, numbers, and an English API name. The test runs for about 60 seconds and records partial/final results, session rebuilds, and errors.', 'settings.asrTestStart': 'Start test', 'settings.asrTestStop': 'Stop test', 'settings.asrTestRestarting': 'Rebuilding recognition session…', 'settings.asrTestCopy': 'Copy log', 'settings.asrTestClear': 'Clear log', 'settings.asrTestPermissionSettings': 'Permission settings', 'settings.asrTestNativeOnly': 'Available only in the Android app', 'settings.asrTestWebUnsupported': 'Native ASR diagnostics are unavailable in a browser. Open this page in the Android app.', 'settings.asrTestConsent': 'This test uses the microphone and may send audio to the Android system default speech recognition service. Continue?', 'settings.asrTestStarted': 'ASR test started; read the test content aloud', 'settings.asrTestStopped': 'ASR test stopped', 'settings.asrTestPermission': 'Requesting microphone permission…', 'settings.asrTestPermissionDenied': 'Microphone permission was not granted; ASR cannot be tested', 'settings.asrTestPermissionError': 'The system speech service lacks microphone authorization. Open permission settings and try again.', 'settings.asrTestUnavailable': 'No system speech recognition service is available on this device', 'settings.asrTestBusy': 'An ASR test is already running', 'settings.asrTestCopyOk': 'Test log copied', 'settings.asrTestCopyFailed': 'Could not copy the test log', 'settings.asrTestLogEmpty': 'No test log yet', 'settings.asrTestMeta': 'Device information', 'settings.asrTestSummary': 'Test summary', 'settings.asrTestEvent': 'Event log', 'settings.asrTestCloud': 'The system default recognition service may use cloud ASR; this test does not upload logs', 'settings.asrTestStatus': 'Status: {status}',
|
|
1165
1252
|
'settings.servers': 'Servers (one or more)', 'settings.speedTest': 'Test', 'settings.add': 'Add',
|
|
1253
|
+
'settings.asrTestEngineSettings': 'Speech engine settings',
|
|
1166
1254
|
'settings.scanTitle': 'Scan to pair', 'settings.scanDesc': 'Use the live camera or photo/gallery QR decoding; no Google services required', 'settings.scan': 'Scan',
|
|
1167
1255
|
'settings.notifyTitle': 'Notifications', 'settings.notifyDesc': 'Push on approvals / questions', 'settings.announcementHistoryTitle': 'Announcement history', 'settings.announcementHistoryDesc': 'Review announcements you received before', 'settings.announcementHistory': 'View history',
|
|
1168
1256
|
'settings.testNotifyTitle': 'Test notification', 'settings.testNotifyDesc': 'Schedule a local notification in 3 seconds to verify the notification pipeline', 'settings.testNotify': 'Send test notification',
|
|
@@ -1194,11 +1282,11 @@
|
|
|
1194
1282
|
'theme.panelTitle': 'Choose theme', 'theme.close': 'Close',
|
|
1195
1283
|
'settings.tokenTitle': 'Access token', 'settings.change': 'Change',
|
|
1196
1284
|
'settings.hostTitle': 'DSH status', 'settings.hostProbing': 'Probing…', 'settings.probe': 'Probe', 'settings.probeFailed': 'Probe failed',
|
|
1197
|
-
'settings.dshControlTitle': 'Remote DSH control', 'settings.dshControlProbing': 'Querying the gateway for the local
|
|
1285
|
+
'settings.dshControlTitle': 'Remote DSH control', 'settings.dshExperimental': 'Windows experimental', 'settings.dshControlProbing': 'Querying the gateway for the local DSH 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}',
|
|
1198
1286
|
'settings.dshRunningDetail': 'Running · {service} · PID {pid} · {state}', 'settings.dshStoppedDetail': 'Stopped · {service} · {state}', 'settings.dshStatusFailed': 'Service status query failed: {msg}',
|
|
1199
|
-
'settings.dshStageQueued': 'Request reached the gateway; waiting to inspect the service', 'settings.dshStageChecking': 'Checking
|
|
1287
|
+
'settings.dshStageQueued': 'Request reached the gateway; waiting to inspect the service', 'settings.dshStageChecking': 'Checking DSH 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)',
|
|
1200
1288
|
'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.',
|
|
1201
|
-
'settings.dshErrorServiceNotFound': '
|
|
1289
|
+
'settings.dshErrorServiceNotFound': 'DSH 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.dshErrorServiceControlNotFound': 'sc.exe is not available on this host', 'settings.dshErrorServiceDisabled': 'The Windows DSH service is disabled', 'settings.dshErrorServiceStopTimeout': 'The Windows DSH service did not stop before timeout', 'settings.dshErrorStatusParseFailed': 'Could not parse the Windows DSH service status', 'settings.dshErrorPermissionDenied': 'The current user cannot control the DSH service', 'settings.dshErrorCommandTimeout': 'The service control command timed out', 'settings.dshErrorCommandFailed': 'The service control command failed', '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}',
|
|
1202
1290
|
'settings.hostDesc': 'DSH {version} · {cwd} · {n} attached sessions',
|
|
1203
1291
|
'settings.updateTitle': 'Check for updates', 'settings.updateLoading': 'Loading…', 'settings.downloadUpdate': 'Download & install update', 'settings.check': 'Check',
|
|
1204
1292
|
'settings.feedbackTitle': 'Feedback', 'settings.feedbackDesc': 'GitHub / Gitee / Bilibili: report bugs, suggest features, or just chat',
|
package/public/styles.css
CHANGED
|
@@ -720,6 +720,81 @@ button.overview-attention-item, button.overview-session-item { cursor:pointer; }
|
|
|
720
720
|
background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: var(--dsr-radius);
|
|
721
721
|
margin-bottom: 10px; overflow: hidden;
|
|
722
722
|
}
|
|
723
|
+
.model-settings-shell { padding: 14px; }
|
|
724
|
+
.model-settings-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--dsr-line); }
|
|
725
|
+
.model-settings-head .setting-actions { flex-wrap: nowrap; }
|
|
726
|
+
.model-settings-status { padding: 12px 0 2px; font-size: 12px; }
|
|
727
|
+
.model-settings-status.error { color: var(--dsr-error); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
728
|
+
.model-settings-list { display: flex; flex-direction: column; gap: 8px; padding-top: 10px; }
|
|
729
|
+
.model-provider-card { border: 1px solid var(--dsr-line); border-radius: 12px; background: var(--dsr-bg-2); overflow: hidden; }
|
|
730
|
+
.model-provider-head { display: flex; align-items: center; gap: 8px; padding: 11px 12px; }
|
|
731
|
+
.model-provider-identity { display: flex; align-items: center; gap: 7px; min-width: 0; flex: 1; }
|
|
732
|
+
.model-provider-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; font-weight: 600; }
|
|
733
|
+
.model-provider-route { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsr-muted); font-size: 11px; }
|
|
734
|
+
.model-provider-dot { width: 8px; height: 8px; flex: 0 0 auto; border-radius: 50%; background: var(--dsr-muted); }
|
|
735
|
+
.model-provider-dot.configured { background: var(--dsr-success); box-shadow: 0 0 8px var(--dsr-success); }
|
|
736
|
+
.model-provider-dot.unknown { background: var(--dsr-info); }
|
|
737
|
+
.model-editor { display: flex; flex-direction: column; gap: 12px; padding: 13px 14px 14px; background: var(--dsr-panel); border-top: 1px solid var(--dsr-line); }
|
|
738
|
+
.model-editor-title { display: flex; align-items: baseline; gap: 8px; }
|
|
739
|
+
.model-editor-title strong { font-size: 14px; }
|
|
740
|
+
.model-editor-title code { color: var(--dsr-muted); font-size: 11px; overflow-wrap: anywhere; }
|
|
741
|
+
.model-field { display: flex; flex-direction: column; gap: 5px; }
|
|
742
|
+
.model-field > label, .model-field-label { color: var(--dsr-muted); font-size: 12px; }
|
|
743
|
+
.model-input { box-sizing: border-box; width: 100%; min-height: 36px; padding: 8px 10px; border: 1px solid var(--dsr-line); border-radius: 9px; background: var(--dsr-bg-2); color: var(--dsr-text); font: inherit; font-size: 13px; outline: none; }
|
|
744
|
+
.model-input:focus { border-color: var(--dsr-accent-line); box-shadow: 0 0 0 2px var(--dsr-accent-soft); }
|
|
745
|
+
.model-input::placeholder { color: var(--dsr-muted); opacity: .85; }
|
|
746
|
+
.model-input[type=password] { letter-spacing: .04em; }
|
|
747
|
+
.model-inline { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 9px; }
|
|
748
|
+
.model-catalog { display: flex; flex-direction: column; gap: 8px; padding-top: 3px; border-top: 1px solid var(--dsr-line); }
|
|
749
|
+
.model-catalog-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
|
|
750
|
+
.model-catalog-title { font-size: 12px; color: var(--dsr-muted); }
|
|
751
|
+
.model-catalog-hint { margin-top: 2px; font-size: 11px; color: var(--dsr-muted); line-height: 1.45; }
|
|
752
|
+
.model-catalog-actions { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
|
|
753
|
+
.model-list { display: flex; flex-direction: column; gap: 6px; }
|
|
754
|
+
.model-entry-card { display: flex; flex-direction: column; gap: 8px; padding: 9px; border: 1px solid var(--dsr-line); border-radius: 9px; background: var(--dsr-bg-2); }
|
|
755
|
+
.model-entry { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) auto; gap: 6px; align-items: center; }
|
|
756
|
+
.model-entry .model-input { min-width: 0; min-height: 32px; padding: 6px 8px; font-size: 12px; }
|
|
757
|
+
.model-entry-remove { width: 30px; height: 30px; padding: 0; border: 1px solid var(--dsr-line); border-radius: 8px; background: transparent; color: var(--dsr-muted); cursor: pointer; }
|
|
758
|
+
.model-entry-remove:active { color: var(--dsr-error); border-color: var(--dsr-error); }
|
|
759
|
+
.model-empty { padding: 10px; border: 1px dashed var(--dsr-line); border-radius: 9px; color: var(--dsr-muted); font-size: 12px; text-align: center; }
|
|
760
|
+
.model-reasoning { display: flex; flex-direction: column; gap: 7px; padding-top: 8px; border-top: 1px solid var(--dsr-line); }
|
|
761
|
+
.model-reasoning-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
|
|
762
|
+
.model-reasoning-list { display: flex; flex-direction: column; gap: 6px; }
|
|
763
|
+
.model-reasoning-entry { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1fr) minmax(0, 1.4fr) auto; gap: 6px; align-items: center; }
|
|
764
|
+
.model-reasoning-entry .model-input { min-width: 0; min-height: 32px; padding: 6px 8px; font-size: 12px; }
|
|
765
|
+
.model-reasoning-default { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 8px; color: var(--dsr-muted); font-size: 12px; }
|
|
766
|
+
.model-reasoning-default .model-input { min-height: 32px; padding: 6px 8px; font-size: 12px; }
|
|
767
|
+
.model-discovery { display: flex; flex-direction: column; gap: 7px; padding: 9px; border: 1px solid var(--dsr-info-line); border-radius: 9px; background: var(--dsr-info-soft); }
|
|
768
|
+
.model-discovery-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--dsr-info); font-size: 12px; }
|
|
769
|
+
.model-discovery-list { display: flex; flex-direction: column; gap: 4px; max-height: 180px; overflow-y: auto; }
|
|
770
|
+
.model-discovery-row { display: flex; align-items: center; gap: 7px; min-height: 30px; font-size: 12px; }
|
|
771
|
+
.model-discovery-row input { flex: 0 0 auto; }
|
|
772
|
+
.model-discovery-row code { min-width: 0; overflow-wrap: anywhere; color: var(--dsr-text); }
|
|
773
|
+
.model-editor-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 2px; }
|
|
774
|
+
.model-editor-error { margin: 0; color: var(--dsr-error); font-size: 12px; line-height: 1.45; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
775
|
+
.model-readonly { color: var(--dsr-warning); font-size: 12px; }
|
|
776
|
+
.feature-test-shell { padding: 14px; }
|
|
777
|
+
.feature-test-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--dsr-line); }
|
|
778
|
+
.feature-test-note { margin-top: 12px; padding: 10px 11px; border: 1px solid var(--dsr-info-line); border-radius: 9px; background: var(--dsr-info-soft); color: var(--dsr-info); font-size: 12px; line-height: 1.55; }
|
|
779
|
+
.feature-test-actions { display: flex; flex-wrap: wrap; gap: 7px; padding: 12px 0 8px; }
|
|
780
|
+
.feature-test-status { min-height: 20px; padding: 4px 0; font-size: 12px; }
|
|
781
|
+
.feature-test-status.error { color: var(--dsr-error); }
|
|
782
|
+
.feature-test-status.ok { color: var(--dsr-success); }
|
|
783
|
+
.feature-test-summary { margin-top: 6px; color: var(--dsr-text); font-size: 12px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
784
|
+
.feature-test-log { max-height: 420px; min-height: 170px; margin: 10px 0 0; padding: 11px; overflow: auto; border: 1px solid var(--dsr-line); border-radius: 9px; background: var(--dsr-bg-2); color: var(--dsr-text); font: 11px/1.55 ui-monospace, SFMono-Regular, Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
785
|
+
@media (max-width: 520px) {
|
|
786
|
+
.model-settings-head { flex-direction: column; }
|
|
787
|
+
.model-settings-head .setting-actions { width: 100%; justify-content: flex-start; }
|
|
788
|
+
.model-inline { grid-template-columns: 1fr; }
|
|
789
|
+
.model-entry { grid-template-columns: minmax(0, 1fr) auto; }
|
|
790
|
+
.model-entry .model-name-input { grid-column: 1 / -1; grid-row: 2; }
|
|
791
|
+
.model-reasoning-entry { grid-template-columns: minmax(0, 1fr) auto; }
|
|
792
|
+
.model-reasoning-entry .model-input:nth-child(2), .model-reasoning-entry .model-input:nth-child(3) { grid-column: 1 / -1; }
|
|
793
|
+
.model-reasoning-entry .model-entry-remove { grid-column: 2; grid-row: 1; }
|
|
794
|
+
.model-reasoning-default { grid-template-columns: 1fr; gap: 4px; }
|
|
795
|
+
.feature-test-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
796
|
+
.feature-test-actions .mini-btn { width: 100%; }
|
|
797
|
+
}
|
|
723
798
|
.setting-row {
|
|
724
799
|
display: flex; align-items: center; justify-content: space-between; gap: 10px;
|
|
725
800
|
padding: 13px 14px;
|
|
@@ -727,6 +802,7 @@ button.overview-attention-item, button.overview-session-item { cursor:pointer; }
|
|
|
727
802
|
.setting-row > div:first-child { flex: 1; min-width: 0; }
|
|
728
803
|
.setting-row + .setting-row { border-top: 1px solid var(--dsr-line); }
|
|
729
804
|
.setting-name { font-size: 14.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
805
|
+
.dsh-experimental-badge { display: inline-block; margin-left: 6px; padding: 2px 6px; border: 1px solid var(--dsr-warning-line); border-radius: 999px; color: var(--dsr-warning); background: var(--dsr-warning-soft); font-size: 10px; font-weight: 700; vertical-align: 2px; }
|
|
730
806
|
.setting-desc { font-size: 12px; color: var(--dsr-muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
731
807
|
.setting-desc.expanded { white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; }
|
|
732
808
|
.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; }
|
package/public/update.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.6.
|
|
2
|
+
"version": "0.6.16",
|
|
3
3
|
"apkUrl": "dsh-remote.apk",
|
|
4
|
-
"sha256": "
|
|
5
|
-
"releasedAt": "2026-08-
|
|
6
|
-
"notes": "0.6.
|
|
4
|
+
"sha256": "f2bae1c266867199cc0c21f9e9d08714543acd1b186220f3de906712ba1d9518",
|
|
5
|
+
"releasedAt": "2026-08-27T05:20:03.020Z",
|
|
6
|
+
"notes": "0.6.16:Windows 端 DSH 服务启动/重启接入 Windows Service(实验性功能),启动后继续检查 DSH HTTP 与 mux/host 实时通道;空对话退出时清理 App 本地残留;网关控制台主机 IP 改为可逐项启用的地址表,关闭地址不再进入配对二维码、诊断和防火墙建议;Android 设置新增模型配置、自定义模型思考深度档位和小米/系统 ASR 功能测试,支持复制设备、权限、partial/final、session 重建和错误诊断日志。",
|
|
7
7
|
"history": [
|
|
8
|
+
{
|
|
9
|
+
"version": "0.6.16",
|
|
10
|
+
"notes": "0.6.16:Windows 端 DSH 服务启动/重启接入 Windows Service(实验性功能),启动后继续检查 DSH HTTP 与 mux/host 实时通道;空对话退出时清理 App 本地残留;网关控制台主机 IP 改为可逐项启用的地址表,关闭地址不再进入配对二维码、诊断和防火墙建议;Android 设置新增模型配置、自定义模型思考深度档位和小米/系统 ASR 功能测试,支持复制设备、权限、partial/final、session 重建和错误诊断日志。"
|
|
11
|
+
},
|
|
8
12
|
{
|
|
9
13
|
"version": "0.6.15",
|
|
10
14
|
"notes": "0.6.15:修复拖拽候选项拦截普通竖向滑动的问题,卡片中间也可自然滚动;仅在长按真正进入拖拽后锁定页面,并补充指针结束、取消、失焦和页面隐藏时的解锁清理。保留边缘自动滚动、占位符同步重排、主列表/工作台工作区与组内对话拖动。"
|
|
@@ -40,10 +44,6 @@
|
|
|
40
44
|
{
|
|
41
45
|
"version": "0.6.7",
|
|
42
46
|
"notes": "修复手机端左滑归档松手后按钮不固定;新增云端公告弹窗,支持按 App 版本和有效期定向发布;新增工作台绑定与项目级会话;新增手机端左滑归档和二次确认;新增手机回车行为设置;新增归档会话折叠和 /permission 参数选择。"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"version": "0.6.6",
|
|
46
|
-
"notes": "新增新建工作区,按当前文件目录创建文件夹并自动打开会话;优化工作区排序分组、路径显示和小屏布局。"
|
|
47
47
|
}
|
|
48
48
|
]
|
|
49
49
|
}
|
package/public/version.json
CHANGED