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
package/lib/locales/ja.js CHANGED
@@ -1,607 +1,642 @@
1
- // Japanese catalog. Keys, order and placeholders mirror `en.js`, the source.
2
- export default {
3
- // ---- shared chrome ------------------------------------------------------
4
- 'common.selectBack': 'Enter 選択 · Esc 戻る',
5
- 'common.selectConfirmBack': '↑/↓ 選択 · Enter 確定 · Esc 戻る',
6
- 'common.selectContinueExit': '↑/↓ 選択 · Enter 続行 · Esc 終了',
7
- 'common.escBack': 'Esc 戻る',
8
- 'common.escClose': 'Esc 閉じる',
9
- 'common.escCancel': 'Esc キャンセル',
10
- 'common.working': '処理中…',
11
- 'common.pleaseWait': 'お待ちください',
12
- 'common.on': 'オン',
13
- 'common.off': 'オフ',
14
- 'common.unavailable': '利用不可',
15
- 'common.selected': '選択中',
16
- 'common.default': 'デフォルト',
17
- 'common.system': 'システム',
18
- 'common.installed': '(インストール済み)',
19
- 'common.more': '… 他 {count} 件',
20
- 'common.moreLines': '… 他 {count} 行',
21
- 'common.clickExpand': ' · クリックで展開',
22
- 'common.clickCollapse': ' · クリックで折りたたむ',
23
- 'common.unknown': '不明',
24
- 'common.emptyMessage': '[空のメッセージ]',
25
- 'value.queue': 'キュー',
26
- 'value.steer': 'ステア',
27
- 'value.auto': '自動',
28
- 'value.local': 'ローカル',
29
- 'value.textOnly': 'テキストのみ',
30
- 'value.textImage': 'テキスト + 画像',
31
-
32
- // ---- title screen -------------------------------------------------------
33
- 'splash.hint': '何でも聞いてください… 「壊れたテストを直して」',
34
- 'splash.shortcutSettings': '設定',
35
- 'splash.shortcutThinking': '思考',
36
- 'splash.shortcutBranches': 'ブランチ',
37
-
38
- // ---- header / sidebar / status row -------------------------------------
39
- // ---- command-line help (dsh --profile tui --help) -----------------------
40
- 'startup.description': 'DeepSeek Harness のターミナル UI を起動します。',
41
- 'startup.helpOption': 'このヘルプを表示',
42
- 'startup.resume': 'id を指定して既存の保存済みセッションを再開します',
43
- 'startup.model': '新しいセッションの既定モデル id',
44
- 'startup.provider': '新しいセッションの既定プロバイダールート',
45
- 'startup.sidebar': 'セッションのサイドバーを表示します(既定)',
46
- 'startup.noSidebar': 'サイドバーなしで起動します',
47
- 'startup.examples': '例:',
48
- 'startup.exampleFresh': '新しいセッションを開始',
49
- 'startup.exampleResume': '保存済みセッションを再開',
50
-
51
- 'header.workspace': 'ワークスペース',
52
- 'sidebar.sessions': 'セッション',
53
- 'sidebar.recent': '最近',
54
- 'sidebar.newSession': '+ 新規セッション',
55
- 'status.model': 'モデル',
56
- 'status.draftTokens': '{count} 下書きトークン',
57
- 'status.ctrlP': 'ctrl+p コマンド',
58
- 'status.interrupt': '中断: ctrl+c',
59
-
60
- // ---- composer command hints --------------------------------------------
61
- 'hint.help': 'ヘルプを表示',
62
- 'hint.settings': '設定を開く',
63
- 'hint.new': '新規セッション',
64
- 'hint.resume': 'セッションを再開',
65
- 'hint.model': 'モデルを選択',
66
- 'hint.provider': 'プロバイダーを選択',
67
- 'hint.rewind': '巻き戻し選択',
68
- 'hint.branch': 'git ブランチを切り替える',
69
- 'hint.stats': 'セッション統計とトークン使用量',
70
- 'hint.clear': '表示をクリア',
71
- 'hint.cancel': '実行中のターンをキャンセル',
72
- 'hint.quit': '終了',
73
- 'hint.compact': 'コンテキストを圧縮',
74
- 'hint.goal': 'ゴールを管理',
75
-
76
- // ---- transcript blocks --------------------------------------------------
77
- 'transcript.turns.one': '{count} ターン',
78
- 'transcript.turns.other': '{count} ターン',
79
- 'transcript.steps.one': '{count} ステップ',
80
- 'transcript.steps.other': '{count} ステップ',
81
- 'transcript.thinking': ' 思考',
82
- 'transcript.streaming': ' · ストリーミング…',
83
- 'transcript.steeringBadge': ' ⟲ ステアリング',
84
- 'transcript.tasks': 'タスク',
85
- 'transcript.systemPrompt': ' システムプロンプト',
86
- 'transcript.pendingInput': ' 入力待ち · ',
87
- 'transcript.steering': ' ステアリング',
88
- 'transcript.queued': ' 待機中',
89
- 'note.systemReminder': 'システムリマインダー',
90
- 'note.compaction': '圧縮',
91
-
92
- // ---- images and mermaid -------------------------------------------------
93
- 'image.attachment': '🖼 画像添付',
94
- 'image.rendering': '⏳ 画像を描画中…',
95
- 'image.renderFailed': '⚠ 画像の描画に失敗 · {error}',
96
- 'image.mermaidRendering': '⏳ Mermaid 図を描画中…',
97
- 'image.mermaidTooWide': '↔ Mermaid 図には {width} 列が必要ですが、このペインは {budget} 列です',
98
- 'image.altFallback': '画像',
99
-
100
- // ---- composer / approval prompt ----------------------------------------
101
- 'composer.imageHint': '貼り付けた画像: マルチモーダルモデル/プラグインまたは deepseek-v4-flash-vision-exp を使ってください(ない場合、画像は読み取れません)',
102
- 'composer.approval': '承認 · ',
103
- 'composer.summary': '概要 · ',
104
- 'composer.origin': '発生元 · ',
105
- 'composer.risk': 'リスク · ',
106
- 'composer.approvalHint': 'y 許可 · n 拒否 · Esc キャンセル',
107
- 'risk.low': '低',
108
- 'risk.medium': '中',
109
- 'risk.high': '高',
110
- 'composer.effortHint': 'Tab / ←/→ 調整 · Esc 閉じる',
111
-
112
- // ---- right status rail --------------------------------------------------
113
- 'rail.model': 'モデル',
114
- 'rail.thinking': '思考',
115
- 'rail.context': 'コンテキスト',
116
- 'rail.session': 'セッション',
117
- 'rail.goal': 'ゴール',
118
- 'rail.subagents': 'サブエージェント',
119
- 'rail.noData': '—',
120
- 'rail.percentUsed': '{percent}% 使用',
121
- 'rail.tokens': '~{used} / {window} トークン',
122
- 'rail.cacheHit': 'キャッシュ {percent}% ヒット',
123
- 'rail.breakdown': 'システム {system} · ツール {tools} · メッセージ {messages}',
124
- 'rail.contextPending': '使用量が報告されると表示されます',
125
- 'rail.subagentCounts': '{running} 実行中 · {total} 合計',
126
- 'rail.unreadable': '{label} (読み取り不可)',
127
- 'rail.more': '… +{count} 件',
128
- 'rail.round': ' · ラウンド {started}/{max}',
129
- 'goal.active': 'アクティブ',
130
- 'goal.paused': '一時停止',
131
- 'goal.blocked': 'ブロック',
132
- 'goal.complete': '完了',
133
-
134
- // ---- session stats window ----------------------------------------------
135
- 'stats.title': 'セッション統計',
136
- 'stats.hint': '帯をクリックするか /stats',
137
- 'stats.usage': '使用量',
138
- 'stats.duration': '所要時間',
139
- 'stats.speed': '速度',
140
- 'stats.tokens': 'トークン',
141
- 'stats.cache': 'キャッシュ',
142
- 'stats.context': 'コンテキスト',
143
- 'stats.noSteps': '完了したステップはまだありません',
144
- 'stats.llmTime': 'LLM {value}',
145
- 'stats.toolTime': 'ツール {value}',
146
- 'stats.ttft': 'TTFT 平均 {value}',
147
- 'stats.tokensPerSecond': '{value} tok/s',
148
- 'stats.cacheRate': 'キャッシュ {percent}%',
149
- 'stats.inOut': '入力 {input} · 出力 {output}',
150
- 'stats.cacheDetail': '{percent}% ヒット · 読み {read} · 書き {write} · ミス {miss}',
151
- 'stats.contextUsed': '使用 {percent}% ~{used} / {window}',
152
- 'stats.systemPrompt': 'システムプロンプト',
153
- 'stats.tools': 'ツール',
154
- 'stats.messages': 'メッセージ',
155
- 'stats.compositionUnavailable': '構成を取得できません',
156
- 'stats.contextPending': 'リクエストが使用量を報告するとコンテキスト使用率が表示されます',
157
-
158
- // ---- questions modal ----------------------------------------------------
159
- 'questions.title': '質問',
160
- 'questions.titleOf': '質問 {index} / {total}',
161
- 'questions.defer': 'Esc 後で',
162
- 'questions.range': '{from}-{to} / {total} PgUp/PgDn',
163
- 'questions.other': 'その他: ',
164
- 'questions.answer': '回答: ',
165
- 'questions.placeholder': '回答を入力してください',
166
- 'questions.hintCustom': 'Enter 確定 · Esc 戻る',
167
- 'questions.hintMulti': 'Space 切り替え · Enter 続行 · Up/Down 移動',
168
- 'questions.hintSingle': 'Enter 選択 · Up/Down 移動',
169
-
170
- // ---- secret prompt ------------------------------------------------------
171
- 'secret.hint': 'Enter で送信 · Esc でキャンセル',
172
-
173
- // ---- settings dialog chrome --------------------------------------------
174
- 'settings.title': '設定',
175
- 'settings.menu': 'メニュー',
176
- 'settings.shared': 'DeepSeek Harness WebUI と共有',
177
- 'settings.footerEdit': 'Enter 保存 · Esc キャンセル',
178
- 'settings.footerMenu': '↑/↓ 移動 · Tab メニュー · Enter 選択 · Esc 戻る',
179
- 'settings.footerPlain': '↑/↓ 移動 · Enter 選択 · Esc 戻る',
180
- 'settings.confirmHint': '{text} · Y / N',
181
- 'settings.confirmDefault': 'Y 確定 · N キャンセル',
182
- 'settings.confirmDeleteSession': 'Ctrl+D をもう一度押すと削除',
183
- 'settings.confirmChange': 'この変更を確定しますか?',
184
- 'settings.deleteTwice': 'Ctrl+D をもう一度押すと削除 ',
185
- 'settings.deleteMcpTwice': 'Delete をもう一度押すと削除 ',
186
- 'settings.noSession': 'セッションが選択されていません',
187
- 'settings.noSessions': '利用できるセッションがありません',
188
- 'settings.noMcp': 'MCP サーバーが選択されていません',
189
- 'settings.noOptions': '{label} に利用可能な選択肢がありません',
190
- 'settings.saved': 'DSH 設定に保存しました',
191
- 'settings.providerRemoved': 'プロバイダーを削除しました',
192
- 'settings.conflict': '設定が別の場所で変更されたため再読み込みしました',
193
- 'settings.error': '設定: {error}',
194
- 'settings.dshSettings': 'DSH 設定',
195
- 'settings.optionList': 'Enter 選択 · Esc 戻る',
196
-
197
- // ---- settings left menu -------------------------------------------------
198
- 'menu.main': 'メイン',
199
- 'menu.model': 'モデル',
200
- 'menu.update': '更新',
201
- 'menu.mcp': 'MCP',
202
-
203
- // ---- settings rows: main tab -------------------------------------------
204
- 'settings.general': '一般',
205
- 'settings.graphics': 'グラフィック',
206
- 'settings.sessions': 'セッション',
207
- 'settings.system': 'システム',
208
- 'settings.busyEnter': '実行中の Enter',
209
- 'settings.defaultPreset': 'デフォルトプリセット',
210
- 'settings.permissionPreset': '権限プリセット',
211
- 'settings.permissionDangerConfirm': 'ツールとファイルへの無制限アクセスを有効にしますか?',
212
- 'settings.graphicsRendering': 'グラフィック描画',
213
- 'settings.noProtocolFallback': 'プロトコルなしのフォールバック',
214
- 'settings.imageHeightCap': '画像の高さ上限 (行)',
215
- 'settings.mermaidRendering': 'Mermaid 描画',
216
- 'settings.newSession': '新規セッション',
217
- 'settings.manageSessions': 'セッションを管理',
218
- 'settings.providerConfig': 'プロバイダー API 設定',
219
- 'settings.updateManager': '更新マネージャー',
220
- 'settings.settingsFile': '設定ファイル',
221
- 'settings.language': '言語',
222
- 'settings.languageSystem': 'システム ({language})',
223
- 'settings.languageSaved': '言語: {language}',
224
-
225
- // ---- model tab ----------------------------------------------------------
226
- 'model.title': 'モデル',
227
- 'model.subtitle': 'Enter で一覧のモデルをデフォルトに設定',
228
- 'model.defaultSection': 'デフォルト',
229
- 'model.defaultProvider': 'デフォルトプロバイダー',
230
- 'model.defaultModel': 'デフォルトモデル',
231
- 'model.reasoning': '推論',
232
- 'model.providerUrl': 'プロバイダー URL',
233
- 'model.providerApiKey': 'プロバイダー API キー',
234
- 'model.displayName': '表示名',
235
- 'model.wireProtocol': '通信プロトコル',
236
- 'model.defaultImageInput': 'デフォルトの画像入力',
237
- 'model.models': 'モデル',
238
- 'model.fetch': '取得…',
239
- 'model.selectedCount': '{count} 件選択',
240
- 'model.removeProvider': 'プロバイダーを削除',
241
- 'model.removeProviderConfirm': '{name} とその管理資格情報を削除しますか?',
242
- 'model.noModels': '利用できるモデルがありません',
243
- 'model.noModelsReturned': 'プロバイダーがモデルを返しませんでした',
244
- 'model.fetchUnavailable': '自動取得は利用不可 — 保存済みモデル · Enter 切り替え',
245
- 'model.fetchOk': '自動取得済み · Enter 切り替え · Esc 戻る',
246
- 'model.fetching': 'モデルを取得中…',
247
- 'model.autoFetching': '自動取得中…',
248
- 'model.credentialConfigured': '設定済み ({source})',
249
- 'model.credentialMissing': '未設定',
250
- 'model.defaultTag': 'デフォルト',
251
- 'model.providerUnavailable': 'プロバイダーは利用できなくなりました',
252
- 'model.namespaceUnavailable': 'プロバイダー設定の名前空間が利用できません',
253
- 'model.apiKeyEmpty': 'API キーは空にできません',
254
- 'model.credentialsUnavailable': '資格情報サービスが利用できません',
255
- 'model.noProviderModels': '選択したプロバイダーに利用可能なモデルがありません',
256
- 'model.addCount.one': '{count} 件追加可能',
257
- 'model.addCount.other': '{count} 件追加可能',
258
-
259
- // ---- add-provider flow --------------------------------------------------
260
- 'provider.add': 'プロバイダーを追加',
261
- 'provider.empty': 'プロバイダーがまだ設定されていません',
262
- 'provider.pickSubtitle': 'Enter 選択 · Esc 戻る',
263
- 'provider.catalog': 'インストール済みのプロバイダー',
264
- 'provider.catalogEmpty': 'インストール済みのプロバイダーはすべて設定済みです',
265
- 'provider.custom': 'カスタム API — エンドポイントを宣言',
266
- 'provider.form.catalog': 'インストール済みプロバイダーを採用',
267
- 'provider.form.custom': 'カスタムプロバイダーを宣言',
268
- 'provider.formSubtitle': 'Enter 編集 · Esc 戻る',
269
- 'provider.field.route': 'ルート ID',
270
- 'provider.field.addModel': 'モデル ID を手動で追加',
271
- 'provider.field.save': 'プロバイダーを保存',
272
- 'provider.hint.route': '英小文字・数字・ハイフン · キーは {ref} として保存',
273
- 'provider.error.route': 'ルート ID は英小文字で始まり、英小文字・数字・ハイフンのみ使用できます',
274
- 'provider.error.routeNeeded': 'プロバイダーを選択してください',
275
- 'provider.error.taken': 'このルート ID は既に使われています',
276
- 'provider.error.baseUrl': 'エンドポイントは http または https の URL である必要があります',
277
- 'provider.error.baseUrlNeeded': 'カスタムプロバイダーにはエンドポイントが必要です',
278
- 'provider.error.apiNeeded': 'このエンドポイントが話すプロトコルを選択してください',
279
- 'provider.error.modelsNeeded': 'カスタムプロバイダーには少なくとも 1 つのモデルが必要です',
280
- 'provider.error.modelId': 'モデル {index} に ID がありません',
281
- 'provider.error.modelDuplicate': 'モデル "{id}" が重複しています',
282
- 'provider.added': 'プロバイダーを追加しました',
283
- 'provider.accountManaged': 'DeepSeek アカウントでサインイン済み',
284
- 'provider.search': '検索',
285
- 'provider.searchPlaceholder': '入力で絞り込み',
286
- 'provider.searchEmpty': '"{query}" に一致するプロバイダーがありません',
287
-
288
- // ---- モデル 1 件分 --------------------------------------------------------
289
- 'model.edit': 'モデルを編集',
290
- 'model.editHint': 'e 編集 · Del 削除',
291
- 'model.refresh': 'カタログを再取得',
292
- 'model.selectAll': 'すべて選択',
293
- 'model.fetchRefused': 'エンドポイントがモデル一覧を返しませんでした',
294
- 'model.notSaved': 'このモデルはまだ保存されていません',
295
- 'model.removed': 'モデルを削除しました',
296
- 'model.form.add': 'モデルを追加',
297
- 'model.form.edit': 'モデル · {id}',
298
- 'model.form.save': 'モデルを保存',
299
- 'model.form.remove': 'プロバイダーから削除',
300
- 'model.form.removeConfirm': 'このモデルをプロバイダーから削除しますか?',
301
- 'model.field.id': 'モデル ID',
302
- 'model.field.name': '表示名',
303
- 'model.field.contextWindow': 'コンテキストウィンドウ',
304
- 'model.field.maxTokens': '最大出力トークン',
305
- 'model.field.input': '入力',
306
- 'model.error.idNeeded': 'モデルには ID が必要です',
307
- 'model.error.idDuplicate': 'モデル "{id}" はすでに一覧にあります',
308
- 'model.error.capacity': 'コンテキストウィンドウと最大トークンは整数で指定します(256K、1M)',
309
-
310
- // ---- MCP tab ------------------------------------------------------------
311
- 'mcp.title': 'MCP',
312
- 'mcp.subtitle': 'Enter 編集 · Del 削除 · Esc 戻る',
313
- 'mcp.editSubtitle': 'Enter 編集 · Esc 戻る',
314
- 'mcp.servers': 'MCP サーバー',
315
- 'mcp.empty': 'MCP サーバーが設定されていません',
316
- 'mcp.add': 'MCP サーバーを追加',
317
- 'mcp.scope': 'スコープ',
318
- 'mcp.scopeUserPrefix': 'ユーザー · {path}',
319
- 'mcp.scopePathPrefix': 'パス · {path}',
320
- 'mcp.configFiles': '設定ファイル',
321
- 'mcp.userScope': 'ユーザー(すべてのセッション)',
322
- 'mcp.secrets': 'シークレット',
323
- 'mcp.secretsPlain': '設定ファイル内に平文で保存',
324
- 'mcp.loaded': '読み込み済み',
325
- 'mcp.notCreated': '未作成',
326
- 'mcp.type.stdio': 'ローカルコマンド',
327
- 'mcp.type.http': 'HTTP',
328
- 'mcp.type.sse': 'SSE',
329
- 'mcp.state.connected': '● 接続済み',
330
- 'mcp.state.tools.one': '● ツール {count} 件',
331
- 'mcp.state.tools.other': '● ツール {count} 件',
332
- 'mcp.state.pending': '… 接続中',
333
- 'mcp.state.disabled': '○ 無効',
334
- 'mcp.state.idle': '○ 未接続',
335
- 'mcp.form.add': 'MCP サーバーを追加',
336
- 'mcp.form.edit': 'MCP サーバーを編集 · {name}',
337
- 'mcp.titleAdd': 'MCP · 追加',
338
- 'mcp.titleEdit': 'MCP · 編集',
339
- 'mcp.field.name': '名前',
340
- 'mcp.field.type': '種類',
341
- 'mcp.field.timeout': 'タイムアウト (ms)',
342
- 'mcp.field.command': 'コマンド',
343
- 'mcp.field.args': '引数',
344
- 'mcp.field.env': '環境変数 (JSON)',
345
- 'mcp.field.url': 'URL',
346
- 'mcp.field.headers': 'ヘッダー (JSON)',
347
- 'mcp.field.scope': 'スコープ',
348
- 'mcp.field.path': 'パス',
349
- 'mcp.field.enabled': '有効',
350
- 'mcp.field.save': '保存',
351
- 'mcp.field.remove': '削除',
352
- 'mcp.choice.stdio': 'ローカルコマンド (stdio)',
353
- 'mcp.choice.http': 'HTTP (ストリーミング)',
354
- 'mcp.choice.sse': 'SSE (従来の HTTP+SSE)',
355
- 'mcp.choice.scopeUser': 'ユーザー — すべてのセッション',
356
- 'mcp.choice.scopePath': 'パス — ディレクトリ配下のセッション',
357
- 'mcp.removeConfirm': 'この MCP サーバーを削除して切断しますか?',
358
- 'mcp.saved': 'MCP サーバーを保存しました',
359
- 'mcp.added': 'MCP サーバーを追加しました',
360
- 'mcp.removed': 'MCP サーバーを削除しました',
361
- 'mcp.error.name': '名前は英数字と "-" "_" の 1〜32 文字にしてください',
362
- 'mcp.error.duplicate': '"{name}" という名前の MCP サーバーは既に設定されています',
363
- 'mcp.error.timeout': 'timeoutMs は 1〜{max} の整数にしてください',
364
- 'mcp.error.pathNeeded': 'パススコープのサーバーにはディレクトリが必要です',
365
- 'mcp.error.pathAbsolute': 'パススコープは絶対ディレクトリにしてください',
366
- 'mcp.error.commandNeeded': 'stdio サーバーにはコマンドが必要です',
367
- 'mcp.error.urlParse': 'URL を解析できません',
368
- 'mcp.error.urlScheme': 'URL は http または https を使用してください',
369
- 'mcp.error.pathNotDir': 'パススコープがディレクトリではありません: {path}',
370
- 'mcp.error.configIsDir': '設定ファイルのパスがディレクトリです: {path}',
371
- 'mcp.error.notFound': '"{name}" という名前の MCP サーバーは設定されていません',
372
- 'mcp.error.documentGone': '"{name}" を定義するドキュメントがありません: {error}',
373
- 'mcp.error.noClient': 'ホストが MCP クライアントを提供していません',
374
- 'mcp.error.connectTimeout': '{name} への接続がタイムアウトしました',
375
- 'mcp.error.json': 'ドキュメントが有効な JSON ではありません: {error}',
376
- 'mcp.error.jsonObject': 'ドキュメントは JSON オブジェクトである必要があります',
377
- 'mcp.error.serversObject': '"servers" は JSON オブジェクトである必要があります',
378
- 'mcp.error.argsArray': '引数は文字列の JSON 配列である必要があります',
379
- 'mcp.error.argsTypes': '引数は文字列または数値である必要があります',
380
- 'mcp.error.argsUnclosed': '引数に閉じられていない引用符があります',
381
- 'mcp.error.envObject': '{label} は JSON オブジェクトである必要があります',
382
- 'mcp.error.envValue': '{label} の値 "{name}" は文字列・数値・真偽値のいずれかにしてください',
383
- 'mcp.error.header': '無効な HTTP ヘッダー "{name}"',
384
- 'mcp.error.envName': '無効な環境変数名 "{name}"',
385
-
386
- // ---- rewind -------------------------------------------------------------
387
- 'rewind.title': '巻き戻し',
388
- 'rewind.restoreTo': '次の地点の前まで戻す: {label}',
389
- 'rewind.restorePrompt': '会話を次の地点の前まで戻す…',
390
- 'rewind.empty': 'まだ戻せる地点がありません。',
391
- 'rewind.option.conversation': '会話を復元',
392
- 'rewind.option.both': '会話とファイルを復元',
393
- 'rewind.option.code': 'ファイルを復元',
394
- 'rewind.option.cancel': 'キャンセル',
395
- 'rewind.current': '(現在)',
396
- 'rewind.noPoints': '戻せるユーザーメッセージがありません',
397
- 'rewind.unknownPoint': '不明な巻き戻し地点 "{selector}" — 番号か last を指定してください',
398
- 'rewind.noPoint': '巻き戻し地点 {n} はありません — 1..{count}',
399
- 'rewind.notGit': 'git ワークツリーではありません',
400
- 'rewind.noBackup': 'バックアップ先がありません',
401
- 'rewind.filesNotRestored': 'ファイルは復元されませんでした',
402
- 'rewind.filesNotRestoredReason': 'ファイルは復元されませんでした ({reason})',
403
- 'rewind.restored.one': 'HEAD から追跡ファイル {count} 件を復元しました',
404
- 'rewind.restored.other': 'HEAD から追跡ファイル {count} 件を復元しました',
405
- 'rewind.removed.one': '新規ファイル {count} 件を削除しました',
406
- 'rewind.removed.other': '新規ファイル {count} 件を削除しました',
407
- 'rewind.skipped': '{count} 件をスキップ',
408
- 'rewind.previousSaved': '以前の内容を {path} に保存しました',
409
- 'rewind.noChanges': 'この地点以降にファイル変更はありません',
410
- 'rewind.image': '[画像]',
411
- 'rewind.images': '[画像 {count} 件]',
412
- 'rewind.emptyMessage': '(空)',
413
- 'git.title': 'Git ブランチ',
414
- 'git.subtitle': '現在:{branch} · {path}',
415
- 'git.local': 'ローカルブランチ',
416
- 'git.remote': 'リモートブランチ',
417
- 'git.empty': 'このリポジトリにはブランチがありません。',
418
- 'git.detached': '(デタッチド)',
419
- 'git.switched': 'ブランチ {branch} に切り替えました',
420
- 'git.switchFailed': '{branch} に切り替えられません:{error}',
421
- 'git.pullDone': '更新をプルしました',
422
- 'git.pullFailed': '更新をプルできません:{error}',
423
- 'git.listFailed': 'ブランチを一覧表示できません:{error}',
424
- 'git.notRepo': 'git ワークツリーではありません',
425
- 'git.gitMissing': 'git が PATH に見つかりません',
426
- 'git.timedOut': 'git がタイムアウトしました',
427
- 'git.onlyTitleScreen': 'ブランチ切り替えは空のページでのみ利用できます — /new でセッションを離れてください',
428
- 'git.footer': '↑/↓ 選択 · Enter 切替 · P プル · R 更新 · Esc 閉じる',
429
-
430
- // ---- update tab ---------------------------------------------------------
431
- 'update.title': '更新',
432
- 'update.checking': 'バージョンを確認中…',
433
- 'update.fetching': 'npm レジストリから取得中…',
434
- 'update.fetchingVersions': 'バージョンを取得中…',
435
- 'update.versionsSubtitle': 'Enter ダウンロード · Esc 戻る',
436
- 'update.installed': 'インストール済み',
437
- 'update.latest': '最新 (npm タグ)',
438
- 'update.status': '状態',
439
- 'update.versions': 'バージョン',
440
- 'update.selectVersion': 'バージョンを選択…',
441
- 'update.restartApply': '再起動して {version} を適用',
442
- 'update.enterRestart': 'Enter 再起動',
443
- 'update.discard': 'ダウンロードした {version} を破棄',
444
- 'update.actions': '操作',
445
- 'update.checkNow': '今すぐ確認',
446
- 'update.checkingShort': '確認中…',
447
- 'update.startupCheck': '起動時の確認',
448
- 'update.profile': 'プロファイル',
449
- 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
450
- 'update.statusCorrupt': 'インストールが壊れています — 下から再インストールしてください',
451
- 'update.statusError': 'レジストリの確認に失敗しました: {error}',
452
- 'update.statusAvailable': '更新あり → {version}',
453
- 'update.statusUpToDate': '最新です',
454
- 'update.statusNoStable': '安定版がありません — バージョンから選択してください',
455
- 'update.notOnPath': 'PATH に見つかりません',
456
- 'update.subtitleStaged': '{package} {version} をダウンロード済み — 再起動して適用',
457
- 'update.subtitleIdle': 'Enter 選択 · ダウンロード後に再起動して適用',
458
- 'update.download': 'ダウンロード',
459
- 'update.contacting': 'レジストリに接続中…',
460
- 'update.version': 'バージョン',
461
- 'update.savingTo': '保存先',
462
- 'update.escCancels': 'Esc でキャンセル',
463
- 'update.restartApplyQ': '再起動して {label} {version} を適用しますか?(ダウンロード済み)',
464
- 'update.downloadQ': '{label} {version} をダウンロードし、再起動して適用しますか?',
465
- 'update.localSwitch': ' — ローカルインストールをレジストリのバージョンに切り替えます',
466
- 'update.downloaded': 'ダウンロード済み · 再起動して適用',
467
- 'update.downloadedToast': '{label} {version} をダウンロードしました · 更新タブから適用してください',
468
- 'update.downloadedConfirm': 'ダウンロードしました 再起動して {label} {version} を適用しますか? (y/n)',
469
- 'update.alreadyDownloadedConfirm': 'ダウンロード済み · 再起動して {label} {version} を適用しますか? (y/n)',
470
- 'update.downloadCancelled': 'ダウンロードをキャンセルしました',
471
- 'update.downloadFailed': 'ダウンロードに失敗しました: {error}',
472
- 'update.stagedGone': 'ダウンロード済みのファイルがありません — バージョンを選び直してください',
473
- 'update.locks.one': 'dsh が他の {count} プロセスで実行中のため適用できません — 終了して再試行してください',
474
- 'update.locks.other': 'dsh が他の {count} プロセスで実行中のため適用できません — 終了して再試行してください',
475
- 'update.noNpm': '適用できません: npm が見つかりません',
476
- 'update.noDshCli': '適用できません: dsh CLI が見つかりません',
477
- 'update.installerFailed': 'インストーラーを開始できません — dsh を再起動して {label} を適用してください',
478
- 'update.applying': '{label} を適用中 · 終了して再起動します…',
479
- 'update.stagedDiscarded': 'ダウンロード済みのファイルを破棄しました',
480
- 'update.tagCached': 'キャッシュ済み',
481
- 'update.tagStaged': 'ステージ済み',
482
- 'update.installFailed': 'インストールに失敗しました (終了コード {code}) — バージョンから再試行してください',
483
- 'update.installFailedRetry': '更新 → dsh-oc-tui → バージョン を開き、バージョンを選んで再ダウンロードしてください',
484
- 'update.installUnreadable': 'インストールは成功と報告されましたが、インストール済みバージョンは {installed} です(期待値 {expected}) — 修復: {repair}',
485
- 'update.registryUnreachable': 'レジストリに接続できません: {error}',
486
- 'update.notOnRegistry': '{package} はレジストリにありません',
487
- 'update.registryHttp': 'レジストリが {package} に対して HTTP {status} を返しました',
488
- 'update.noTarballUrl': 'レジストリの応答に tarball URL がありません',
489
- 'update.downloadHttp': 'ダウンロードに失敗しました: {url} に対して HTTP {status}',
490
- 'update.downloadEmpty': 'ダウンロードに失敗しました: 応答本文が空です',
491
- 'update.integrityFailed': '{file} の整合性チェックに失敗しました — ダウンロードを破棄しました',
492
- 'update.npmMissing': 'PATH に npm が見つかりません',
493
- 'update.npmViewFailed': 'npm view {package} が {code} で終了しました',
494
- 'update.timedOut': '\n({ms}ms 後にタイムアウト)',
495
- 'update.noOutput': '(出力なし)',
496
-
497
- // ---- commands -----------------------------------------------------------
498
- 'command.settings': 'TUI の設定画面を開く',
499
- 'command.help': 'TUI のキーとコマンドの一覧を表示',
500
- 'command.stats': 'セッションのトークンとキャッシュの統計を表示',
501
- 'command.new': '新しいセッションを開始',
502
- 'command.resume': '保存済みセッションを再開',
503
- 'command.clear': '会話ログをクリア',
504
- 'command.cancel': '実行中のターンをキャンセル',
505
- 'command.rewind': 'セッションを以前の地点に巻き戻す',
506
- 'command.branch': '空のページで git ブランチを切り替える',
507
- 'command.quit': 'TUI を終了',
508
-
509
- // ---- help overlay -------------------------------------------------------
510
- 'help.title': 'DeepSeek Harness TUI — ヘルプ',
511
- 'help.enter': 'Enter',
512
- 'help.enterDesc': 'メッセージを送信',
513
- 'help.ctrlEnter': 'Ctrl+Enter',
514
- 'help.ctrlEnterDesc': '改行を挿入',
515
- 'help.ctrlC': 'Ctrl+C',
516
- 'help.ctrlCDesc': '実行中のターンをキャンセル。もう一度押すと終了',
517
- 'help.ctrlP': 'Ctrl+P',
518
- 'help.ctrlPDesc': '設定を開く',
519
- 'help.ctrlE': 'Ctrl+E',
520
- 'help.ctrlEDesc': '思考スライダーを切り替え',
521
- 'help.tab': 'Tab',
522
- 'help.tabDesc': '思考の強度を切り替え',
523
- 'help.ctrlN': 'Ctrl+N',
524
- 'help.ctrlNDesc': '新規セッション',
525
- 'help.ctrlG': 'Ctrl+G',
526
- 'help.ctrlGDesc': 'git ブランチ切り替え(空のページ)',
527
- 'help.ctrlD': 'Ctrl+D',
528
- 'help.ctrlDDesc': 'セッション管理でセッションを削除(2 回押す)',
529
- 'help.pg': 'PgUp / PgDn',
530
- 'help.pgDesc': '会話ログをスクロール',
531
- 'help.shiftArrows': 'Shift+↑/↓',
532
- 'help.shiftArrowsDesc': 'ステータスレールをスクロール(広い画面)',
533
- 'help.upDown': 'Up / Down',
534
- 'help.upDownDesc': 'カーソルを上下移動。端では履歴',
535
- 'help.mouse': 'マウスドラッグ',
536
- 'help.mouseDesc': 'テキストを選択。右クリックでコピー',
537
- 'help.wheel': 'ホイール',
538
- 'help.wheelDesc': '会話ログ / 設定をスクロール',
539
- 'help.escEsc': 'Esc Esc',
540
- 'help.escEscDesc': '巻き戻し選択',
541
- 'help.esc': 'Esc',
542
- 'help.escDesc': 'オーバーレイを閉じる · ターンをキャンセル · プロンプトをクリア',
543
- 'help.commands': 'コマンド:',
544
-
545
- // ---- session manager / toasts ------------------------------------------
546
- 'session.newTitle': '新しいセッション',
547
- 'session.noSaved': '保存済みセッションはありません',
548
- 'session.manageTitle': 'セッションを管理',
549
- 'session.manageSubtitle': 'Enter 開く · Ctrl+D 2 回で削除 · Esc 戻る',
550
- 'session.loading': 'セッションを読み込み中…',
551
- 'session.deleted': 'セッション {label} を削除しました',
552
- 'session.deleteFailed': 'セッション削除: {error}',
553
- 'session.deleteNotFound': '保存済みセッションのディレクトリが見つかりません',
554
- 'session.deleteCancelled': '削除をキャンセルしました',
555
- 'session.resumed': 'セッション {id} を再開しました',
556
- 'session.started': 'セッション {id} を開始しました',
557
- 'session.openFailed': 'セッションを開けませんでした: {error}',
558
- 'session.forkSummary': '{parent} からの {label} · {files}',
559
- 'session.forkDropped': ' · 継承した入力 {count} 件を破棄',
560
- 'session.conversationOnly': '会話のみ',
561
- 'session.rewindLabel': '巻き戻し #{n}',
562
- 'session.files': 'ファイル: {summary}',
563
- 'session.error': 'エラー: {error}',
564
- 'session.interruptFirst': '先に実行中のターンを中断してください (/cancel)',
565
- 'session.interruptFirstEsc': '先に実行中のターンを中断してください (Esc または /cancel)',
566
- 'session.startFirst': '先にセッションを開始してください',
567
- 'session.noReasoningLevels': '現在のモデルには推論レベルがありません',
568
- 'session.settingsUnavailable': '設定を利用できません',
569
- 'session.interruptRequested': '中断を要求しました',
570
- 'session.nothingToInterrupt': '中断するものはありません',
571
- 'session.noSessionRunning': '実行中のセッションはありません',
572
- 'session.promptCleared': 'プロンプトをクリアしました',
573
- 'session.exitAgain': '終了するにはもう一度 Ctrl+C を押してください',
574
- 'session.usageResume': '使い方: /resume <sessionId>',
575
- 'session.currentModel': '現在のモデル: {model}',
576
- 'session.modelSet': 'モデルを {model} に設定しました(次のリクエストから適用)',
577
- 'session.currentProvider': '現在のプロバイダー: {provider}',
578
- 'session.providerSet': 'プロバイダーを {provider} に設定しました(次のリクエストから適用)',
579
- 'session.unknownCommand': '不明なコマンド /{name} — /help を参照してください',
580
- 'session.queryMissing': 'このプロファイルにはセッションクエリがマウントされていません',
581
- 'session.listHeader': 'セッション:',
582
- 'session.noPersisted': '保存済みセッションはありません',
583
- 'session.listFailed': 'セッション一覧の取得に失敗しました: {error}',
584
- 'session.modelNoImages': 'モデル "{model}" は画像入力をサポートしていません',
585
- 'session.imageAttachFailed': '画像の添付に失敗しました: {error}',
586
- 'session.attachmentsUnavailable': '添付サービスが利用できません。画像を読み取れません',
587
- 'session.copied.one': '{count} 行をクリップボードにコピーしました',
588
- 'session.copied.other': '{count} 行をクリップボードにコピーしました',
589
- 'session.valueRequired': '値が必要です',
590
- 'session.minChars': '{count} 文字以上',
591
- 'session.maxChars': '{count} 文字以内',
592
- 'session.answerRequired': '選択肢を選ぶか回答を入力してください',
593
- 'session.typeAnswer': '回答を入力するか Esc を押してください',
594
- 'session.updatesAvailable': '更新: {list} — Ctrl+P → 更新',
595
- 'session.versionsError': 'バージョン: {error}',
596
- 'session.mcpError': 'MCP: {error}',
597
- 'session.noClipboard': 'クリップボードのパスがありません',
598
- 'session.unsupportedInteraction': '未対応のインタラクション種別: {kind}',
599
-
600
- // ---- tool activity summaries -------------------------------------------
601
- 'tool.run': '{command} を実行',
602
- 'tool.askUser': 'ユーザーに確認',
603
- 'tool.askQuestions': '質問 {count} 件',
1
+ // Japanese catalog. Keys, order and placeholders mirror `en.js`, the source.
2
+ export default {
3
+ // ---- shared chrome ------------------------------------------------------
4
+ 'common.selectBack': 'Enter 選択 · Esc 戻る',
5
+ 'common.selectConfirmBack': '↑/↓ 選択 · Enter 確定 · Esc 戻る',
6
+ 'common.selectContinueExit': '↑/↓ 選択 · Enter 続行 · Esc 終了',
7
+ 'common.escBack': 'Esc 戻る',
8
+ 'common.escClose': 'Esc 閉じる',
9
+ 'common.escCancel': 'Esc キャンセル',
10
+ 'common.working': '処理中…',
11
+ 'common.pleaseWait': 'お待ちください',
12
+ 'common.on': 'オン',
13
+ 'common.off': 'オフ',
14
+ 'common.unavailable': '利用不可',
15
+ 'common.selected': '選択中',
16
+ 'common.default': 'デフォルト',
17
+ 'common.system': 'システム',
18
+ 'common.installed': '(インストール済み)',
19
+ 'common.more': '… 他 {count} 件',
20
+ 'common.moreLines': '… 他 {count} 行',
21
+ 'common.clickExpand': ' · クリックで展開',
22
+ 'common.clickCollapse': ' · クリックで折りたたむ',
23
+ 'common.unknown': '不明',
24
+ 'common.emptyMessage': '[空のメッセージ]',
25
+ 'value.queue': 'キュー',
26
+ 'value.steer': 'ステア',
27
+ 'value.auto': '自動',
28
+ 'value.local': 'ローカル',
29
+ 'value.textOnly': 'テキストのみ',
30
+ 'value.textImage': 'テキスト + 画像',
31
+ 'value.show': '表示',
32
+ 'value.hide': '非表示',
33
+
34
+ // ---- title screen -------------------------------------------------------
35
+ 'splash.hint': '何でも聞いてください… 「壊れたテストを直して」',
36
+ 'splash.shortcutSettings': '設定',
37
+ 'splash.shortcutThinking': '思考',
38
+ 'splash.shortcutBranches': 'ブランチ',
39
+
40
+ // ---- header / sidebar / status row -------------------------------------
41
+ // ---- command-line help (dsh --profile tui --help) -----------------------
42
+ 'startup.description': 'DeepSeek Harness のターミナル UI を起動します。',
43
+ 'startup.helpOption': 'このヘルプを表示',
44
+ 'startup.resume': 'id を指定して既存の保存済みセッションを再開します',
45
+ 'startup.model': '新しいセッションの既定モデル id',
46
+ 'startup.provider': '新しいセッションの既定プロバイダールート',
47
+ 'startup.sidebar': 'セッションのサイドバーを表示します(既定)',
48
+ 'startup.noSidebar': 'サイドバーなしで起動します',
49
+ 'startup.examples': '例:',
50
+ 'startup.exampleFresh': '新しいセッションを開始',
51
+ 'startup.exampleResume': '保存済みセッションを再開',
52
+
53
+ 'header.workspace': 'ワークスペース',
54
+ 'sidebar.sessions': 'セッション',
55
+ 'sidebar.recent': '最近',
56
+ 'sidebar.newSession': '+ 新規セッション',
57
+ 'status.model': 'モデル',
58
+ 'status.draftTokens': '{count} 下書きトークン',
59
+ 'status.ctrlP': 'ctrl+p コマンド',
60
+ 'status.interrupt': '中断: ctrl+c',
61
+
62
+ // ---- composer command hints --------------------------------------------
63
+ 'hint.help': 'ヘルプを表示',
64
+ 'hint.settings': '設定を開く',
65
+ 'hint.new': '新規セッション',
66
+ 'hint.resume': 'セッションを再開',
67
+ 'hint.model': 'モデルを選択',
68
+ 'hint.provider': 'プロバイダーを選択',
69
+ 'hint.rewind': '巻き戻し選択',
70
+ 'hint.branch': 'git ブランチを切り替える',
71
+ 'hint.stats': 'セッション統計とトークン使用量',
72
+ 'hint.clear': '表示をクリア',
73
+ 'hint.cancel': '実行中のターンをキャンセル',
74
+ 'hint.quit': '終了',
75
+ 'hint.compact': 'コンテキストを圧縮',
76
+ 'hint.goal': 'ゴールを管理',
77
+
78
+ // ---- transcript blocks --------------------------------------------------
79
+ 'transcript.turns.one': '{count} ターン',
80
+ 'transcript.turns.other': '{count} ターン',
81
+ 'transcript.steps.one': '{count} ステップ',
82
+ 'transcript.steps.other': '{count} ステップ',
83
+ 'transcript.modelChanged': 'モデルを {from} から {to} に変更しました',
84
+ 'transcript.thinking': ' 思考',
85
+ 'transcript.streaming': ' · ストリーミング…',
86
+ 'transcript.steeringBadge': ' ⟲ ステアリング',
87
+ 'transcript.tasks': 'タスク',
88
+ 'transcript.systemPrompt': ' システムプロンプト',
89
+ 'transcript.pendingInput': ' 入力待ち · ',
90
+ 'transcript.steering': ' ステアリング',
91
+ 'transcript.queued': ' 待機中',
92
+ 'note.systemReminder': 'システムリマインダー',
93
+ 'note.compaction': '圧縮',
94
+ 'note.runtimeContext': 'ランタイムコンテキスト',
95
+
96
+ // ---- images and mermaid -------------------------------------------------
97
+ 'image.attachment': '🖼 画像添付',
98
+ 'image.rendering': '⏳ 画像を描画中…',
99
+ 'image.renderFailed': '⚠ 画像の描画に失敗 · {error}',
100
+ 'image.mermaidRendering': '⏳ Mermaid 図を描画中…',
101
+ 'image.mermaidTooWide': '↔ Mermaid 図には {width} 列が必要ですが、このペインは {budget} 列です',
102
+ 'image.altFallback': '画像',
103
+
104
+ // ---- composer / approval prompt ----------------------------------------
105
+ 'composer.keys': "Enter 送信 · Ctrl+Enter 改行 · Ctrl+P 設定",
106
+ 'composer.commandKeys': "↑/↓ 選択 · Tab 補完 · Esc 閉じる",
107
+ 'composer.imageHint': '貼り付けた画像: マルチモーダルモデル/プラグインまたは deepseek-v4-flash-vision-exp を使ってください(ない場合、画像は読み取れません)',
108
+ 'composer.approval': '承認 · ',
109
+ 'composer.summary': '概要 · ',
110
+ 'composer.origin': '発生元 · ',
111
+ 'composer.risk': 'リスク · ',
112
+ 'composer.approvalHint': 'y 許可 · n 拒否 · Esc キャンセル',
113
+ 'risk.low': '低',
114
+ 'risk.medium': '中',
115
+ 'risk.high': '高',
116
+ 'composer.effortHint': 'Tab / ←/→ 調整 · Esc 閉じる',
117
+
118
+ // ---- right status rail --------------------------------------------------
119
+ 'rail.model': 'モデル',
120
+ 'rail.thinking': '思考',
121
+ 'rail.context': 'コンテキスト',
122
+ 'rail.session': 'セッション',
123
+ 'rail.goal': 'ゴール',
124
+ 'rail.subagents': 'サブエージェント',
125
+ 'rail.noData': '—',
126
+ 'rail.percentUsed': '{percent}% 使用',
127
+ 'rail.tokens': '~{used} / {window} トークン',
128
+ 'rail.cacheHit': 'キャッシュ {percent}% ヒット',
129
+ 'rail.breakdown': 'システム {system} · ツール {tools} · メッセージ {messages}',
130
+ 'rail.contextPending': '使用量が報告されると表示されます',
131
+ 'rail.subagentCounts': '{running} 実行中 · {total} 合計',
132
+ 'rail.unreadable': '{label} (読み取り不可)',
133
+ 'rail.more': '… +{count} 件',
134
+ 'rail.round': ' · ラウンド {started}/{max}',
135
+ 'goal.active': 'アクティブ',
136
+ 'goal.paused': '一時停止',
137
+ 'goal.blocked': 'ブロック',
138
+ 'goal.complete': '完了',
139
+
140
+ // ---- session stats window ----------------------------------------------
141
+ 'stats.title': 'セッション統計',
142
+ 'stats.hint': '帯をクリックするか /stats',
143
+ 'stats.usage': '使用量',
144
+ 'stats.duration': '所要時間',
145
+ 'stats.speed': '速度',
146
+ 'stats.tokens': 'トークン',
147
+ 'stats.cache': 'キャッシュ',
148
+ 'stats.context': 'コンテキスト',
149
+ 'stats.noSteps': '完了したステップはまだありません',
150
+ 'stats.llmTime': 'LLM {value}',
151
+ 'stats.toolTime': 'ツール {value}',
152
+ 'stats.ttft': 'TTFT 平均 {value}',
153
+ 'stats.tokensPerSecond': '{value} tok/s',
154
+ 'stats.cacheRate': 'キャッシュ {percent}%',
155
+ 'stats.inOut': '入力 {input} · 出力 {output}',
156
+ 'stats.cacheDetail': '{percent}% ヒット · 読み {read} · 書き {write} · ミス {miss}',
157
+ 'stats.contextUsed': '使用 {percent}% ~{used} / {window}',
158
+ 'stats.systemPrompt': 'システムプロンプト',
159
+ 'stats.tools': 'ツール',
160
+ 'stats.messages': 'メッセージ',
161
+ 'stats.compositionUnavailable': '構成を取得できません',
162
+ 'stats.contextPending': 'リクエストが使用量を報告するとコンテキスト使用率が表示されます',
163
+
164
+ // ---- questions modal ----------------------------------------------------
165
+ 'questions.title': '質問',
166
+ 'questions.titleOf': '質問 {index} / {total}',
167
+ 'questions.defer': 'Esc 後で',
168
+ 'questions.range': '{from}-{to} / {total} PgUp/PgDn',
169
+ 'questions.other': 'その他: ',
170
+ 'questions.answer': '回答: ',
171
+ 'questions.placeholder': '回答を入力してください',
172
+ 'questions.hintCustom': 'Enter 確定 · Esc 戻る',
173
+ 'questions.hintMulti': 'Space 切り替え · Enter 続行 · Up/Down 移動',
174
+ 'questions.hintSingle': 'Enter 選択 · Up/Down 移動',
175
+
176
+ // ---- secret prompt ------------------------------------------------------
177
+ 'secret.hint': 'Enter で送信 · Esc でキャンセル',
178
+
179
+ // ---- boot gate: the dsh version this build may run on ----
180
+ 'boot.unsupportedTitle': '未対応の dsh バージョン',
181
+ 'boot.unverifiedTitle': '未検証の dsh バージョン',
182
+ 'boot.runningLabel': '実行中の dsh',
183
+ 'boot.supportedLabel': '対応範囲',
184
+ 'boot.recommendedLabel': '推奨バージョン',
185
+ 'boot.verifiedLabel': '検証済み',
186
+ 'boot.unsupportedBody': 'この dsh-oc-tui は {range} のみに対応しており、{version} は範囲外です。対応バージョンの dsh に切り替えるまでセッションは実行できません。',
187
+ 'boot.unverifiedBody': 'この dsh-oc-tui は {verified} でのみ検証済みで、{version} は検証していません。確実に動作させるには {recommended} をインストールしてください。',
188
+ 'boot.installHint': '推奨バージョンの dsh をインストールしてから、この profile を起動し直してください:',
189
+ 'boot.updatePluginHint': '新しい dsh-oc-tui がこの dsh に対応している場合は、プラグインを更新してください:',
190
+ 'boot.exitHint': 'Esc または Ctrl+C で終了',
191
+
192
+ // ---- settings dialog chrome --------------------------------------------
193
+ 'settings.title': '設定',
194
+ 'settings.menu': 'メニュー',
195
+ 'settings.shared': 'DeepSeek Harness WebUI と共有',
196
+ 'settings.footerEdit': 'Enter 保存 · Esc キャンセル',
197
+ 'settings.footerMenu': '↑/↓ 移動 · Tab メニュー · Enter 選択 · Esc 戻る',
198
+ 'settings.footerPlain': '↑/↓ 移動 · Enter 選択 · Esc 戻る',
199
+ 'settings.confirmHint': '{text} · Y / N',
200
+ 'settings.confirmDefault': 'Y 確定 · N キャンセル',
201
+ 'settings.confirmDeleteSession': 'Ctrl+D をもう一度押すと削除',
202
+ 'settings.confirmChange': 'この変更を確定しますか?',
203
+ 'settings.deleteTwice': 'Ctrl+D をもう一度押すと削除 ',
204
+ 'settings.deleteMcpTwice': 'Delete をもう一度押すと削除 ',
205
+ 'settings.noSession': 'セッションが選択されていません',
206
+ 'settings.noSessions': '利用できるセッションがありません',
207
+ 'settings.noMcp': 'MCP サーバーが選択されていません',
208
+ 'settings.noOptions': '{label} に利用可能な選択肢がありません',
209
+ 'settings.saved': 'DSH 設定に保存しました',
210
+ 'settings.providerRemoved': 'プロバイダーを削除しました',
211
+ 'settings.conflict': '設定が別の場所で変更されたため再読み込みしました',
212
+ 'settings.error': '設定: {error}',
213
+ 'settings.dshSettings': 'DSH 設定',
214
+ 'settings.optionList': 'Enter 選択 · Esc 戻る',
215
+
216
+ // ---- settings left menu -------------------------------------------------
217
+ 'menu.main': 'メイン',
218
+ 'menu.model': 'モデル',
219
+ 'menu.update': '更新',
220
+ 'menu.mcp': 'MCP',
221
+
222
+ // ---- settings rows: main tab -------------------------------------------
223
+ 'settings.general': '一般',
224
+ 'settings.graphics': 'グラフィック',
225
+ 'settings.sessions': 'セッション',
226
+ 'settings.system': 'システム',
227
+ 'settings.developer': '開発者',
228
+ 'settings.contextDetails': 'コンテキストの詳細',
229
+ 'settings.busyEnter': '実行中の Enter',
230
+ 'settings.defaultPreset': 'デフォルトプリセット',
231
+ 'settings.permissionPreset': '権限プリセット',
232
+ 'settings.permissionDangerConfirm': 'ツールとファイルへの無制限アクセスを有効にしますか?',
233
+ 'settings.graphicsRendering': 'グラフィック描画',
234
+ 'settings.noProtocolFallback': 'プロトコルなしのフォールバック',
235
+ 'settings.imageHeightCap': '画像の高さ上限 (行)',
236
+ 'settings.mermaidRendering': 'Mermaid 描画',
237
+ 'settings.newSession': '新規セッション',
238
+ 'settings.manageSessions': 'セッションを管理',
239
+ 'settings.providerConfig': 'プロバイダー API 設定',
240
+ 'settings.updateManager': '更新マネージャー',
241
+ 'settings.settingsFile': '設定ファイル',
242
+ 'settings.language': '言語',
243
+ 'settings.theme': 'テーマ',
244
+ 'theme.deepseek': 'DeepSeek Standard',
245
+ 'theme.github-dark': 'GitHub Dark',
246
+ 'theme.dracula': 'Dracula',
247
+ 'theme.vscode-dark': 'VS Code Dark+',
248
+ 'theme.nord': 'Nord',
249
+ 'settings.languageSystem': 'システム ({language})',
250
+ 'settings.languageSaved': '言語: {language}',
251
+
252
+ // ---- model tab ----------------------------------------------------------
253
+ 'model.title': 'モデル',
254
+ 'model.subtitle': 'Enter で一覧のモデルをデフォルトに設定',
255
+ 'model.defaultSection': 'デフォルト',
256
+ 'model.defaultProvider': 'デフォルトプロバイダー',
257
+ 'model.defaultModel': 'デフォルトモデル',
258
+ 'model.reasoning': '推論',
259
+ 'model.providerUrl': 'プロバイダー URL',
260
+ 'model.providerApiKey': 'プロバイダー API キー',
261
+ 'model.displayName': '表示名',
262
+ 'model.wireProtocol': '通信プロトコル',
263
+ 'model.defaultImageInput': 'デフォルトの画像入力',
264
+ 'model.models': 'モデル',
265
+ 'model.fetch': '取得…',
266
+ 'model.selectedCount': '{count} 件選択',
267
+ 'model.removeProvider': 'プロバイダーを削除',
268
+ 'model.removeProviderConfirm': '{name} とその管理資格情報を削除しますか?',
269
+ 'model.noModels': '利用できるモデルがありません',
270
+ 'model.noModelsReturned': 'プロバイダーがモデルを返しませんでした',
271
+ 'model.fetchUnavailable': '自動取得は利用不可 — 保存済みモデル · Enter 切り替え',
272
+ 'model.fetchOk': '自動取得済み · Enter 切り替え · Esc 戻る',
273
+ 'model.fetching': 'モデルを取得中…',
274
+ 'model.autoFetching': '自動取得中…',
275
+ 'model.credentialConfigured': '設定済み ({source})',
276
+ 'model.credentialMissing': '未設定',
277
+ 'model.defaultTag': 'デフォルト',
278
+ 'model.providerUnavailable': 'プロバイダーは利用できなくなりました',
279
+ 'model.namespaceUnavailable': 'プロバイダー設定の名前空間が利用できません',
280
+ 'model.apiKeyEmpty': 'API キーは空にできません',
281
+ 'model.credentialsUnavailable': '資格情報サービスが利用できません',
282
+ 'model.noProviderModels': '選択したプロバイダーに利用可能なモデルがありません',
283
+ 'model.addCount.one': '{count} 件追加可能',
284
+ 'model.addCount.other': '{count} 件追加可能',
285
+
286
+ // ---- add-provider flow --------------------------------------------------
287
+ 'provider.add': 'プロバイダーを追加',
288
+ 'provider.empty': 'プロバイダーがまだ設定されていません',
289
+ 'provider.pickSubtitle': 'Enter 選択 · Esc 戻る',
290
+ 'provider.catalog': 'インストール済みのプロバイダー',
291
+ 'provider.catalogEmpty': 'インストール済みのプロバイダーはすべて設定済みです',
292
+ 'provider.custom': 'カスタム API — エンドポイントを宣言',
293
+ 'provider.form.catalog': 'インストール済みプロバイダーを採用',
294
+ 'provider.form.custom': 'カスタムプロバイダーを宣言',
295
+ 'provider.formSubtitle': 'Enter 編集 · Esc 戻る',
296
+ 'provider.field.route': 'ルート ID',
297
+ 'provider.field.addModel': 'モデル ID を手動で追加',
298
+ 'provider.field.save': 'プロバイダーを保存',
299
+ 'provider.hint.route': '英小文字・数字・ハイフン · キーは {ref} として保存',
300
+ 'provider.error.route': 'ルート ID は英小文字で始まり、英小文字・数字・ハイフンのみ使用できます',
301
+ 'provider.error.routeNeeded': 'プロバイダーを選択してください',
302
+ 'provider.error.taken': 'このルート ID は既に使われています',
303
+ 'provider.error.baseUrl': 'エンドポイントは http または https の URL である必要があります',
304
+ 'provider.error.baseUrlNeeded': 'カスタムプロバイダーにはエンドポイントが必要です',
305
+ 'provider.error.apiNeeded': 'このエンドポイントが話すプロトコルを選択してください',
306
+ 'provider.error.modelsNeeded': 'カスタムプロバイダーには少なくとも 1 つのモデルが必要です',
307
+ 'provider.error.modelId': 'モデル {index} に ID がありません',
308
+ 'provider.error.modelDuplicate': 'モデル "{id}" が重複しています',
309
+ 'provider.added': 'プロバイダーを追加しました',
310
+ 'provider.accountManaged': 'DeepSeek アカウントでサインイン済み',
311
+ 'provider.search': '検索',
312
+ 'provider.searchPlaceholder': '入力で絞り込み',
313
+ 'provider.searchEmpty': '"{query}" に一致するプロバイダーがありません',
314
+
315
+ // ---- モデル 1 件分 --------------------------------------------------------
316
+ 'model.edit': 'モデルを編集',
317
+ 'model.editHint': 'e 編集 · Del 削除',
318
+ 'model.refresh': 'カタログを再取得',
319
+ 'model.selectAll': 'すべて選択',
320
+ 'model.fetchRefused': 'エンドポイントがモデル一覧を返しませんでした',
321
+ 'model.notSaved': 'このモデルはまだ保存されていません',
322
+ 'model.removed': 'モデルを削除しました',
323
+ 'model.form.add': 'モデルを追加',
324
+ 'model.form.edit': 'モデル · {id}',
325
+ 'model.form.save': 'モデルを保存',
326
+ 'model.form.remove': 'プロバイダーから削除',
327
+ 'model.form.removeConfirm': 'このモデルをプロバイダーから削除しますか?',
328
+ 'model.field.id': 'モデル ID',
329
+ 'model.field.name': '表示名',
330
+ 'model.field.contextWindow': 'コンテキストウィンドウ',
331
+ 'model.field.maxTokens': '最大出力トークン',
332
+ 'model.field.input': '入力',
333
+ 'model.error.idNeeded': 'モデルには ID が必要です',
334
+ 'model.error.idDuplicate': 'モデル "{id}" はすでに一覧にあります',
335
+ 'model.error.capacity': 'コンテキストウィンドウと最大トークンは整数で指定します(256K、1M)',
336
+
337
+ // ---- MCP tab ------------------------------------------------------------
338
+ 'mcp.title': 'MCP',
339
+ 'mcp.subtitle': 'Enter 編集 · Del 削除 · Esc 戻る',
340
+ 'mcp.editSubtitle': 'Enter 編集 · Esc 戻る',
341
+ 'mcp.servers': 'MCP サーバー',
342
+ 'mcp.empty': 'MCP サーバーが設定されていません',
343
+ 'mcp.add': 'MCP サーバーを追加',
344
+ 'mcp.scope': 'スコープ',
345
+ 'mcp.scopeUserPrefix': 'ユーザー · {path}',
346
+ 'mcp.scopePathPrefix': 'パス · {path}',
347
+ 'mcp.configFiles': '設定ファイル',
348
+ 'mcp.userScope': 'ユーザー(すべてのセッション)',
349
+ 'mcp.secrets': 'シークレット',
350
+ 'mcp.secretsPlain': '設定ファイル内に平文で保存',
351
+ 'mcp.loaded': '読み込み済み',
352
+ 'mcp.notCreated': '未作成',
353
+ 'mcp.type.stdio': 'ローカルコマンド',
354
+ 'mcp.type.http': 'HTTP',
355
+ 'mcp.type.sse': 'SSE',
356
+ 'mcp.state.connected': '● 接続済み',
357
+ 'mcp.state.tools.one': '● ツール {count} 件',
358
+ 'mcp.state.tools.other': '● ツール {count} 件',
359
+ 'mcp.state.pending': '… 接続中',
360
+ 'mcp.state.disabled': '○ 無効',
361
+ 'mcp.state.idle': '○ 未接続',
362
+ 'mcp.notice.connected': "MCP {name}: 接続済み",
363
+ 'mcp.notice.failed': "MCP {name}: 接続失敗",
364
+ 'mcp.form.add': 'MCP サーバーを追加',
365
+ 'mcp.form.edit': 'MCP サーバーを編集 · {name}',
366
+ 'mcp.titleAdd': 'MCP · 追加',
367
+ 'mcp.titleEdit': 'MCP · 編集',
368
+ 'mcp.field.name': '名前',
369
+ 'mcp.field.type': '種類',
370
+ 'mcp.field.timeout': 'タイムアウト (ms)',
371
+ 'mcp.field.command': 'コマンド',
372
+ 'mcp.field.args': '引数',
373
+ 'mcp.field.env': '環境変数 (JSON)',
374
+ 'mcp.field.url': 'URL',
375
+ 'mcp.field.headers': 'ヘッダー (JSON)',
376
+ 'mcp.field.scope': 'スコープ',
377
+ 'mcp.field.path': 'パス',
378
+ 'mcp.field.enabled': '有効',
379
+ 'mcp.field.save': '保存',
380
+ 'mcp.field.remove': '削除',
381
+ 'mcp.choice.stdio': 'ローカルコマンド (stdio)',
382
+ 'mcp.choice.http': 'HTTP (ストリーミング)',
383
+ 'mcp.choice.sse': 'SSE (従来の HTTP+SSE)',
384
+ 'mcp.choice.scopeUser': 'ユーザー — すべてのセッション',
385
+ 'mcp.choice.scopePath': 'パス — ディレクトリ配下のセッション',
386
+ 'mcp.removeConfirm': 'この MCP サーバーを削除して切断しますか?',
387
+ 'mcp.saved': 'MCP サーバーを保存しました',
388
+ 'mcp.added': 'MCP サーバーを追加しました',
389
+ 'mcp.removed': 'MCP サーバーを削除しました',
390
+ 'mcp.error.name': '名前は英数字と "-" "_" の 1〜32 文字にしてください',
391
+ 'mcp.error.duplicate': '"{name}" という名前の MCP サーバーは既に設定されています',
392
+ 'mcp.error.timeout': 'timeoutMs は 1〜{max} の整数にしてください',
393
+ 'mcp.error.pathNeeded': 'パススコープのサーバーにはディレクトリが必要です',
394
+ 'mcp.error.pathAbsolute': 'パススコープは絶対ディレクトリにしてください',
395
+ 'mcp.error.commandNeeded': 'stdio サーバーにはコマンドが必要です',
396
+ 'mcp.error.urlParse': 'URL を解析できません',
397
+ 'mcp.error.urlScheme': 'URL は http または https を使用してください',
398
+ 'mcp.error.pathNotDir': 'パススコープがディレクトリではありません: {path}',
399
+ 'mcp.error.configIsDir': '設定ファイルのパスがディレクトリです: {path}',
400
+ 'mcp.error.notFound': '"{name}" という名前の MCP サーバーは設定されていません',
401
+ 'mcp.error.documentGone': '"{name}" を定義するドキュメントがありません: {error}',
402
+ 'mcp.error.noClient': 'ホストが MCP クライアントを提供していません',
403
+ 'mcp.error.connectTimeout': '{name} への接続がタイムアウトしました',
404
+ 'mcp.error.json': 'ドキュメントが有効な JSON ではありません: {error}',
405
+ 'mcp.error.jsonObject': 'ドキュメントは JSON オブジェクトである必要があります',
406
+ 'mcp.error.serversObject': '"servers" は JSON オブジェクトである必要があります',
407
+ 'mcp.error.argsArray': '引数は文字列の JSON 配列である必要があります',
408
+ 'mcp.error.argsTypes': '引数は文字列または数値である必要があります',
409
+ 'mcp.error.argsUnclosed': '引数に閉じられていない引用符があります',
410
+ 'mcp.error.envObject': '{label} は JSON オブジェクトである必要があります',
411
+ 'mcp.error.envValue': '{label} の値 "{name}" は文字列・数値・真偽値のいずれかにしてください',
412
+ 'mcp.error.header': '無効な HTTP ヘッダー "{name}"',
413
+ 'mcp.error.envName': '無効な環境変数名 "{name}"',
414
+
415
+ // ---- rewind -------------------------------------------------------------
416
+ 'rewind.title': '巻き戻し',
417
+ 'rewind.restoreTo': '次の地点の前まで戻す: {label}',
418
+ 'rewind.restorePrompt': '会話を次の地点の前まで戻す…',
419
+ 'rewind.empty': 'まだ戻せる地点がありません。',
420
+ 'rewind.option.conversation': '会話を復元',
421
+ 'rewind.option.both': '会話とファイルを復元',
422
+ 'rewind.option.code': 'ファイルを復元',
423
+ 'rewind.option.cancel': 'キャンセル',
424
+ 'rewind.current': '(現在)',
425
+ 'rewind.noPoints': '戻せるユーザーメッセージがありません',
426
+ 'rewind.unknownPoint': '不明な巻き戻し地点 "{selector}" — 番号か last を指定してください',
427
+ 'rewind.noPoint': '巻き戻し地点 {n} はありません — 1..{count}',
428
+ 'rewind.notGit': 'git ワークツリーではありません',
429
+ 'rewind.noBackup': 'バックアップ先がありません',
430
+ 'rewind.filesNotRestored': 'ファイルは復元されませんでした',
431
+ 'rewind.filesNotRestoredReason': 'ファイルは復元されませんでした ({reason})',
432
+ 'rewind.restored.one': 'HEAD から追跡ファイル {count} 件を復元しました',
433
+ 'rewind.restored.other': 'HEAD から追跡ファイル {count} 件を復元しました',
434
+ 'rewind.removed.one': '新規ファイル {count} 件を削除しました',
435
+ 'rewind.removed.other': '新規ファイル {count} 件を削除しました',
436
+ 'rewind.skipped': '{count} 件をスキップ',
437
+ 'rewind.previousSaved': '以前の内容を {path} に保存しました',
438
+ 'rewind.noChanges': 'この地点以降にファイル変更はありません',
439
+ 'rewind.image': '[画像]',
440
+ 'rewind.images': '[画像 {count} 件]',
441
+ 'rewind.emptyMessage': '(空)',
442
+ 'git.title': 'Git ブランチ',
443
+ 'git.subtitle': '現在:{branch} · {path}',
444
+ 'git.local': 'ローカルブランチ',
445
+ 'git.remote': 'リモートブランチ',
446
+ 'git.empty': 'このリポジトリにはブランチがありません。',
447
+ 'git.detached': '(デタッチド)',
448
+ 'git.switched': 'ブランチ {branch} に切り替えました',
449
+ 'git.switchFailed': '{branch} に切り替えられません:{error}',
450
+ 'git.pullDone': '更新をプルしました',
451
+ 'git.pullFailed': '更新をプルできません:{error}',
452
+ 'git.listFailed': 'ブランチを一覧表示できません:{error}',
453
+ 'git.notRepo': 'git ワークツリーではありません',
454
+ 'git.gitMissing': 'git が PATH に見つかりません',
455
+ 'git.timedOut': 'git がタイムアウトしました',
456
+ 'git.onlyTitleScreen': 'ブランチ切り替えは空のページでのみ利用できます — /new でセッションを離れてください',
457
+ 'git.footer': '↑/↓ 選択 · Enter 切替 · P プル · R 更新 · Esc 閉じる',
458
+
459
+ // ---- update tab ---------------------------------------------------------
460
+ 'update.title': '更新',
461
+ 'update.checking': 'バージョンを確認中…',
462
+ 'update.fetching': 'npm レジストリから取得中…',
463
+ 'update.fetchingVersions': 'バージョンを取得中…',
464
+ 'update.versionsSubtitle': 'Enter ダウンロード · Esc 戻る',
465
+ 'update.installed': 'インストール済み',
466
+ 'update.latest': '最新 (npm タグ)',
467
+ 'update.status': '状態',
468
+ 'update.versions': 'バージョン',
469
+ 'update.selectVersion': 'バージョンを選択…',
470
+ 'update.restartApply': '再起動して {version} を適用',
471
+ 'update.enterRestart': 'Enter 再起動',
472
+ 'update.discard': 'ダウンロードした {version} を破棄',
473
+ 'update.actions': '操作',
474
+ 'update.checkNow': '今すぐ確認',
475
+ 'update.checkingShort': '確認中…',
476
+ 'update.startupCheck': '起動時の確認',
477
+ 'update.profile': 'プロファイル',
478
+ 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
479
+ 'update.statusCorrupt': 'インストールが壊れています — 下から再インストールしてください',
480
+ 'update.statusError': 'レジストリの確認に失敗しました: {error}',
481
+ 'update.statusAvailable': '更新あり → {version}',
482
+ 'update.statusUpToDate': '最新です',
483
+ 'update.statusNoStable': '安定版がありません — バージョンから選択してください',
484
+ 'update.notOnPath': 'PATH に見つかりません',
485
+ 'update.subtitleStaged': '{package} {version} をダウンロード済み — 再起動して適用',
486
+ 'update.subtitleIdle': 'Enter 選択 · ダウンロード後に再起動して適用',
487
+ 'update.download': 'ダウンロード',
488
+ 'update.contacting': 'レジストリに接続中…',
489
+ 'update.version': 'バージョン',
490
+ 'update.savingTo': '保存先',
491
+ 'update.escCancels': 'Esc でキャンセル',
492
+ 'update.restartApplyQ': '再起動して {label} {version} を適用しますか?(ダウンロード済み)',
493
+ 'update.downloadQ': '{label} {version} をダウンロードし、再起動して適用しますか?',
494
+ 'update.localSwitch': ' — ローカルインストールをレジストリのバージョンに切り替えます',
495
+ 'update.downloaded': 'ダウンロード済み · 再起動して適用',
496
+ 'update.downloadedToast': '{label} {version} をダウンロードしました · 更新タブから適用してください',
497
+ 'update.downloadedConfirm': 'ダウンロードしました 再起動して {label} {version} を適用しますか? (y/n)',
498
+ 'update.alreadyDownloadedConfirm': 'ダウンロード済み · 再起動して {label} {version} を適用しますか? (y/n)',
499
+ 'update.downloadCancelled': 'ダウンロードをキャンセルしました',
500
+ 'update.downloadFailed': 'ダウンロードに失敗しました: {error}',
501
+ 'update.stagedGone': 'ダウンロード済みのファイルがありません — バージョンを選び直してください',
502
+ 'update.locks.one': 'dsh が他の {count} プロセスで実行中のため適用できません — 終了して再試行してください',
503
+ 'update.locks.other': 'dsh が他の {count} プロセスで実行中のため適用できません — 終了して再試行してください',
504
+ 'update.noNpm': '適用できません: npm が見つかりません',
505
+ 'update.noDshCli': '適用できません: dsh CLI が見つかりません',
506
+ 'update.installerFailed': 'インストーラーを開始できません — dsh を再起動して {label} を適用してください',
507
+ 'update.applying': '{label} を適用中 · 終了して再起動します…',
508
+ 'update.stagedDiscarded': 'ダウンロード済みのファイルを破棄しました',
509
+ 'update.tagCached': 'キャッシュ済み',
510
+ 'update.tagStaged': 'ステージ済み',
511
+ 'update.installFailed': 'インストールに失敗しました (終了コード {code}) — バージョンから再試行してください',
512
+ 'update.installFailedRetry': '更新 → dsh-oc-tui → バージョン を開き、バージョンを選んで再ダウンロードしてください',
513
+ 'update.installUnreadable': 'インストールは成功と報告されましたが、インストール済みバージョンは {installed} です(期待値 {expected}) — 修復: {repair}',
514
+ 'update.registryUnreachable': 'レジストリに接続できません: {error}',
515
+ 'update.notOnRegistry': '{package} はレジストリにありません',
516
+ 'update.registryHttp': 'レジストリが {package} に対して HTTP {status} を返しました',
517
+ 'update.noTarballUrl': 'レジストリの応答に tarball URL がありません',
518
+ 'update.downloadHttp': 'ダウンロードに失敗しました: {url} に対して HTTP {status}',
519
+ 'update.downloadEmpty': 'ダウンロードに失敗しました: 応答本文が空です',
520
+ 'update.integrityFailed': '{file} の整合性チェックに失敗しました — ダウンロードを破棄しました',
521
+ 'update.npmMissing': 'PATH に npm が見つかりません',
522
+ 'update.npmViewFailed': 'npm view {package} が {code} で終了しました',
523
+ 'update.timedOut': '\n({ms}ms 後にタイムアウト)',
524
+ 'update.noOutput': '(出力なし)',
525
+
526
+ // ---- commands -----------------------------------------------------------
527
+ 'command.settings': 'TUI の設定画面を開く',
528
+ 'command.help': 'TUI のキーとコマンドの一覧を表示',
529
+ 'command.stats': 'セッションのトークンとキャッシュの統計を表示',
530
+ 'command.new': '新しいセッションを開始',
531
+ 'command.resume': '保存済みセッションを再開',
532
+ 'command.clear': '会話ログをクリア',
533
+ 'command.cancel': '実行中のターンをキャンセル',
534
+ 'command.rewind': 'セッションを以前の地点に巻き戻す',
535
+ 'command.branch': '空のページで git ブランチを切り替える',
536
+ 'command.quit': 'TUI を終了',
537
+
538
+ // ---- help overlay -------------------------------------------------------
539
+ 'help.title': 'DeepSeek Harness TUI — ヘルプ',
540
+ 'help.enter': 'Enter',
541
+ 'help.enterDesc': 'メッセージを送信',
542
+ 'help.ctrlEnter': 'Ctrl+Enter',
543
+ 'help.ctrlEnterDesc': '改行を挿入',
544
+ 'help.ctrlC': 'Ctrl+C',
545
+ 'help.ctrlCDesc': '実行中のターンをキャンセル。もう一度押すと終了',
546
+ 'help.ctrlP': 'Ctrl+P',
547
+ 'help.ctrlPDesc': '設定を開く',
548
+ 'help.ctrlE': 'Ctrl+E',
549
+ 'help.ctrlEDesc': '思考スライダーを切り替え',
550
+ 'help.tab': 'Tab',
551
+ 'help.tabDesc': '思考の強度を切り替え',
552
+ 'help.ctrlN': 'Ctrl+N',
553
+ 'help.ctrlNDesc': '新規セッション',
554
+ 'help.ctrlG': 'Ctrl+G',
555
+ 'help.ctrlGDesc': 'git ブランチ切り替え(空のページ)',
556
+ 'help.ctrlD': 'Ctrl+D',
557
+ 'help.ctrlDDesc': 'セッション管理でセッションを削除(2 回押す)',
558
+ 'help.pg': 'PgUp / PgDn',
559
+ 'help.pgDesc': '会話ログをスクロール',
560
+ 'help.shiftArrows': 'Shift+↑/↓',
561
+ 'help.shiftArrowsDesc': 'ステータスレールをスクロール(広い画面)',
562
+ 'help.upDown': 'Up / Down',
563
+ 'help.upDownDesc': 'カーソルを上下移動。端では履歴',
564
+ 'help.mouse': 'マウスドラッグ',
565
+ 'help.mouseDesc': 'テキストを選択。右クリックでコピー',
566
+ 'help.wheel': 'ホイール',
567
+ 'help.wheelDesc': '会話ログ / 設定をスクロール',
568
+ 'help.escEsc': 'Esc Esc',
569
+ 'help.escEscDesc': '巻き戻し選択',
570
+ 'help.esc': 'Esc',
571
+ 'help.escDesc': 'オーバーレイを閉じる · ターンをキャンセル · プロンプトをクリア',
572
+ 'help.commands': 'コマンド:',
573
+
574
+ // ---- session manager / toasts ------------------------------------------
575
+ 'session.newTitle': '新しいセッション',
576
+ 'session.noSaved': '保存済みセッションはありません',
577
+ 'session.manageTitle': 'セッションを管理',
578
+ 'session.manageSubtitle': 'Enter 開く · Ctrl+D 2 回で削除 · Esc 戻る',
579
+ 'session.loading': 'セッションを読み込み中…',
580
+ 'session.deleted': 'セッション {label} を削除しました',
581
+ 'session.deleteFailed': 'セッション削除: {error}',
582
+ 'session.deleteNotFound': '保存済みセッションのディレクトリが見つかりません',
583
+ 'session.deleteCancelled': '削除をキャンセルしました',
584
+ 'session.resumed': 'セッション {id} を再開しました',
585
+ 'session.started': 'セッション {id} を開始しました',
586
+ 'session.openFailed': 'セッションを開けませんでした: {error}',
587
+ 'session.forkSummary': '{parent} からの {label} · {files}',
588
+ 'session.forkDropped': ' · 継承した入力 {count} 件を破棄',
589
+ 'session.conversationOnly': '会話のみ',
590
+ 'session.rewindLabel': '巻き戻し #{n}',
591
+ 'session.files': 'ファイル: {summary}',
592
+ 'session.error': 'エラー: {error}',
593
+ 'session.interruptFirst': '先に実行中のターンを中断してください (/cancel)',
594
+ 'session.interruptFirstEsc': '先に実行中のターンを中断してください (Esc または /cancel)',
595
+ 'session.startFirst': '先にセッションを開始してください',
596
+ 'session.noReasoningLevels': '現在のモデルには推論レベルがありません',
597
+ 'session.settingsUnavailable': '設定を利用できません',
598
+ 'session.interruptRequested': '中断を要求しました',
599
+ 'session.nothingToInterrupt': '中断するものはありません',
600
+ 'session.noSessionRunning': '実行中のセッションはありません',
601
+ 'session.promptCleared': 'プロンプトをクリアしました',
602
+ 'session.exitAgain': '終了するにはもう一度 Ctrl+C を押してください',
603
+ 'session.usageResume': '使い方: /resume <sessionId>',
604
+ 'session.currentModel': '現在のモデル: {model}',
605
+ 'session.modelSet': 'モデルを {model} に設定しました(次のリクエストから適用)',
606
+ 'session.currentProvider': '現在のプロバイダー: {provider}',
607
+ 'session.providerSet': 'プロバイダーを {provider} に設定しました(次のリクエストから適用)',
608
+ 'session.unknownCommand': '不明なコマンド /{name} — /help を参照してください',
609
+ 'session.queryMissing': 'このプロファイルにはセッションクエリがマウントされていません',
610
+ 'session.listHeader': 'セッション:',
611
+ 'session.noPersisted': '保存済みセッションはありません',
612
+ 'session.listFailed': 'セッション一覧の取得に失敗しました: {error}',
613
+ 'session.modelNoImages': 'モデル "{model}" は画像入力をサポートしていません',
614
+ 'session.imageAttachFailed': '画像の添付に失敗しました: {error}',
615
+ 'session.attachmentsUnavailable': '添付サービスが利用できません。画像を読み取れません',
616
+ 'session.copied.one': '{count} 行をクリップボードにコピーしました',
617
+ 'session.copied.other': '{count} 行をクリップボードにコピーしました',
618
+ 'session.valueRequired': '値が必要です',
619
+ 'session.minChars': '{count} 文字以上',
620
+ 'session.maxChars': '{count} 文字以内',
621
+ 'session.answerRequired': '選択肢を選ぶか回答を入力してください',
622
+ 'session.typeAnswer': '回答を入力するか Esc を押してください',
623
+ 'session.updatesAvailable': '更新: {list} — Ctrl+P → 更新',
624
+ 'session.versionsError': 'バージョン: {error}',
625
+ 'session.mcpError': 'MCP: {error}',
626
+ 'session.noClipboard': 'クリップボードのパスがありません',
627
+ 'session.unsupportedInteraction': '未対応のインタラクション種別: {kind}',
628
+
629
+ // ---- tool activity summaries -------------------------------------------
630
+ 'tool.run': '{command} を実行',
631
+ 'tool.askUser': 'ユーザーに確認',
632
+ 'tool.askQuestions': '質問 {count} 件',
604
633
 
605
634
  // ---- host diagnostics ----------------------------------------------------
606
635
  'diagnostics.notice': 'ホストの診断ログを {path} に記録しました',
607
- }
636
+
637
+ // ---- screenshots --------------------------------------------------------
638
+ "screenshot.shortcut": "スクリーンショット",
639
+ "screenshot.directory": "スクリーンショットの保存先",
640
+ "screenshot.saved": "スクリーンショットを保存しました",
641
+ "screenshot.failed": "スクリーンショットに失敗しました",
642
+ }