dsh-oc-tui 0.2.0 → 0.3.0

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.
Files changed (50) hide show
  1. package/README.md +21 -563
  2. package/bin/mcp-sse-bridge.mjs +499 -499
  3. package/docs/assets/conversation.png +0 -0
  4. package/docs/assets/cover.png +0 -0
  5. package/docs/assets/home.png +0 -0
  6. package/docs/assets/settings.png +0 -0
  7. package/docs/dsh-std-/346/216/245/345/205/245/350/257/264/346/230/216.md +566 -0
  8. package/docs/user-guide.md +616 -0
  9. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +607 -593
  10. package/dsh-plugin.json +69 -69
  11. package/lib/boot-block.js +129 -0
  12. package/lib/diagnostics.js +162 -120
  13. package/lib/dsh-version.js +161 -0
  14. package/lib/git-branch.js +157 -157
  15. package/lib/i18n.js +283 -283
  16. package/lib/image.js +2 -1
  17. package/lib/index.js +5183 -4812
  18. package/lib/locales/ar.js +670 -635
  19. package/lib/locales/de.js +639 -604
  20. package/lib/locales/en.js +35 -0
  21. package/lib/locales/es.js +639 -604
  22. package/lib/locales/fr.js +639 -604
  23. package/lib/locales/id.js +641 -606
  24. package/lib/locales/it.js +639 -604
  25. package/lib/locales/ja.js +639 -604
  26. package/lib/locales/ko.js +639 -604
  27. package/lib/locales/nl.js +639 -604
  28. package/lib/locales/pl.js +653 -618
  29. package/lib/locales/pt-BR.js +639 -604
  30. package/lib/locales/ru.js +653 -618
  31. package/lib/locales/tr.js +639 -604
  32. package/lib/locales/vi.js +641 -606
  33. package/lib/locales/zh-CN.js +640 -605
  34. package/lib/locales/zh-TW.js +640 -605
  35. package/lib/markdown.js +101 -27
  36. package/lib/mcp-monitor.js +189 -0
  37. package/lib/mcp-skill.js +93 -93
  38. package/lib/mcp.js +865 -838
  39. package/lib/model-route.js +66 -0
  40. package/lib/providers.js +712 -712
  41. package/lib/screenshot.js +140 -0
  42. package/lib/splash-opencode.js +29 -26
  43. package/lib/startup.js +66 -48
  44. package/lib/term.js +53 -11
  45. package/lib/themes.js +101 -0
  46. package/lib/ui.js +685 -443
  47. package/lib/updates.js +5 -2
  48. package/lib/web-settings.js +52 -21
  49. package/package.json +160 -146
  50. package/skills/mcp-import/SKILL.md +216 -216
@@ -1,608 +1,643 @@
1
- // 简体中文消息目录。键与英文源目录 lib/locales/en.js 完全一致,顺序也一致;
2
- // 占位符 `{name}` 原样保留,前导/尾随空格同样保留(相邻字符串会拼接)。
3
- export default {
4
- // ---- shared chrome ------------------------------------------------------
5
- 'common.selectBack': 'Enter 选择 · Esc 返回',
6
- 'common.selectConfirmBack': '↑/↓ 选择 · Enter 确认 · Esc 返回',
7
- 'common.selectContinueExit': '↑/↓ 选择 · Enter 继续 · Esc 退出',
8
- 'common.escBack': 'Esc 返回',
9
- 'common.escClose': 'Esc 关闭',
10
- 'common.escCancel': 'Esc 取消',
11
- 'common.working': '处理中…',
12
- 'common.pleaseWait': '请稍候',
13
- 'common.on': '开',
14
- 'common.off': '关',
15
- 'common.unavailable': '不可用',
16
- 'common.selected': '已选',
17
- 'common.default': '默认',
18
- 'common.system': '系统',
19
- 'common.installed': '(已安装)',
20
- 'common.more': '… 还有 {count} 项',
21
- 'common.moreLines': '… 还有 {count} 行',
22
- 'common.clickExpand': ' · 点击展开',
23
- 'common.clickCollapse': ' · 点击收起',
24
- 'common.unknown': '未知',
25
- 'common.emptyMessage': '[空消息]',
26
- 'value.queue': '排队',
27
- 'value.steer': '引导',
28
- 'value.auto': '自动',
29
- 'value.local': '本地',
30
- 'value.textOnly': '仅文本',
31
- 'value.textImage': '文本 + 图像',
32
-
33
- // ---- title screen -------------------------------------------------------
34
- 'splash.hint': '随便问点什么…“修复失败的测试”',
35
- 'splash.shortcutSettings': '设置',
36
- 'splash.shortcutThinking': '思考',
37
- 'splash.shortcutBranches': '分支',
38
-
39
- // ---- header / sidebar / status row -------------------------------------
40
- // ---- command-line help (dsh --profile tui --help) -----------------------
41
- 'startup.description': '启动 DeepSeek Harness 终端界面。',
42
- 'startup.helpOption': '显示此帮助',
43
- 'startup.resume': '按 id 恢复已有的持久化会话',
44
- 'startup.model': '新会话的默认模型 id',
45
- 'startup.provider': '新会话的默认服务商路由',
46
- 'startup.sidebar': '显示会话侧边栏(默认)',
47
- 'startup.noSidebar': '启动时不显示侧边栏',
48
- 'startup.examples': '示例:',
49
- 'startup.exampleFresh': '启动一个新会话',
50
- 'startup.exampleResume': '恢复一个持久化会话',
51
-
52
- 'header.workspace': '工作区',
53
- 'sidebar.sessions': '会话',
54
- 'sidebar.recent': '最近',
55
- 'sidebar.newSession': '+ 新建会话',
56
- 'status.model': '模型',
57
- 'status.draftTokens': '{count} 草稿 token',
58
- 'status.ctrlP': 'ctrl+p 命令',
59
- 'status.interrupt': '中断:ctrl+c',
60
-
61
- // ---- composer command hints --------------------------------------------
62
- 'hint.help': '显示帮助',
63
- 'hint.settings': '打开设置',
64
- 'hint.new': '新建会话',
65
- 'hint.resume': '恢复会话',
66
- 'hint.model': '选择模型',
67
- 'hint.provider': '选择服务商',
68
- 'hint.rewind': '回退选择器',
69
- 'hint.branch': '切换 git 分支',
70
- 'hint.stats': '会话统计与 token 用量',
71
- 'hint.clear': '清空视图',
72
- 'hint.cancel': '取消当前回合',
73
- 'hint.quit': '退出',
74
- 'hint.compact': '压缩上下文',
75
- 'hint.goal': '管理目标',
76
-
77
- // ---- transcript blocks --------------------------------------------------
78
- 'transcript.turns.one': '{count} 轮',
79
- 'transcript.turns.other': '{count} 轮',
80
- 'transcript.steps.one': '{count} 步',
81
- 'transcript.steps.other': '{count} 步',
82
- 'transcript.thinking': ' 思考',
83
- 'transcript.streaming': ' · 输出中…',
84
- 'transcript.steeringBadge': ' ⟲ 引导中',
85
- 'transcript.tasks': '任务',
86
- 'transcript.systemPrompt': ' 系统提示词',
87
- 'transcript.pendingInput': ' 待发输入 · ',
88
- 'transcript.steering': ' 引导',
89
- 'transcript.queued': ' 已排队',
90
- 'note.systemReminder': '系统提醒',
91
- 'note.compaction': '压缩',
92
-
93
- // ---- images and mermaid -------------------------------------------------
94
- 'image.attachment': '🖼 图片附件',
95
- 'image.rendering': '⏳ 正在渲染图片…',
96
- 'image.renderFailed': '⚠ 图片渲染失败 · {error}',
97
- 'image.mermaidRendering': '⏳ 正在渲染 mermaid 图…',
98
- 'image.mermaidTooWide': '↔ mermaid 图需要 {width} 列,当前面板只有 {budget}',
99
- 'image.altFallback': '图片',
100
-
101
- // ---- composer / approval prompt ----------------------------------------
102
- 'composer.imageHint': '粘贴的图片:请使用多模态模型/插件或 deepseek-v4-flash-vision-exp,否则无法读取该图片',
103
- 'composer.approval': '审批 · ',
104
- 'composer.summary': '摘要 · ',
105
- 'composer.origin': '来源 · ',
106
- 'composer.risk': '风险 · ',
107
- 'composer.approvalHint': 'y 允许 · n 拒绝 · Esc 取消',
108
- 'risk.low': '低',
109
- 'risk.medium': '中',
110
- 'risk.high': '高',
111
- 'composer.effortHint': 'Tab / ←/→ 调整 · Esc 关闭',
112
-
113
- // ---- right status rail --------------------------------------------------
114
- 'rail.model': '模型',
115
- 'rail.thinking': '思考',
116
- 'rail.context': '上下文',
117
- 'rail.session': '会话',
118
- 'rail.goal': '目标',
119
- 'rail.subagents': '子智能体',
120
- 'rail.noData': '—',
121
- 'rail.percentUsed': '已用 {percent}%',
122
- 'rail.tokens': '~{used} / {window} token',
123
- 'rail.cacheHit': '缓存命中 {percent}%',
124
- 'rail.breakdown': '系统 {system} · 工具 {tools} · 消息 {messages}',
125
- 'rail.contextPending': '上报用量后显示',
126
- 'rail.subagentCounts': '{running} 运行中 · {total} 总数',
127
- 'rail.unreadable': '{label}(无法读取)',
128
- 'rail.more': '… 还有 {count} 项',
129
- 'rail.round': ' · 第 {started}/{max} 轮',
130
- 'goal.active': '进行中',
131
- 'goal.paused': '已暂停',
132
- 'goal.blocked': '受阻',
133
- 'goal.complete': '已完成',
134
-
135
- // ---- session stats window ----------------------------------------------
136
- 'stats.title': '会话统计',
137
- 'stats.hint': '点击统计条或输入 /stats',
138
- 'stats.usage': '用量',
139
- 'stats.duration': '耗时',
140
- 'stats.speed': '速度',
141
- 'stats.tokens': 'tokens',
142
- 'stats.cache': '缓存',
143
- 'stats.context': '上下文',
144
- 'stats.noSteps': '暂无已完成的步骤',
145
- 'stats.llmTime': 'LLM {value}',
146
- 'stats.toolTime': '工具 {value}',
147
- 'stats.ttft': 'TTFT 平均 {value}',
148
- 'stats.tokensPerSecond': '{value} tok/s',
149
- 'stats.cacheRate': '缓存 {percent}%',
150
- 'stats.inOut': '输入 {input} · 输出 {output}',
151
- 'stats.cacheDetail': '命中 {percent}% · 读 {read} · 写 {write} · 未命中 {miss}',
152
- 'stats.contextUsed': '已用 {percent}% ~{used} / {window}',
153
- 'stats.systemPrompt': '系统提示词',
154
- 'stats.tools': '工具',
155
- 'stats.messages': '消息',
156
- 'stats.compositionUnavailable': '无法获取构成',
157
- 'stats.contextPending': '请求上报用量后显示上下文占用',
158
-
159
- // ---- questions modal ----------------------------------------------------
160
- 'questions.title': '问题',
161
- 'questions.titleOf': '问题 {index}/{total}',
162
- 'questions.defer': 'Esc 稍后处理',
163
- 'questions.range': '{from}-{to} / {total} PgUp/PgDn',
164
- 'questions.other': '其他: ',
165
- 'questions.answer': '回答: ',
166
- 'questions.placeholder': '输入你自己的答案',
167
- 'questions.hintCustom': 'Enter 确认 · Esc 返回',
168
- 'questions.hintMulti': 'Space 切换 · Enter 继续 · ↑/↓ 移动',
169
- 'questions.hintSingle': 'Enter 选择 · ↑/↓ 移动',
170
-
171
- // ---- secret prompt ------------------------------------------------------
172
- 'secret.hint': 'Enter 提交 · Esc 取消',
173
-
174
- // ---- settings dialog chrome --------------------------------------------
175
- 'settings.title': '设置',
176
- 'settings.menu': '菜单',
177
- 'settings.shared': '与 DeepSeek Harness WebUI 共享',
178
- 'settings.footerEdit': 'Enter 保存 · Esc 取消',
179
- 'settings.footerMenu': '↑/↓ 移动 · Tab 菜单 · Enter 选择 · Esc 返回',
180
- 'settings.footerPlain': '↑/↓ 移动 · Enter 选择 · Esc 返回',
181
- 'settings.confirmHint': '{text} · Y / N',
182
- 'settings.confirmDefault': 'Y 确认 · N 取消',
183
- 'settings.confirmDeleteSession': '再按一次 Ctrl+D 删除',
184
- 'settings.confirmChange': '确认此更改?',
185
- 'settings.deleteTwice': '再按一次 Ctrl+D 删除 ',
186
- 'settings.deleteMcpTwice': '再按一次 Delete 移除 ',
187
- 'settings.noSession': '未选择会话',
188
- 'settings.noSessions': '没有可用的会话',
189
- 'settings.noMcp': '未选择 MCP 服务器',
190
- 'settings.noOptions': '{label} 没有可用选项',
191
- 'settings.saved': '已保存到 DSH 设置',
192
- 'settings.providerRemoved': '服务商已移除',
193
- 'settings.conflict': '设置已在别处更改,已重新加载',
194
- 'settings.error': '设置:{error}',
195
- 'settings.dshSettings': 'DSH 设置',
196
- 'settings.optionList': 'Enter 选择 · Esc 返回',
197
-
198
- // ---- settings left menu -------------------------------------------------
199
- 'menu.main': '主菜单',
200
- 'menu.model': '模型',
201
- 'menu.update': '更新',
202
- 'menu.mcp': 'MCP',
203
-
204
- // ---- settings rows: main tab -------------------------------------------
205
- 'settings.general': '通用',
206
- 'settings.graphics': '图形',
207
- 'settings.sessions': '会话',
208
- 'settings.system': '系统',
209
- 'settings.busyEnter': '忙碌时 Enter',
210
- 'settings.defaultPreset': '默认预设',
211
- 'settings.permissionPreset': '权限预设',
212
- 'settings.permissionDangerConfirm': '启用不受限制的工具与文件访问?',
213
- 'settings.graphicsRendering': '图形渲染',
214
- 'settings.noProtocolFallback': '无协议回退',
215
- 'settings.imageHeightCap': '图片高度上限(行)',
216
- 'settings.mermaidRendering': 'Mermaid 渲染',
217
- 'settings.newSession': '新建会话',
218
- 'settings.manageSessions': '管理会话',
219
- 'settings.providerConfig': '服务商 API 配置',
220
- 'settings.updateManager': '更新管理',
221
- 'settings.settingsFile': '设置文件',
222
- 'settings.language': '语言',
223
- 'settings.languageSystem': '跟随系统({language})',
224
- 'settings.languageSaved': '语言:{language}',
225
-
226
- // ---- model tab ----------------------------------------------------------
227
- 'model.title': '模型',
228
- 'model.subtitle': 'Enter 将列表中的模型设为默认',
229
- 'model.defaultSection': '默认',
230
- 'model.defaultProvider': '默认服务商',
231
- 'model.defaultModel': '默认模型',
232
- 'model.reasoning': '推理',
233
- 'model.providerUrl': '服务商 URL',
234
- 'model.providerApiKey': '服务商 API 密钥',
235
- 'model.displayName': '显示名称',
236
- 'model.wireProtocol': '传输协议',
237
- 'model.defaultImageInput': '默认图片输入',
238
- 'model.models': '模型',
239
- 'model.fetch': '获取…',
240
- 'model.selectedCount': '已选 {count} 项',
241
- 'model.removeProvider': '移除服务商',
242
- 'model.removeProviderConfirm': '移除 {name} 及其托管的凭据?',
243
- 'model.noModels': '没有可用的模型',
244
- 'model.noModelsReturned': '服务商未返回任何模型',
245
- 'model.fetchUnavailable': '无法自动获取 — 已保存的模型 · Enter 切换',
246
- 'model.fetchOk': '已自动获取 · Enter 切换 · Esc 返回',
247
- 'model.fetching': '正在获取模型…',
248
- 'model.autoFetching': '自动获取中…',
249
- 'model.credentialConfigured': '已配置({source})',
250
- 'model.credentialMissing': '未配置',
251
- 'model.defaultTag': '默认',
252
- 'model.providerUnavailable': '服务商已不可用',
253
- 'model.namespaceUnavailable': '服务商设置命名空间不可用',
254
- 'model.apiKeyEmpty': 'API 密钥不能为空',
255
- 'model.credentialsUnavailable': '凭据服务不可用',
256
- 'model.noProviderModels': '所选服务商没有可用的模型',
257
- 'model.addCount.one': '{count} 个可添加',
258
- 'model.addCount.other': '{count} 个可添加',
259
-
260
- // ---- add-provider flow --------------------------------------------------
261
- 'provider.add': '添加服务商',
262
- 'provider.empty': '还没有配置任何服务商',
263
- 'provider.pickSubtitle': 'Enter 选择 · Esc 返回',
264
- 'provider.catalog': '已安装的服务商',
265
- 'provider.catalogEmpty': '所有已安装的服务商都已配置',
266
- 'provider.custom': '自定义 API — 手工声明端点',
267
- 'provider.form.catalog': '启用已安装的服务商',
268
- 'provider.form.custom': '声明自定义服务商',
269
- 'provider.formSubtitle': 'Enter 编辑 · Esc 返回',
270
- 'provider.field.route': '路由 ID',
271
- 'provider.field.addModel': '手动添加模型 ID',
272
- 'provider.field.save': '保存服务商',
273
- 'provider.hint.route': '小写字母、数字与连字符 · 密钥保存为 {ref}',
274
- 'provider.error.route': '路由 ID 必须以字母开头,只含小写字母、数字与连字符',
275
- 'provider.error.routeNeeded': '请先选择一个服务商',
276
- 'provider.error.taken': '该路由 ID 已被其他服务商使用',
277
- 'provider.error.baseUrl': '端点必须是 http 或 https URL',
278
- 'provider.error.baseUrlNeeded': '自定义服务商必须填写端点',
279
- 'provider.error.apiNeeded': '请选择该端点使用的协议',
280
- 'provider.error.modelsNeeded': '自定义服务商至少需要一个模型',
281
- 'provider.error.modelId': '第 {index} 个模型缺少 ID',
282
- 'provider.error.modelDuplicate': '模型 "{id}" 重复出现',
283
- 'provider.added': '服务商已添加',
284
- 'provider.accountManaged': '已通过 DeepSeek 账号登录',
285
- 'provider.search': '搜索',
286
- 'provider.searchPlaceholder': '输入以筛选',
287
- 'provider.searchEmpty': '没有匹配 "{query}" 的服务商',
288
-
289
- // ---- 单个模型条目 --------------------------------------------------------
290
- 'model.edit': '编辑模型',
291
- 'model.editHint': 'e 编辑 · Del 删除',
292
- 'model.refresh': '重新获取目录',
293
- 'model.selectAll': '全选',
294
- 'model.fetchRefused': '端点没有返回任何模型列表',
295
- 'model.notSaved': '该模型尚未保存',
296
- 'model.removed': '模型已删除',
297
- 'model.form.add': '添加模型',
298
- 'model.form.edit': '模型 · {id}',
299
- 'model.form.save': '保存模型',
300
- 'model.form.remove': '从服务商移除',
301
- 'model.form.removeConfirm': '要把这个模型从该服务商移除吗?',
302
- 'model.field.id': '模型 ID',
303
- 'model.field.name': '显示名称',
304
- 'model.field.contextWindow': '上下文窗口',
305
- 'model.field.maxTokens': '最大输出 tokens',
306
- 'model.field.input': '输入类型',
307
- 'model.error.idNeeded': '模型必须有 ID',
308
- 'model.error.idDuplicate': '模型 "{id}" 已在列表中',
309
- 'model.error.capacity': '上下文窗口与最大 tokens 必须是整数(可写 256K、1M)',
310
-
311
- // ---- MCP tab ------------------------------------------------------------
312
- 'mcp.title': 'MCP',
313
- 'mcp.subtitle': 'Enter 编辑 · Del 移除 · Esc 返回',
314
- 'mcp.editSubtitle': 'Enter 编辑 · Esc 返回',
315
- 'mcp.servers': 'MCP 服务器',
316
- 'mcp.empty': '尚未配置 MCP 服务器',
317
- 'mcp.add': '添加 MCP 服务器',
318
- 'mcp.scope': '作用域',
319
- 'mcp.scopeUserPrefix': '用户 · {path}',
320
- 'mcp.scopePathPrefix': '路径 · {path}',
321
- 'mcp.configFiles': '配置文件',
322
- 'mcp.userScope': '用户(所有会话)',
323
- 'mcp.secrets': '密钥',
324
- 'mcp.secretsPlain': '在配置文件中以明文保存',
325
- 'mcp.loaded': '已加载',
326
- 'mcp.notCreated': '尚未创建',
327
- 'mcp.type.stdio': '本地命令',
328
- 'mcp.type.http': 'HTTP',
329
- 'mcp.type.sse': 'SSE',
330
- 'mcp.state.connected': '● 已连接',
331
- 'mcp.state.tools.one': '● {count} 个工具',
332
- 'mcp.state.tools.other': '● {count} 个工具',
333
- 'mcp.state.pending': '… 连接中',
334
- 'mcp.state.disabled': '○ 已禁用',
335
- 'mcp.state.idle': '○ 未连接',
336
- 'mcp.form.add': '添加 MCP 服务器',
337
- 'mcp.form.edit': '编辑 MCP 服务器 · {name}',
338
- 'mcp.titleAdd': 'MCP · 添加',
339
- 'mcp.titleEdit': 'MCP · 编辑',
340
- 'mcp.field.name': '名称',
341
- 'mcp.field.type': '类型',
342
- 'mcp.field.timeout': '超时(毫秒)',
343
- 'mcp.field.command': '命令',
344
- 'mcp.field.args': '参数',
345
- 'mcp.field.env': '环境变量(JSON)',
346
- 'mcp.field.url': 'URL',
347
- 'mcp.field.headers': '请求头(JSON)',
348
- 'mcp.field.scope': '作用域',
349
- 'mcp.field.path': '路径',
350
- 'mcp.field.enabled': '启用',
351
- 'mcp.field.save': '保存',
352
- 'mcp.field.remove': '移除',
353
- 'mcp.choice.stdio': '本地命令(stdio)',
354
- 'mcp.choice.http': 'HTTP(流式)',
355
- 'mcp.choice.sse': 'SSE(旧版 HTTP+SSE)',
356
- 'mcp.choice.scopeUser': '用户 — 所有会话',
357
- 'mcp.choice.scopePath': '路径 — 某个目录下的会话',
358
- 'mcp.removeConfirm': '移除此 MCP 服务器并断开连接?',
359
- 'mcp.saved': 'MCP 服务器已保存',
360
- 'mcp.added': 'MCP 服务器已添加',
361
- 'mcp.removed': 'MCP 服务器已移除',
362
- 'mcp.error.name': '名称必须为 1-32 个字符,只能包含字母、数字、“-”或“_”',
363
- 'mcp.error.duplicate': '已配置名为“{name}”的 MCP 服务器',
364
- 'mcp.error.timeout': 'timeoutMs 必须是 1 到 {max} 之间的整数',
365
- 'mcp.error.pathNeeded': '路径作用域的服务器需要指定目录',
366
- 'mcp.error.pathAbsolute': '路径作用域必须是绝对目录',
367
- 'mcp.error.commandNeeded': 'stdio 服务器需要指定命令',
368
- 'mcp.error.urlParse': 'URL 无法解析',
369
- 'mcp.error.urlScheme': 'URL 必须使用 http 或 https',
370
- 'mcp.error.pathNotDir': '路径作用域不是目录:{path}',
371
- 'mcp.error.configIsDir': '配置文件路径是目录:{path}',
372
- 'mcp.error.notFound': '未配置名为“{name}”的 MCP 服务器',
373
- 'mcp.error.documentGone': '定义“{name}”的文档已不存在:{error}',
374
- 'mcp.error.noClient': '宿主未提供 MCP 客户端',
375
- 'mcp.error.connectTimeout': '连接 {name} 超时',
376
- 'mcp.error.json': '文档不是有效的 JSON:{error}',
377
- 'mcp.error.jsonObject': '文档必须是 JSON 对象',
378
- 'mcp.error.serversObject': '“servers”必须是 JSON 对象',
379
- 'mcp.error.argsArray': '参数必须是字符串组成的 JSON 数组',
380
- 'mcp.error.argsTypes': '参数必须是字符串或数字',
381
- 'mcp.error.argsUnclosed': '参数中有未闭合的引号',
382
- 'mcp.error.envObject': '{label} 必须是 JSON 对象',
383
- 'mcp.error.envValue': '{label} 的值“{name}”必须是字符串、数字或布尔值',
384
- 'mcp.error.header': '无效的 HTTP 请求头“{name}”',
385
- 'mcp.error.envName': '无效的环境变量名“{name}”',
386
-
387
- // ---- rewind -------------------------------------------------------------
388
- 'rewind.title': '回退',
389
- 'rewind.restoreTo': '恢复到此前的位置:{label}',
390
- 'rewind.restorePrompt': '将会话恢复到此前的位置…',
391
- 'rewind.empty': '暂无可回退的位置。',
392
- 'rewind.option.conversation': '恢复对话',
393
- 'rewind.option.both': '恢复对话与文件',
394
- 'rewind.option.code': '恢复文件',
395
- 'rewind.option.cancel': '取消',
396
- 'rewind.current': '(当前)',
397
- 'rewind.noPoints': '没有可回退的用户消息',
398
- 'rewind.unknownPoint': '未知的回退点“{selector}” — 请使用数字或 last',
399
- 'rewind.noPoint': '没有回退点 {n} — 1..{count}',
400
- 'rewind.notGit': '不是 git 工作树',
401
- 'rewind.noBackup': '没有备份位置',
402
- 'rewind.filesNotRestored': '文件未恢复',
403
- 'rewind.filesNotRestoredReason': '文件未恢复({reason})',
404
- 'rewind.restored.one': '已从 HEAD 恢复 {count} 个受跟踪文件',
405
- 'rewind.restored.other': '已从 HEAD 恢复 {count} 个受跟踪文件',
406
- 'rewind.removed.one': '已删除 {count} 个新增文件',
407
- 'rewind.removed.other': '已删除 {count} 个新增文件',
408
- 'rewind.skipped': '跳过 {count} 个',
409
- 'rewind.previousSaved': '原内容已保存至 {path}',
410
- 'rewind.noChanges': '此位置之后没有文件变更',
411
- 'rewind.image': '[图片]',
412
- 'rewind.images': '[{count} 张图片]',
413
- 'rewind.emptyMessage': '(空)',
414
- 'git.title': 'Git 分支',
415
- 'git.subtitle': '当前:{branch} · {path}',
416
- 'git.local': '本地分支',
417
- 'git.remote': '远程分支',
418
- 'git.empty': '此仓库没有任何分支。',
419
- 'git.detached': '(游离头指针)',
420
- 'git.switched': '已切换到分支 {branch}',
421
- 'git.switchFailed': '无法切换到 {branch}:{error}',
422
- 'git.pullDone': '已拉取更新',
423
- 'git.pullFailed': '无法拉取更新:{error}',
424
- 'git.listFailed': '无法列出分支:{error}',
425
- 'git.notRepo': '不是 git 工作树',
426
- 'git.gitMissing': 'PATH 中找不到 git',
427
- 'git.timedOut': 'git 执行超时',
428
- 'git.onlyTitleScreen': '分支切换仅在空页面可用 — 请先输入 /new 退出会话',
429
- 'git.footer': '↑/↓ 选择 · Enter 切换 · P 拉取 · R 刷新 · Esc 关闭',
430
-
431
- // ---- update tab ---------------------------------------------------------
432
- 'update.title': '更新',
433
- 'update.checking': '正在检查版本…',
434
- 'update.fetching': '正在从 npm registry 获取…',
435
- 'update.fetchingVersions': '正在获取版本…',
436
- 'update.versionsSubtitle': 'Enter 下载 · Esc 返回',
437
- 'update.installed': '已安装',
438
- 'update.latest': '最新(npm 标签)',
439
- 'update.status': '状态',
440
- 'update.versions': '版本',
441
- 'update.selectVersion': '选择版本…',
442
- 'update.restartApply': '重启以应用 {version}',
443
- 'update.enterRestart': 'Enter 重启',
444
- 'update.discard': '丢弃已下载的 {version}',
445
- 'update.actions': '操作',
446
- 'update.checkNow': '立即检查',
447
- 'update.checkingShort': '检查中…',
448
- 'update.startupCheck': '启动时检查',
449
- 'update.profile': 'profile',
450
- 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
451
- 'update.statusCorrupt': '安装已损坏 — 请在下方重新安装',
452
- 'update.statusError': 'registry 检查失败:{error}',
453
- 'update.statusAvailable': '有可用更新 → {version}',
454
- 'update.statusUpToDate': '已是最新',
455
- 'update.statusNoStable': '没有稳定版本 — 请从“版本”中选择',
456
- 'update.notOnPath': '在 PATH 中未找到',
457
- 'update.subtitleStaged': '{package} {version} 已下载 — 重启后应用',
458
- 'update.subtitleIdle': 'Enter 选择 · 下载后重启以应用',
459
- 'update.download': '下载',
460
- 'update.contacting': '正在连接 registry…',
461
- 'update.version': '版本',
462
- 'update.savingTo': '保存到',
463
- 'update.escCancels': 'Esc 取消',
464
- 'update.restartApplyQ': '重启以应用 {label} {version}?(已下载)',
465
- 'update.downloadQ': '下载 {label} {version} 并重启应用?',
466
- 'update.localSwitch': ' — 将本地安装切换为 registry 版本',
467
- 'update.downloaded': '已下载 · 重启后应用',
468
- 'update.downloadedToast': '{label} {version} 已下载 · 可在“更新”标签页应用',
469
- 'update.downloadedConfirm': '已下载 重启以应用 {label} {version}?(y/n)',
470
- 'update.alreadyDownloadedConfirm': '已下载 · 重启以应用 {label} {version}?(y/n)',
471
- 'update.downloadCancelled': '下载已取消',
472
- 'update.downloadFailed': '下载失败:{error}',
473
- 'update.stagedGone': '已下载的暂存包不存在 — 请重新选择版本',
474
- 'update.locks.one': 'dsh 仍在另外 {count} 个进程中运行,无法应用 — 请关闭后重试',
475
- 'update.locks.other': 'dsh 仍在另外 {count} 个进程中运行,无法应用 — 请关闭后重试',
476
- 'update.noNpm': '无法应用:未找到 npm',
477
- 'update.noDshCli': '无法应用:未找到 dsh CLI',
478
- 'update.installerFailed': '无法启动安装程序 — 请重启 dsh 以应用 {label}',
479
- 'update.applying': '正在应用 {label} · 即将退出并重启…',
480
- 'update.stagedDiscarded': '已丢弃暂存的下载包',
481
- 'update.tagCached': '已缓存',
482
- 'update.tagStaged': '已暂存',
483
- 'update.installFailed': '安装失败(退出码 {code})— 请从“版本”重试',
484
- 'update.installFailedRetry': '打开“更新”→“dsh-oc-tui”→“版本”,然后选择版本重新下载',
485
- 'update.installUnreadable': '安装报告成功,但已安装版本为 {installed}(预期 {expected})— 修复:{repair}',
486
- 'update.registryUnreachable': 'registry 无法访问:{error}',
487
- 'update.notOnRegistry': '{package} 不在 registry 中',
488
- 'update.registryHttp': 'registry 对 {package} 返回 HTTP {status}',
489
- 'update.noTarballUrl': 'registry 响应中没有 tarball URL',
490
- 'update.downloadHttp': '下载失败:{url} 返回 HTTP {status}',
491
- 'update.downloadEmpty': '下载失败:响应体为空',
492
- 'update.integrityFailed': '{file} 完整性校验失败 — 已丢弃该下载',
493
- 'update.npmMissing': '在 PATH 中未找到 npm',
494
- 'update.npmViewFailed': 'npm view {package} 退出码 {code}',
495
- 'update.timedOut': '\n({ms}ms 后超时)',
496
- 'update.noOutput': '(无输出)',
497
-
498
- // ---- commands -----------------------------------------------------------
499
- 'command.settings': '打开 TUI 设置页面',
500
- 'command.help': '显示 TUI 快捷键与命令参考',
501
- 'command.stats': '显示会话 token 与缓存统计',
502
- 'command.new': '开始新会话',
503
- 'command.resume': '恢复已持久化的会话',
504
- 'command.clear': '清空对话记录',
505
- 'command.cancel': '取消正在运行的回合',
506
- 'command.rewind': '将会话回退到更早的位置',
507
- 'command.branch': '在空页面切换 git 分支',
508
- 'command.quit': '退出 TUI',
509
-
510
- // ---- help overlay -------------------------------------------------------
511
- 'help.title': 'DeepSeek Harness TUI — 帮助',
512
- 'help.enter': 'Enter',
513
- 'help.enterDesc': '发送消息',
514
- 'help.ctrlEnter': 'Ctrl+Enter',
515
- 'help.ctrlEnterDesc': '插入换行',
516
- 'help.ctrlC': 'Ctrl+C',
517
- 'help.ctrlCDesc': '取消正在运行的回合;再按一次退出',
518
- 'help.ctrlP': 'Ctrl+P',
519
- 'help.ctrlPDesc': '打开设置',
520
- 'help.ctrlE': 'Ctrl+E',
521
- 'help.ctrlEDesc': '切换思考滑块',
522
- 'help.tab': 'Tab',
523
- 'help.tabDesc': '切换思考强度',
524
- 'help.ctrlN': 'Ctrl+N',
525
- 'help.ctrlNDesc': '新建会话',
526
- 'help.ctrlG': 'Ctrl+G',
527
- 'help.ctrlGDesc': '切换 git 分支(空页面)',
528
- 'help.ctrlD': 'Ctrl+D',
529
- 'help.ctrlDDesc': '在“管理会话”中删除会话(按两次)',
530
- 'help.pg': 'PgUp / PgDn',
531
- 'help.pgDesc': '滚动对话记录',
532
- 'help.shiftArrows': 'Shift+↑/↓',
533
- 'help.shiftArrowsDesc': '滚动状态栏(宽窗口)',
534
- 'help.upDown': 'Up / Down',
535
- 'help.upDownDesc': '光标上/下移;到边界时翻阅历史',
536
- 'help.mouse': '鼠标拖动',
537
- 'help.mouseDesc': '选择文本;右键复制',
538
- 'help.wheel': '滚轮',
539
- 'help.wheelDesc': '滚动对话记录 / 设置',
540
- 'help.escEsc': 'Esc Esc',
541
- 'help.escEscDesc': '回退选择器',
542
- 'help.esc': 'Esc',
543
- 'help.escDesc': '关闭浮层 · 取消回合 · 清空输入',
544
- 'help.commands': '命令:',
545
-
546
- // ---- session manager / toasts ------------------------------------------
547
- 'session.newTitle': '新会话',
548
- 'session.noSaved': '没有已保存的会话',
549
- 'session.manageTitle': '管理会话',
550
- 'session.manageSubtitle': 'Enter 打开 · Ctrl+D 两次删除 · Esc 返回',
551
- 'session.loading': '正在加载会话…',
552
- 'session.deleted': '已删除会话 {label}',
553
- 'session.deleteFailed': '删除会话:{error}',
554
- 'session.deleteNotFound': '未找到持久化的会话目录',
555
- 'session.deleteCancelled': '删除已取消',
556
- 'session.resumed': '已恢复会话 {id}',
557
- 'session.started': '已开始会话 {id}',
558
- 'session.openFailed': '打开会话失败:{error}',
559
- 'session.forkSummary': '{label}(来自 {parent})· {files}',
560
- 'session.forkDropped': ' · 丢弃了 {count} 条继承的待发输入',
561
- 'session.conversationOnly': '仅对话',
562
- 'session.rewindLabel': '回退 #{n}',
563
- 'session.files': '文件:{summary}',
564
- 'session.error': '错误:{error}',
565
- 'session.interruptFirst': '请先中断正在运行的回合(/cancel)',
566
- 'session.interruptFirstEsc': '请先中断正在运行的回合(Esc 或 /cancel)',
567
- 'session.startFirst': '请先开始一个会话',
568
- 'session.noReasoningLevels': '当前模型没有可用的推理等级',
569
- 'session.settingsUnavailable': '设置不可用',
570
- 'session.interruptRequested': '已请求中断',
571
- 'session.nothingToInterrupt': '没有可中断的内容',
572
- 'session.noSessionRunning': '没有正在运行的会话',
573
- 'session.promptCleared': '输入已清空',
574
- 'session.exitAgain': '再按一次 Ctrl+C 退出',
575
- 'session.usageResume': '用法:/resume <sessionId>',
576
- 'session.currentModel': '当前模型:{model}',
577
- 'session.modelSet': '模型已设为 {model}(对下一次请求生效)',
578
- 'session.currentProvider': '当前服务商:{provider}',
579
- 'session.providerSet': '服务商已设为 {provider}(对下一次请求生效)',
580
- 'session.unknownCommand': '未知命令 /{name} — 试试 /help',
581
- 'session.queryMissing': '当前 profile 中未挂载会话查询服务',
582
- 'session.listHeader': '会话:',
583
- 'session.noPersisted': '没有持久化的会话',
584
- 'session.listFailed': '列出会话失败:{error}',
585
- 'session.modelNoImages': '模型“{model}”不支持图片输入',
586
- 'session.imageAttachFailed': '附加图片失败:{error}',
587
- 'session.attachmentsUnavailable': '附件服务不可用,无法读取图片',
588
- 'session.copied.one': '已复制 {count} 行到剪贴板',
589
- 'session.copied.other': '已复制 {count} 行到剪贴板',
590
- 'session.valueRequired': '需要填写值',
591
- 'session.minChars': '至少 {count} 个字符',
592
- 'session.maxChars': '最多 {count} 个字符',
593
- 'session.answerRequired': '请选择选项或输入答案',
594
- 'session.typeAnswer': '请输入答案或按 Esc',
595
- 'session.updatesAvailable': '更新:{list} — Ctrl+P → 更新',
596
- 'session.versionsError': '版本:{error}',
597
- 'session.mcpError': 'MCP:{error}',
598
- 'session.noClipboard': '没有可用的剪贴板通道',
599
- 'session.unsupportedInteraction': '不支持的交互类型:{kind}',
600
-
601
- // ---- tool activity summaries -------------------------------------------
602
- 'tool.run': '运行 {command}',
603
- 'tool.askUser': '询问用户',
604
- 'tool.askQuestions': '询问 {count} 个问题',
1
+ // 简体中文消息目录。键与英文源目录 lib/locales/en.js 完全一致,顺序也一致;
2
+ // 占位符 `{name}` 原样保留,前导/尾随空格同样保留(相邻字符串会拼接)。
3
+ export default {
4
+ // ---- shared chrome ------------------------------------------------------
5
+ 'common.selectBack': 'Enter 选择 · Esc 返回',
6
+ 'common.selectConfirmBack': '↑/↓ 选择 · Enter 确认 · Esc 返回',
7
+ 'common.selectContinueExit': '↑/↓ 选择 · Enter 继续 · Esc 退出',
8
+ 'common.escBack': 'Esc 返回',
9
+ 'common.escClose': 'Esc 关闭',
10
+ 'common.escCancel': 'Esc 取消',
11
+ 'common.working': '处理中…',
12
+ 'common.pleaseWait': '请稍候',
13
+ 'common.on': '开',
14
+ 'common.off': '关',
15
+ 'common.unavailable': '不可用',
16
+ 'common.selected': '已选',
17
+ 'common.default': '默认',
18
+ 'common.system': '系统',
19
+ 'common.installed': '(已安装)',
20
+ 'common.more': '… 还有 {count} 项',
21
+ 'common.moreLines': '… 还有 {count} 行',
22
+ 'common.clickExpand': ' · 点击展开',
23
+ 'common.clickCollapse': ' · 点击收起',
24
+ 'common.unknown': '未知',
25
+ 'common.emptyMessage': '[空消息]',
26
+ 'value.queue': '排队',
27
+ 'value.steer': '引导',
28
+ 'value.auto': '自动',
29
+ 'value.local': '本地',
30
+ 'value.textOnly': '仅文本',
31
+ 'value.textImage': '文本 + 图像',
32
+ 'value.show': '显示',
33
+ 'value.hide': '隐藏',
34
+
35
+ // ---- title screen -------------------------------------------------------
36
+ 'splash.hint': '随便问点什么…“修复失败的测试”',
37
+ 'splash.shortcutSettings': '设置',
38
+ 'splash.shortcutThinking': '思考',
39
+ 'splash.shortcutBranches': '分支',
40
+
41
+ // ---- header / sidebar / status row -------------------------------------
42
+ // ---- command-line help (dsh --profile tui --help) -----------------------
43
+ 'startup.description': '启动 DeepSeek Harness 终端界面。',
44
+ 'startup.helpOption': '显示此帮助',
45
+ 'startup.resume': '按 id 恢复已有的持久化会话',
46
+ 'startup.model': '新会话的默认模型 id',
47
+ 'startup.provider': '新会话的默认服务商路由',
48
+ 'startup.sidebar': '显示会话侧边栏(默认)',
49
+ 'startup.noSidebar': '启动时不显示侧边栏',
50
+ 'startup.examples': '示例:',
51
+ 'startup.exampleFresh': '启动一个新会话',
52
+ 'startup.exampleResume': '恢复一个持久化会话',
53
+
54
+ 'header.workspace': '工作区',
55
+ 'sidebar.sessions': '会话',
56
+ 'sidebar.recent': '最近',
57
+ 'sidebar.newSession': '+ 新建会话',
58
+ 'status.model': '模型',
59
+ 'status.draftTokens': '{count} 草稿 token',
60
+ 'status.ctrlP': 'ctrl+p 命令',
61
+ 'status.interrupt': '中断:ctrl+c',
62
+
63
+ // ---- composer command hints --------------------------------------------
64
+ 'hint.help': '显示帮助',
65
+ 'hint.settings': '打开设置',
66
+ 'hint.new': '新建会话',
67
+ 'hint.resume': '恢复会话',
68
+ 'hint.model': '选择模型',
69
+ 'hint.provider': '选择服务商',
70
+ 'hint.rewind': '回退选择器',
71
+ 'hint.branch': '切换 git 分支',
72
+ 'hint.stats': '会话统计与 token 用量',
73
+ 'hint.clear': '清空视图',
74
+ 'hint.cancel': '取消当前回合',
75
+ 'hint.quit': '退出',
76
+ 'hint.compact': '压缩上下文',
77
+ 'hint.goal': '管理目标',
78
+
79
+ // ---- transcript blocks --------------------------------------------------
80
+ 'transcript.turns.one': '{count} 轮',
81
+ 'transcript.turns.other': '{count} 轮',
82
+ 'transcript.steps.one': '{count} 步',
83
+ 'transcript.steps.other': '{count} 步',
84
+ 'transcript.modelChanged': '模型已从 {from} 更改为 {to}',
85
+ 'transcript.thinking': ' 思考',
86
+ 'transcript.streaming': ' · 输出中…',
87
+ 'transcript.steeringBadge': ' ⟲ 引导中',
88
+ 'transcript.tasks': '任务',
89
+ 'transcript.systemPrompt': ' 系统提示词',
90
+ 'transcript.pendingInput': ' 待发输入 · ',
91
+ 'transcript.steering': ' 引导',
92
+ 'transcript.queued': ' 已排队',
93
+ 'note.systemReminder': '系统提醒',
94
+ 'note.compaction': '压缩',
95
+ 'note.runtimeContext': '运行时上下文',
96
+
97
+ // ---- images and mermaid -------------------------------------------------
98
+ 'image.attachment': '🖼 图片附件',
99
+ 'image.rendering': '⏳ 正在渲染图片…',
100
+ 'image.renderFailed': '⚠ 图片渲染失败 · {error}',
101
+ 'image.mermaidRendering': '⏳ 正在渲染 mermaid 图…',
102
+ 'image.mermaidTooWide': '↔ mermaid 图需要 {width} 列,当前面板只有 {budget}',
103
+ 'image.altFallback': '图片',
104
+
105
+ // ---- composer / approval prompt ----------------------------------------
106
+ 'composer.keys': "Enter 发送 · Ctrl+Enter 换行 · Ctrl+P 设置",
107
+ 'composer.commandKeys': "↑/↓ 选择 · Tab 补全 · Esc 关闭",
108
+ 'composer.imageHint': '粘贴的图片:请使用多模态模型/插件或 deepseek-v4-flash-vision-exp,否则无法读取该图片',
109
+ 'composer.approval': '审批 · ',
110
+ 'composer.summary': '摘要 · ',
111
+ 'composer.origin': '来源 · ',
112
+ 'composer.risk': '风险 · ',
113
+ 'composer.approvalHint': 'y 允许 · n 拒绝 · Esc 取消',
114
+ 'risk.low': '低',
115
+ 'risk.medium': '中',
116
+ 'risk.high': '高',
117
+ 'composer.effortHint': 'Tab / ←/→ 调整 · Esc 关闭',
118
+
119
+ // ---- right status rail --------------------------------------------------
120
+ 'rail.model': '模型',
121
+ 'rail.thinking': '思考',
122
+ 'rail.context': '上下文',
123
+ 'rail.session': '会话',
124
+ 'rail.goal': '目标',
125
+ 'rail.subagents': '子智能体',
126
+ 'rail.noData': '—',
127
+ 'rail.percentUsed': '已用 {percent}%',
128
+ 'rail.tokens': '~{used} / {window} token',
129
+ 'rail.cacheHit': '缓存命中 {percent}%',
130
+ 'rail.breakdown': '系统 {system} · 工具 {tools} · 消息 {messages}',
131
+ 'rail.contextPending': '上报用量后显示',
132
+ 'rail.subagentCounts': '{running} 运行中 · {total} 总数',
133
+ 'rail.unreadable': '{label}(无法读取)',
134
+ 'rail.more': '… 还有 {count} 项',
135
+ 'rail.round': ' · 第 {started}/{max} 轮',
136
+ 'goal.active': '进行中',
137
+ 'goal.paused': '已暂停',
138
+ 'goal.blocked': '受阻',
139
+ 'goal.complete': '已完成',
140
+
141
+ // ---- session stats window ----------------------------------------------
142
+ 'stats.title': '会话统计',
143
+ 'stats.hint': '点击统计条或输入 /stats',
144
+ 'stats.usage': '用量',
145
+ 'stats.duration': '耗时',
146
+ 'stats.speed': '速度',
147
+ 'stats.tokens': 'tokens',
148
+ 'stats.cache': '缓存',
149
+ 'stats.context': '上下文',
150
+ 'stats.noSteps': '暂无已完成的步骤',
151
+ 'stats.llmTime': 'LLM {value}',
152
+ 'stats.toolTime': '工具 {value}',
153
+ 'stats.ttft': 'TTFT 平均 {value}',
154
+ 'stats.tokensPerSecond': '{value} tok/s',
155
+ 'stats.cacheRate': '缓存 {percent}%',
156
+ 'stats.inOut': '输入 {input} · 输出 {output}',
157
+ 'stats.cacheDetail': '命中 {percent}% · 读 {read} · 写 {write} · 未命中 {miss}',
158
+ 'stats.contextUsed': '已用 {percent}% ~{used} / {window}',
159
+ 'stats.systemPrompt': '系统提示词',
160
+ 'stats.tools': '工具',
161
+ 'stats.messages': '消息',
162
+ 'stats.compositionUnavailable': '无法获取构成',
163
+ 'stats.contextPending': '请求上报用量后显示上下文占用',
164
+
165
+ // ---- questions modal ----------------------------------------------------
166
+ 'questions.title': '问题',
167
+ 'questions.titleOf': '问题 {index}/{total}',
168
+ 'questions.defer': 'Esc 稍后处理',
169
+ 'questions.range': '{from}-{to} / {total} PgUp/PgDn',
170
+ 'questions.other': '其他: ',
171
+ 'questions.answer': '回答: ',
172
+ 'questions.placeholder': '输入你自己的答案',
173
+ 'questions.hintCustom': 'Enter 确认 · Esc 返回',
174
+ 'questions.hintMulti': 'Space 切换 · Enter 继续 · ↑/↓ 移动',
175
+ 'questions.hintSingle': 'Enter 选择 · ↑/↓ 移动',
176
+
177
+ // ---- secret prompt ------------------------------------------------------
178
+ 'secret.hint': 'Enter 提交 · Esc 取消',
179
+
180
+ // ---- boot gate: the dsh version this build may run on ----
181
+ 'boot.unsupportedTitle': 'dsh 版本不受支持',
182
+ 'boot.unverifiedTitle': 'dsh 版本尚未验证',
183
+ 'boot.runningLabel': '当前 dsh',
184
+ 'boot.supportedLabel': '支持范围',
185
+ 'boot.recommendedLabel': '推荐版本',
186
+ 'boot.verifiedLabel': '已验证',
187
+ 'boot.unsupportedBody': '本版 dsh-oc-tui 只支持 {range},{version} 不在其中。在 dsh 换成受支持的版本之前,会话无法运行。',
188
+ 'boot.unverifiedBody': '本版 dsh-oc-tui 只在 {verified} 上验证过,没有验证过 {version}。请安装 {recommended} 以确保可用。',
189
+ 'boot.installHint': '安装推荐的 dsh 版本,然后重新启动本 profile:',
190
+ 'boot.updatePluginHint': '如果新版 dsh-oc-tui 已支持当前 dsh,也可以改为更新插件:',
191
+ 'boot.exitHint': 'Esc 或 Ctrl+C 退出',
192
+
193
+ // ---- settings dialog chrome --------------------------------------------
194
+ 'settings.title': '设置',
195
+ 'settings.menu': '菜单',
196
+ 'settings.shared': '与 DeepSeek Harness WebUI 共享',
197
+ 'settings.footerEdit': 'Enter 保存 · Esc 取消',
198
+ 'settings.footerMenu': '↑/↓ 移动 · Tab 菜单 · Enter 选择 · Esc 返回',
199
+ 'settings.footerPlain': '↑/↓ 移动 · Enter 选择 · Esc 返回',
200
+ 'settings.confirmHint': '{text} · Y / N',
201
+ 'settings.confirmDefault': 'Y 确认 · N 取消',
202
+ 'settings.confirmDeleteSession': '再按一次 Ctrl+D 删除',
203
+ 'settings.confirmChange': '确认此更改?',
204
+ 'settings.deleteTwice': '再按一次 Ctrl+D 删除 ',
205
+ 'settings.deleteMcpTwice': '再按一次 Delete 移除 ',
206
+ 'settings.noSession': '未选择会话',
207
+ 'settings.noSessions': '没有可用的会话',
208
+ 'settings.noMcp': '未选择 MCP 服务器',
209
+ 'settings.noOptions': '{label} 没有可用选项',
210
+ 'settings.saved': '已保存到 DSH 设置',
211
+ 'settings.providerRemoved': '服务商已移除',
212
+ 'settings.conflict': '设置已在别处更改,已重新加载',
213
+ 'settings.error': '设置:{error}',
214
+ 'settings.dshSettings': 'DSH 设置',
215
+ 'settings.optionList': 'Enter 选择 · Esc 返回',
216
+
217
+ // ---- settings left menu -------------------------------------------------
218
+ 'menu.main': '主菜单',
219
+ 'menu.model': '模型',
220
+ 'menu.update': '更新',
221
+ 'menu.mcp': 'MCP',
222
+
223
+ // ---- settings rows: main tab -------------------------------------------
224
+ 'settings.general': '通用',
225
+ 'settings.graphics': '图形',
226
+ 'settings.sessions': '会话',
227
+ 'settings.system': '系统',
228
+ 'settings.developer': '开发者',
229
+ 'settings.contextDetails': '上下文详情',
230
+ 'settings.busyEnter': '忙碌时 Enter',
231
+ 'settings.defaultPreset': '默认预设',
232
+ 'settings.permissionPreset': '权限预设',
233
+ 'settings.permissionDangerConfirm': '启用不受限制的工具与文件访问?',
234
+ 'settings.graphicsRendering': '图形渲染',
235
+ 'settings.noProtocolFallback': '无协议回退',
236
+ 'settings.imageHeightCap': '图片高度上限(行)',
237
+ 'settings.mermaidRendering': 'Mermaid 渲染',
238
+ 'settings.newSession': '新建会话',
239
+ 'settings.manageSessions': '管理会话',
240
+ 'settings.providerConfig': '服务商 API 配置',
241
+ 'settings.updateManager': '更新管理',
242
+ 'settings.settingsFile': '设置文件',
243
+ 'settings.language': '语言',
244
+ 'settings.theme': '主题',
245
+ 'theme.deepseek': 'DeepSeek Standard',
246
+ 'theme.github-dark': 'GitHub Dark',
247
+ 'theme.dracula': 'Dracula',
248
+ 'theme.vscode-dark': 'VS Code Dark+',
249
+ 'theme.nord': 'Nord',
250
+ 'settings.languageSystem': '跟随系统({language})',
251
+ 'settings.languageSaved': '语言:{language}',
252
+
253
+ // ---- model tab ----------------------------------------------------------
254
+ 'model.title': '模型',
255
+ 'model.subtitle': 'Enter 将列表中的模型设为默认',
256
+ 'model.defaultSection': '默认',
257
+ 'model.defaultProvider': '默认服务商',
258
+ 'model.defaultModel': '默认模型',
259
+ 'model.reasoning': '推理',
260
+ 'model.providerUrl': '服务商 URL',
261
+ 'model.providerApiKey': '服务商 API 密钥',
262
+ 'model.displayName': '显示名称',
263
+ 'model.wireProtocol': '传输协议',
264
+ 'model.defaultImageInput': '默认图片输入',
265
+ 'model.models': '模型',
266
+ 'model.fetch': '获取…',
267
+ 'model.selectedCount': '已选 {count} 项',
268
+ 'model.removeProvider': '移除服务商',
269
+ 'model.removeProviderConfirm': '移除 {name} 及其托管的凭据?',
270
+ 'model.noModels': '没有可用的模型',
271
+ 'model.noModelsReturned': '服务商未返回任何模型',
272
+ 'model.fetchUnavailable': '无法自动获取 — 已保存的模型 · Enter 切换',
273
+ 'model.fetchOk': '已自动获取 · Enter 切换 · Esc 返回',
274
+ 'model.fetching': '正在获取模型…',
275
+ 'model.autoFetching': '自动获取中…',
276
+ 'model.credentialConfigured': '已配置({source})',
277
+ 'model.credentialMissing': '未配置',
278
+ 'model.defaultTag': '默认',
279
+ 'model.providerUnavailable': '服务商已不可用',
280
+ 'model.namespaceUnavailable': '服务商设置命名空间不可用',
281
+ 'model.apiKeyEmpty': 'API 密钥不能为空',
282
+ 'model.credentialsUnavailable': '凭据服务不可用',
283
+ 'model.noProviderModels': '所选服务商没有可用的模型',
284
+ 'model.addCount.one': '{count} 个可添加',
285
+ 'model.addCount.other': '{count} 个可添加',
286
+
287
+ // ---- add-provider flow --------------------------------------------------
288
+ 'provider.add': '添加服务商',
289
+ 'provider.empty': '还没有配置任何服务商',
290
+ 'provider.pickSubtitle': 'Enter 选择 · Esc 返回',
291
+ 'provider.catalog': '已安装的服务商',
292
+ 'provider.catalogEmpty': '所有已安装的服务商都已配置',
293
+ 'provider.custom': '自定义 API — 手工声明端点',
294
+ 'provider.form.catalog': '启用已安装的服务商',
295
+ 'provider.form.custom': '声明自定义服务商',
296
+ 'provider.formSubtitle': 'Enter 编辑 · Esc 返回',
297
+ 'provider.field.route': '路由 ID',
298
+ 'provider.field.addModel': '手动添加模型 ID',
299
+ 'provider.field.save': '保存服务商',
300
+ 'provider.hint.route': '小写字母、数字与连字符 · 密钥保存为 {ref}',
301
+ 'provider.error.route': '路由 ID 必须以字母开头,只含小写字母、数字与连字符',
302
+ 'provider.error.routeNeeded': '请先选择一个服务商',
303
+ 'provider.error.taken': '该路由 ID 已被其他服务商使用',
304
+ 'provider.error.baseUrl': '端点必须是 http 或 https URL',
305
+ 'provider.error.baseUrlNeeded': '自定义服务商必须填写端点',
306
+ 'provider.error.apiNeeded': '请选择该端点使用的协议',
307
+ 'provider.error.modelsNeeded': '自定义服务商至少需要一个模型',
308
+ 'provider.error.modelId': '第 {index} 个模型缺少 ID',
309
+ 'provider.error.modelDuplicate': '模型 "{id}" 重复出现',
310
+ 'provider.added': '服务商已添加',
311
+ 'provider.accountManaged': '已通过 DeepSeek 账号登录',
312
+ 'provider.search': '搜索',
313
+ 'provider.searchPlaceholder': '输入以筛选',
314
+ 'provider.searchEmpty': '没有匹配 "{query}" 的服务商',
315
+
316
+ // ---- 单个模型条目 --------------------------------------------------------
317
+ 'model.edit': '编辑模型',
318
+ 'model.editHint': 'e 编辑 · Del 删除',
319
+ 'model.refresh': '重新获取目录',
320
+ 'model.selectAll': '全选',
321
+ 'model.fetchRefused': '端点没有返回任何模型列表',
322
+ 'model.notSaved': '该模型尚未保存',
323
+ 'model.removed': '模型已删除',
324
+ 'model.form.add': '添加模型',
325
+ 'model.form.edit': '模型 · {id}',
326
+ 'model.form.save': '保存模型',
327
+ 'model.form.remove': '从服务商移除',
328
+ 'model.form.removeConfirm': '要把这个模型从该服务商移除吗?',
329
+ 'model.field.id': '模型 ID',
330
+ 'model.field.name': '显示名称',
331
+ 'model.field.contextWindow': '上下文窗口',
332
+ 'model.field.maxTokens': '最大输出 tokens',
333
+ 'model.field.input': '输入类型',
334
+ 'model.error.idNeeded': '模型必须有 ID',
335
+ 'model.error.idDuplicate': '模型 "{id}" 已在列表中',
336
+ 'model.error.capacity': '上下文窗口与最大 tokens 必须是整数(可写 256K、1M)',
337
+
338
+ // ---- MCP tab ------------------------------------------------------------
339
+ 'mcp.title': 'MCP',
340
+ 'mcp.subtitle': 'Enter 编辑 · Del 移除 · Esc 返回',
341
+ 'mcp.editSubtitle': 'Enter 编辑 · Esc 返回',
342
+ 'mcp.servers': 'MCP 服务器',
343
+ 'mcp.empty': '尚未配置 MCP 服务器',
344
+ 'mcp.add': '添加 MCP 服务器',
345
+ 'mcp.scope': '作用域',
346
+ 'mcp.scopeUserPrefix': '用户 · {path}',
347
+ 'mcp.scopePathPrefix': '路径 · {path}',
348
+ 'mcp.configFiles': '配置文件',
349
+ 'mcp.userScope': '用户(所有会话)',
350
+ 'mcp.secrets': '密钥',
351
+ 'mcp.secretsPlain': '在配置文件中以明文保存',
352
+ 'mcp.loaded': '已加载',
353
+ 'mcp.notCreated': '尚未创建',
354
+ 'mcp.type.stdio': '本地命令',
355
+ 'mcp.type.http': 'HTTP',
356
+ 'mcp.type.sse': 'SSE',
357
+ 'mcp.state.connected': '● 已连接',
358
+ 'mcp.state.tools.one': '● {count} 个工具',
359
+ 'mcp.state.tools.other': '● {count} 个工具',
360
+ 'mcp.state.pending': '… 连接中',
361
+ 'mcp.state.disabled': '○ 已禁用',
362
+ 'mcp.state.idle': '○ 未连接',
363
+ 'mcp.notice.connected': "MCP {name}: 已连接",
364
+ 'mcp.notice.failed': "MCP {name}: 连接失败",
365
+ 'mcp.form.add': '添加 MCP 服务器',
366
+ 'mcp.form.edit': '编辑 MCP 服务器 · {name}',
367
+ 'mcp.titleAdd': 'MCP · 添加',
368
+ 'mcp.titleEdit': 'MCP · 编辑',
369
+ 'mcp.field.name': '名称',
370
+ 'mcp.field.type': '类型',
371
+ 'mcp.field.timeout': '超时(毫秒)',
372
+ 'mcp.field.command': '命令',
373
+ 'mcp.field.args': '参数',
374
+ 'mcp.field.env': '环境变量(JSON)',
375
+ 'mcp.field.url': 'URL',
376
+ 'mcp.field.headers': '请求头(JSON)',
377
+ 'mcp.field.scope': '作用域',
378
+ 'mcp.field.path': '路径',
379
+ 'mcp.field.enabled': '启用',
380
+ 'mcp.field.save': '保存',
381
+ 'mcp.field.remove': '移除',
382
+ 'mcp.choice.stdio': '本地命令(stdio)',
383
+ 'mcp.choice.http': 'HTTP(流式)',
384
+ 'mcp.choice.sse': 'SSE(旧版 HTTP+SSE)',
385
+ 'mcp.choice.scopeUser': '用户 — 所有会话',
386
+ 'mcp.choice.scopePath': '路径 — 某个目录下的会话',
387
+ 'mcp.removeConfirm': '移除此 MCP 服务器并断开连接?',
388
+ 'mcp.saved': 'MCP 服务器已保存',
389
+ 'mcp.added': 'MCP 服务器已添加',
390
+ 'mcp.removed': 'MCP 服务器已移除',
391
+ 'mcp.error.name': '名称必须为 1-32 个字符,只能包含字母、数字、“-”或“_”',
392
+ 'mcp.error.duplicate': '已配置名为“{name}”的 MCP 服务器',
393
+ 'mcp.error.timeout': 'timeoutMs 必须是 1 到 {max} 之间的整数',
394
+ 'mcp.error.pathNeeded': '路径作用域的服务器需要指定目录',
395
+ 'mcp.error.pathAbsolute': '路径作用域必须是绝对目录',
396
+ 'mcp.error.commandNeeded': 'stdio 服务器需要指定命令',
397
+ 'mcp.error.urlParse': 'URL 无法解析',
398
+ 'mcp.error.urlScheme': 'URL 必须使用 http 或 https',
399
+ 'mcp.error.pathNotDir': '路径作用域不是目录:{path}',
400
+ 'mcp.error.configIsDir': '配置文件路径是目录:{path}',
401
+ 'mcp.error.notFound': '未配置名为“{name}”的 MCP 服务器',
402
+ 'mcp.error.documentGone': '定义“{name}”的文档已不存在:{error}',
403
+ 'mcp.error.noClient': '宿主未提供 MCP 客户端',
404
+ 'mcp.error.connectTimeout': '连接 {name} 超时',
405
+ 'mcp.error.json': '文档不是有效的 JSON:{error}',
406
+ 'mcp.error.jsonObject': '文档必须是 JSON 对象',
407
+ 'mcp.error.serversObject': '“servers”必须是 JSON 对象',
408
+ 'mcp.error.argsArray': '参数必须是字符串组成的 JSON 数组',
409
+ 'mcp.error.argsTypes': '参数必须是字符串或数字',
410
+ 'mcp.error.argsUnclosed': '参数中有未闭合的引号',
411
+ 'mcp.error.envObject': '{label} 必须是 JSON 对象',
412
+ 'mcp.error.envValue': '{label} 的值“{name}”必须是字符串、数字或布尔值',
413
+ 'mcp.error.header': '无效的 HTTP 请求头“{name}”',
414
+ 'mcp.error.envName': '无效的环境变量名“{name}”',
415
+
416
+ // ---- rewind -------------------------------------------------------------
417
+ 'rewind.title': '回退',
418
+ 'rewind.restoreTo': '恢复到此前的位置:{label}',
419
+ 'rewind.restorePrompt': '将会话恢复到此前的位置…',
420
+ 'rewind.empty': '暂无可回退的位置。',
421
+ 'rewind.option.conversation': '恢复对话',
422
+ 'rewind.option.both': '恢复对话与文件',
423
+ 'rewind.option.code': '恢复文件',
424
+ 'rewind.option.cancel': '取消',
425
+ 'rewind.current': '(当前)',
426
+ 'rewind.noPoints': '没有可回退的用户消息',
427
+ 'rewind.unknownPoint': '未知的回退点“{selector}” — 请使用数字或 last',
428
+ 'rewind.noPoint': '没有回退点 {n} — 1..{count}',
429
+ 'rewind.notGit': '不是 git 工作树',
430
+ 'rewind.noBackup': '没有备份位置',
431
+ 'rewind.filesNotRestored': '文件未恢复',
432
+ 'rewind.filesNotRestoredReason': '文件未恢复({reason})',
433
+ 'rewind.restored.one': '已从 HEAD 恢复 {count} 个受跟踪文件',
434
+ 'rewind.restored.other': '已从 HEAD 恢复 {count} 个受跟踪文件',
435
+ 'rewind.removed.one': '已删除 {count} 个新增文件',
436
+ 'rewind.removed.other': '已删除 {count} 个新增文件',
437
+ 'rewind.skipped': '跳过 {count} 个',
438
+ 'rewind.previousSaved': '原内容已保存至 {path}',
439
+ 'rewind.noChanges': '此位置之后没有文件变更',
440
+ 'rewind.image': '[图片]',
441
+ 'rewind.images': '[{count} 张图片]',
442
+ 'rewind.emptyMessage': '(空)',
443
+ 'git.title': 'Git 分支',
444
+ 'git.subtitle': '当前:{branch} · {path}',
445
+ 'git.local': '本地分支',
446
+ 'git.remote': '远程分支',
447
+ 'git.empty': '此仓库没有任何分支。',
448
+ 'git.detached': '(游离头指针)',
449
+ 'git.switched': '已切换到分支 {branch}',
450
+ 'git.switchFailed': '无法切换到 {branch}:{error}',
451
+ 'git.pullDone': '已拉取更新',
452
+ 'git.pullFailed': '无法拉取更新:{error}',
453
+ 'git.listFailed': '无法列出分支:{error}',
454
+ 'git.notRepo': '不是 git 工作树',
455
+ 'git.gitMissing': 'PATH 中找不到 git',
456
+ 'git.timedOut': 'git 执行超时',
457
+ 'git.onlyTitleScreen': '分支切换仅在空页面可用 — 请先输入 /new 退出会话',
458
+ 'git.footer': '↑/↓ 选择 · Enter 切换 · P 拉取 · R 刷新 · Esc 关闭',
459
+
460
+ // ---- update tab ---------------------------------------------------------
461
+ 'update.title': '更新',
462
+ 'update.checking': '正在检查版本…',
463
+ 'update.fetching': '正在从 npm registry 获取…',
464
+ 'update.fetchingVersions': '正在获取版本…',
465
+ 'update.versionsSubtitle': 'Enter 下载 · Esc 返回',
466
+ 'update.installed': '已安装',
467
+ 'update.latest': '最新(npm 标签)',
468
+ 'update.status': '状态',
469
+ 'update.versions': '版本',
470
+ 'update.selectVersion': '选择版本…',
471
+ 'update.restartApply': '重启以应用 {version}',
472
+ 'update.enterRestart': 'Enter 重启',
473
+ 'update.discard': '丢弃已下载的 {version}',
474
+ 'update.actions': '操作',
475
+ 'update.checkNow': '立即检查',
476
+ 'update.checkingShort': '检查中…',
477
+ 'update.startupCheck': '启动时检查',
478
+ 'update.profile': 'profile',
479
+ 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
480
+ 'update.statusCorrupt': '安装已损坏 — 请在下方重新安装',
481
+ 'update.statusError': 'registry 检查失败:{error}',
482
+ 'update.statusAvailable': '有可用更新 → {version}',
483
+ 'update.statusUpToDate': '已是最新',
484
+ 'update.statusNoStable': '没有稳定版本 — 请从“版本”中选择',
485
+ 'update.notOnPath': '在 PATH 中未找到',
486
+ 'update.subtitleStaged': '{package} {version} 已下载 — 重启后应用',
487
+ 'update.subtitleIdle': 'Enter 选择 · 下载后重启以应用',
488
+ 'update.download': '下载',
489
+ 'update.contacting': '正在连接 registry…',
490
+ 'update.version': '版本',
491
+ 'update.savingTo': '保存到',
492
+ 'update.escCancels': 'Esc 取消',
493
+ 'update.restartApplyQ': '重启以应用 {label} {version}?(已下载)',
494
+ 'update.downloadQ': '下载 {label} {version} 并重启应用?',
495
+ 'update.localSwitch': ' — 将本地安装切换为 registry 版本',
496
+ 'update.downloaded': '已下载 · 重启后应用',
497
+ 'update.downloadedToast': '{label} {version} 已下载 · 可在“更新”标签页应用',
498
+ 'update.downloadedConfirm': '已下载 重启以应用 {label} {version}?(y/n)',
499
+ 'update.alreadyDownloadedConfirm': '已下载 · 重启以应用 {label} {version}?(y/n)',
500
+ 'update.downloadCancelled': '下载已取消',
501
+ 'update.downloadFailed': '下载失败:{error}',
502
+ 'update.stagedGone': '已下载的暂存包不存在 — 请重新选择版本',
503
+ 'update.locks.one': 'dsh 仍在另外 {count} 个进程中运行,无法应用 — 请关闭后重试',
504
+ 'update.locks.other': 'dsh 仍在另外 {count} 个进程中运行,无法应用 — 请关闭后重试',
505
+ 'update.noNpm': '无法应用:未找到 npm',
506
+ 'update.noDshCli': '无法应用:未找到 dsh CLI',
507
+ 'update.installerFailed': '无法启动安装程序 — 请重启 dsh 以应用 {label}',
508
+ 'update.applying': '正在应用 {label} · 即将退出并重启…',
509
+ 'update.stagedDiscarded': '已丢弃暂存的下载包',
510
+ 'update.tagCached': '已缓存',
511
+ 'update.tagStaged': '已暂存',
512
+ 'update.installFailed': '安装失败(退出码 {code})— 请从“版本”重试',
513
+ 'update.installFailedRetry': '打开“更新”→“dsh-oc-tui”→“版本”,然后选择版本重新下载',
514
+ 'update.installUnreadable': '安装报告成功,但已安装版本为 {installed}(预期 {expected})— 修复:{repair}',
515
+ 'update.registryUnreachable': 'registry 无法访问:{error}',
516
+ 'update.notOnRegistry': '{package} 不在 registry 中',
517
+ 'update.registryHttp': 'registry 对 {package} 返回 HTTP {status}',
518
+ 'update.noTarballUrl': 'registry 响应中没有 tarball URL',
519
+ 'update.downloadHttp': '下载失败:{url} 返回 HTTP {status}',
520
+ 'update.downloadEmpty': '下载失败:响应体为空',
521
+ 'update.integrityFailed': '{file} 完整性校验失败 — 已丢弃该下载',
522
+ 'update.npmMissing': '在 PATH 中未找到 npm',
523
+ 'update.npmViewFailed': 'npm view {package} 退出码 {code}',
524
+ 'update.timedOut': '\n({ms}ms 后超时)',
525
+ 'update.noOutput': '(无输出)',
526
+
527
+ // ---- commands -----------------------------------------------------------
528
+ 'command.settings': '打开 TUI 设置页面',
529
+ 'command.help': '显示 TUI 快捷键与命令参考',
530
+ 'command.stats': '显示会话 token 与缓存统计',
531
+ 'command.new': '开始新会话',
532
+ 'command.resume': '恢复已持久化的会话',
533
+ 'command.clear': '清空对话记录',
534
+ 'command.cancel': '取消正在运行的回合',
535
+ 'command.rewind': '将会话回退到更早的位置',
536
+ 'command.branch': '在空页面切换 git 分支',
537
+ 'command.quit': '退出 TUI',
538
+
539
+ // ---- help overlay -------------------------------------------------------
540
+ 'help.title': 'DeepSeek Harness TUI — 帮助',
541
+ 'help.enter': 'Enter',
542
+ 'help.enterDesc': '发送消息',
543
+ 'help.ctrlEnter': 'Ctrl+Enter',
544
+ 'help.ctrlEnterDesc': '插入换行',
545
+ 'help.ctrlC': 'Ctrl+C',
546
+ 'help.ctrlCDesc': '取消正在运行的回合;再按一次退出',
547
+ 'help.ctrlP': 'Ctrl+P',
548
+ 'help.ctrlPDesc': '打开设置',
549
+ 'help.ctrlE': 'Ctrl+E',
550
+ 'help.ctrlEDesc': '切换思考滑块',
551
+ 'help.tab': 'Tab',
552
+ 'help.tabDesc': '切换思考强度',
553
+ 'help.ctrlN': 'Ctrl+N',
554
+ 'help.ctrlNDesc': '新建会话',
555
+ 'help.ctrlG': 'Ctrl+G',
556
+ 'help.ctrlGDesc': '切换 git 分支(空页面)',
557
+ 'help.ctrlD': 'Ctrl+D',
558
+ 'help.ctrlDDesc': '在“管理会话”中删除会话(按两次)',
559
+ 'help.pg': 'PgUp / PgDn',
560
+ 'help.pgDesc': '滚动对话记录',
561
+ 'help.shiftArrows': 'Shift+↑/↓',
562
+ 'help.shiftArrowsDesc': '滚动状态栏(宽窗口)',
563
+ 'help.upDown': 'Up / Down',
564
+ 'help.upDownDesc': '光标上/下移;到边界时翻阅历史',
565
+ 'help.mouse': '鼠标拖动',
566
+ 'help.mouseDesc': '选择文本;右键复制',
567
+ 'help.wheel': '滚轮',
568
+ 'help.wheelDesc': '滚动对话记录 / 设置',
569
+ 'help.escEsc': 'Esc Esc',
570
+ 'help.escEscDesc': '回退选择器',
571
+ 'help.esc': 'Esc',
572
+ 'help.escDesc': '关闭浮层 · 取消回合 · 清空输入',
573
+ 'help.commands': '命令:',
574
+
575
+ // ---- session manager / toasts ------------------------------------------
576
+ 'session.newTitle': '新会话',
577
+ 'session.noSaved': '没有已保存的会话',
578
+ 'session.manageTitle': '管理会话',
579
+ 'session.manageSubtitle': 'Enter 打开 · Ctrl+D 两次删除 · Esc 返回',
580
+ 'session.loading': '正在加载会话…',
581
+ 'session.deleted': '已删除会话 {label}',
582
+ 'session.deleteFailed': '删除会话:{error}',
583
+ 'session.deleteNotFound': '未找到持久化的会话目录',
584
+ 'session.deleteCancelled': '删除已取消',
585
+ 'session.resumed': '已恢复会话 {id}',
586
+ 'session.started': '已开始会话 {id}',
587
+ 'session.openFailed': '打开会话失败:{error}',
588
+ 'session.forkSummary': '{label}(来自 {parent})· {files}',
589
+ 'session.forkDropped': ' · 丢弃了 {count} 条继承的待发输入',
590
+ 'session.conversationOnly': '仅对话',
591
+ 'session.rewindLabel': '回退 #{n}',
592
+ 'session.files': '文件:{summary}',
593
+ 'session.error': '错误:{error}',
594
+ 'session.interruptFirst': '请先中断正在运行的回合(/cancel)',
595
+ 'session.interruptFirstEsc': '请先中断正在运行的回合(Esc 或 /cancel)',
596
+ 'session.startFirst': '请先开始一个会话',
597
+ 'session.noReasoningLevels': '当前模型没有可用的推理等级',
598
+ 'session.settingsUnavailable': '设置不可用',
599
+ 'session.interruptRequested': '已请求中断',
600
+ 'session.nothingToInterrupt': '没有可中断的内容',
601
+ 'session.noSessionRunning': '没有正在运行的会话',
602
+ 'session.promptCleared': '输入已清空',
603
+ 'session.exitAgain': '再按一次 Ctrl+C 退出',
604
+ 'session.usageResume': '用法:/resume <sessionId>',
605
+ 'session.currentModel': '当前模型:{model}',
606
+ 'session.modelSet': '模型已设为 {model}(对下一次请求生效)',
607
+ 'session.currentProvider': '当前服务商:{provider}',
608
+ 'session.providerSet': '服务商已设为 {provider}(对下一次请求生效)',
609
+ 'session.unknownCommand': '未知命令 /{name} — 试试 /help',
610
+ 'session.queryMissing': '当前 profile 中未挂载会话查询服务',
611
+ 'session.listHeader': '会话:',
612
+ 'session.noPersisted': '没有持久化的会话',
613
+ 'session.listFailed': '列出会话失败:{error}',
614
+ 'session.modelNoImages': '模型“{model}”不支持图片输入',
615
+ 'session.imageAttachFailed': '附加图片失败:{error}',
616
+ 'session.attachmentsUnavailable': '附件服务不可用,无法读取图片',
617
+ 'session.copied.one': '已复制 {count} 行到剪贴板',
618
+ 'session.copied.other': '已复制 {count} 行到剪贴板',
619
+ 'session.valueRequired': '需要填写值',
620
+ 'session.minChars': '至少 {count} 个字符',
621
+ 'session.maxChars': '最多 {count} 个字符',
622
+ 'session.answerRequired': '请选择选项或输入答案',
623
+ 'session.typeAnswer': '请输入答案或按 Esc',
624
+ 'session.updatesAvailable': '更新:{list} — Ctrl+P → 更新',
625
+ 'session.versionsError': '版本:{error}',
626
+ 'session.mcpError': 'MCP:{error}',
627
+ 'session.noClipboard': '没有可用的剪贴板通道',
628
+ 'session.unsupportedInteraction': '不支持的交互类型:{kind}',
629
+
630
+ // ---- tool activity summaries -------------------------------------------
631
+ 'tool.run': '运行 {command}',
632
+ 'tool.askUser': '询问用户',
633
+ 'tool.askQuestions': '询问 {count} 个问题',
605
634
 
606
635
  // ---- host diagnostics ----------------------------------------------------
607
636
  'diagnostics.notice': '宿主诊断已写入 {path}',
608
- }
637
+
638
+ // ---- screenshots --------------------------------------------------------
639
+ "screenshot.shortcut": "截图",
640
+ "screenshot.directory": "截图保存位置",
641
+ "screenshot.saved": "截图已保存",
642
+ "screenshot.failed": "截图失败",
643
+ }