@nac3/forge-cli 1.0.76 → 1.0.78

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.
@@ -1,527 +1,531 @@
1
- {
2
- "panel.brand": "Yujin Forge",
3
- "panel.brand.kanji": "侑",
4
- "panel.tagline": "Assistente de desenvolvimento por voz",
5
- "panel.input.placeholder": "Pergunte ao Yujin",
6
- "panel.button.send": "Enviar",
7
- "panel.button.mic": "Falar (manter pressionado)",
8
- "panel.button.mic.recording": "Pressione para parar a gravacao",
9
- "panel.button.tts": "Voz ativada",
10
- "panel.button.keys": "Chaves",
11
- "panel.button.minimise": "Reduzir",
12
- "panel.button.maximise": "Maximizar",
13
- "panel.button.close": "Fechar",
14
- "panel.button.language": "Idioma",
15
- "panel.trace.title": "Registro de acoes",
16
- "panel.trace.count.one": "{n} chamada de ferramenta",
17
- "panel.trace.count.other": "{n} chamadas de ferramentas",
18
- "panel.trace.empty.kanji": "空",
19
- "panel.trace.empty.body": "O Yujin Forge mostra aqui cada ferramenta que invoca para responder a voce: leitura do manifest, busca no SPEC, edicao de componentes, leitura de documentos. Faca uma pergunta que precise consulta-los.",
20
- "panel.trace.badge.tool": "FERRAMENTA",
21
- "panel.trace.badge.voice": "VOZ",
22
- "panel.trace.badge.error": "ERRO",
23
- "panel.stream.empty.kanji": "侑仁",
24
- "panel.stream.empty.body": "Yujin Forge online. Peca mudancas ao projeto.",
25
- "panel.status.no_audio": "Nao foi capturado audio. O microfone provavelmente nao recebeu nada.",
26
- "panel.status.did_not_catch": "Nao entendi. Vamos tentar de novo.",
27
- "panel.status.mic_denied": "Permissao do microfone negada ou indisponivel: {error}",
28
- "panel.status.voice_failed": "A voz falhou: {error}",
29
- "panel.status.voice_reply_failed": "Nao consegui reproduzir a resposta: {error}",
30
- "panel.status.audio_play_error": "Nao consegui reproduzir o audio: {error}",
31
- "panel.status.reading": "Lendo {filename}...",
32
- "panel.status.ingest_failed": "A ingestao falhou: {error}",
33
- "panel.status.read_failed": "Nao consegui ler a especificacao: {error}",
34
- "panel.drop.title": "Solte a especificacao aqui",
35
- "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
- "panel.ingest.spec_attached": "Especificacao anexada: {filename}, {kb} KB",
37
- "panel.ingest.read_label": "Lida.",
38
- "panel.ingest.title_label": "Titulo: {title}",
39
- "panel.ingest.no_title": "(sem titulo)",
40
- "panel.ingest.format_label": "Formato: {format} / {sections} secao(oes) / {kb} KB",
41
- "panel.ingest.first_lines": "Primeiras linhas:",
42
- "panel.ingest.action_done": "Acao {tool} concluida.",
43
- "vault.modal.title": "Credenciais (vault)",
44
- "vault.modal.aria.close": "Fechar modal de credenciais",
45
- "vault.tab.list": "Slots carregados",
46
- "vault.tab.add": "Adicionar",
47
- "vault.list.loading": "Carregando...",
48
- "vault.list.empty": "Voce ainda nao carregou nenhuma chave. Clique em \"Adicionar\" para comecar.",
49
- "vault.add.slot_label": "Nome do slot",
50
- "vault.add.slot_hint": "Letras minusculas, digitos, sublinhado, hifen. Deve comecar com letra.",
51
- "vault.add.value_label": "Valor em texto claro (oculto)",
52
- "vault.add.value_hint": "Aparece uma so vez ao salvar. Depois pode ser substituido mas nao lido.",
53
- "vault.add.button_save": "Salvar",
54
- "vault.add.button_cancel": "Cancelar",
55
- "vault.add.success": "Slot {slot} salvo.",
56
- "vault.add.overwrite": "Slot {slot} sobrescrito.",
57
- "manual.intro": "Yujin Forge -- manual do usuario",
58
- "manual.section.welcome": "Boas-vindas",
59
- "manual.section.install": "Instalacao",
60
- "manual.section.first_run": "Primeira execucao",
61
- "manual.section.voice": "Comandos por voz",
62
- "manual.section.spec_ingest": "Ingestao de especificacoes",
63
- "manual.section.troubleshooting": "Solucao de problemas",
64
- "manual.section.support": "Suporte",
65
- "lang.name.es": "Espanhol",
66
- "lang.name.en": "Ingles",
67
- "lang.name.pt": "Portugues",
68
- "lang.name.fr": "Frances",
69
- "lang.name.ja": "Japones",
70
- "lang.name.zh": "Chines",
71
- "lang.name.hi": "Hindi",
72
- "lang.name.ar": "Arabe",
73
- "lang.name.de": "Alemao",
74
- "lang.name.it": "Italiano",
75
- "recap.fallback_period": ".",
76
- "recap.empty": "Ainda nao ha nada para resumir.",
77
- "error_ui.severity.info": "INFO",
78
- "error_ui.severity.warning": "ATENCAO",
79
- "error_ui.severity.error": "ERRO",
80
- "error_ui.severity.fatal": "FATAL",
81
- "error_ui.label.what": "O que aconteceu",
82
- "error_ui.label.why": "Por que",
83
- "error_ui.label.fix": "Como resolver",
84
- "error_ui.label.cmd": "Comando",
85
- "error_ui.label.docs": "Docs locais",
86
- "error_ui.label.retry": "Tentar novamente em",
87
- "error_ui.copy_btn": "Copiar comando",
88
- "error_ui.unknown.what": "Forge encontrou um erro interno (codigo desconhecido).",
89
- "error_ui.unknown.why": "O codigo {code} nao esta no catalogo. E um bug.",
90
- "error_ui.unknown.fix": "Abra um issue em https://github.com/yujinapp/yujin-forge/issues com o codigo + traceback.",
91
- "error.cap_frontier_exhausted.what": "Cap mensal de tokens do tier frontier esgotado (modelo grande).",
92
- "error.cap_frontier_exhausted.why": "Seu plano {plan} permite ate {cap} tokens/mes em frontier. Voce usou {used}. Reseta no inicio do proximo mes UTC.",
93
- "error.cap_frontier_exhausted.fix": "Mude para BYOK Anthropic direto: ignora o cap mensal do worker. Seu custo passa a ser o que a Anthropic cobra.",
94
- "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
- "error.cap_eco_exhausted.what": "Cap mensal de tokens do tier eco esgotado (modelo pequeno).",
96
- "error.cap_eco_exhausted.why": "Seu plano {plan} permite ate {cap} tokens/mes em eco. Voce usou {used}. Reseta no inicio do proximo mes UTC.",
97
- "error.cap_eco_exhausted.fix": "Mude para BYOK direto ou suba de plano. BYOK ignora o cap do worker.",
98
- "error.cap_eco_exhausted.cmd": "yf brain config --eco-provider google_ai --eco-model gemini-2.5-flash-lite",
99
- "error.tier_not_in_plan.what": "O tier {tier} nao esta habilitado no seu plano.",
100
- "error.tier_not_in_plan.why": "Seu plano {plan} nao inclui o tier {tier}. Provavelmente voce esta em free-public ou sua licenca expirou.",
101
- "error.tier_not_in_plan.fix": "Ative uma licenca paga ou mude para BYOK direto (seu custo, sem cap do worker).",
102
- "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
- "error.response_truncated.what": "A resposta do modelo foi cortada antes de terminar.",
104
- "error.response_truncated.why": "Limite managed_max_tokens_per_turn = {limit} tokens atingido no meio do turno. O modelo parou de gerar.",
105
- "error.response_truncated.fix": "Aumente o limite via yf limits. Aplica ao proximo turno sem reiniciar o chat.",
106
- "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
- "error.response_truncated.banner": "[Resposta truncada por max_tokens={max}. Aumente o limite com: yf limits set managed_max_tokens_per_turn {suggested}]",
108
- "error.modal_trace_stale.what": "O modal de aprovacao expirou ou ficou orfao.",
109
- "error.modal_trace_stale.why": "O trace_id {trace_id} nao tem approval pendente no dispatcher. Possivel race condition entre invoke e estado do panel, ou cancel anterior deixou o trace zumbi.",
110
- "error.modal_trace_stale.fix": "Reinvoque o verb do chat: inicia um novo trace limpo. Se persistir, rode yf doctor para verificar o panel.",
111
- "error.modal_trace_stale.cmd": "yf doctor",
112
- "error.byok_key_missing.what": "API key faltando para o provider {provider}.",
113
- "error.byok_key_missing.why": "Voce configurou {provider} como provider do tier {tier} mas o slot byok_{slot} nao esta no Vault encriptado.",
114
- "error.byok_key_missing.fix": "Configure a key com yf keys set (atomico, mode 0600, nunca logado).",
115
- "error.byok_key_missing.cmd": "yf keys set {slot}",
116
- "error.worker_unreachable.what": "Nao consegui alcancar o worker yujin.app.",
117
- "error.worker_unreachable.why": "Timeout de rede ou worker fora (HTTP {status}). Tentei {attempts} vezes.",
118
- "error.worker_unreachable.fix": "Verifique sua internet. Se estiver OK, mude temporariamente para BYOK direto.",
119
- "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
- "error.vault_decrypt_failed.what": "Nao consegui descriptar uma chave do Vault.",
121
- "error.vault_decrypt_failed.why": "A master key esta incorreta ou o arquivo do Vault esta corrompido. Pode acontecer se voce moveu config entre maquinas sem migrar a master ou por disk error.",
122
- "error.vault_decrypt_failed.fix": "Puxe a copia do server (re-encripta com sua master local) se voce tem server backup ativo.",
123
- "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
- "error.shell_exec_rejected.what": "Voce rejeitou o modal R8 de yujin.shell.exec.",
125
- "error.shell_exec_rejected.why": "O comando {command} foi classificado como {classification}. shell.exec sempre pede aprovacao por seguranca, mesmo sendo read-only.",
126
- "error.shell_exec_rejected.fix": "Se o comando era read-only (yf projects active, git status, ls), use o verb nativo equivalente. Se era necessario e voce rejeitou por erro, reinvoque.",
127
- "error.project_not_registered.what": "Nao ha projeto adopter registrado.",
128
- "error.project_not_registered.why": "O verb invocado requer project root ativo mas ~/.yujin-forge/projects.json nao tem entradas.",
129
- "error.project_not_registered.fix": "Crie um com yujin.project.init ou registre um existente com yf projects add.",
130
- "error.project_not_registered.cmd": "yf projects scan",
131
- "panel.button.agents": "Agentes",
132
- "panel.agents.title": "Agentes",
133
- "panel.agents.subtitle": "Director e sub-agentes registados neste projeto",
134
- "panel.agents.empty.title": "Ainda nao ha agentes",
135
- "panel.agents.empty.body": "Execute `yf agent install --defaults` para registar o Director e os 4 sub-agentes (Analista, Coder, Tester, Scaffolder).",
136
- "panel.agents.legend.eco": "Eco",
137
- "panel.agents.legend.managed": "Managed",
138
- "panel.agents.legend.frontier": "Frontier",
139
- "panel.agents.status.disabled": "Runtime de agentes nao iniciado",
140
- "panel.agents.event.running": "A correr",
141
- "panel.agents.event.idle": "Em espera",
142
- "panel.agents.tick.live": "Ligado",
143
- "panel.agents.tick.lost": "Ligacao perdida",
144
- "workflow.phase.i": "Triagem e intencao",
145
- "workflow.phase.ii": "Clarificacao (funcional + 4 NFR + blocos)",
146
- "workflow.phase.iii": "Especificacoes (RFP + Arch + Design + aprovacoes)",
147
- "workflow.phase.iv": "Bootstrap",
148
- "workflow.phase.v": "Desenvolvimento por blocos",
149
- "workflow.phase.vi": "Deploy + pos-lancamento",
150
- "wizard.title": "Bem-vindo ao Yujin Forge",
151
- "wizard.close": "Fechar",
152
- "wizard.intro": "Para comecar, escolha como o Forge conecta ao seu modelo de IA. Voce pode mudar isso depois em Settings.",
153
- "wizard.back": "Voltar",
154
- "wizard.start": "Comecar",
155
- "wizard.plan.badge": "Recomendado",
156
- "wizard.plan.title": "Plano Claude",
157
- "wizard.plan.desc": "Assinatura mensal Claude. Opcao mais economica para uso continuo. Forge usa sua sessao claude -p.",
158
- "wizard.plan.price": "Taxa fixa mensal (Plano)",
159
- "wizard.plan.step.title": "Conectar seu Plano Claude",
160
- "wizard.plan.step.1": "Abra um novo terminal.",
161
- "wizard.plan.step.2": "Execute o comando claude (sem argumentos) e complete o login no navegador.",
162
- "wizard.plan.step.3": "Volte aqui e clique em Estou logado para verificar.",
163
- "wizard.plan.done": "Estou logado",
164
- "wizard.byok.title": "Sua propria API key (BYOK)",
165
- "wizard.byok.desc": "Sua propria key de qualquer provedor (Anthropic, OpenAI, Google, DeepSeek...). Pague por uso na sua conta.",
166
- "wizard.byok.price": "Pagamento por uso (Console)",
167
- "wizard.byok.step.title": "Escolha seu provedor e cole sua API key",
168
- "wizard.byok.step.intro": "Escolha o provedor no menu e cole sua API key. O Forge a guarda criptografada no Vault local; nunca sai da sua maquina.",
169
- "wizard.byok.test": "Validar e salvar",
170
- "wizard.skip.title": "Ja tenho tudo configurado",
171
- "wizard.skip.desc": "Pular o wizard. Voce pode abri-lo depois em Settings.",
172
- "wizard.done.kanji": "Pronto",
173
- "wizard.done.title": "Pronto",
174
- "wizard.done.msg": "Forge esta configurado. Comece a conversar.",
175
- "pizarron.button.read": "Ler em voz alta",
176
- "pizarron.button.copy": "Copiar",
177
- "pizarron.button.edit": "Editar",
178
- "pizarron.graph.refresh": "Atualizar",
179
- "pizarron.graph.regenerating": "Regenerando...",
180
- "pizarron.graph.detail.hint": "Toque num no para ver o detalhe.",
181
- "pizarron.graph.detail.empty": "Sem detalhe para este no.",
1
+ {
2
+ "panel.brand": "Yujin Forge",
3
+ "panel.brand.kanji": "侑",
4
+ "panel.tagline": "Assistente de desenvolvimento por voz",
5
+ "panel.input.placeholder": "Pergunte ao Yujin",
6
+ "panel.button.send": "Enviar",
7
+ "panel.button.mic": "Falar (manter pressionado)",
8
+ "panel.button.mic.recording": "Pressione para parar a gravacao",
9
+ "panel.button.tts": "Voz ativada",
10
+ "panel.button.keys": "Chaves",
11
+ "panel.button.minimise": "Reduzir",
12
+ "panel.button.maximise": "Maximizar",
13
+ "panel.button.close": "Fechar",
14
+ "panel.button.language": "Idioma",
15
+ "panel.trace.title": "Registro de acoes",
16
+ "panel.trace.count.one": "{n} chamada de ferramenta",
17
+ "panel.trace.count.other": "{n} chamadas de ferramentas",
18
+ "panel.trace.empty.kanji": "空",
19
+ "panel.trace.empty.body": "O Yujin Forge mostra aqui cada ferramenta que invoca para responder a voce: leitura do manifest, busca no SPEC, edicao de componentes, leitura de documentos. Faca uma pergunta que precise consulta-los.",
20
+ "panel.trace.badge.tool": "FERRAMENTA",
21
+ "panel.trace.badge.voice": "VOZ",
22
+ "panel.trace.badge.error": "ERRO",
23
+ "panel.stream.empty.kanji": "侑仁",
24
+ "panel.stream.empty.body": "Yujin Forge online. Peca mudancas ao projeto.",
25
+ "panel.status.no_audio": "Nao foi capturado audio. O microfone provavelmente nao recebeu nada.",
26
+ "panel.status.did_not_catch": "Nao entendi. Vamos tentar de novo.",
27
+ "panel.status.mic_denied": "Permissao do microfone negada ou indisponivel: {error}",
28
+ "panel.status.voice_failed": "A voz falhou: {error}",
29
+ "panel.status.voice_reply_failed": "Nao consegui reproduzir a resposta: {error}",
30
+ "panel.status.audio_play_error": "Nao consegui reproduzir o audio: {error}",
31
+ "panel.status.reading": "Lendo {filename}...",
32
+ "panel.status.ingest_failed": "A ingestao falhou: {error}",
33
+ "panel.status.read_failed": "Nao consegui ler a especificacao: {error}",
34
+ "panel.drop.title": "Solte a especificacao aqui",
35
+ "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
+ "panel.ingest.spec_attached": "Especificacao anexada: {filename}, {kb} KB",
37
+ "panel.ingest.read_label": "Lida.",
38
+ "panel.ingest.title_label": "Titulo: {title}",
39
+ "panel.ingest.no_title": "(sem titulo)",
40
+ "panel.ingest.format_label": "Formato: {format} / {sections} secao(oes) / {kb} KB",
41
+ "panel.ingest.first_lines": "Primeiras linhas:",
42
+ "panel.ingest.action_done": "Acao {tool} concluida.",
43
+ "vault.modal.title": "Credenciais (vault)",
44
+ "vault.modal.aria.close": "Fechar modal de credenciais",
45
+ "vault.tab.list": "Slots carregados",
46
+ "vault.tab.add": "Adicionar",
47
+ "vault.list.loading": "Carregando...",
48
+ "vault.list.empty": "Voce ainda nao carregou nenhuma chave. Clique em \"Adicionar\" para comecar.",
49
+ "vault.add.slot_label": "Nome do slot",
50
+ "vault.add.slot_hint": "Letras minusculas, digitos, sublinhado, hifen. Deve comecar com letra.",
51
+ "vault.add.value_label": "Valor em texto claro (oculto)",
52
+ "vault.add.value_hint": "Aparece uma so vez ao salvar. Depois pode ser substituido mas nao lido.",
53
+ "vault.add.button_save": "Salvar",
54
+ "vault.add.button_cancel": "Cancelar",
55
+ "vault.add.success": "Slot {slot} salvo.",
56
+ "vault.add.overwrite": "Slot {slot} sobrescrito.",
57
+ "manual.intro": "Yujin Forge -- manual do usuario",
58
+ "manual.section.welcome": "Boas-vindas",
59
+ "manual.section.install": "Instalacao",
60
+ "manual.section.first_run": "Primeira execucao",
61
+ "manual.section.voice": "Comandos por voz",
62
+ "manual.section.spec_ingest": "Ingestao de especificacoes",
63
+ "manual.section.troubleshooting": "Solucao de problemas",
64
+ "manual.section.support": "Suporte",
65
+ "lang.name.es": "Espanhol",
66
+ "lang.name.en": "Ingles",
67
+ "lang.name.pt": "Portugues",
68
+ "lang.name.fr": "Frances",
69
+ "lang.name.ja": "Japones",
70
+ "lang.name.zh": "Chines",
71
+ "lang.name.hi": "Hindi",
72
+ "lang.name.ar": "Arabe",
73
+ "lang.name.de": "Alemao",
74
+ "lang.name.it": "Italiano",
75
+ "recap.fallback_period": ".",
76
+ "recap.empty": "Ainda nao ha nada para resumir.",
77
+ "error_ui.severity.info": "INFO",
78
+ "error_ui.severity.warning": "ATENCAO",
79
+ "error_ui.severity.error": "ERRO",
80
+ "error_ui.severity.fatal": "FATAL",
81
+ "error_ui.label.what": "O que aconteceu",
82
+ "error_ui.label.why": "Por que",
83
+ "error_ui.label.fix": "Como resolver",
84
+ "error_ui.label.cmd": "Comando",
85
+ "error_ui.label.docs": "Docs locais",
86
+ "error_ui.label.retry": "Tentar novamente em",
87
+ "error_ui.copy_btn": "Copiar comando",
88
+ "error_ui.unknown.what": "Forge encontrou um erro interno (codigo desconhecido).",
89
+ "error_ui.unknown.why": "O codigo {code} nao esta no catalogo. E um bug.",
90
+ "error_ui.unknown.fix": "Abra um issue em https://github.com/yujinapp/yujin-forge/issues com o codigo + traceback.",
91
+ "error.cap_frontier_exhausted.what": "Cap mensal de tokens do tier frontier esgotado (modelo grande).",
92
+ "error.cap_frontier_exhausted.why": "Seu plano {plan} permite ate {cap} tokens/mes em frontier. Voce usou {used}. Reseta no inicio do proximo mes UTC.",
93
+ "error.cap_frontier_exhausted.fix": "Mude para BYOK Anthropic direto: ignora o cap mensal do worker. Seu custo passa a ser o que a Anthropic cobra.",
94
+ "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
+ "error.cap_eco_exhausted.what": "Cap mensal de tokens do tier eco esgotado (modelo pequeno).",
96
+ "error.cap_eco_exhausted.why": "Seu plano {plan} permite ate {cap} tokens/mes em eco. Voce usou {used}. Reseta no inicio do proximo mes UTC.",
97
+ "error.cap_eco_exhausted.fix": "Mude para BYOK direto ou suba de plano. BYOK ignora o cap do worker.",
98
+ "error.cap_eco_exhausted.cmd": "yf brain config --eco-provider google_ai --eco-model gemini-2.5-flash-lite",
99
+ "error.tier_not_in_plan.what": "O tier {tier} nao esta habilitado no seu plano.",
100
+ "error.tier_not_in_plan.why": "Seu plano {plan} nao inclui o tier {tier}. Provavelmente voce esta em free-public ou sua licenca expirou.",
101
+ "error.tier_not_in_plan.fix": "Ative uma licenca paga ou mude para BYOK direto (seu custo, sem cap do worker).",
102
+ "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
+ "error.response_truncated.what": "A resposta do modelo foi cortada antes de terminar.",
104
+ "error.response_truncated.why": "Limite managed_max_tokens_per_turn = {limit} tokens atingido no meio do turno. O modelo parou de gerar.",
105
+ "error.response_truncated.fix": "Aumente o limite via yf limits. Aplica ao proximo turno sem reiniciar o chat.",
106
+ "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
+ "error.response_truncated.banner": "[Resposta truncada por max_tokens={max}. Aumente o limite com: yf limits set managed_max_tokens_per_turn {suggested}]",
108
+ "error.modal_trace_stale.what": "O modal de aprovacao expirou ou ficou orfao.",
109
+ "error.modal_trace_stale.why": "O trace_id {trace_id} nao tem approval pendente no dispatcher. Possivel race condition entre invoke e estado do panel, ou cancel anterior deixou o trace zumbi.",
110
+ "error.modal_trace_stale.fix": "Reinvoque o verb do chat: inicia um novo trace limpo. Se persistir, rode yf doctor para verificar o panel.",
111
+ "error.modal_trace_stale.cmd": "yf doctor",
112
+ "error.byok_key_missing.what": "API key faltando para o provider {provider}.",
113
+ "error.byok_key_missing.why": "Voce configurou {provider} como provider do tier {tier} mas o slot byok_{slot} nao esta no Vault encriptado.",
114
+ "error.byok_key_missing.fix": "Configure a key com yf keys set (atomico, mode 0600, nunca logado).",
115
+ "error.byok_key_missing.cmd": "yf keys set {slot}",
116
+ "error.worker_unreachable.what": "Nao consegui alcancar o worker yujin.app.",
117
+ "error.worker_unreachable.why": "Timeout de rede ou worker fora (HTTP {status}). Tentei {attempts} vezes.",
118
+ "error.worker_unreachable.fix": "Verifique sua internet. Se estiver OK, mude temporariamente para BYOK direto.",
119
+ "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
+ "error.vault_decrypt_failed.what": "Nao consegui descriptar uma chave do Vault.",
121
+ "error.vault_decrypt_failed.why": "A master key esta incorreta ou o arquivo do Vault esta corrompido. Pode acontecer se voce moveu config entre maquinas sem migrar a master ou por disk error.",
122
+ "error.vault_decrypt_failed.fix": "Puxe a copia do server (re-encripta com sua master local) se voce tem server backup ativo.",
123
+ "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
+ "error.shell_exec_rejected.what": "Voce rejeitou o modal R8 de yujin.shell.exec.",
125
+ "error.shell_exec_rejected.why": "O comando {command} foi classificado como {classification}. shell.exec sempre pede aprovacao por seguranca, mesmo sendo read-only.",
126
+ "error.shell_exec_rejected.fix": "Se o comando era read-only (yf projects active, git status, ls), use o verb nativo equivalente. Se era necessario e voce rejeitou por erro, reinvoque.",
127
+ "error.project_not_registered.what": "Nao ha projeto adopter registrado.",
128
+ "error.project_not_registered.why": "O verb invocado requer project root ativo mas ~/.yujin-forge/projects.json nao tem entradas.",
129
+ "error.project_not_registered.fix": "Crie um com yujin.project.init ou registre um existente com yf projects add.",
130
+ "error.project_not_registered.cmd": "yf projects scan",
131
+ "panel.button.agents": "Agentes",
132
+ "panel.agents.title": "Agentes",
133
+ "panel.agents.subtitle": "Director e sub-agentes registados neste projeto",
134
+ "panel.agents.empty.title": "Ainda nao ha agentes",
135
+ "panel.agents.empty.body": "Execute `yf agent install --defaults` para registar o Director e os 4 sub-agentes (Analista, Coder, Tester, Scaffolder).",
136
+ "panel.agents.legend.eco": "Eco",
137
+ "panel.agents.legend.managed": "Managed",
138
+ "panel.agents.legend.frontier": "Frontier",
139
+ "panel.agents.status.disabled": "Runtime de agentes nao iniciado",
140
+ "panel.agents.event.running": "A correr",
141
+ "panel.agents.event.idle": "Em espera",
142
+ "panel.agents.tick.live": "Ligado",
143
+ "panel.agents.tick.lost": "Ligacao perdida",
144
+ "workflow.phase.i": "Triagem e intencao",
145
+ "workflow.phase.ii": "Clarificacao (funcional + 4 NFR + blocos)",
146
+ "workflow.phase.iii": "Especificacoes (RFP + Arch + Design + aprovacoes)",
147
+ "workflow.phase.iv": "Bootstrap",
148
+ "workflow.phase.v": "Desenvolvimento por blocos",
149
+ "workflow.phase.vi": "Deploy + pos-lancamento",
150
+ "wizard.title": "Bem-vindo ao Yujin Forge",
151
+ "wizard.close": "Fechar",
152
+ "wizard.intro": "Para comecar, escolha como o Forge conecta ao seu modelo de IA. Voce pode mudar isso depois em Settings.",
153
+ "wizard.back": "Voltar",
154
+ "wizard.start": "Comecar",
155
+ "wizard.plan.badge": "Recomendado",
156
+ "wizard.plan.title": "Plano Claude",
157
+ "wizard.plan.desc": "Assinatura mensal Claude. Opcao mais economica para uso continuo. Forge usa sua sessao claude -p.",
158
+ "wizard.plan.price": "Taxa fixa mensal (Plano)",
159
+ "wizard.plan.step.title": "Conectar seu Plano Claude",
160
+ "wizard.plan.step.1": "Abra um novo terminal.",
161
+ "wizard.plan.step.2": "Execute o comando claude (sem argumentos) e complete o login no navegador.",
162
+ "wizard.plan.step.3": "Volte aqui e clique em Estou logado para verificar.",
163
+ "wizard.plan.done": "Estou logado",
164
+ "wizard.byok.title": "Sua propria API key (BYOK)",
165
+ "wizard.byok.desc": "Sua propria key de qualquer provedor (Anthropic, OpenAI, Google, DeepSeek...). Pague por uso na sua conta.",
166
+ "wizard.byok.price": "Pagamento por uso (Console)",
167
+ "wizard.byok.step.title": "Escolha seu provedor e cole sua API key",
168
+ "wizard.byok.step.intro": "Escolha o provedor no menu e cole sua API key. O Forge a guarda criptografada no Vault local; nunca sai da sua maquina.",
169
+ "wizard.byok.test": "Validar e salvar",
170
+ "wizard.skip.title": "Ja tenho tudo configurado",
171
+ "wizard.skip.desc": "Pular o wizard. Voce pode abri-lo depois em Settings.",
172
+ "wizard.done.kanji": "Pronto",
173
+ "wizard.done.title": "Pronto",
174
+ "wizard.done.msg": "Forge esta configurado. Comece a conversar.",
175
+ "pizarron.button.read": "Ler em voz alta",
176
+ "pizarron.button.copy": "Copiar",
177
+ "pizarron.button.edit": "Editar",
178
+ "pizarron.graph.refresh": "Atualizar",
179
+ "pizarron.graph.regenerating": "Regenerando...",
180
+ "pizarron.graph.detail.hint": "Toque num no para ver o detalhe.",
181
+ "pizarron.graph.detail.empty": "Sem detalhe para este no.",
182
182
  "pizarron.graph.detail.weight": "peso",
183
183
  "pizarron.graph.orbit": "Orbita",
184
- "pizarron.graph.orbit.speed": "Velocidade orbital",
185
- "startup.tab.graph": "Grafo visual",
186
- "startup.tab.graphSem": "Grafo semantico",
187
- "startup.tab.pendings": "Pendencias",
188
- "startup.tab.workflow": "Workflow",
189
- "settings.startupTabs": "Abas ao abrir (grafo, pendencias, workflow)",
190
- "graph.term.nodes": "nos",
191
- "graph.term.edges": "arestas",
192
- "coding.read": "Lendo {x}",
193
- "coding.read_bare": "Lendo um arquivo",
194
- "coding.edit": "Editando {x}",
195
- "coding.edit_bare": "Editando um arquivo",
196
- "coding.write": "Escrevendo {x}",
197
- "coding.write_bare": "Escrevendo um arquivo",
198
- "coding.notebook_bare": "Editando notebook",
199
- "coding.bash": "Executando: {x}",
200
- "coding.bash_bare": "Executando um comando",
201
- "coding.grep": "Buscando \"{x}\"",
202
- "coding.grep_bare": "Buscando no codigo",
203
- "coding.glob": "Listando {x}",
204
- "coding.glob_bare": "Listando arquivos",
205
- "coding.web_bare": "Lendo a web",
206
- "coding.websearch": "Buscando na web: {x}",
207
- "coding.websearch_bare": "Buscando na web",
208
- "coding.task": "Subagente: {x}",
209
- "coding.task_bare": "Lancando um subagente",
210
- "coding.todo": "Atualizando sua lista de tarefas",
211
- "coding.verb_bare": "Executando um verbo yujin",
212
- "panel.button.stop": "Parar",
213
- "panel.status.stopping": "Parando...",
214
- "panel.status.noActiveTurn": "Nao havia nenhum turno em andamento.",
215
- "panel.status.interruptFailed": "Nao foi possivel enviar a interrupcao.",
216
- "panel.status.turnInterrupted": "Turno interrompido.",
217
- "panel.label.interrupted": "(interrompido)",
218
- "panel.queue.label": "Na fila",
219
- "panel.queue.remove": "Remover da fila",
220
- "panel.project.switchHint": "Trocar de projeto",
221
- "panel.project.title": "Projetos",
222
- "panel.project.add": "Adicionar projeto...",
223
- "panel.project.addPrompt": "Caminho absoluto do projeto a adicionar:",
224
- "panel.project.switching": "Trocando de projeto...",
225
- "startup.tab.files": "Arquivos",
226
- "panel.project.remove": "Remover da lista",
227
- "panel.project.removeConfirm": "Remover este projeto da lista? (nao apaga os arquivos do disco)",
228
- "panel.project.removed": "Projeto removido da lista",
229
- "panel.files.refresh": "Atualizar",
230
- "panel.files.loading": "Carregando...",
231
- "panel.files.error": "Nao foi possivel ler os arquivos.",
232
- "panel.files.empty": "(sem arquivos)",
233
- "panel.files.truncated": "(lista truncada)",
234
- "panel.files.opened": "Aberto",
235
- "panel.files.openFailed": "Nao foi possivel abrir o arquivo.",
236
- "startup.tab.tasks": "Tarefas",
237
- "settings.bridge.title": "Coordenacao entre instancias",
238
- "settings.bridge.accept": "Aceitar mensagens dirigidas de outras instancias (injetadas como chat)",
239
- "settings.bridge.composePlaceholder": "Mensagem para as outras instancias...",
240
- "settings.voice.title": "Voz",
241
- "settings.voice.mode": "Modo",
242
- "settings.voice.modeMic": "modo mic",
243
- "settings.voice.stt": "STT",
244
- "settings.voice.sttBrowser": "STT navegador",
245
- "settings.voice.ttsEngine": "Motor TTS",
246
- "settings.voice.ttsBrowser": "TTS navegador",
247
- "settings.voice.ttsVoice": "Voz TTS (so Google)",
248
- "settings.vad.title": "VAD (deteccao de silencio)",
249
- "settings.vad.resetDefaults": "Restaurar padroes",
250
- "settings.vad.engine": "Motor",
251
- "settings.vad.engineAmplitude": "Amplitude (RMS)",
252
- "settings.vad.engineBand": "Banda 80-400Hz",
253
- "settings.vad.baselineWindow": "Janela de baseline",
254
- "settings.vad.thresholdMult": "Mult. de limiar (baseline x N)",
255
- "settings.vad.thresholdMin": "Limiar minimo",
256
- "settings.vad.thresholdMax": "Limiar maximo",
257
- "settings.vad.silence": "Silencio para fechar",
258
- "settings.vad.minVoiced": "Voz minima (anti-blip)",
259
- "settings.vad.tick": "Tick do VAD",
260
- "settings.vad.bandLow": "Banda de voz: low (Hz)",
261
- "settings.vad.bandHigh": "Banda de voz: high (Hz)",
262
- "settings.vad.showOverlay": "Mostrar overlay ao vivo",
263
- "settings.vad.logStats": "Registrar stats por sessao",
264
- "settings.brain.anthropicMode": "Anthropic: modalidade",
265
- "settings.brain.modePlan": "Plan (assinatura Claude)",
266
- "settings.brain.modeConsole": "Console (API key)",
267
- "settings.brain.modeNote": "Aplica-se ao reabrir o painel.",
268
- "settings.brain.ecoEnabled": "Modo eco habilitado",
269
- "settings.brain.ecoHint": "desligado = frontier sempre",
270
- "settings.brain.modelEco": "Modelo eco",
271
- "settings.brain.modelFrontier": "Modelo frontier",
272
- "settings.brain.modelMultimodal": "Modelo multimodal",
273
- "settings.brain.multimodalClearTitle": "Remover o brain multimodal dedicado (volta ao roteamento de visao automatico)",
274
- "settings.brain.auto": "Auto",
275
- "settings.brain.multimodalHint": "Brain dedicado para turnos com imagem. Auto = roteamento de visao automatico (o frontier se ve, ou aviso se nao).",
276
- "settings.brain.geminiCache": "Cache explicito do Gemini (CachedContent)",
277
- "settings.brain.geminiCacheHint": "Opt-in. Util em sessoes longas com Gemini Pro; em sessoes curtas o cache implicito gratuito do 2.5 ja basta.",
278
- "settings.federation.title": "Federacao de brain",
279
- "settings.federation.intro": "Use o brain de outro Forge (a key nunca sai da maquina dele) ou empreste o seu. Seu codigo roda local; so a inferencia viaja.",
280
- "settings.federation.connectedTo": "Conectado a",
281
- "settings.federation.disconnect": "Desconectar",
282
- "settings.federation.connectMe": "Conectar-me",
283
- "settings.federation.tokenPlaceholder": "Cole o codigo de federacao",
284
- "settings.federation.connect": "Conectar",
285
- "settings.federation.lendBrain": "Emprestar meu brain",
286
- "settings.federation.generateCode": "Gerar codigo",
287
- "settings.federation.host": "Hospedar (responder aos filhos)",
288
- "settings.federation.fedBrain": "Brain de federacao",
289
- "settings.federation.fedBrainNote": "O que responde aos filhos. API direta (DeepSeek por padrao). Claude Plan nao serve para hospedar; precisa de uma key com saldo.",
290
- "settings.federation.codeOnce": "Codigo (uso unico)",
291
- "settings.federation.copy": "Copiar",
292
- "settings.keys.title": "API keys (BYOK)",
293
- "settings.keys.configure": "Configurar",
294
- "settings.keys.remove": "Remover",
295
- "settings.keys.brainAnthropic": "Brain (Anthropic)",
296
- "settings.keys.brainOpenai": "Brain (OpenAI)",
297
- "settings.keys.brainGoogle": "Brain (Google IA)",
298
- "settings.keys.brainDeepseek": "Brain (DeepSeek)",
299
- "settings.keys.brainXai": "Brain (xAI / Grok)",
300
- "settings.keys.brainMistral": "Brain (Mistral)",
301
- "settings.keys.brainCohere": "Brain (Cohere)",
302
- "settings.keys.sttGoogle": "STT Google",
303
- "settings.keys.ttsGoogle": "TTS Google",
304
- "settings.keys.ttsElevenlabs": "TTS ElevenLabs",
305
- "settings.keys.sttWhisper": "STT Whisper",
306
- "settings.lang.title": "Idioma",
307
- "settings.lang.panelVoice": "Painel + voz",
308
- "settings.lang.changeButton": "Mudar idioma",
309
- "settings.vault.title": "Vault (encriptado)",
310
- "settings.vault.slots": "Slots",
311
- "settings.vault.open": "Abrir vault",
312
- "settings.license.email": "Email",
313
- "settings.license.validated": "Validado",
314
- "settings.license.connectHint": "Conecte sua conta da Polar. Coloque o email com o qual pagou e sincronizamos seu plano automaticamente.",
315
- "settings.license.emailPlaceholder": "email@exemplo.com",
316
- "settings.license.connect": "Conectar",
317
- "settings.license.sync": "Sincronizar com Polar",
318
- "settings.license.buy": "Comprar / ativar plano",
319
- "settings.budget.title": "Orcamento deste mes",
320
- "settings.budget.renews": "Renova",
321
- "settings.budget.tokensEco": "Tokens eco",
322
- "settings.budget.tokensFrontier": "Tokens frontier",
323
- "settings.budget.buyExtension": "Comprar extensao de tokens",
324
- "settings.limits.title": "Limites (avancado)",
325
- "settings.limits.editHint": "Edite qualquer valor + tab/blur salva.",
326
- "settings.limits.reset": "Restaurar padroes",
327
- "settings.bookmarks.title": "Marcadores do Reader",
328
- "settings.graph.title": "Grafo de conhecimento do projeto",
329
- "settings.pair.title": "Vincular telefone",
330
- "settings.pair.hint": "Abra o Forge Mobile, toque em \"Vincular\" e escaneie este QR. Pronto.",
331
- "settings.pair.generateQr": "Gerar QR",
332
- "settings.pair.cantRead": "A camera nao le o QR? Copie este codigo e cole no Forge Mobile:",
333
- "settings.audit.viewFull": "Ver completo",
334
- "settings.audit.close": "Fechar",
335
- "settings.audit.allKinds": "Todos os kinds",
336
- "settings.audit.allModes": "Todos os modes",
337
- "settings.audit.copyJson": "Copiar JSON",
338
- "settings.audit.closeDetail": "Fechar detalhe",
339
- "settings.about.title": "Sobre",
340
- "settings.danger.title": "Zona de perigo",
341
- "settings.danger.warning": "Quando ON, o Yujin executa TODA acao sem pedir confirmacao (inclui shell.exec, rm, git push --force, etc). Velocidade sobre seguranca. Tudo fica registrado no audit log.",
342
- "settings.keyEditor.placeholder": "Cole aqui sua API key",
343
- "settings.license.title": "Licença",
344
- "settings.plan": "Plano",
345
- "settings.audit.title": "Registro de auditoria",
346
- "settings.legal.title": "Legal",
347
- "panel.status.projectSwitchFail": "Nao foi possivel trocar de projeto.",
348
- "panel.status.projectRemoveFail": "Nao foi possivel remover o projeto.",
349
- "panel.status.projectAddFail": "Nao foi possivel adicionar o projeto.",
350
- "panel.status.cancelFail": "Nao foi possivel cancelar: {reason}",
351
- "panel.status.cancelNetError": "Erro de rede ao cancelar o shell.",
352
- "panel.status.notEditable": "Este tipo de conteudo nao e editavel.",
353
- "panel.status.savedAsPicker": "Salvo como: {name} (no caminho que voce escolheu na caixa de dialogo).",
354
- "panel.status.saveAsFail": "Erro em Salvar como: {error} -- usando fallback.",
355
- "panel.status.saveFail": "Erro ao salvar: {error}",
356
- "panel.status.savedAs": "Salvo como: {path} ({bytes} bytes)",
357
- "panel.status.netError": "Erro de rede: {error}",
358
- "panel.status.savedTabOnly": "Alteracoes salvas na aba (nao no disco -- sem file_path).",
359
- "panel.status.saved": "Salvo: {path} ({bytes} bytes)",
360
- "panel.status.copied": "Copiado para a area de transferencia.",
361
- "panel.status.copyFail": "Nao foi possivel copiar.",
362
- "panel.status.modeAvailable": "Modos disponiveis: didactico, tecnico. Uso: /modo tecnico",
363
- "panel.status.modeChangeFail": "Nao consegui mudar o modo: {error}",
364
- "panel.status.modeChanged": "Modo alterado para {target}. O proximo turno ja usa este modo.",
365
- "panel.status.genericError": "Erro: {error}",
366
- "panel.status.brainTierAuto": "Brain tier voltou para auto (o router decide por verbo / fase).",
367
- "panel.status.brainTierForced": "Brain tier forcado para \"{target}\" nesta sessao. /auto volta ao router.",
368
- "panel.confirm.tabUnsaved": "A aba \"{title}\" tem alteracoes nao salvas. Fechar mesmo assim?",
369
- "panel.confirm.tabsUnsaved": "Ha abas com alteracoes nao salvas. Fechar tudo mesmo assim?",
370
- "panel.confirm.discardChanges": "Descartar as alteracoes nao salvas?",
371
- "panel.confirm.removeSlot": "Remover o slot \"{slot}\"? Isto nao pode ser desfeito.",
372
- "panel.confirm.removeKey": "Remover a key de {slot}?",
373
- "panel.prompt.saveAs": "Salvar como (caminho relativo ao projeto):",
374
- "panel.voice.sttFallback": "STT do navegador indisponivel; usando fallback do servidor.",
375
- "panel.voice.noMicSupport": "Seu navegador nao suporta acesso ao microfone.",
376
- "panel.voice.recordingCountdown": "Gravando... parada automatica em {n}s",
377
- "panel.voice.autoStopped": "Gravacao parada automaticamente aos 55s (limite de 1 min do Google STT). Tente algo mais curto.",
378
- "panel.voice.noAudio": "Nenhum audio capturado. Tente novamente.",
379
- "panel.voice.audioTooLong": "Audio muito longo (>1 min). Limite sincrono do Google STT. Tente algo mais curto.",
380
- "panel.voice.ttsUnavailable": "TTS do navegador indisponivel; volte para o Google nas configuracoes.",
381
- "panel.voice.micClosedHalfDuplex": "Mic fechado enquanto Yujin fala (half-duplex).",
382
- "panel.voice.micBlocked": "Microfone bloqueado. Permita o microfone para este app nas configuracoes do navegador e tente novamente.",
383
- "panel.voice.noMicDevice": "Nenhum microfone detectado neste dispositivo.",
384
- "panel.voice.micOpenFail": "Nao consegui abrir o microfone: {error}",
385
- "panel.voice.micOpenListening": "Mic aberto, ouvindo...",
386
- "panel.voice.listening": "Estou ouvindo...",
387
- "panel.voice.listeningInterim": "Estou ouvindo... {text}",
388
- "panel.voice.micBlockedBrowser": "Microfone bloqueado pelo navegador. Clique no icone de cadeado na barra de URL e permita o microfone, depois recarregue a pagina. Ou mude o STT para \"google\" / \"whisper\" nas configuracoes se tiver a API key.",
389
- "panel.voice.noMicPhysical": "Nenhum microfone fisico detectado. Conecte um ou mude o STT para \"google\" / \"whisper\" nas configuracoes.",
390
- "panel.voice.networkRequired": "Web Speech requer conexao com a internet (o Chrome usa o Google por tras). Tente sem conexao intermitente ou mude o STT para \"whisper\" se tiver a API key.",
391
- "panel.voice.langNotSupported": "Seu navegador nao suporta este idioma para STT. Mude o idioma do painel para um suportado (en, es, pt) ou mude o STT para \"google\" / \"whisper\".",
392
- "panel.voice.micError": "Erro de mic: {error}",
393
- "panel.voice.noAudioToRecognizer": "Nenhum audio chegou ao reconhecedor: o ditado do navegador nao esta capturando neste app.",
394
- "panel.voice.micOpenNoVoice": "Mic aberto mas nenhuma voz detectada. Aproxime-se do microfone e fale mais alto; se continuar, o ditado gratis nao funciona nesta PWA.",
395
- "panel.voice.voiceNoText": "Voz detectada mas o navegador nao retornou texto (STT gratis indisponivel nesta PWA).",
396
- "panel.voice.startingDictation": "Iniciando ditado...",
397
- "panel.voice.couldNotStartMic": "Nao consegui iniciar o mic: {error}",
398
- "panel.status.imageTooLarge": "Imagem muito grande (>6MB): {name}",
399
- "panel.status.imageReady": "Imagem pronta para enviar: {name}",
400
- "panel.status.imageReadFail": "Nao consegui ler a imagem: {error}",
401
- "panel.tip.attachFile": "Anexar arquivo",
402
- "panel.tip.refreshDiscovery": "Atualizar discovery",
403
- "panel.tip.refreshNow": "Atualizar agora",
404
- "panel.tip.filterByProject": "Filtrar por projeto",
405
- "panel.tip.concurrentRuns": "Execucoes concorrentes: limites global / por projeto",
406
- "panel.tip.mcpBridges": "MCP Bridges (F101)",
407
- "panel.tip.activity": "Atividade de agentes + inspetor de bridge + chat por agente",
408
- "panel.tip.settings": "Ajustes (modo voz, STT, TTS, chaves, idioma)",
409
- "panel.tip.zoomOut": "Reduzir zoom (Ctrl -)",
410
- "panel.tip.zoomReset": "Redefinir zoom (Ctrl 0)",
411
- "panel.tip.zoomIn": "Aumentar zoom (Ctrl +)",
412
- "panel.tip.maximize": "Maximizar / restaurar (tela cheia)",
413
- "panel.tip.closeBoard": "Fechar todo o quadro",
414
- "panel.tip.openInEditor": "Abrir no meu editor",
415
- "panel.tip.open": "Abrir",
416
- "panel.tip.saveAs": "Salvar como -- escolha um novo caminho (relativo ao projeto)",
417
- "panel.tip.codeModeDetail": "Detalhado: arquivos, diffs e comandos ao vivo",
418
- "panel.tip.codeModeZen": "Sumi-e: arte com texto ocasional",
419
- "panel.tip.cancelShell": "Cancelar comando shell",
420
- "panel.tip.closeTab": "Fechar aba",
421
- "panel.tip.reopenNativeTabs": "Reabrir abas nativas fechadas",
422
- "panel.tip.notTestedYet": "ainda nao testado",
423
- "panel.aria.activity": "Atividade",
424
- "panel.aria.settings": "Ajustes",
425
- "panel.aria.zoomOut": "Reduzir zoom",
426
- "panel.aria.zoomIn": "Aumentar zoom",
427
- "panel.aria.maximize": "Maximizar",
428
- "panel.aria.closeBoard": "fechar tudo",
429
- "panel.aria.thinking": "pensando",
430
- "panel.hint.boardEmpty": "O conteudo estruturado aparece aqui: codigo, tabelas, documentos. Peca ao Yujin para escrever ou editar algo.",
431
- "panel.hint.planMode": "Voce esta no modo Plan (assinatura). O quadro e desenhado quando o brain roda em modo API: altere em <strong>Ajustes &gt; Brain &gt; Anthropic: modalidade &gt; Console</strong> e reabra o painel.",
432
- "panel.hint.bookmarksEmpty": "Sem bookmarks. Peca ao Yujin \"marque este ponto como ...\" ao ler um doc.",
433
- "panel.voice.replyFailed": "Falha na resposta de voz: {err}",
434
- "panel.voice.replyError": "Erro na resposta de voz: {err}",
435
- "panel.status.languageSwitchFailed": "Falha ao trocar de idioma: {err}",
436
- "panel.status.languageListFailed": "Nao foi possivel carregar a lista de idiomas",
437
- "panel.legal.loading": "Carregando...",
438
- "panel.legal.loadError": "Erro {status} ao carregar o documento.",
439
- "panel.legal.networkError": "Erro de rede: {err}",
440
- "panel.legal.defaultTitle": "Legal",
441
- "panel.feedback.copied": "Copiado",
442
- "panel.feedback.copyFailed": "Falha ao copiar",
443
- "panel.feedback.clipboardUnavailable": "Area de transferencia indisponivel",
444
- "panel.feedback.saving": "Salvando...",
445
- "panel.feedback.saved": "Salvo.",
446
- "panel.feedback.saveError": "erro ao salvar",
447
- "panel.feedback.netError": "erro de rede",
448
- "panel.feedback.netErrorSaving": "erro de rede ao salvar",
449
- "panel.feedback.errorPrefix": "Erro: {detail}",
450
- "panel.pair.generating": "Gerando...",
451
- "panel.pair.generateQr": "Gerar QR",
452
- "panel.pair.copy": "Copiar",
453
- "panel.pair.expiry": "Expira em ~{mins} min. Gere novamente se caducar.",
454
- "panel.pair.qrNetError": "Erro de rede ao gerar o QR.",
455
- "panel.audit.copyJson": "Copiar JSON",
456
- "panel.limits.resetApplied": "Reset para padroes aplicado",
457
- "panel.nac3.effects": "Efeitos: {list}",
458
- "panel.nac3.effectsUnknown": "desconhecidos",
459
- "panel.nac3.cancel": "Cancelar",
460
- "panel.nac3.reject": "Rejeitar",
461
- "panel.nac3.approve": "Aprovar",
462
- "panel.nac3.approveDestructive": "Aprovar (destrutivo)",
463
- "panel.nac3.executing": "Executando...",
464
- "panel.tts.providerBrowser": "TTS navegador",
465
- "panel.tts.providerGoogle": "TTS Google",
466
- "panel.tts.providerTitle": "Clique para alternar entre navegador (SpeechSynthesis nativo, vozes do SO) e Google Cloud TTS (server-side).",
467
- "panel.stt.providerBrowser": "STT navegador",
468
- "panel.stt.providerGoogle": "STT Google",
469
- "panel.stt.providerWhisper": "STT Whisper",
470
- "panel.stt.providerTitle": "Clique para alternar entre navegador (rapido + es-AR nativo + gratis), Google Cloud STT (server-side, BYOK) ou Whisper (server-side, BYOK).",
471
- "panel.tts.voiceTitle": "Voz atual: {id} / {persona} ({gender}) -- {style}. Clique para ciclar. Studio = articula s claro; Neural2 = espanhol natural (aspira s finais).",
472
- "panel.license.lendNeedsLicense": "ative sua licenca para emprestar seu brain",
473
- "panel.license.emailInvalid": "Insira um email valido (com @).",
474
- "panel.license.connecting": "Conectando...",
475
- "panel.license.savingEmail": "Salvando email + sincronizando com Polar...",
476
- "panel.license.syncFailedRetry": "Email salvo, mas o sync falhou: {err}{http}. Se voce acabou de pagar, espere 1-2 min e clique em \"Sincronizar com Polar\".",
477
- "panel.license.planOk": "OK -- plano: {plan}.",
478
- "panel.license.netError": "Erro de rede: {err}",
479
- "panel.license.syncing": "Sincronizando...",
480
- "panel.license.querying": "Consultando servidor...",
481
- "panel.license.syncError": "Erro de sync: {err}{http}",
482
- "panel.license.planUnchanged": "Plano sem alteracoes: {plan}",
483
- "panel.license.planUpdated": "Plano atualizado: {before} -> {after}",
484
- "panel.license.syncWithPolar": "Sincronizar com Polar",
485
- "panel.license.errorWithCode": "erro: {code}",
486
- "panel.keyEditor.keyTooShort": "Key muito curta (min 8 chars).",
487
- "panel.bridge.coordUnavailable": "Coordenacao indisponivel.",
488
- "panel.bridge.statusUnavailable": "indisponivel",
489
- "panel.mcp.loadingBridges": "Carregando bridges...",
490
- "panel.tools.loading": "Carregando tools...",
491
- "panel.agentsChat.backPairs": "< Pares",
492
- "panel.agentsChat.noMessages": "Sem mensagens neste par.",
493
- "panel.agentsChat.noAgents": "sem agentes",
494
- "panel.agentsChat.pickAgent": "Escolha um agente + digite texto antes de enviar.",
495
- "panel.agentsChat.sending": "Enviando...",
496
- "panel.agentsChat.errorGeneric": "Erro: {err}",
497
- "panel.whatsNew.dismiss": "Fechar",
498
- "panel.alert.noEditor": "Nenhum editor no PATH. Copie o caminho: {path}",
499
- "panel.alert.pathRelative": "O caminho deve ser relativo ao projeto (sem \"/\" inicial nem \"..\").",
500
- "panel.tip.saveTo": "Salvar em {path}",
501
- "panel.tip.saveToMemory": "(memoria)",
502
- "panel.button.saveAs": "Salvar como...",
503
- "panel.aria.concurrentRuns": "Execucoes concorrentes",
504
- "panel.activity.allProjects": "Todos os projetos",
505
- "panel.activity.loadingFeed": "Carregando feed...",
506
- "panel.feedback.savedShort": "salvo",
507
- "panel.pair.qrFailed": "Nao foi possivel gerar o QR.",
508
- "panel.brain.modePlan": "Plan (assinatura)",
509
- "panel.brain.modeConsole": "Console (API key)",
510
- "panel.brain.applying": "aplicando {mode}...",
511
- "panel.brain.applied": "{mode} aplicado. O proximo turno ja usa este modo.",
512
- "panel.brain.reopenHint": "Aplica-se ao reabrir o painel.",
513
- "panel.brain.active": "{mode} ativo",
514
- "panel.bridge.roleHost": "host",
515
- "panel.bridge.roleClient": "cliente",
516
- "panel.bridge.instanceOne": "instancia",
517
- "panel.bridge.instanceMany": "instancias",
518
- "panel.bridge.you": "voce",
519
- "panel.tip.deleteTask": "Excluir tarefa",
520
- "panel.tasks.cmdPlaceholder": "comando (ex: pnpm install)...",
521
- "panel.readAloud.code": "Codigo",
522
- "panel.readAloud.codeLang": "Codigo em {lang}",
523
- "panel.readAloud.file": "Arquivo {file}",
524
- "panel.readAloud.content": "Conteudo: {content}",
525
- "panel.pizarron.tabOne": "aba",
526
- "panel.pizarron.tabMany": "abas"
527
- }
184
+ "pizarron.graph.orbit.speed": "Velocidade orbital",
185
+ "startup.tab.graph": "Grafo visual",
186
+ "startup.tab.graphSem": "Grafo semantico",
187
+ "startup.tab.pendings": "Pendencias",
188
+ "startup.tab.workflow": "Workflow",
189
+ "settings.startupTabs": "Abas ao abrir (grafo, pendencias, workflow)",
190
+ "graph.term.nodes": "nos",
191
+ "graph.term.edges": "arestas",
192
+ "coding.read": "Lendo {x}",
193
+ "coding.read_bare": "Lendo um arquivo",
194
+ "coding.edit": "Editando {x}",
195
+ "coding.edit_bare": "Editando um arquivo",
196
+ "coding.write": "Escrevendo {x}",
197
+ "coding.write_bare": "Escrevendo um arquivo",
198
+ "coding.notebook_bare": "Editando notebook",
199
+ "coding.bash": "Executando: {x}",
200
+ "coding.bash_bare": "Executando um comando",
201
+ "coding.grep": "Buscando \"{x}\"",
202
+ "coding.grep_bare": "Buscando no codigo",
203
+ "coding.glob": "Listando {x}",
204
+ "coding.glob_bare": "Listando arquivos",
205
+ "coding.web_bare": "Lendo a web",
206
+ "coding.websearch": "Buscando na web: {x}",
207
+ "coding.websearch_bare": "Buscando na web",
208
+ "coding.task": "Subagente: {x}",
209
+ "coding.task_bare": "Lancando um subagente",
210
+ "coding.todo": "Atualizando sua lista de tarefas",
211
+ "coding.verb_bare": "Executando um verbo yujin",
212
+ "panel.button.stop": "Parar",
213
+ "panel.status.stopping": "Parando...",
214
+ "panel.status.noActiveTurn": "Nao havia nenhum turno em andamento.",
215
+ "panel.status.interruptFailed": "Nao foi possivel enviar a interrupcao.",
216
+ "panel.status.turnInterrupted": "Turno interrompido.",
217
+ "panel.label.interrupted": "(interrompido)",
218
+ "panel.queue.label": "Na fila",
219
+ "panel.queue.remove": "Remover da fila",
220
+ "panel.project.switchHint": "Trocar de projeto",
221
+ "panel.project.title": "Projetos",
222
+ "panel.project.add": "Adicionar projeto...",
223
+ "panel.project.addPrompt": "Caminho absoluto do projeto a adicionar:",
224
+ "panel.project.switching": "Trocando de projeto...",
225
+ "startup.tab.files": "Arquivos",
226
+ "panel.project.remove": "Remover da lista",
227
+ "panel.project.removeConfirm": "Remover este projeto da lista? (nao apaga os arquivos do disco)",
228
+ "panel.project.removed": "Projeto removido da lista",
229
+ "panel.files.refresh": "Atualizar",
230
+ "panel.files.loading": "Carregando...",
231
+ "panel.files.error": "Nao foi possivel ler os arquivos.",
232
+ "panel.files.empty": "(sem arquivos)",
233
+ "panel.files.truncated": "(lista truncada)",
234
+ "panel.files.opened": "Aberto",
235
+ "panel.files.openFailed": "Nao foi possivel abrir o arquivo.",
236
+ "panel.files.searchName": "Filtrar por nome",
237
+ "panel.files.searchType": "Tipo (ex: ts, png)",
238
+ "panel.files.matches": "{n} correspondencias",
239
+ "panel.files.noMatches": "Sem correspondencias",
240
+ "startup.tab.tasks": "Tarefas",
241
+ "settings.bridge.title": "Coordenacao entre instancias",
242
+ "settings.bridge.accept": "Aceitar mensagens dirigidas de outras instancias (injetadas como chat)",
243
+ "settings.bridge.composePlaceholder": "Mensagem para as outras instancias...",
244
+ "settings.voice.title": "Voz",
245
+ "settings.voice.mode": "Modo",
246
+ "settings.voice.modeMic": "modo mic",
247
+ "settings.voice.stt": "STT",
248
+ "settings.voice.sttBrowser": "STT navegador",
249
+ "settings.voice.ttsEngine": "Motor TTS",
250
+ "settings.voice.ttsBrowser": "TTS navegador",
251
+ "settings.voice.ttsVoice": "Voz TTS (so Google)",
252
+ "settings.vad.title": "VAD (deteccao de silencio)",
253
+ "settings.vad.resetDefaults": "Restaurar padroes",
254
+ "settings.vad.engine": "Motor",
255
+ "settings.vad.engineAmplitude": "Amplitude (RMS)",
256
+ "settings.vad.engineBand": "Banda 80-400Hz",
257
+ "settings.vad.baselineWindow": "Janela de baseline",
258
+ "settings.vad.thresholdMult": "Mult. de limiar (baseline x N)",
259
+ "settings.vad.thresholdMin": "Limiar minimo",
260
+ "settings.vad.thresholdMax": "Limiar maximo",
261
+ "settings.vad.silence": "Silencio para fechar",
262
+ "settings.vad.minVoiced": "Voz minima (anti-blip)",
263
+ "settings.vad.tick": "Tick do VAD",
264
+ "settings.vad.bandLow": "Banda de voz: low (Hz)",
265
+ "settings.vad.bandHigh": "Banda de voz: high (Hz)",
266
+ "settings.vad.showOverlay": "Mostrar overlay ao vivo",
267
+ "settings.vad.logStats": "Registrar stats por sessao",
268
+ "settings.brain.anthropicMode": "Anthropic: modalidade",
269
+ "settings.brain.modePlan": "Plan (assinatura Claude)",
270
+ "settings.brain.modeConsole": "Console (API key)",
271
+ "settings.brain.modeNote": "Aplica-se ao reabrir o painel.",
272
+ "settings.brain.ecoEnabled": "Modo eco habilitado",
273
+ "settings.brain.ecoHint": "desligado = frontier sempre",
274
+ "settings.brain.modelEco": "Modelo eco",
275
+ "settings.brain.modelFrontier": "Modelo frontier",
276
+ "settings.brain.modelMultimodal": "Modelo multimodal",
277
+ "settings.brain.multimodalClearTitle": "Remover o brain multimodal dedicado (volta ao roteamento de visao automatico)",
278
+ "settings.brain.auto": "Auto",
279
+ "settings.brain.multimodalHint": "Brain dedicado para turnos com imagem. Auto = roteamento de visao automatico (o frontier se ve, ou aviso se nao).",
280
+ "settings.brain.geminiCache": "Cache explicito do Gemini (CachedContent)",
281
+ "settings.brain.geminiCacheHint": "Opt-in. Util em sessoes longas com Gemini Pro; em sessoes curtas o cache implicito gratuito do 2.5 ja basta.",
282
+ "settings.federation.title": "Federacao de brain",
283
+ "settings.federation.intro": "Use o brain de outro Forge (a key nunca sai da maquina dele) ou empreste o seu. Seu codigo roda local; so a inferencia viaja.",
284
+ "settings.federation.connectedTo": "Conectado a",
285
+ "settings.federation.disconnect": "Desconectar",
286
+ "settings.federation.connectMe": "Conectar-me",
287
+ "settings.federation.tokenPlaceholder": "Cole o codigo de federacao",
288
+ "settings.federation.connect": "Conectar",
289
+ "settings.federation.lendBrain": "Emprestar meu brain",
290
+ "settings.federation.generateCode": "Gerar codigo",
291
+ "settings.federation.host": "Hospedar (responder aos filhos)",
292
+ "settings.federation.fedBrain": "Brain de federacao",
293
+ "settings.federation.fedBrainNote": "O que responde aos filhos. API direta (DeepSeek por padrao). Claude Plan nao serve para hospedar; precisa de uma key com saldo.",
294
+ "settings.federation.codeOnce": "Codigo (uso unico)",
295
+ "settings.federation.copy": "Copiar",
296
+ "settings.keys.title": "API keys (BYOK)",
297
+ "settings.keys.configure": "Configurar",
298
+ "settings.keys.remove": "Remover",
299
+ "settings.keys.brainAnthropic": "Brain (Anthropic)",
300
+ "settings.keys.brainOpenai": "Brain (OpenAI)",
301
+ "settings.keys.brainGoogle": "Brain (Google IA)",
302
+ "settings.keys.brainDeepseek": "Brain (DeepSeek)",
303
+ "settings.keys.brainXai": "Brain (xAI / Grok)",
304
+ "settings.keys.brainMistral": "Brain (Mistral)",
305
+ "settings.keys.brainCohere": "Brain (Cohere)",
306
+ "settings.keys.sttGoogle": "STT Google",
307
+ "settings.keys.ttsGoogle": "TTS Google",
308
+ "settings.keys.ttsElevenlabs": "TTS ElevenLabs",
309
+ "settings.keys.sttWhisper": "STT Whisper",
310
+ "settings.lang.title": "Idioma",
311
+ "settings.lang.panelVoice": "Painel + voz",
312
+ "settings.lang.changeButton": "Mudar idioma",
313
+ "settings.vault.title": "Vault (encriptado)",
314
+ "settings.vault.slots": "Slots",
315
+ "settings.vault.open": "Abrir vault",
316
+ "settings.license.email": "Email",
317
+ "settings.license.validated": "Validado",
318
+ "settings.license.connectHint": "Conecte sua conta da Polar. Coloque o email com o qual pagou e sincronizamos seu plano automaticamente.",
319
+ "settings.license.emailPlaceholder": "email@exemplo.com",
320
+ "settings.license.connect": "Conectar",
321
+ "settings.license.sync": "Sincronizar com Polar",
322
+ "settings.license.buy": "Comprar / ativar plano",
323
+ "settings.budget.title": "Orcamento deste mes",
324
+ "settings.budget.renews": "Renova",
325
+ "settings.budget.tokensEco": "Tokens eco",
326
+ "settings.budget.tokensFrontier": "Tokens frontier",
327
+ "settings.budget.buyExtension": "Comprar extensao de tokens",
328
+ "settings.limits.title": "Limites (avancado)",
329
+ "settings.limits.editHint": "Edite qualquer valor + tab/blur salva.",
330
+ "settings.limits.reset": "Restaurar padroes",
331
+ "settings.bookmarks.title": "Marcadores do Reader",
332
+ "settings.graph.title": "Grafo de conhecimento do projeto",
333
+ "settings.pair.title": "Vincular telefone",
334
+ "settings.pair.hint": "Abra o Forge Mobile, toque em \"Vincular\" e escaneie este QR. Pronto.",
335
+ "settings.pair.generateQr": "Gerar QR",
336
+ "settings.pair.cantRead": "A camera nao le o QR? Copie este codigo e cole no Forge Mobile:",
337
+ "settings.audit.viewFull": "Ver completo",
338
+ "settings.audit.close": "Fechar",
339
+ "settings.audit.allKinds": "Todos os kinds",
340
+ "settings.audit.allModes": "Todos os modes",
341
+ "settings.audit.copyJson": "Copiar JSON",
342
+ "settings.audit.closeDetail": "Fechar detalhe",
343
+ "settings.about.title": "Sobre",
344
+ "settings.danger.title": "Zona de perigo",
345
+ "settings.danger.warning": "Quando ON, o Yujin executa TODA acao sem pedir confirmacao (inclui shell.exec, rm, git push --force, etc). Velocidade sobre seguranca. Tudo fica registrado no audit log.",
346
+ "settings.keyEditor.placeholder": "Cole aqui sua API key",
347
+ "settings.license.title": "Licença",
348
+ "settings.plan": "Plano",
349
+ "settings.audit.title": "Registro de auditoria",
350
+ "settings.legal.title": "Legal",
351
+ "panel.status.projectSwitchFail": "Nao foi possivel trocar de projeto.",
352
+ "panel.status.projectRemoveFail": "Nao foi possivel remover o projeto.",
353
+ "panel.status.projectAddFail": "Nao foi possivel adicionar o projeto.",
354
+ "panel.status.cancelFail": "Nao foi possivel cancelar: {reason}",
355
+ "panel.status.cancelNetError": "Erro de rede ao cancelar o shell.",
356
+ "panel.status.notEditable": "Este tipo de conteudo nao e editavel.",
357
+ "panel.status.savedAsPicker": "Salvo como: {name} (no caminho que voce escolheu na caixa de dialogo).",
358
+ "panel.status.saveAsFail": "Erro em Salvar como: {error} -- usando fallback.",
359
+ "panel.status.saveFail": "Erro ao salvar: {error}",
360
+ "panel.status.savedAs": "Salvo como: {path} ({bytes} bytes)",
361
+ "panel.status.netError": "Erro de rede: {error}",
362
+ "panel.status.savedTabOnly": "Alteracoes salvas na aba (nao no disco -- sem file_path).",
363
+ "panel.status.saved": "Salvo: {path} ({bytes} bytes)",
364
+ "panel.status.copied": "Copiado para a area de transferencia.",
365
+ "panel.status.copyFail": "Nao foi possivel copiar.",
366
+ "panel.status.modeAvailable": "Modos disponiveis: didactico, tecnico. Uso: /modo tecnico",
367
+ "panel.status.modeChangeFail": "Nao consegui mudar o modo: {error}",
368
+ "panel.status.modeChanged": "Modo alterado para {target}. O proximo turno ja usa este modo.",
369
+ "panel.status.genericError": "Erro: {error}",
370
+ "panel.status.brainTierAuto": "Brain tier voltou para auto (o router decide por verbo / fase).",
371
+ "panel.status.brainTierForced": "Brain tier forcado para \"{target}\" nesta sessao. /auto volta ao router.",
372
+ "panel.confirm.tabUnsaved": "A aba \"{title}\" tem alteracoes nao salvas. Fechar mesmo assim?",
373
+ "panel.confirm.tabsUnsaved": "Ha abas com alteracoes nao salvas. Fechar tudo mesmo assim?",
374
+ "panel.confirm.discardChanges": "Descartar as alteracoes nao salvas?",
375
+ "panel.confirm.removeSlot": "Remover o slot \"{slot}\"? Isto nao pode ser desfeito.",
376
+ "panel.confirm.removeKey": "Remover a key de {slot}?",
377
+ "panel.prompt.saveAs": "Salvar como (caminho relativo ao projeto):",
378
+ "panel.voice.sttFallback": "STT do navegador indisponivel; usando fallback do servidor.",
379
+ "panel.voice.noMicSupport": "Seu navegador nao suporta acesso ao microfone.",
380
+ "panel.voice.recordingCountdown": "Gravando... parada automatica em {n}s",
381
+ "panel.voice.autoStopped": "Gravacao parada automaticamente aos 55s (limite de 1 min do Google STT). Tente algo mais curto.",
382
+ "panel.voice.noAudio": "Nenhum audio capturado. Tente novamente.",
383
+ "panel.voice.audioTooLong": "Audio muito longo (>1 min). Limite sincrono do Google STT. Tente algo mais curto.",
384
+ "panel.voice.ttsUnavailable": "TTS do navegador indisponivel; volte para o Google nas configuracoes.",
385
+ "panel.voice.micClosedHalfDuplex": "Mic fechado enquanto Yujin fala (half-duplex).",
386
+ "panel.voice.micBlocked": "Microfone bloqueado. Permita o microfone para este app nas configuracoes do navegador e tente novamente.",
387
+ "panel.voice.noMicDevice": "Nenhum microfone detectado neste dispositivo.",
388
+ "panel.voice.micOpenFail": "Nao consegui abrir o microfone: {error}",
389
+ "panel.voice.micOpenListening": "Mic aberto, ouvindo...",
390
+ "panel.voice.listening": "Estou ouvindo...",
391
+ "panel.voice.listeningInterim": "Estou ouvindo... {text}",
392
+ "panel.voice.micBlockedBrowser": "Microfone bloqueado pelo navegador. Clique no icone de cadeado na barra de URL e permita o microfone, depois recarregue a pagina. Ou mude o STT para \"google\" / \"whisper\" nas configuracoes se tiver a API key.",
393
+ "panel.voice.noMicPhysical": "Nenhum microfone fisico detectado. Conecte um ou mude o STT para \"google\" / \"whisper\" nas configuracoes.",
394
+ "panel.voice.networkRequired": "Web Speech requer conexao com a internet (o Chrome usa o Google por tras). Tente sem conexao intermitente ou mude o STT para \"whisper\" se tiver a API key.",
395
+ "panel.voice.langNotSupported": "Seu navegador nao suporta este idioma para STT. Mude o idioma do painel para um suportado (en, es, pt) ou mude o STT para \"google\" / \"whisper\".",
396
+ "panel.voice.micError": "Erro de mic: {error}",
397
+ "panel.voice.noAudioToRecognizer": "Nenhum audio chegou ao reconhecedor: o ditado do navegador nao esta capturando neste app.",
398
+ "panel.voice.micOpenNoVoice": "Mic aberto mas nenhuma voz detectada. Aproxime-se do microfone e fale mais alto; se continuar, o ditado gratis nao funciona nesta PWA.",
399
+ "panel.voice.voiceNoText": "Voz detectada mas o navegador nao retornou texto (STT gratis indisponivel nesta PWA).",
400
+ "panel.voice.startingDictation": "Iniciando ditado...",
401
+ "panel.voice.couldNotStartMic": "Nao consegui iniciar o mic: {error}",
402
+ "panel.status.imageTooLarge": "Imagem muito grande (>6MB): {name}",
403
+ "panel.status.imageReady": "Imagem pronta para enviar: {name}",
404
+ "panel.status.imageReadFail": "Nao consegui ler a imagem: {error}",
405
+ "panel.tip.attachFile": "Anexar arquivo",
406
+ "panel.tip.refreshDiscovery": "Atualizar discovery",
407
+ "panel.tip.refreshNow": "Atualizar agora",
408
+ "panel.tip.filterByProject": "Filtrar por projeto",
409
+ "panel.tip.concurrentRuns": "Execucoes concorrentes: limites global / por projeto",
410
+ "panel.tip.mcpBridges": "MCP Bridges (F101)",
411
+ "panel.tip.activity": "Atividade de agentes + inspetor de bridge + chat por agente",
412
+ "panel.tip.settings": "Ajustes (modo voz, STT, TTS, chaves, idioma)",
413
+ "panel.tip.zoomOut": "Reduzir zoom (Ctrl -)",
414
+ "panel.tip.zoomReset": "Redefinir zoom (Ctrl 0)",
415
+ "panel.tip.zoomIn": "Aumentar zoom (Ctrl +)",
416
+ "panel.tip.maximize": "Maximizar / restaurar (tela cheia)",
417
+ "panel.tip.closeBoard": "Fechar todo o quadro",
418
+ "panel.tip.openInEditor": "Abrir no meu editor",
419
+ "panel.tip.open": "Abrir",
420
+ "panel.tip.saveAs": "Salvar como -- escolha um novo caminho (relativo ao projeto)",
421
+ "panel.tip.codeModeDetail": "Detalhado: arquivos, diffs e comandos ao vivo",
422
+ "panel.tip.codeModeZen": "Sumi-e: arte com texto ocasional",
423
+ "panel.tip.cancelShell": "Cancelar comando shell",
424
+ "panel.tip.closeTab": "Fechar aba",
425
+ "panel.tip.reopenNativeTabs": "Reabrir abas nativas fechadas",
426
+ "panel.tip.notTestedYet": "ainda nao testado",
427
+ "panel.aria.activity": "Atividade",
428
+ "panel.aria.settings": "Ajustes",
429
+ "panel.aria.zoomOut": "Reduzir zoom",
430
+ "panel.aria.zoomIn": "Aumentar zoom",
431
+ "panel.aria.maximize": "Maximizar",
432
+ "panel.aria.closeBoard": "fechar tudo",
433
+ "panel.aria.thinking": "pensando",
434
+ "panel.hint.boardEmpty": "O conteudo estruturado aparece aqui: codigo, tabelas, documentos. Peca ao Yujin para escrever ou editar algo.",
435
+ "panel.hint.planMode": "Voce esta no modo Plan (assinatura). O quadro e desenhado quando o brain roda em modo API: altere em <strong>Ajustes &gt; Brain &gt; Anthropic: modalidade &gt; Console</strong> e reabra o painel.",
436
+ "panel.hint.bookmarksEmpty": "Sem bookmarks. Peca ao Yujin \"marque este ponto como ...\" ao ler um doc.",
437
+ "panel.voice.replyFailed": "Falha na resposta de voz: {err}",
438
+ "panel.voice.replyError": "Erro na resposta de voz: {err}",
439
+ "panel.status.languageSwitchFailed": "Falha ao trocar de idioma: {err}",
440
+ "panel.status.languageListFailed": "Nao foi possivel carregar a lista de idiomas",
441
+ "panel.legal.loading": "Carregando...",
442
+ "panel.legal.loadError": "Erro {status} ao carregar o documento.",
443
+ "panel.legal.networkError": "Erro de rede: {err}",
444
+ "panel.legal.defaultTitle": "Legal",
445
+ "panel.feedback.copied": "Copiado",
446
+ "panel.feedback.copyFailed": "Falha ao copiar",
447
+ "panel.feedback.clipboardUnavailable": "Area de transferencia indisponivel",
448
+ "panel.feedback.saving": "Salvando...",
449
+ "panel.feedback.saved": "Salvo.",
450
+ "panel.feedback.saveError": "erro ao salvar",
451
+ "panel.feedback.netError": "erro de rede",
452
+ "panel.feedback.netErrorSaving": "erro de rede ao salvar",
453
+ "panel.feedback.errorPrefix": "Erro: {detail}",
454
+ "panel.pair.generating": "Gerando...",
455
+ "panel.pair.generateQr": "Gerar QR",
456
+ "panel.pair.copy": "Copiar",
457
+ "panel.pair.expiry": "Expira em ~{mins} min. Gere novamente se caducar.",
458
+ "panel.pair.qrNetError": "Erro de rede ao gerar o QR.",
459
+ "panel.audit.copyJson": "Copiar JSON",
460
+ "panel.limits.resetApplied": "Reset para padroes aplicado",
461
+ "panel.nac3.effects": "Efeitos: {list}",
462
+ "panel.nac3.effectsUnknown": "desconhecidos",
463
+ "panel.nac3.cancel": "Cancelar",
464
+ "panel.nac3.reject": "Rejeitar",
465
+ "panel.nac3.approve": "Aprovar",
466
+ "panel.nac3.approveDestructive": "Aprovar (destrutivo)",
467
+ "panel.nac3.executing": "Executando...",
468
+ "panel.tts.providerBrowser": "TTS navegador",
469
+ "panel.tts.providerGoogle": "TTS Google",
470
+ "panel.tts.providerTitle": "Clique para alternar entre navegador (SpeechSynthesis nativo, vozes do SO) e Google Cloud TTS (server-side).",
471
+ "panel.stt.providerBrowser": "STT navegador",
472
+ "panel.stt.providerGoogle": "STT Google",
473
+ "panel.stt.providerWhisper": "STT Whisper",
474
+ "panel.stt.providerTitle": "Clique para alternar entre navegador (rapido + es-AR nativo + gratis), Google Cloud STT (server-side, BYOK) ou Whisper (server-side, BYOK).",
475
+ "panel.tts.voiceTitle": "Voz atual: {id} / {persona} ({gender}) -- {style}. Clique para ciclar. Studio = articula s claro; Neural2 = espanhol natural (aspira s finais).",
476
+ "panel.license.lendNeedsLicense": "ative sua licenca para emprestar seu brain",
477
+ "panel.license.emailInvalid": "Insira um email valido (com @).",
478
+ "panel.license.connecting": "Conectando...",
479
+ "panel.license.savingEmail": "Salvando email + sincronizando com Polar...",
480
+ "panel.license.syncFailedRetry": "Email salvo, mas o sync falhou: {err}{http}. Se voce acabou de pagar, espere 1-2 min e clique em \"Sincronizar com Polar\".",
481
+ "panel.license.planOk": "OK -- plano: {plan}.",
482
+ "panel.license.netError": "Erro de rede: {err}",
483
+ "panel.license.syncing": "Sincronizando...",
484
+ "panel.license.querying": "Consultando servidor...",
485
+ "panel.license.syncError": "Erro de sync: {err}{http}",
486
+ "panel.license.planUnchanged": "Plano sem alteracoes: {plan}",
487
+ "panel.license.planUpdated": "Plano atualizado: {before} -> {after}",
488
+ "panel.license.syncWithPolar": "Sincronizar com Polar",
489
+ "panel.license.errorWithCode": "erro: {code}",
490
+ "panel.keyEditor.keyTooShort": "Key muito curta (min 8 chars).",
491
+ "panel.bridge.coordUnavailable": "Coordenacao indisponivel.",
492
+ "panel.bridge.statusUnavailable": "indisponivel",
493
+ "panel.mcp.loadingBridges": "Carregando bridges...",
494
+ "panel.tools.loading": "Carregando tools...",
495
+ "panel.agentsChat.backPairs": "< Pares",
496
+ "panel.agentsChat.noMessages": "Sem mensagens neste par.",
497
+ "panel.agentsChat.noAgents": "sem agentes",
498
+ "panel.agentsChat.pickAgent": "Escolha um agente + digite texto antes de enviar.",
499
+ "panel.agentsChat.sending": "Enviando...",
500
+ "panel.agentsChat.errorGeneric": "Erro: {err}",
501
+ "panel.whatsNew.dismiss": "Fechar",
502
+ "panel.alert.noEditor": "Nenhum editor no PATH. Copie o caminho: {path}",
503
+ "panel.alert.pathRelative": "O caminho deve ser relativo ao projeto (sem \"/\" inicial nem \"..\").",
504
+ "panel.tip.saveTo": "Salvar em {path}",
505
+ "panel.tip.saveToMemory": "(memoria)",
506
+ "panel.button.saveAs": "Salvar como...",
507
+ "panel.aria.concurrentRuns": "Execucoes concorrentes",
508
+ "panel.activity.allProjects": "Todos os projetos",
509
+ "panel.activity.loadingFeed": "Carregando feed...",
510
+ "panel.feedback.savedShort": "salvo",
511
+ "panel.pair.qrFailed": "Nao foi possivel gerar o QR.",
512
+ "panel.brain.modePlan": "Plan (assinatura)",
513
+ "panel.brain.modeConsole": "Console (API key)",
514
+ "panel.brain.applying": "aplicando {mode}...",
515
+ "panel.brain.applied": "{mode} aplicado. O proximo turno ja usa este modo.",
516
+ "panel.brain.reopenHint": "Aplica-se ao reabrir o painel.",
517
+ "panel.brain.active": "{mode} ativo",
518
+ "panel.bridge.roleHost": "host",
519
+ "panel.bridge.roleClient": "cliente",
520
+ "panel.bridge.instanceOne": "instancia",
521
+ "panel.bridge.instanceMany": "instancias",
522
+ "panel.bridge.you": "voce",
523
+ "panel.tip.deleteTask": "Excluir tarefa",
524
+ "panel.tasks.cmdPlaceholder": "comando (ex: pnpm install)...",
525
+ "panel.readAloud.code": "Codigo",
526
+ "panel.readAloud.codeLang": "Codigo em {lang}",
527
+ "panel.readAloud.file": "Arquivo {file}",
528
+ "panel.readAloud.content": "Conteudo: {content}",
529
+ "panel.pizarron.tabOne": "aba",
530
+ "panel.pizarron.tabMany": "abas"
531
+ }