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/ko.js CHANGED
@@ -1,607 +1,642 @@
1
- // Korean 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': '사용자 정의 공급자에는 모델이 하나 이상 필요합니다',
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
- // ---- 모델 한 건 ----------------------------------------------------------
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': 'PATH에서 git을 찾을 수 없습니다',
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': '세션 관리에서 세션 삭제 (두 번 누름)',
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 두 번으로 삭제 · 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
+ // Korean 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': '사용자 정의 공급자에는 모델이 하나 이상 필요합니다',
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
+ // ---- 모델 한 건 ----------------------------------------------------------
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': 'PATH에서 git을 찾을 수 없습니다',
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': '세션 관리에서 세션 삭제 (두 번 누름)',
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 두 번으로 삭제 · 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
+ }