dsh-oc-tui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +21 -563
  2. package/bin/mcp-sse-bridge.mjs +499 -499
  3. package/docs/assets/conversation.png +0 -0
  4. package/docs/assets/cover.png +0 -0
  5. package/docs/assets/home.png +0 -0
  6. package/docs/assets/settings.png +0 -0
  7. package/docs/dsh-std-/346/216/245/345/205/245/350/257/264/346/230/216.md +566 -0
  8. package/docs/user-guide.md +616 -0
  9. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +607 -593
  10. package/dsh-plugin.json +69 -69
  11. package/lib/boot-block.js +129 -0
  12. package/lib/diagnostics.js +162 -120
  13. package/lib/dsh-version.js +161 -0
  14. package/lib/git-branch.js +157 -157
  15. package/lib/i18n.js +283 -283
  16. package/lib/image.js +2 -1
  17. package/lib/index.js +5183 -4812
  18. package/lib/locales/ar.js +670 -635
  19. package/lib/locales/de.js +639 -604
  20. package/lib/locales/en.js +35 -0
  21. package/lib/locales/es.js +639 -604
  22. package/lib/locales/fr.js +639 -604
  23. package/lib/locales/id.js +641 -606
  24. package/lib/locales/it.js +639 -604
  25. package/lib/locales/ja.js +639 -604
  26. package/lib/locales/ko.js +639 -604
  27. package/lib/locales/nl.js +639 -604
  28. package/lib/locales/pl.js +653 -618
  29. package/lib/locales/pt-BR.js +639 -604
  30. package/lib/locales/ru.js +653 -618
  31. package/lib/locales/tr.js +639 -604
  32. package/lib/locales/vi.js +641 -606
  33. package/lib/locales/zh-CN.js +640 -605
  34. package/lib/locales/zh-TW.js +640 -605
  35. package/lib/markdown.js +101 -27
  36. package/lib/mcp-monitor.js +189 -0
  37. package/lib/mcp-skill.js +93 -93
  38. package/lib/mcp.js +865 -838
  39. package/lib/model-route.js +66 -0
  40. package/lib/providers.js +712 -712
  41. package/lib/screenshot.js +140 -0
  42. package/lib/splash-opencode.js +29 -26
  43. package/lib/startup.js +66 -48
  44. package/lib/term.js +53 -11
  45. package/lib/themes.js +101 -0
  46. package/lib/ui.js +685 -443
  47. package/lib/updates.js +5 -2
  48. package/lib/web-settings.js +52 -21
  49. package/package.json +160 -146
  50. package/skills/mcp-import/SKILL.md +216 -216
@@ -1,607 +1,642 @@
1
- // Brazilian Portuguese catalog. Keys, order and placeholders mirror `en.js`, the source.
2
- export default {
3
- // ---- shared chrome ------------------------------------------------------
4
- 'common.selectBack': 'Enter selecionar · Esc voltar',
5
- 'common.selectConfirmBack': '↑/↓ selecionar · Enter confirmar · Esc voltar',
6
- 'common.selectContinueExit': '↑/↓ selecionar · Enter continuar · Esc sair',
7
- 'common.escBack': 'Esc voltar',
8
- 'common.escClose': 'Esc fechar',
9
- 'common.escCancel': 'Esc cancelar',
10
- 'common.working': 'Trabalhando…',
11
- 'common.pleaseWait': 'aguarde',
12
- 'common.on': 'ativado',
13
- 'common.off': 'desativado',
14
- 'common.unavailable': 'indisponível',
15
- 'common.selected': 'selecionado',
16
- 'common.default': 'padrão',
17
- 'common.system': 'sistema',
18
- 'common.installed': '(instalado)',
19
- 'common.more': '… {count} a mais',
20
- 'common.moreLines': '… {count} linhas a mais',
21
- 'common.clickExpand': ' · clique para expandir',
22
- 'common.clickCollapse': ' · clique para recolher',
23
- 'common.unknown': 'desconhecido',
24
- 'common.emptyMessage': '[mensagem vazia]',
25
- 'value.queue': 'fila',
26
- 'value.steer': 'direcionar',
27
- 'value.auto': 'automático',
28
- 'value.local': 'local',
29
- 'value.textOnly': 'somente texto',
30
- 'value.textImage': 'texto + imagem',
31
-
32
- // ---- title screen -------------------------------------------------------
33
- 'splash.hint': 'Pergunte qualquer coisa... "Corrigir testes quebrados"',
34
- 'splash.shortcutSettings': 'configurações',
35
- 'splash.shortcutThinking': 'raciocínio',
36
- 'splash.shortcutBranches': 'branches',
37
-
38
- // ---- header / sidebar / status row -------------------------------------
39
- // ---- command-line help (dsh --profile tui --help) -----------------------
40
- 'startup.description': 'Inicia a interface de terminal do DeepSeek Harness.',
41
- 'startup.helpOption': 'mostrar esta ajuda',
42
- 'startup.resume': 'retomar uma sessão persistida existente por id',
43
- 'startup.model': 'id de modelo padrão para novas sessões',
44
- 'startup.provider': 'rota de provedor padrão para novas sessões',
45
- 'startup.sidebar': 'mostrar a barra lateral de sessões (padrão)',
46
- 'startup.noSidebar': 'iniciar sem a barra lateral',
47
- 'startup.examples': 'Exemplos:',
48
- 'startup.exampleFresh': 'iniciar uma nova sessão',
49
- 'startup.exampleResume': 'retomar uma sessão persistida',
50
-
51
- 'header.workspace': 'ESPAÇO DE TRABALHO',
52
- 'sidebar.sessions': 'SESSÕES',
53
- 'sidebar.recent': 'RECENTES',
54
- 'sidebar.newSession': '+ Nova sessão',
55
- 'status.model': 'modelo',
56
- 'status.draftTokens': '{count} tok rascunho',
57
- 'status.ctrlP': 'ctrl+p comandos',
58
- 'status.interrupt': 'interromper: ctrl+c',
59
-
60
- // ---- composer command hints --------------------------------------------
61
- 'hint.help': 'mostrar ajuda',
62
- 'hint.settings': 'abrir configurações',
63
- 'hint.new': 'nova sessão',
64
- 'hint.resume': 'retomar sessão',
65
- 'hint.model': 'selecionar modelo',
66
- 'hint.provider': 'selecionar provedor',
67
- 'hint.rewind': 'retroceder',
68
- 'hint.branch': 'trocar de branch do git',
69
- 'hint.stats': 'estatísticas e uso de tokens',
70
- 'hint.clear': 'limpar a tela',
71
- 'hint.cancel': 'cancelar o turno em execução',
72
- 'hint.quit': 'sair',
73
- 'hint.compact': 'compactar contexto',
74
- 'hint.goal': 'gerenciar objetivo',
75
-
76
- // ---- transcript blocks --------------------------------------------------
77
- 'transcript.turns.one': '{count} turno',
78
- 'transcript.turns.other': '{count} turnos',
79
- 'transcript.steps.one': '{count} etapa',
80
- 'transcript.steps.other': '{count} etapas',
81
- 'transcript.thinking': ' raciocínio',
82
- 'transcript.streaming': ' · transmitindo…',
83
- 'transcript.steeringBadge': ' ⟲ intervenção',
84
- 'transcript.tasks': 'tarefas',
85
- 'transcript.systemPrompt': ' prompt do sistema',
86
- 'transcript.pendingInput': ' entrada pendente · ',
87
- 'transcript.steering': ' intervenção',
88
- 'transcript.queued': ' na fila',
89
- 'note.systemReminder': 'system-reminder',
90
- 'note.compaction': 'compactação',
91
-
92
- // ---- images and mermaid -------------------------------------------------
93
- 'image.attachment': '🖼 imagem anexada',
94
- 'image.rendering': '⏳ renderizando imagem…',
95
- 'image.renderFailed': '⚠ falha ao renderizar a imagem · {error}',
96
- 'image.mermaidRendering': '⏳ renderizando diagrama mermaid…',
97
- 'image.mermaidTooWide': '↔ o diagrama mermaid precisa de {width} colunas, este painel tem {budget}',
98
- 'image.altFallback': 'imagem',
99
-
100
- // ---- composer / approval prompt ----------------------------------------
101
- 'composer.imageHint': 'Imagem colada: use um modelo/plugin multimodal ou deepseek-v4-flash-vision-exp, senão a imagem não pode ser lida',
102
- 'composer.approval': 'Aprovação · ',
103
- 'composer.summary': 'Resumo · ',
104
- 'composer.origin': 'Origem · ',
105
- 'composer.risk': 'Risco · ',
106
- 'composer.approvalHint': 'y permitir · n negar · Esc cancelar',
107
- 'risk.low': 'baixo',
108
- 'risk.medium': 'médio',
109
- 'risk.high': 'alto',
110
- 'composer.effortHint': 'Tab / ←/→ ajustar · Esc fechar',
111
-
112
- // ---- right status rail --------------------------------------------------
113
- 'rail.model': 'MODELO',
114
- 'rail.thinking': 'RACIOCÍNIO',
115
- 'rail.context': 'CONTEXTO',
116
- 'rail.session': 'SESSÃO',
117
- 'rail.goal': 'OBJETIVO',
118
- 'rail.subagents': 'SUBAGENTES',
119
- 'rail.noData': '—',
120
- 'rail.percentUsed': '{percent}% usado',
121
- 'rail.tokens': '~{used} / {window} tokens',
122
- 'rail.cacheHit': 'cache {percent}% de acertos',
123
- 'rail.breakdown': 'sistema {system} · ferramentas {tools} · mensagens {messages}',
124
- 'rail.contextPending': 'exibido assim que o uso for informado',
125
- 'rail.subagentCounts': '{running} ativos · {total} no total',
126
- 'rail.unreadable': '{label} (ilegível)',
127
- 'rail.more': '… +{count} a mais',
128
- 'rail.round': ' · rodada {started}/{max}',
129
- 'goal.active': 'ativo',
130
- 'goal.paused': 'pausado',
131
- 'goal.blocked': 'bloqueado',
132
- 'goal.complete': 'concluído',
133
-
134
- // ---- session stats window ----------------------------------------------
135
- 'stats.title': 'estatísticas da sessão',
136
- 'stats.hint': 'clique na faixa ou /stats',
137
- 'stats.usage': 'uso',
138
- 'stats.duration': 'duração',
139
- 'stats.speed': 'velocidade',
140
- 'stats.tokens': 'tokens',
141
- 'stats.cache': 'cache',
142
- 'stats.context': 'contexto',
143
- 'stats.noSteps': 'nenhuma etapa concluída ainda',
144
- 'stats.llmTime': 'LLM {value}',
145
- 'stats.toolTime': 'ferramentas {value}',
146
- 'stats.ttft': 'TTFT méd. {value}',
147
- 'stats.tokensPerSecond': '{value} tok/s',
148
- 'stats.cacheRate': 'cache {percent}%',
149
- 'stats.inOut': 'entrada {input} · saída {output}',
150
- 'stats.cacheDetail': '{percent}% de acertos · lidos {read} · gravados {write} · falhas {miss}',
151
- 'stats.contextUsed': 'usado {percent}% ~{used} / {window}',
152
- 'stats.systemPrompt': 'prompt do sistema',
153
- 'stats.tools': 'ferramentas',
154
- 'stats.messages': 'mensagens',
155
- 'stats.compositionUnavailable': 'composição indisponível',
156
- 'stats.contextPending': 'a ocupação do contexto aparece quando uma requisição informar o uso',
157
-
158
- // ---- questions modal ----------------------------------------------------
159
- 'questions.title': 'Pergunta',
160
- 'questions.titleOf': 'Pergunta {index} de {total}',
161
- 'questions.defer': 'Esc adiar',
162
- 'questions.range': '{from}-{to} de {total} PgUp/PgDn',
163
- 'questions.other': 'Outra: ',
164
- 'questions.answer': 'Resposta: ',
165
- 'questions.placeholder': 'digite sua própria resposta',
166
- 'questions.hintCustom': 'Enter confirmar · Esc voltar',
167
- 'questions.hintMulti': 'Espaço alternar · Enter continuar · Cima/Baixo mover',
168
- 'questions.hintSingle': 'Enter selecionar · Cima/Baixo mover',
169
-
170
- // ---- secret prompt ------------------------------------------------------
171
- 'secret.hint': 'Enter enviar · Esc cancelar',
172
-
173
- // ---- settings dialog chrome --------------------------------------------
174
- 'settings.title': 'Configurações',
175
- 'settings.menu': 'MENU',
176
- 'settings.shared': 'Compartilhado com o DeepSeek Harness WebUI',
177
- 'settings.footerEdit': 'Enter salvar · Esc cancelar',
178
- 'settings.footerMenu': '↑/↓ mover · Tab menu · Enter selecionar · Esc voltar',
179
- 'settings.footerPlain': '↑/↓ mover · Enter selecionar · Esc voltar',
180
- 'settings.confirmHint': '{text} · Y / N',
181
- 'settings.confirmDefault': 'Y confirmar · N cancelar',
182
- 'settings.confirmDeleteSession': 'Ctrl+D de novo para excluir',
183
- 'settings.confirmChange': 'Confirmar esta alteração?',
184
- 'settings.deleteTwice': 'Pressione Ctrl+D de novo para excluir ',
185
- 'settings.deleteMcpTwice': 'Pressione Delete de novo para remover ',
186
- 'settings.noSession': 'nenhuma sessão selecionada',
187
- 'settings.noSessions': 'nenhuma sessão disponível',
188
- 'settings.noMcp': 'nenhum servidor MCP selecionado',
189
- 'settings.noOptions': 'nenhuma opção disponível para {label}',
190
- 'settings.saved': 'salvo nas configurações do DSH',
191
- 'settings.providerRemoved': 'provedor removido',
192
- 'settings.conflict': 'configurações alteradas em outro lugar; recarregadas',
193
- 'settings.error': 'configurações: {error}',
194
- 'settings.dshSettings': 'Configurações do DSH',
195
- 'settings.optionList': 'Enter selecionar · Esc voltar',
196
-
197
- // ---- settings left menu -------------------------------------------------
198
- 'menu.main': 'Principal',
199
- 'menu.model': 'Modelo',
200
- 'menu.update': 'Atualização',
201
- 'menu.mcp': 'MCP',
202
-
203
- // ---- settings rows: main tab -------------------------------------------
204
- 'settings.general': 'Geral',
205
- 'settings.graphics': 'Gráficos',
206
- 'settings.sessions': 'Sessões',
207
- 'settings.system': 'Sistema',
208
- 'settings.busyEnter': 'Enter ocupado',
209
- 'settings.defaultPreset': 'Preset padrão',
210
- 'settings.permissionPreset': 'Preset de permissões',
211
- 'settings.permissionDangerConfirm': 'Ativar acesso irrestrito a ferramentas e arquivos?',
212
- 'settings.graphicsRendering': 'Renderização gráfica',
213
- 'settings.noProtocolFallback': 'Fallback sem protocolo',
214
- 'settings.imageHeightCap': 'Altura máx. de imagem (linhas)',
215
- 'settings.mermaidRendering': 'Renderização de Mermaid',
216
- 'settings.newSession': 'Nova sessão',
217
- 'settings.manageSessions': 'Gerenciar sessões',
218
- 'settings.providerConfig': 'Config. de API do provedor',
219
- 'settings.updateManager': 'Gerenciador de atualizações',
220
- 'settings.settingsFile': 'Arquivo de configurações',
221
- 'settings.language': 'Idioma',
222
- 'settings.languageSystem': 'Sistema ({language})',
223
- 'settings.languageSaved': 'idioma: {language}',
224
-
225
- // ---- model tab ----------------------------------------------------------
226
- 'model.title': 'Modelo',
227
- 'model.subtitle': 'Enter define um modelo da lista como padrão',
228
- 'model.defaultSection': 'Padrão',
229
- 'model.defaultProvider': 'Provedor padrão',
230
- 'model.defaultModel': 'Modelo padrão',
231
- 'model.reasoning': 'Raciocínio',
232
- 'model.providerUrl': 'URL do provedor',
233
- 'model.providerApiKey': 'Chave de API do provedor',
234
- 'model.displayName': 'Nome de exibição',
235
- 'model.wireProtocol': 'Protocolo de transporte',
236
- 'model.defaultImageInput': 'Entrada de imagem padrão',
237
- 'model.models': 'Modelos',
238
- 'model.fetch': 'buscar…',
239
- 'model.selectedCount': '{count} selecionados',
240
- 'model.removeProvider': 'Remover provedor',
241
- 'model.removeProviderConfirm': 'Remover {name} e sua credencial gerenciada?',
242
- 'model.noModels': 'nenhum modelo disponível',
243
- 'model.noModelsReturned': 'o provedor não retornou modelos',
244
- 'model.fetchUnavailable': 'busca automática indisponível — modelos salvos · Enter alternar',
245
- 'model.fetchOk': 'buscado automaticamente · Enter alternar · Esc voltar',
246
- 'model.fetching': 'Buscando modelos…',
247
- 'model.autoFetching': 'busca automática…',
248
- 'model.credentialConfigured': 'configurada ({source})',
249
- 'model.credentialMissing': 'não configurada',
250
- 'model.defaultTag': 'padrão',
251
- 'model.providerUnavailable': 'o provedor não está mais disponível',
252
- 'model.namespaceUnavailable': 'o namespace de configurações do provedor não está disponível',
253
- 'model.apiKeyEmpty': 'a chave de API não pode ficar vazia',
254
- 'model.credentialsUnavailable': 'o serviço de credenciais não está disponível',
255
- 'model.noProviderModels': 'o provedor selecionado não tem modelos disponíveis',
256
- 'model.addCount.one': '{count} disponível',
257
- 'model.addCount.other': '{count} disponíveis',
258
-
259
- // ---- add-provider flow --------------------------------------------------
260
- 'provider.add': 'Adicionar provedor',
261
- 'provider.empty': 'nenhum provedor configurado ainda',
262
- 'provider.pickSubtitle': 'Enter escolher · Esc voltar',
263
- 'provider.catalog': 'Provedores instalados',
264
- 'provider.catalogEmpty': 'todos os provedores instalados já estão configurados',
265
- 'provider.custom': 'API personalizada — declarar um endpoint',
266
- 'provider.form.catalog': 'Adotar um provedor instalado',
267
- 'provider.form.custom': 'Declarar um provedor personalizado',
268
- 'provider.formSubtitle': 'Enter editar · Esc voltar',
269
- 'provider.field.route': 'ID de rota',
270
- 'provider.field.addModel': 'Adicionar ID de modelo',
271
- 'provider.field.save': 'Salvar provedor',
272
- 'provider.hint.route': 'minúsculas, dígitos e hífens · chave guardada como {ref}',
273
- 'provider.error.route': 'o ID de rota deve começar com uma letra e usar apenas minúsculas, dígitos e hífens',
274
- 'provider.error.routeNeeded': 'escolha um provedor',
275
- 'provider.error.taken': 'já existe um provedor com este ID de rota',
276
- 'provider.error.baseUrl': 'o endpoint precisa ser uma URL http ou https',
277
- 'provider.error.baseUrlNeeded': 'um provedor personalizado precisa de um endpoint',
278
- 'provider.error.apiNeeded': 'escolha o protocolo que este endpoint fala',
279
- 'provider.error.modelsNeeded': 'um provedor personalizado precisa de pelo menos um modelo',
280
- 'provider.error.modelId': 'o modelo {index} precisa de um ID',
281
- 'provider.error.modelDuplicate': 'o modelo "{id}" está listado duas vezes',
282
- 'provider.added': 'provedor adicionado',
283
- 'provider.accountManaged': 'conectado com sua conta DeepSeek',
284
- 'provider.search': 'Buscar',
285
- 'provider.searchPlaceholder': 'digite para filtrar',
286
- 'provider.searchEmpty': 'nenhum provedor corresponde a "{query}"',
287
-
288
- // ---- uma entrada de modelo -----------------------------------------------
289
- 'model.edit': 'Editar modelo',
290
- 'model.editHint': 'e editar · Del remover',
291
- 'model.refresh': 'Atualizar catálogo',
292
- 'model.selectAll': 'Selecionar tudo',
293
- 'model.fetchRefused': 'o endpoint não retornou nenhuma lista de modelos',
294
- 'model.notSaved': 'este modelo ainda não está salvo',
295
- 'model.removed': 'modelo removido',
296
- 'model.form.add': 'Adicionar modelo',
297
- 'model.form.edit': 'Modelo · {id}',
298
- 'model.form.save': 'Salvar modelo',
299
- 'model.form.remove': 'Remover do provedor',
300
- 'model.form.removeConfirm': 'Remover este modelo do provedor?',
301
- 'model.field.id': 'ID do modelo',
302
- 'model.field.name': 'Nome exibido',
303
- 'model.field.contextWindow': 'Janela de contexto',
304
- 'model.field.maxTokens': 'Tokens de saída máx.',
305
- 'model.field.input': 'Entrada',
306
- 'model.error.idNeeded': 'um modelo precisa de um ID',
307
- 'model.error.idDuplicate': 'o modelo "{id}" já está listado',
308
- 'model.error.capacity': 'janela de contexto e tokens máximos precisam ser inteiros (256K, 1M)',
309
-
310
- // ---- MCP tab ------------------------------------------------------------
311
- 'mcp.title': 'MCP',
312
- 'mcp.subtitle': 'Enter editar · Del remover · Esc voltar',
313
- 'mcp.editSubtitle': 'Enter editar · Esc voltar',
314
- 'mcp.servers': 'Servidores MCP',
315
- 'mcp.empty': 'Nenhum servidor MCP configurado',
316
- 'mcp.add': 'Adicionar servidor MCP',
317
- 'mcp.scope': 'escopo',
318
- 'mcp.scopeUserPrefix': 'usuário · {path}',
319
- 'mcp.scopePathPrefix': 'caminho · {path}',
320
- 'mcp.configFiles': 'Arquivos de configuração',
321
- 'mcp.userScope': 'usuário (todas as sessões)',
322
- 'mcp.secrets': 'Segredos',
323
- 'mcp.secretsPlain': 'texto simples nos arquivos de configuração',
324
- 'mcp.loaded': 'carregado',
325
- 'mcp.notCreated': 'ainda não criado',
326
- 'mcp.type.stdio': 'Comando local',
327
- 'mcp.type.http': 'HTTP',
328
- 'mcp.type.sse': 'SSE',
329
- 'mcp.state.connected': '● conectado',
330
- 'mcp.state.tools.one': '● {count} ferramenta',
331
- 'mcp.state.tools.other': '● {count} ferramentas',
332
- 'mcp.state.pending': '… conectando',
333
- 'mcp.state.disabled': '○ desativado',
334
- 'mcp.state.idle': '○ não conectado',
335
- 'mcp.form.add': 'Adicionar servidor MCP',
336
- 'mcp.form.edit': 'Editar servidor MCP · {name}',
337
- 'mcp.titleAdd': 'MCP · adicionar',
338
- 'mcp.titleEdit': 'MCP · editar',
339
- 'mcp.field.name': 'Nome',
340
- 'mcp.field.type': 'Tipo',
341
- 'mcp.field.timeout': 'Tempo limite (ms)',
342
- 'mcp.field.command': 'Comando',
343
- 'mcp.field.args': 'Argumentos',
344
- 'mcp.field.env': 'Ambiente (JSON)',
345
- 'mcp.field.url': 'URL',
346
- 'mcp.field.headers': 'Cabeçalhos (JSON)',
347
- 'mcp.field.scope': 'Escopo',
348
- 'mcp.field.path': 'Caminho',
349
- 'mcp.field.enabled': 'Ativado',
350
- 'mcp.field.save': 'Salvar',
351
- 'mcp.field.remove': 'Remover',
352
- 'mcp.choice.stdio': 'Comando local (stdio)',
353
- 'mcp.choice.http': 'HTTP (com streaming)',
354
- 'mcp.choice.sse': 'SSE (HTTP+SSE legado)',
355
- 'mcp.choice.scopeUser': 'Usuário — todas as sessões',
356
- 'mcp.choice.scopePath': 'Caminho — sessões sob um diretório',
357
- 'mcp.removeConfirm': 'Remover este servidor MCP e desconectá-lo?',
358
- 'mcp.saved': 'Servidor MCP salvo',
359
- 'mcp.added': 'Servidor MCP adicionado',
360
- 'mcp.removed': 'Servidor MCP removido',
361
- 'mcp.error.name': 'o nome deve ter de 1 a 32 caracteres entre letras, dígitos, "-" ou "_"',
362
- 'mcp.error.duplicate': 'já existe um servidor MCP chamado "{name}" configurado',
363
- 'mcp.error.timeout': 'timeoutMs deve ser um número inteiro entre 1 e {max}',
364
- 'mcp.error.pathNeeded': 'um servidor com escopo de caminho precisa de um diretório',
365
- 'mcp.error.pathAbsolute': 'o escopo de caminho deve ser um diretório absoluto',
366
- 'mcp.error.commandNeeded': 'um servidor stdio precisa de um comando',
367
- 'mcp.error.urlParse': 'não é possível analisar a URL',
368
- 'mcp.error.urlScheme': 'a URL deve usar http ou https',
369
- 'mcp.error.pathNotDir': 'o escopo de caminho não é um diretório: {path}',
370
- 'mcp.error.configIsDir': 'o caminho do arquivo de configuração é um diretório: {path}',
371
- 'mcp.error.notFound': 'nenhum servidor MCP chamado "{name}" está configurado',
372
- 'mcp.error.documentGone': 'o documento que define "{name}" sumiu: {error}',
373
- 'mcp.error.noClient': 'o host não fornece nenhum cliente MCP',
374
- 'mcp.error.connectTimeout': 'a conexão com {name} expirou',
375
- 'mcp.error.json': 'o documento não é JSON válido: {error}',
376
- 'mcp.error.jsonObject': 'o documento deve ser um objeto JSON',
377
- 'mcp.error.serversObject': '"servers" deve ser um objeto JSON',
378
- 'mcp.error.argsArray': 'os argumentos devem ser um array JSON de strings',
379
- 'mcp.error.argsTypes': 'os argumentos devem ser strings ou números',
380
- 'mcp.error.argsUnclosed': 'os argumentos têm uma aspa não fechada',
381
- 'mcp.error.envObject': '{label} deve ser um objeto JSON',
382
- 'mcp.error.envValue': 'o valor "{name}" de {label} deve ser string, número ou booleano',
383
- 'mcp.error.header': 'cabeçalho HTTP inválido "{name}"',
384
- 'mcp.error.envName': 'nome de ambiente inválido "{name}"',
385
-
386
- // ---- rewind -------------------------------------------------------------
387
- 'rewind.title': 'Retroceder',
388
- 'rewind.restoreTo': 'Restaurar para o ponto anterior: {label}',
389
- 'rewind.restorePrompt': 'Restaurar a conversa para o ponto anterior a…',
390
- 'rewind.empty': 'Nada para retroceder ainda.',
391
- 'rewind.option.conversation': 'Restaurar conversa',
392
- 'rewind.option.both': 'Restaurar conversa e arquivos',
393
- 'rewind.option.code': 'Restaurar arquivos',
394
- 'rewind.option.cancel': 'Cancelar',
395
- 'rewind.current': '(atual)',
396
- 'rewind.noPoints': 'nenhuma mensagem do usuário para retroceder',
397
- 'rewind.unknownPoint': 'ponto de retrocesso desconhecido "{selector}" — use um número ou last',
398
- 'rewind.noPoint': 'nenhum ponto de retrocesso {n} — 1..{count}',
399
- 'rewind.notGit': 'não é um worktree git',
400
- 'rewind.noBackup': 'nenhum local de backup',
401
- 'rewind.filesNotRestored': 'arquivos não restaurados',
402
- 'rewind.filesNotRestoredReason': 'arquivos não restaurados ({reason})',
403
- 'rewind.restored.one': '{count} arquivo rastreado restaurado de HEAD',
404
- 'rewind.restored.other': '{count} arquivos rastreados restaurados de HEAD',
405
- 'rewind.removed.one': '{count} arquivo novo removido',
406
- 'rewind.removed.other': '{count} arquivos novos removidos',
407
- 'rewind.skipped': '{count} ignorados',
408
- 'rewind.previousSaved': 'conteúdo anterior salvo em {path}',
409
- 'rewind.noChanges': 'nenhuma alteração de arquivo após este ponto',
410
- 'rewind.image': '[imagem]',
411
- 'rewind.images': '[{count} imagens]',
412
- 'rewind.emptyMessage': '(vazio)',
413
- 'git.title': 'Branches do Git',
414
- 'git.subtitle': 'Atual: {branch} · {path}',
415
- 'git.local': 'Branches locais',
416
- 'git.remote': 'Branches remotas',
417
- 'git.empty': 'Nenhuma branch neste repositório.',
418
- 'git.detached': '(destacado)',
419
- 'git.switched': 'Mudou para a branch {branch}',
420
- 'git.switchFailed': 'Não é possível mudar para {branch}: {error}',
421
- 'git.pullDone': 'Atualizações baixadas',
422
- 'git.pullFailed': 'Não é possível baixar as atualizações: {error}',
423
- 'git.listFailed': 'Não é possível listar as branches: {error}',
424
- 'git.notRepo': 'não é uma árvore de trabalho do git',
425
- 'git.gitMissing': 'git não está disponível no PATH',
426
- 'git.timedOut': 'git esgotou o tempo limite',
427
- 'git.onlyTitleScreen': 'A troca de branch só está disponível na página vazia — use /new para sair da sessão',
428
- 'git.footer': '↑/↓ escolher · Enter trocar · P pull · R atualizar · Esc fechar',
429
-
430
- // ---- update tab ---------------------------------------------------------
431
- 'update.title': 'Atualização',
432
- 'update.checking': 'Verificando versões…',
433
- 'update.fetching': 'buscando no registro npm…',
434
- 'update.fetchingVersions': 'Buscando versões…',
435
- 'update.versionsSubtitle': 'Enter baixar · Esc voltar',
436
- 'update.installed': 'Instalada',
437
- 'update.latest': 'Mais recente (tag npm)',
438
- 'update.status': 'Status',
439
- 'update.versions': 'Versões',
440
- 'update.selectVersion': 'Selecionar versão…',
441
- 'update.restartApply': 'Reiniciar para aplicar {version}',
442
- 'update.enterRestart': 'Enter reiniciar',
443
- 'update.discard': 'Descartar {version} baixada',
444
- 'update.actions': 'Ações',
445
- 'update.checkNow': 'Verificar agora',
446
- 'update.checkingShort': 'Verificando…',
447
- 'update.startupCheck': 'Verificação na inicialização',
448
- 'update.profile': 'perfil',
449
- 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
450
- 'update.statusCorrupt': 'Instalação danificada — reinstale abaixo',
451
- 'update.statusError': 'Falha na verificação do registro: {error}',
452
- 'update.statusAvailable': 'Atualização disponível → {version}',
453
- 'update.statusUpToDate': 'Atualizado',
454
- 'update.statusNoStable': 'Nenhuma versão estável — escolha em Versões',
455
- 'update.notOnPath': 'não encontrado no PATH',
456
- 'update.subtitleStaged': '{package} {version} baixada — reinicie para aplicar',
457
- 'update.subtitleIdle': 'Enter selecionar · baixar e reiniciar para aplicar',
458
- 'update.download': 'Baixar',
459
- 'update.contacting': 'contatando o registro…',
460
- 'update.version': 'Versão',
461
- 'update.savingTo': 'Salvando em',
462
- 'update.escCancels': 'Esc cancela',
463
- 'update.restartApplyQ': 'Reiniciar para aplicar {label} {version}? (já baixada)',
464
- 'update.downloadQ': 'Baixar {label} {version} e reiniciar para aplicar?',
465
- 'update.localSwitch': ' — muda a instalação local para uma versão do registro',
466
- 'update.downloaded': 'baixada · reinicie para aplicar',
467
- 'update.downloadedToast': '{label} {version} baixada · aplique na aba Atualização',
468
- 'update.downloadedConfirm': 'Baixado reiniciar para aplicar {label} {version}? (y/n)',
469
- 'update.alreadyDownloadedConfirm': 'Já baixado · reiniciar para aplicar {label} {version}? (y/n)',
470
- 'update.downloadCancelled': 'download cancelado',
471
- 'update.downloadFailed': 'falha no download: {error}',
472
- 'update.stagedGone': 'o download preparado sumiu — escolha a versão de novo',
473
- 'update.locks.one': 'não é possível aplicar enquanto o dsh roda em {count} outro processo — feche-o e tente de novo',
474
- 'update.locks.other': 'não é possível aplicar enquanto o dsh roda em {count} outros processos — feche-os e tente de novo',
475
- 'update.noNpm': 'não é possível aplicar: npm não encontrado',
476
- 'update.noDshCli': 'não é possível aplicar: a CLI do dsh não foi encontrada',
477
- 'update.installerFailed': 'não é possível iniciar o instalador — reinicie o dsh para aplicar {label}',
478
- 'update.applying': 'aplicando {label} · saindo, reiniciando…',
479
- 'update.stagedDiscarded': 'download preparado descartado',
480
- 'update.tagCached': 'em cache',
481
- 'update.tagStaged': 'preparada',
482
- 'update.installFailed': 'Falha na instalação (código {code}) — tente de novo em Versões',
483
- 'update.installFailedRetry': 'abra Atualização → dsh-oc-tui → Versões e escolha uma versão para baixar de novo',
484
- 'update.installUnreadable': 'a instalação informou sucesso, mas a versão instalada é {installed} (esperada {expected}) — reparo: {repair}',
485
- 'update.registryUnreachable': 'registro inacessível: {error}',
486
- 'update.notOnRegistry': '{package} não está no registro',
487
- 'update.registryHttp': 'o registro retornou HTTP {status} para {package}',
488
- 'update.noTarballUrl': 'a resposta do registro não traz URL de tarball',
489
- 'update.downloadHttp': 'falha no download: HTTP {status} para {url}',
490
- 'update.downloadEmpty': 'falha no download: corpo da resposta vazio',
491
- 'update.integrityFailed': 'falha na verificação de integridade de {file} — download descartado',
492
- 'update.npmMissing': 'npm não encontrado no PATH',
493
- 'update.npmViewFailed': 'npm view {package} saiu com {code}',
494
- 'update.timedOut': '\n(tempo esgotado após {ms}ms)',
495
- 'update.noOutput': '(sem saída)',
496
-
497
- // ---- commands -----------------------------------------------------------
498
- 'command.settings': 'Abrir as páginas de configurações da TUI',
499
- 'command.help': 'Mostrar a referência de teclas e comandos da TUI',
500
- 'command.stats': 'Mostrar estatísticas de tokens e cache da sessão',
501
- 'command.new': 'Iniciar uma nova sessão',
502
- 'command.resume': 'Retomar uma sessão salva',
503
- 'command.clear': 'Limpar o transcript',
504
- 'command.cancel': 'Cancelar o turno em execução',
505
- 'command.rewind': 'Retroceder a sessão para um ponto anterior',
506
- 'command.branch': 'Trocar de branch do git na página vazia',
507
- 'command.quit': 'Sair da TUI',
508
-
509
- // ---- help overlay -------------------------------------------------------
510
- 'help.title': 'DeepSeek Harness TUI — ajuda',
511
- 'help.enter': 'Enter',
512
- 'help.enterDesc': 'enviar mensagem',
513
- 'help.ctrlEnter': 'Ctrl+Enter',
514
- 'help.ctrlEnterDesc': 'inserir quebra de linha',
515
- 'help.ctrlC': 'Ctrl+C',
516
- 'help.ctrlCDesc': 'cancelar o turno em execução; pressione de novo para sair',
517
- 'help.ctrlP': 'Ctrl+P',
518
- 'help.ctrlPDesc': 'abrir configurações',
519
- 'help.ctrlE': 'Ctrl+E',
520
- 'help.ctrlEDesc': 'alternar o controle de raciocínio',
521
- 'help.tab': 'Tab',
522
- 'help.tabDesc': 'alternar a intensidade de raciocínio',
523
- 'help.ctrlN': 'Ctrl+N',
524
- 'help.ctrlNDesc': 'nova sessão',
525
- 'help.ctrlG': 'Ctrl+G',
526
- 'help.ctrlGDesc': 'trocar de branch do git (página vazia)',
527
- 'help.ctrlD': 'Ctrl+D',
528
- 'help.ctrlDDesc': 'excluir sessão em Gerenciar sessões (pressione duas vezes)',
529
- 'help.pg': 'PgUp / PgDn',
530
- 'help.pgDesc': 'rolar o transcript',
531
- 'help.shiftArrows': 'Shift+↑/↓',
532
- 'help.shiftArrowsDesc': 'rolar a barra de status (janelas largas)',
533
- 'help.upDown': 'Cima / Baixo',
534
- 'help.upDownDesc': 'cursor para cima/baixo; histórico nas bordas',
535
- 'help.mouse': 'Arrastar mouse',
536
- 'help.mouseDesc': 'selecionar texto; clique direito copia',
537
- 'help.wheel': 'Roda',
538
- 'help.wheelDesc': 'rolar transcript / configurações',
539
- 'help.escEsc': 'Esc Esc',
540
- 'help.escEscDesc': 'seletor de retrocesso',
541
- 'help.esc': 'Esc',
542
- 'help.escDesc': 'fechar overlay · cancelar turno · limpar entrada',
543
- 'help.commands': 'Comandos:',
544
-
545
- // ---- session manager / toasts ------------------------------------------
546
- 'session.newTitle': 'Nova sessão',
547
- 'session.noSaved': 'Nenhuma sessão salva',
548
- 'session.manageTitle': 'Gerenciar sessões',
549
- 'session.manageSubtitle': 'Enter abrir · Ctrl+D duas vezes para excluir · Esc voltar',
550
- 'session.loading': 'Carregando sessões...',
551
- 'session.deleted': 'sessão {label} excluída',
552
- 'session.deleteFailed': 'excluir sessão: {error}',
553
- 'session.deleteNotFound': 'o diretório da sessão salva não foi encontrado',
554
- 'session.deleteCancelled': 'exclusão cancelada',
555
- 'session.resumed': 'sessão {id} retomada',
556
- 'session.started': 'sessão {id} iniciada',
557
- 'session.openFailed': 'falha ao abrir a sessão: {error}',
558
- 'session.forkSummary': '{label} de {parent} · {files}',
559
- 'session.forkDropped': ' · {count} entradas pendentes herdadas descartadas',
560
- 'session.conversationOnly': 'somente conversa',
561
- 'session.rewindLabel': 'retrocesso #{n}',
562
- 'session.files': 'arquivos: {summary}',
563
- 'session.error': 'erro: {error}',
564
- 'session.interruptFirst': 'cancele primeiro o turno em execução (/cancel)',
565
- 'session.interruptFirstEsc': 'cancele primeiro o turno em execução (Esc ou /cancel)',
566
- 'session.startFirst': 'inicie uma sessão primeiro',
567
- 'session.noReasoningLevels': 'o modelo atual não expõe níveis de raciocínio',
568
- 'session.settingsUnavailable': 'configurações indisponíveis',
569
- 'session.interruptRequested': 'interrupção solicitada',
570
- 'session.nothingToInterrupt': 'nada para interromper',
571
- 'session.noSessionRunning': 'nenhuma sessão em execução',
572
- 'session.promptCleared': 'entrada limpa',
573
- 'session.exitAgain': 'pressione Ctrl+C de novo para sair',
574
- 'session.usageResume': 'uso: /resume <sessionId>',
575
- 'session.currentModel': 'modelo atual: {model}',
576
- 'session.modelSet': 'modelo definido como {model} (vale para a próxima requisição)',
577
- 'session.currentProvider': 'provedor atual: {provider}',
578
- 'session.providerSet': 'provedor definido como {provider} (vale para a próxima requisição)',
579
- 'session.unknownCommand': 'comando desconhecido /{name} — tente /help',
580
- 'session.queryMissing': 'a consulta de sessão não está montada neste perfil',
581
- 'session.listHeader': 'sessões:',
582
- 'session.noPersisted': 'nenhuma sessão salva',
583
- 'session.listFailed': 'falha ao listar sessões: {error}',
584
- 'session.modelNoImages': 'o modelo "{model}" não aceita entrada de imagem',
585
- 'session.imageAttachFailed': 'falha ao anexar imagem: {error}',
586
- 'session.attachmentsUnavailable': 'serviço de anexos indisponível; não é possível ler a imagem',
587
- 'session.copied.one': '{count} linha copiada para a área de transferência',
588
- 'session.copied.other': '{count} linhas copiadas para a área de transferência',
589
- 'session.valueRequired': 'um valor é obrigatório',
590
- 'session.minChars': 'pelo menos {count} caracteres',
591
- 'session.maxChars': 'no máximo {count} caracteres',
592
- 'session.answerRequired': 'selecione uma opção ou digite uma resposta',
593
- 'session.typeAnswer': 'digite uma resposta ou pressione Esc',
594
- 'session.updatesAvailable': 'Atualizações: {list} — Ctrl+P → Atualização',
595
- 'session.versionsError': 'versões: {error}',
596
- 'session.mcpError': 'MCP: {error}',
597
- 'session.noClipboard': 'nenhum caminho de área de transferência disponível',
598
- 'session.unsupportedInteraction': 'tipo de interação não suportado: {kind}',
599
-
600
- // ---- tool activity summaries -------------------------------------------
601
- 'tool.run': 'executar {command}',
602
- 'tool.askUser': 'perguntar ao usuário',
603
- 'tool.askQuestions': 'fazer {count} perguntas',
1
+ // Brazilian Portuguese catalog. Keys, order and placeholders mirror `en.js`, the source.
2
+ export default {
3
+ // ---- shared chrome ------------------------------------------------------
4
+ 'common.selectBack': 'Enter selecionar · Esc voltar',
5
+ 'common.selectConfirmBack': '↑/↓ selecionar · Enter confirmar · Esc voltar',
6
+ 'common.selectContinueExit': '↑/↓ selecionar · Enter continuar · Esc sair',
7
+ 'common.escBack': 'Esc voltar',
8
+ 'common.escClose': 'Esc fechar',
9
+ 'common.escCancel': 'Esc cancelar',
10
+ 'common.working': 'Trabalhando…',
11
+ 'common.pleaseWait': 'aguarde',
12
+ 'common.on': 'ativado',
13
+ 'common.off': 'desativado',
14
+ 'common.unavailable': 'indisponível',
15
+ 'common.selected': 'selecionado',
16
+ 'common.default': 'padrão',
17
+ 'common.system': 'sistema',
18
+ 'common.installed': '(instalado)',
19
+ 'common.more': '… {count} a mais',
20
+ 'common.moreLines': '… {count} linhas a mais',
21
+ 'common.clickExpand': ' · clique para expandir',
22
+ 'common.clickCollapse': ' · clique para recolher',
23
+ 'common.unknown': 'desconhecido',
24
+ 'common.emptyMessage': '[mensagem vazia]',
25
+ 'value.queue': 'fila',
26
+ 'value.steer': 'direcionar',
27
+ 'value.auto': 'automático',
28
+ 'value.local': 'local',
29
+ 'value.textOnly': 'somente texto',
30
+ 'value.textImage': 'texto + imagem',
31
+ 'value.show': 'mostrar',
32
+ 'value.hide': 'ocultar',
33
+
34
+ // ---- title screen -------------------------------------------------------
35
+ 'splash.hint': 'Pergunte qualquer coisa... "Corrigir testes quebrados"',
36
+ 'splash.shortcutSettings': 'configurações',
37
+ 'splash.shortcutThinking': 'raciocínio',
38
+ 'splash.shortcutBranches': 'branches',
39
+
40
+ // ---- header / sidebar / status row -------------------------------------
41
+ // ---- command-line help (dsh --profile tui --help) -----------------------
42
+ 'startup.description': 'Inicia a interface de terminal do DeepSeek Harness.',
43
+ 'startup.helpOption': 'mostrar esta ajuda',
44
+ 'startup.resume': 'retomar uma sessão persistida existente por id',
45
+ 'startup.model': 'id de modelo padrão para novas sessões',
46
+ 'startup.provider': 'rota de provedor padrão para novas sessões',
47
+ 'startup.sidebar': 'mostrar a barra lateral de sessões (padrão)',
48
+ 'startup.noSidebar': 'iniciar sem a barra lateral',
49
+ 'startup.examples': 'Exemplos:',
50
+ 'startup.exampleFresh': 'iniciar uma nova sessão',
51
+ 'startup.exampleResume': 'retomar uma sessão persistida',
52
+
53
+ 'header.workspace': 'ESPAÇO DE TRABALHO',
54
+ 'sidebar.sessions': 'SESSÕES',
55
+ 'sidebar.recent': 'RECENTES',
56
+ 'sidebar.newSession': '+ Nova sessão',
57
+ 'status.model': 'modelo',
58
+ 'status.draftTokens': '{count} tok rascunho',
59
+ 'status.ctrlP': 'ctrl+p comandos',
60
+ 'status.interrupt': 'interromper: ctrl+c',
61
+
62
+ // ---- composer command hints --------------------------------------------
63
+ 'hint.help': 'mostrar ajuda',
64
+ 'hint.settings': 'abrir configurações',
65
+ 'hint.new': 'nova sessão',
66
+ 'hint.resume': 'retomar sessão',
67
+ 'hint.model': 'selecionar modelo',
68
+ 'hint.provider': 'selecionar provedor',
69
+ 'hint.rewind': 'retroceder',
70
+ 'hint.branch': 'trocar de branch do git',
71
+ 'hint.stats': 'estatísticas e uso de tokens',
72
+ 'hint.clear': 'limpar a tela',
73
+ 'hint.cancel': 'cancelar o turno em execução',
74
+ 'hint.quit': 'sair',
75
+ 'hint.compact': 'compactar contexto',
76
+ 'hint.goal': 'gerenciar objetivo',
77
+
78
+ // ---- transcript blocks --------------------------------------------------
79
+ 'transcript.turns.one': '{count} turno',
80
+ 'transcript.turns.other': '{count} turnos',
81
+ 'transcript.steps.one': '{count} etapa',
82
+ 'transcript.steps.other': '{count} etapas',
83
+ 'transcript.modelChanged': 'Modelo alterado de {from} para {to}',
84
+ 'transcript.thinking': ' raciocínio',
85
+ 'transcript.streaming': ' · transmitindo…',
86
+ 'transcript.steeringBadge': ' ⟲ intervenção',
87
+ 'transcript.tasks': 'tarefas',
88
+ 'transcript.systemPrompt': ' prompt do sistema',
89
+ 'transcript.pendingInput': ' entrada pendente · ',
90
+ 'transcript.steering': ' intervenção',
91
+ 'transcript.queued': ' na fila',
92
+ 'note.systemReminder': 'system-reminder',
93
+ 'note.compaction': 'compactação',
94
+ 'note.runtimeContext': 'contexto de execução',
95
+
96
+ // ---- images and mermaid -------------------------------------------------
97
+ 'image.attachment': '🖼 imagem anexada',
98
+ 'image.rendering': '⏳ renderizando imagem…',
99
+ 'image.renderFailed': '⚠ falha ao renderizar a imagem · {error}',
100
+ 'image.mermaidRendering': '⏳ renderizando diagrama mermaid…',
101
+ 'image.mermaidTooWide': '↔ o diagrama mermaid precisa de {width} colunas, este painel tem {budget}',
102
+ 'image.altFallback': 'imagem',
103
+
104
+ // ---- composer / approval prompt ----------------------------------------
105
+ 'composer.keys': "Enter enviar · Ctrl+Enter nova linha · Ctrl+P ajustes",
106
+ 'composer.commandKeys': "↑/↓ selecionar · Tab completar · Esc fechar",
107
+ 'composer.imageHint': 'Imagem colada: use um modelo/plugin multimodal ou deepseek-v4-flash-vision-exp, senão a imagem não pode ser lida',
108
+ 'composer.approval': 'Aprovação · ',
109
+ 'composer.summary': 'Resumo · ',
110
+ 'composer.origin': 'Origem · ',
111
+ 'composer.risk': 'Risco · ',
112
+ 'composer.approvalHint': 'y permitir · n negar · Esc cancelar',
113
+ 'risk.low': 'baixo',
114
+ 'risk.medium': 'médio',
115
+ 'risk.high': 'alto',
116
+ 'composer.effortHint': 'Tab / ←/→ ajustar · Esc fechar',
117
+
118
+ // ---- right status rail --------------------------------------------------
119
+ 'rail.model': 'MODELO',
120
+ 'rail.thinking': 'RACIOCÍNIO',
121
+ 'rail.context': 'CONTEXTO',
122
+ 'rail.session': 'SESSÃO',
123
+ 'rail.goal': 'OBJETIVO',
124
+ 'rail.subagents': 'SUBAGENTES',
125
+ 'rail.noData': '—',
126
+ 'rail.percentUsed': '{percent}% usado',
127
+ 'rail.tokens': '~{used} / {window} tokens',
128
+ 'rail.cacheHit': 'cache {percent}% de acertos',
129
+ 'rail.breakdown': 'sistema {system} · ferramentas {tools} · mensagens {messages}',
130
+ 'rail.contextPending': 'exibido assim que o uso for informado',
131
+ 'rail.subagentCounts': '{running} ativos · {total} no total',
132
+ 'rail.unreadable': '{label} (ilegível)',
133
+ 'rail.more': '… +{count} a mais',
134
+ 'rail.round': ' · rodada {started}/{max}',
135
+ 'goal.active': 'ativo',
136
+ 'goal.paused': 'pausado',
137
+ 'goal.blocked': 'bloqueado',
138
+ 'goal.complete': 'concluído',
139
+
140
+ // ---- session stats window ----------------------------------------------
141
+ 'stats.title': 'estatísticas da sessão',
142
+ 'stats.hint': 'clique na faixa ou /stats',
143
+ 'stats.usage': 'uso',
144
+ 'stats.duration': 'duração',
145
+ 'stats.speed': 'velocidade',
146
+ 'stats.tokens': 'tokens',
147
+ 'stats.cache': 'cache',
148
+ 'stats.context': 'contexto',
149
+ 'stats.noSteps': 'nenhuma etapa concluída ainda',
150
+ 'stats.llmTime': 'LLM {value}',
151
+ 'stats.toolTime': 'ferramentas {value}',
152
+ 'stats.ttft': 'TTFT méd. {value}',
153
+ 'stats.tokensPerSecond': '{value} tok/s',
154
+ 'stats.cacheRate': 'cache {percent}%',
155
+ 'stats.inOut': 'entrada {input} · saída {output}',
156
+ 'stats.cacheDetail': '{percent}% de acertos · lidos {read} · gravados {write} · falhas {miss}',
157
+ 'stats.contextUsed': 'usado {percent}% ~{used} / {window}',
158
+ 'stats.systemPrompt': 'prompt do sistema',
159
+ 'stats.tools': 'ferramentas',
160
+ 'stats.messages': 'mensagens',
161
+ 'stats.compositionUnavailable': 'composição indisponível',
162
+ 'stats.contextPending': 'a ocupação do contexto aparece quando uma requisição informar o uso',
163
+
164
+ // ---- questions modal ----------------------------------------------------
165
+ 'questions.title': 'Pergunta',
166
+ 'questions.titleOf': 'Pergunta {index} de {total}',
167
+ 'questions.defer': 'Esc adiar',
168
+ 'questions.range': '{from}-{to} de {total} PgUp/PgDn',
169
+ 'questions.other': 'Outra: ',
170
+ 'questions.answer': 'Resposta: ',
171
+ 'questions.placeholder': 'digite sua própria resposta',
172
+ 'questions.hintCustom': 'Enter confirmar · Esc voltar',
173
+ 'questions.hintMulti': 'Espaço alternar · Enter continuar · Cima/Baixo mover',
174
+ 'questions.hintSingle': 'Enter selecionar · Cima/Baixo mover',
175
+
176
+ // ---- secret prompt ------------------------------------------------------
177
+ 'secret.hint': 'Enter enviar · Esc cancelar',
178
+
179
+ // ---- boot gate: the dsh version this build may run on ----
180
+ 'boot.unsupportedTitle': 'Versão do dsh não suportada',
181
+ 'boot.unverifiedTitle': 'Versão do dsh não verificada',
182
+ 'boot.runningLabel': 'dsh em execução',
183
+ 'boot.supportedLabel': 'suportada',
184
+ 'boot.recommendedLabel': 'recomendada',
185
+ 'boot.verifiedLabel': 'verificada',
186
+ 'boot.unsupportedBody': 'Esta versão do dsh-oc-tui suporta apenas {range}, e {version} está fora dela. As sessões não podem rodar até que o dsh esteja em uma versão suportada.',
187
+ 'boot.unverifiedBody': 'Esta versão do dsh-oc-tui foi verificada com {verified}, não com {version}. Instale {recommended} para ter certeza de que funciona.',
188
+ 'boot.installHint': 'Instale a versão recomendada do dsh e inicie este profile novamente:',
189
+ 'boot.updatePluginHint': 'Se uma versão mais nova do dsh-oc-tui já suporta este dsh, atualize o plugin:',
190
+ 'boot.exitHint': 'Esc ou Ctrl+C para sair',
191
+
192
+ // ---- settings dialog chrome --------------------------------------------
193
+ 'settings.title': 'Configurações',
194
+ 'settings.menu': 'MENU',
195
+ 'settings.shared': 'Compartilhado com o DeepSeek Harness WebUI',
196
+ 'settings.footerEdit': 'Enter salvar · Esc cancelar',
197
+ 'settings.footerMenu': '↑/↓ mover · Tab menu · Enter selecionar · Esc voltar',
198
+ 'settings.footerPlain': '↑/↓ mover · Enter selecionar · Esc voltar',
199
+ 'settings.confirmHint': '{text} · Y / N',
200
+ 'settings.confirmDefault': 'Y confirmar · N cancelar',
201
+ 'settings.confirmDeleteSession': 'Ctrl+D de novo para excluir',
202
+ 'settings.confirmChange': 'Confirmar esta alteração?',
203
+ 'settings.deleteTwice': 'Pressione Ctrl+D de novo para excluir ',
204
+ 'settings.deleteMcpTwice': 'Pressione Delete de novo para remover ',
205
+ 'settings.noSession': 'nenhuma sessão selecionada',
206
+ 'settings.noSessions': 'nenhuma sessão disponível',
207
+ 'settings.noMcp': 'nenhum servidor MCP selecionado',
208
+ 'settings.noOptions': 'nenhuma opção disponível para {label}',
209
+ 'settings.saved': 'salvo nas configurações do DSH',
210
+ 'settings.providerRemoved': 'provedor removido',
211
+ 'settings.conflict': 'configurações alteradas em outro lugar; recarregadas',
212
+ 'settings.error': 'configurações: {error}',
213
+ 'settings.dshSettings': 'Configurações do DSH',
214
+ 'settings.optionList': 'Enter selecionar · Esc voltar',
215
+
216
+ // ---- settings left menu -------------------------------------------------
217
+ 'menu.main': 'Principal',
218
+ 'menu.model': 'Modelo',
219
+ 'menu.update': 'Atualização',
220
+ 'menu.mcp': 'MCP',
221
+
222
+ // ---- settings rows: main tab -------------------------------------------
223
+ 'settings.general': 'Geral',
224
+ 'settings.graphics': 'Gráficos',
225
+ 'settings.sessions': 'Sessões',
226
+ 'settings.system': 'Sistema',
227
+ 'settings.developer': 'Desenvolvedor',
228
+ 'settings.contextDetails': 'Detalhes do contexto',
229
+ 'settings.busyEnter': 'Enter ocupado',
230
+ 'settings.defaultPreset': 'Preset padrão',
231
+ 'settings.permissionPreset': 'Preset de permissões',
232
+ 'settings.permissionDangerConfirm': 'Ativar acesso irrestrito a ferramentas e arquivos?',
233
+ 'settings.graphicsRendering': 'Renderização gráfica',
234
+ 'settings.noProtocolFallback': 'Fallback sem protocolo',
235
+ 'settings.imageHeightCap': 'Altura máx. de imagem (linhas)',
236
+ 'settings.mermaidRendering': 'Renderização de Mermaid',
237
+ 'settings.newSession': 'Nova sessão',
238
+ 'settings.manageSessions': 'Gerenciar sessões',
239
+ 'settings.providerConfig': 'Config. de API do provedor',
240
+ 'settings.updateManager': 'Gerenciador de atualizações',
241
+ 'settings.settingsFile': 'Arquivo de configurações',
242
+ 'settings.language': 'Idioma',
243
+ 'settings.theme': 'Tema',
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': 'Sistema ({language})',
250
+ 'settings.languageSaved': 'idioma: {language}',
251
+
252
+ // ---- model tab ----------------------------------------------------------
253
+ 'model.title': 'Modelo',
254
+ 'model.subtitle': 'Enter define um modelo da lista como padrão',
255
+ 'model.defaultSection': 'Padrão',
256
+ 'model.defaultProvider': 'Provedor padrão',
257
+ 'model.defaultModel': 'Modelo padrão',
258
+ 'model.reasoning': 'Raciocínio',
259
+ 'model.providerUrl': 'URL do provedor',
260
+ 'model.providerApiKey': 'Chave de API do provedor',
261
+ 'model.displayName': 'Nome de exibição',
262
+ 'model.wireProtocol': 'Protocolo de transporte',
263
+ 'model.defaultImageInput': 'Entrada de imagem padrão',
264
+ 'model.models': 'Modelos',
265
+ 'model.fetch': 'buscar…',
266
+ 'model.selectedCount': '{count} selecionados',
267
+ 'model.removeProvider': 'Remover provedor',
268
+ 'model.removeProviderConfirm': 'Remover {name} e sua credencial gerenciada?',
269
+ 'model.noModels': 'nenhum modelo disponível',
270
+ 'model.noModelsReturned': 'o provedor não retornou modelos',
271
+ 'model.fetchUnavailable': 'busca automática indisponível — modelos salvos · Enter alternar',
272
+ 'model.fetchOk': 'buscado automaticamente · Enter alternar · Esc voltar',
273
+ 'model.fetching': 'Buscando modelos…',
274
+ 'model.autoFetching': 'busca automática…',
275
+ 'model.credentialConfigured': 'configurada ({source})',
276
+ 'model.credentialMissing': 'não configurada',
277
+ 'model.defaultTag': 'padrão',
278
+ 'model.providerUnavailable': 'o provedor não está mais disponível',
279
+ 'model.namespaceUnavailable': 'o namespace de configurações do provedor não está disponível',
280
+ 'model.apiKeyEmpty': 'a chave de API não pode ficar vazia',
281
+ 'model.credentialsUnavailable': 'o serviço de credenciais não está disponível',
282
+ 'model.noProviderModels': 'o provedor selecionado não tem modelos disponíveis',
283
+ 'model.addCount.one': '{count} disponível',
284
+ 'model.addCount.other': '{count} disponíveis',
285
+
286
+ // ---- add-provider flow --------------------------------------------------
287
+ 'provider.add': 'Adicionar provedor',
288
+ 'provider.empty': 'nenhum provedor configurado ainda',
289
+ 'provider.pickSubtitle': 'Enter escolher · Esc voltar',
290
+ 'provider.catalog': 'Provedores instalados',
291
+ 'provider.catalogEmpty': 'todos os provedores instalados já estão configurados',
292
+ 'provider.custom': 'API personalizada — declarar um endpoint',
293
+ 'provider.form.catalog': 'Adotar um provedor instalado',
294
+ 'provider.form.custom': 'Declarar um provedor personalizado',
295
+ 'provider.formSubtitle': 'Enter editar · Esc voltar',
296
+ 'provider.field.route': 'ID de rota',
297
+ 'provider.field.addModel': 'Adicionar ID de modelo',
298
+ 'provider.field.save': 'Salvar provedor',
299
+ 'provider.hint.route': 'minúsculas, dígitos e hífens · chave guardada como {ref}',
300
+ 'provider.error.route': 'o ID de rota deve começar com uma letra e usar apenas minúsculas, dígitos e hífens',
301
+ 'provider.error.routeNeeded': 'escolha um provedor',
302
+ 'provider.error.taken': 'já existe um provedor com este ID de rota',
303
+ 'provider.error.baseUrl': 'o endpoint precisa ser uma URL http ou https',
304
+ 'provider.error.baseUrlNeeded': 'um provedor personalizado precisa de um endpoint',
305
+ 'provider.error.apiNeeded': 'escolha o protocolo que este endpoint fala',
306
+ 'provider.error.modelsNeeded': 'um provedor personalizado precisa de pelo menos um modelo',
307
+ 'provider.error.modelId': 'o modelo {index} precisa de um ID',
308
+ 'provider.error.modelDuplicate': 'o modelo "{id}" está listado duas vezes',
309
+ 'provider.added': 'provedor adicionado',
310
+ 'provider.accountManaged': 'conectado com sua conta DeepSeek',
311
+ 'provider.search': 'Buscar',
312
+ 'provider.searchPlaceholder': 'digite para filtrar',
313
+ 'provider.searchEmpty': 'nenhum provedor corresponde a "{query}"',
314
+
315
+ // ---- uma entrada de modelo -----------------------------------------------
316
+ 'model.edit': 'Editar modelo',
317
+ 'model.editHint': 'e editar · Del remover',
318
+ 'model.refresh': 'Atualizar catálogo',
319
+ 'model.selectAll': 'Selecionar tudo',
320
+ 'model.fetchRefused': 'o endpoint não retornou nenhuma lista de modelos',
321
+ 'model.notSaved': 'este modelo ainda não está salvo',
322
+ 'model.removed': 'modelo removido',
323
+ 'model.form.add': 'Adicionar modelo',
324
+ 'model.form.edit': 'Modelo · {id}',
325
+ 'model.form.save': 'Salvar modelo',
326
+ 'model.form.remove': 'Remover do provedor',
327
+ 'model.form.removeConfirm': 'Remover este modelo do provedor?',
328
+ 'model.field.id': 'ID do modelo',
329
+ 'model.field.name': 'Nome exibido',
330
+ 'model.field.contextWindow': 'Janela de contexto',
331
+ 'model.field.maxTokens': 'Tokens de saída máx.',
332
+ 'model.field.input': 'Entrada',
333
+ 'model.error.idNeeded': 'um modelo precisa de um ID',
334
+ 'model.error.idDuplicate': 'o modelo "{id}" já está listado',
335
+ 'model.error.capacity': 'janela de contexto e tokens máximos precisam ser inteiros (256K, 1M)',
336
+
337
+ // ---- MCP tab ------------------------------------------------------------
338
+ 'mcp.title': 'MCP',
339
+ 'mcp.subtitle': 'Enter editar · Del remover · Esc voltar',
340
+ 'mcp.editSubtitle': 'Enter editar · Esc voltar',
341
+ 'mcp.servers': 'Servidores MCP',
342
+ 'mcp.empty': 'Nenhum servidor MCP configurado',
343
+ 'mcp.add': 'Adicionar servidor MCP',
344
+ 'mcp.scope': 'escopo',
345
+ 'mcp.scopeUserPrefix': 'usuário · {path}',
346
+ 'mcp.scopePathPrefix': 'caminho · {path}',
347
+ 'mcp.configFiles': 'Arquivos de configuração',
348
+ 'mcp.userScope': 'usuário (todas as sessões)',
349
+ 'mcp.secrets': 'Segredos',
350
+ 'mcp.secretsPlain': 'texto simples nos arquivos de configuração',
351
+ 'mcp.loaded': 'carregado',
352
+ 'mcp.notCreated': 'ainda não criado',
353
+ 'mcp.type.stdio': 'Comando local',
354
+ 'mcp.type.http': 'HTTP',
355
+ 'mcp.type.sse': 'SSE',
356
+ 'mcp.state.connected': '● conectado',
357
+ 'mcp.state.tools.one': '● {count} ferramenta',
358
+ 'mcp.state.tools.other': '● {count} ferramentas',
359
+ 'mcp.state.pending': '… conectando',
360
+ 'mcp.state.disabled': '○ desativado',
361
+ 'mcp.state.idle': '○ não conectado',
362
+ 'mcp.notice.connected': "MCP {name}: conectado",
363
+ 'mcp.notice.failed': "MCP {name}: falha na conexão",
364
+ 'mcp.form.add': 'Adicionar servidor MCP',
365
+ 'mcp.form.edit': 'Editar servidor MCP · {name}',
366
+ 'mcp.titleAdd': 'MCP · adicionar',
367
+ 'mcp.titleEdit': 'MCP · editar',
368
+ 'mcp.field.name': 'Nome',
369
+ 'mcp.field.type': 'Tipo',
370
+ 'mcp.field.timeout': 'Tempo limite (ms)',
371
+ 'mcp.field.command': 'Comando',
372
+ 'mcp.field.args': 'Argumentos',
373
+ 'mcp.field.env': 'Ambiente (JSON)',
374
+ 'mcp.field.url': 'URL',
375
+ 'mcp.field.headers': 'Cabeçalhos (JSON)',
376
+ 'mcp.field.scope': 'Escopo',
377
+ 'mcp.field.path': 'Caminho',
378
+ 'mcp.field.enabled': 'Ativado',
379
+ 'mcp.field.save': 'Salvar',
380
+ 'mcp.field.remove': 'Remover',
381
+ 'mcp.choice.stdio': 'Comando local (stdio)',
382
+ 'mcp.choice.http': 'HTTP (com streaming)',
383
+ 'mcp.choice.sse': 'SSE (HTTP+SSE legado)',
384
+ 'mcp.choice.scopeUser': 'Usuário — todas as sessões',
385
+ 'mcp.choice.scopePath': 'Caminho — sessões sob um diretório',
386
+ 'mcp.removeConfirm': 'Remover este servidor MCP e desconectá-lo?',
387
+ 'mcp.saved': 'Servidor MCP salvo',
388
+ 'mcp.added': 'Servidor MCP adicionado',
389
+ 'mcp.removed': 'Servidor MCP removido',
390
+ 'mcp.error.name': 'o nome deve ter de 1 a 32 caracteres entre letras, dígitos, "-" ou "_"',
391
+ 'mcp.error.duplicate': 'já existe um servidor MCP chamado "{name}" configurado',
392
+ 'mcp.error.timeout': 'timeoutMs deve ser um número inteiro entre 1 e {max}',
393
+ 'mcp.error.pathNeeded': 'um servidor com escopo de caminho precisa de um diretório',
394
+ 'mcp.error.pathAbsolute': 'o escopo de caminho deve ser um diretório absoluto',
395
+ 'mcp.error.commandNeeded': 'um servidor stdio precisa de um comando',
396
+ 'mcp.error.urlParse': 'não é possível analisar a URL',
397
+ 'mcp.error.urlScheme': 'a URL deve usar http ou https',
398
+ 'mcp.error.pathNotDir': 'o escopo de caminho não é um diretório: {path}',
399
+ 'mcp.error.configIsDir': 'o caminho do arquivo de configuração é um diretório: {path}',
400
+ 'mcp.error.notFound': 'nenhum servidor MCP chamado "{name}" está configurado',
401
+ 'mcp.error.documentGone': 'o documento que define "{name}" sumiu: {error}',
402
+ 'mcp.error.noClient': 'o host não fornece nenhum cliente MCP',
403
+ 'mcp.error.connectTimeout': 'a conexão com {name} expirou',
404
+ 'mcp.error.json': 'o documento não é JSON válido: {error}',
405
+ 'mcp.error.jsonObject': 'o documento deve ser um objeto JSON',
406
+ 'mcp.error.serversObject': '"servers" deve ser um objeto JSON',
407
+ 'mcp.error.argsArray': 'os argumentos devem ser um array JSON de strings',
408
+ 'mcp.error.argsTypes': 'os argumentos devem ser strings ou números',
409
+ 'mcp.error.argsUnclosed': 'os argumentos têm uma aspa não fechada',
410
+ 'mcp.error.envObject': '{label} deve ser um objeto JSON',
411
+ 'mcp.error.envValue': 'o valor "{name}" de {label} deve ser string, número ou booleano',
412
+ 'mcp.error.header': 'cabeçalho HTTP inválido "{name}"',
413
+ 'mcp.error.envName': 'nome de ambiente inválido "{name}"',
414
+
415
+ // ---- rewind -------------------------------------------------------------
416
+ 'rewind.title': 'Retroceder',
417
+ 'rewind.restoreTo': 'Restaurar para o ponto anterior: {label}',
418
+ 'rewind.restorePrompt': 'Restaurar a conversa para o ponto anterior a…',
419
+ 'rewind.empty': 'Nada para retroceder ainda.',
420
+ 'rewind.option.conversation': 'Restaurar conversa',
421
+ 'rewind.option.both': 'Restaurar conversa e arquivos',
422
+ 'rewind.option.code': 'Restaurar arquivos',
423
+ 'rewind.option.cancel': 'Cancelar',
424
+ 'rewind.current': '(atual)',
425
+ 'rewind.noPoints': 'nenhuma mensagem do usuário para retroceder',
426
+ 'rewind.unknownPoint': 'ponto de retrocesso desconhecido "{selector}" — use um número ou last',
427
+ 'rewind.noPoint': 'nenhum ponto de retrocesso {n} — 1..{count}',
428
+ 'rewind.notGit': 'não é um worktree git',
429
+ 'rewind.noBackup': 'nenhum local de backup',
430
+ 'rewind.filesNotRestored': 'arquivos não restaurados',
431
+ 'rewind.filesNotRestoredReason': 'arquivos não restaurados ({reason})',
432
+ 'rewind.restored.one': '{count} arquivo rastreado restaurado de HEAD',
433
+ 'rewind.restored.other': '{count} arquivos rastreados restaurados de HEAD',
434
+ 'rewind.removed.one': '{count} arquivo novo removido',
435
+ 'rewind.removed.other': '{count} arquivos novos removidos',
436
+ 'rewind.skipped': '{count} ignorados',
437
+ 'rewind.previousSaved': 'conteúdo anterior salvo em {path}',
438
+ 'rewind.noChanges': 'nenhuma alteração de arquivo após este ponto',
439
+ 'rewind.image': '[imagem]',
440
+ 'rewind.images': '[{count} imagens]',
441
+ 'rewind.emptyMessage': '(vazio)',
442
+ 'git.title': 'Branches do Git',
443
+ 'git.subtitle': 'Atual: {branch} · {path}',
444
+ 'git.local': 'Branches locais',
445
+ 'git.remote': 'Branches remotas',
446
+ 'git.empty': 'Nenhuma branch neste repositório.',
447
+ 'git.detached': '(destacado)',
448
+ 'git.switched': 'Mudou para a branch {branch}',
449
+ 'git.switchFailed': 'Não é possível mudar para {branch}: {error}',
450
+ 'git.pullDone': 'Atualizações baixadas',
451
+ 'git.pullFailed': 'Não é possível baixar as atualizações: {error}',
452
+ 'git.listFailed': 'Não é possível listar as branches: {error}',
453
+ 'git.notRepo': 'não é uma árvore de trabalho do git',
454
+ 'git.gitMissing': 'git não está disponível no PATH',
455
+ 'git.timedOut': 'git esgotou o tempo limite',
456
+ 'git.onlyTitleScreen': 'A troca de branch só está disponível na página vazia — use /new para sair da sessão',
457
+ 'git.footer': '↑/↓ escolher · Enter trocar · P pull · R atualizar · Esc fechar',
458
+
459
+ // ---- update tab ---------------------------------------------------------
460
+ 'update.title': 'Atualização',
461
+ 'update.checking': 'Verificando versões…',
462
+ 'update.fetching': 'buscando no registro npm…',
463
+ 'update.fetchingVersions': 'Buscando versões…',
464
+ 'update.versionsSubtitle': 'Enter baixar · Esc voltar',
465
+ 'update.installed': 'Instalada',
466
+ 'update.latest': 'Mais recente (tag npm)',
467
+ 'update.status': 'Status',
468
+ 'update.versions': 'Versões',
469
+ 'update.selectVersion': 'Selecionar versão…',
470
+ 'update.restartApply': 'Reiniciar para aplicar {version}',
471
+ 'update.enterRestart': 'Enter reiniciar',
472
+ 'update.discard': 'Descartar {version} baixada',
473
+ 'update.actions': 'Ações',
474
+ 'update.checkNow': 'Verificar agora',
475
+ 'update.checkingShort': 'Verificando…',
476
+ 'update.startupCheck': 'Verificação na inicialização',
477
+ 'update.profile': 'perfil',
478
+ 'update.dshPackage': 'dsh (@deepseek-ai/dsh)',
479
+ 'update.statusCorrupt': 'Instalação danificada — reinstale abaixo',
480
+ 'update.statusError': 'Falha na verificação do registro: {error}',
481
+ 'update.statusAvailable': 'Atualização disponível → {version}',
482
+ 'update.statusUpToDate': 'Atualizado',
483
+ 'update.statusNoStable': 'Nenhuma versão estável — escolha em Versões',
484
+ 'update.notOnPath': 'não encontrado no PATH',
485
+ 'update.subtitleStaged': '{package} {version} baixada — reinicie para aplicar',
486
+ 'update.subtitleIdle': 'Enter selecionar · baixar e reiniciar para aplicar',
487
+ 'update.download': 'Baixar',
488
+ 'update.contacting': 'contatando o registro…',
489
+ 'update.version': 'Versão',
490
+ 'update.savingTo': 'Salvando em',
491
+ 'update.escCancels': 'Esc cancela',
492
+ 'update.restartApplyQ': 'Reiniciar para aplicar {label} {version}? (já baixada)',
493
+ 'update.downloadQ': 'Baixar {label} {version} e reiniciar para aplicar?',
494
+ 'update.localSwitch': ' — muda a instalação local para uma versão do registro',
495
+ 'update.downloaded': 'baixada · reinicie para aplicar',
496
+ 'update.downloadedToast': '{label} {version} baixada · aplique na aba Atualização',
497
+ 'update.downloadedConfirm': 'Baixado reiniciar para aplicar {label} {version}? (y/n)',
498
+ 'update.alreadyDownloadedConfirm': 'Já baixado · reiniciar para aplicar {label} {version}? (y/n)',
499
+ 'update.downloadCancelled': 'download cancelado',
500
+ 'update.downloadFailed': 'falha no download: {error}',
501
+ 'update.stagedGone': 'o download preparado sumiu — escolha a versão de novo',
502
+ 'update.locks.one': 'não é possível aplicar enquanto o dsh roda em {count} outro processo — feche-o e tente de novo',
503
+ 'update.locks.other': 'não é possível aplicar enquanto o dsh roda em {count} outros processos — feche-os e tente de novo',
504
+ 'update.noNpm': 'não é possível aplicar: npm não encontrado',
505
+ 'update.noDshCli': 'não é possível aplicar: a CLI do dsh não foi encontrada',
506
+ 'update.installerFailed': 'não é possível iniciar o instalador — reinicie o dsh para aplicar {label}',
507
+ 'update.applying': 'aplicando {label} · saindo, reiniciando…',
508
+ 'update.stagedDiscarded': 'download preparado descartado',
509
+ 'update.tagCached': 'em cache',
510
+ 'update.tagStaged': 'preparada',
511
+ 'update.installFailed': 'Falha na instalação (código {code}) — tente de novo em Versões',
512
+ 'update.installFailedRetry': 'abra Atualização → dsh-oc-tui → Versões e escolha uma versão para baixar de novo',
513
+ 'update.installUnreadable': 'a instalação informou sucesso, mas a versão instalada é {installed} (esperada {expected}) — reparo: {repair}',
514
+ 'update.registryUnreachable': 'registro inacessível: {error}',
515
+ 'update.notOnRegistry': '{package} não está no registro',
516
+ 'update.registryHttp': 'o registro retornou HTTP {status} para {package}',
517
+ 'update.noTarballUrl': 'a resposta do registro não traz URL de tarball',
518
+ 'update.downloadHttp': 'falha no download: HTTP {status} para {url}',
519
+ 'update.downloadEmpty': 'falha no download: corpo da resposta vazio',
520
+ 'update.integrityFailed': 'falha na verificação de integridade de {file} — download descartado',
521
+ 'update.npmMissing': 'npm não encontrado no PATH',
522
+ 'update.npmViewFailed': 'npm view {package} saiu com {code}',
523
+ 'update.timedOut': '\n(tempo esgotado após {ms}ms)',
524
+ 'update.noOutput': '(sem saída)',
525
+
526
+ // ---- commands -----------------------------------------------------------
527
+ 'command.settings': 'Abrir as páginas de configurações da TUI',
528
+ 'command.help': 'Mostrar a referência de teclas e comandos da TUI',
529
+ 'command.stats': 'Mostrar estatísticas de tokens e cache da sessão',
530
+ 'command.new': 'Iniciar uma nova sessão',
531
+ 'command.resume': 'Retomar uma sessão salva',
532
+ 'command.clear': 'Limpar o transcript',
533
+ 'command.cancel': 'Cancelar o turno em execução',
534
+ 'command.rewind': 'Retroceder a sessão para um ponto anterior',
535
+ 'command.branch': 'Trocar de branch do git na página vazia',
536
+ 'command.quit': 'Sair da TUI',
537
+
538
+ // ---- help overlay -------------------------------------------------------
539
+ 'help.title': 'DeepSeek Harness TUI — ajuda',
540
+ 'help.enter': 'Enter',
541
+ 'help.enterDesc': 'enviar mensagem',
542
+ 'help.ctrlEnter': 'Ctrl+Enter',
543
+ 'help.ctrlEnterDesc': 'inserir quebra de linha',
544
+ 'help.ctrlC': 'Ctrl+C',
545
+ 'help.ctrlCDesc': 'cancelar o turno em execução; pressione de novo para sair',
546
+ 'help.ctrlP': 'Ctrl+P',
547
+ 'help.ctrlPDesc': 'abrir configurações',
548
+ 'help.ctrlE': 'Ctrl+E',
549
+ 'help.ctrlEDesc': 'alternar o controle de raciocínio',
550
+ 'help.tab': 'Tab',
551
+ 'help.tabDesc': 'alternar a intensidade de raciocínio',
552
+ 'help.ctrlN': 'Ctrl+N',
553
+ 'help.ctrlNDesc': 'nova sessão',
554
+ 'help.ctrlG': 'Ctrl+G',
555
+ 'help.ctrlGDesc': 'trocar de branch do git (página vazia)',
556
+ 'help.ctrlD': 'Ctrl+D',
557
+ 'help.ctrlDDesc': 'excluir sessão em Gerenciar sessões (pressione duas vezes)',
558
+ 'help.pg': 'PgUp / PgDn',
559
+ 'help.pgDesc': 'rolar o transcript',
560
+ 'help.shiftArrows': 'Shift+↑/↓',
561
+ 'help.shiftArrowsDesc': 'rolar a barra de status (janelas largas)',
562
+ 'help.upDown': 'Cima / Baixo',
563
+ 'help.upDownDesc': 'cursor para cima/baixo; histórico nas bordas',
564
+ 'help.mouse': 'Arrastar mouse',
565
+ 'help.mouseDesc': 'selecionar texto; clique direito copia',
566
+ 'help.wheel': 'Roda',
567
+ 'help.wheelDesc': 'rolar transcript / configurações',
568
+ 'help.escEsc': 'Esc Esc',
569
+ 'help.escEscDesc': 'seletor de retrocesso',
570
+ 'help.esc': 'Esc',
571
+ 'help.escDesc': 'fechar overlay · cancelar turno · limpar entrada',
572
+ 'help.commands': 'Comandos:',
573
+
574
+ // ---- session manager / toasts ------------------------------------------
575
+ 'session.newTitle': 'Nova sessão',
576
+ 'session.noSaved': 'Nenhuma sessão salva',
577
+ 'session.manageTitle': 'Gerenciar sessões',
578
+ 'session.manageSubtitle': 'Enter abrir · Ctrl+D duas vezes para excluir · Esc voltar',
579
+ 'session.loading': 'Carregando sessões...',
580
+ 'session.deleted': 'sessão {label} excluída',
581
+ 'session.deleteFailed': 'excluir sessão: {error}',
582
+ 'session.deleteNotFound': 'o diretório da sessão salva não foi encontrado',
583
+ 'session.deleteCancelled': 'exclusão cancelada',
584
+ 'session.resumed': 'sessão {id} retomada',
585
+ 'session.started': 'sessão {id} iniciada',
586
+ 'session.openFailed': 'falha ao abrir a sessão: {error}',
587
+ 'session.forkSummary': '{label} de {parent} · {files}',
588
+ 'session.forkDropped': ' · {count} entradas pendentes herdadas descartadas',
589
+ 'session.conversationOnly': 'somente conversa',
590
+ 'session.rewindLabel': 'retrocesso #{n}',
591
+ 'session.files': 'arquivos: {summary}',
592
+ 'session.error': 'erro: {error}',
593
+ 'session.interruptFirst': 'cancele primeiro o turno em execução (/cancel)',
594
+ 'session.interruptFirstEsc': 'cancele primeiro o turno em execução (Esc ou /cancel)',
595
+ 'session.startFirst': 'inicie uma sessão primeiro',
596
+ 'session.noReasoningLevels': 'o modelo atual não expõe níveis de raciocínio',
597
+ 'session.settingsUnavailable': 'configurações indisponíveis',
598
+ 'session.interruptRequested': 'interrupção solicitada',
599
+ 'session.nothingToInterrupt': 'nada para interromper',
600
+ 'session.noSessionRunning': 'nenhuma sessão em execução',
601
+ 'session.promptCleared': 'entrada limpa',
602
+ 'session.exitAgain': 'pressione Ctrl+C de novo para sair',
603
+ 'session.usageResume': 'uso: /resume <sessionId>',
604
+ 'session.currentModel': 'modelo atual: {model}',
605
+ 'session.modelSet': 'modelo definido como {model} (vale para a próxima requisição)',
606
+ 'session.currentProvider': 'provedor atual: {provider}',
607
+ 'session.providerSet': 'provedor definido como {provider} (vale para a próxima requisição)',
608
+ 'session.unknownCommand': 'comando desconhecido /{name} — tente /help',
609
+ 'session.queryMissing': 'a consulta de sessão não está montada neste perfil',
610
+ 'session.listHeader': 'sessões:',
611
+ 'session.noPersisted': 'nenhuma sessão salva',
612
+ 'session.listFailed': 'falha ao listar sessões: {error}',
613
+ 'session.modelNoImages': 'o modelo "{model}" não aceita entrada de imagem',
614
+ 'session.imageAttachFailed': 'falha ao anexar imagem: {error}',
615
+ 'session.attachmentsUnavailable': 'serviço de anexos indisponível; não é possível ler a imagem',
616
+ 'session.copied.one': '{count} linha copiada para a área de transferência',
617
+ 'session.copied.other': '{count} linhas copiadas para a área de transferência',
618
+ 'session.valueRequired': 'um valor é obrigatório',
619
+ 'session.minChars': 'pelo menos {count} caracteres',
620
+ 'session.maxChars': 'no máximo {count} caracteres',
621
+ 'session.answerRequired': 'selecione uma opção ou digite uma resposta',
622
+ 'session.typeAnswer': 'digite uma resposta ou pressione Esc',
623
+ 'session.updatesAvailable': 'Atualizações: {list} — Ctrl+P → Atualização',
624
+ 'session.versionsError': 'versões: {error}',
625
+ 'session.mcpError': 'MCP: {error}',
626
+ 'session.noClipboard': 'nenhum caminho de área de transferência disponível',
627
+ 'session.unsupportedInteraction': 'tipo de interação não suportado: {kind}',
628
+
629
+ // ---- tool activity summaries -------------------------------------------
630
+ 'tool.run': 'executar {command}',
631
+ 'tool.askUser': 'perguntar ao usuário',
632
+ 'tool.askQuestions': 'fazer {count} perguntas',
604
633
 
605
634
  // ---- host diagnostics ----------------------------------------------------
606
635
  'diagnostics.notice': 'Diagnósticos do host registrados em {path}',
607
- }
636
+
637
+ // ---- screenshots --------------------------------------------------------
638
+ "screenshot.shortcut": "Captura de tela",
639
+ "screenshot.directory": "Pasta de capturas",
640
+ "screenshot.saved": "Captura salva",
641
+ "screenshot.failed": "Falha na captura",
642
+ }