@nac3/forge-cli 1.0.77 → 1.0.79

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,535 @@
1
- {
2
- "panel.brand": "Yujin Forge",
3
- "panel.brand.kanji": "侑",
4
- "panel.tagline": "Asistente de desarrollo por voz",
5
- "panel.input.placeholder": "Preguntale a Yujin",
6
- "panel.button.send": "Enviar",
7
- "panel.button.mic": "Hablar (mantener presionado)",
8
- "panel.button.mic.recording": "Presione para detener la grabacion",
9
- "panel.button.tts": "Voz activada",
10
- "panel.button.keys": "Claves",
11
- "panel.button.minimise": "Reducir",
12
- "panel.button.maximise": "Maximizar",
13
- "panel.button.close": "Cerrar",
14
- "panel.button.language": "Idioma",
15
- "panel.trace.title": "Trace de acciones",
16
- "panel.trace.count.one": "{n} llamada a herramienta",
17
- "panel.trace.count.other": "{n} llamadas a herramientas",
18
- "panel.trace.empty.kanji": "空",
19
- "panel.trace.empty.body": "Yujin Forge muestra aca cada herramienta que invoca para responderte: lectura del manifest, busqueda en el SPEC, edicion de componentes, lectura de documentos. Hace una pregunta que requiera consultarlos.",
20
- "panel.trace.badge.tool": "TOOL",
21
- "panel.trace.badge.voice": "VOZ",
22
- "panel.trace.badge.error": "ERROR",
23
- "panel.stream.empty.kanji": "侑仁",
24
- "panel.stream.empty.body": "Yujin Forge en linea. Pedile cambios al proyecto.",
25
- "panel.status.no_audio": "No se capturo audio. Probablemente el microfono no recibio nada.",
26
- "panel.status.did_not_catch": "No te entendi. Probemos de nuevo.",
27
- "panel.status.mic_denied": "Permiso de microfono denegado o no disponible: {error}",
28
- "panel.status.voice_failed": "La voz fallo: {error}",
29
- "panel.status.voice_reply_failed": "No pude reproducir la respuesta: {error}",
30
- "panel.status.audio_play_error": "No pude reproducir el audio: {error}",
31
- "panel.status.reading": "Leyendo {filename}...",
32
- "panel.status.ingest_failed": "La ingesta fallo: {error}",
33
- "panel.status.read_failed": "No pude leer la especificacion: {error}",
34
- "panel.drop.title": "Solta la especificacion aca",
35
- "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
- "panel.ingest.spec_attached": "Especificacion adjunta: {filename}, {kb} KB",
37
- "panel.ingest.read_label": "Leida.",
38
- "panel.ingest.title_label": "Titulo: {title}",
39
- "panel.ingest.no_title": "(sin titulo)",
40
- "panel.ingest.format_label": "Formato: {format} / {sections} seccion(es) / {kb} KB",
41
- "panel.ingest.first_lines": "Primeras lineas:",
42
- "panel.ingest.action_done": "Accion {tool} completada.",
43
- "vault.modal.title": "Credenciales (vault)",
44
- "vault.modal.aria.close": "Cerrar modal de credenciales",
45
- "vault.tab.list": "Slots cargados",
46
- "vault.tab.add": "Agregar",
47
- "vault.list.loading": "Cargando...",
48
- "vault.list.empty": "Todavia no cargaste ninguna clave. Hace click en la pestana \"Agregar\" para empezar.",
49
- "vault.add.slot_label": "Nombre del slot",
50
- "vault.add.slot_hint": "Letras minusculas, digitos, guion bajo, guion. Tiene que empezar con letra.",
51
- "vault.add.value_label": "Valor en texto plano (oculto)",
52
- "vault.add.value_hint": "Se muestra una sola vez al guardar. Despues solo se puede reemplazar, no leer.",
53
- "vault.add.button_save": "Guardar",
54
- "vault.add.button_cancel": "Cancelar",
55
- "vault.add.success": "Slot {slot} guardado.",
56
- "vault.add.overwrite": "Slot {slot} sobrescrito.",
57
- "manual.intro": "Yujin Forge -- manual de usuario",
58
- "manual.section.welcome": "Bienvenida",
59
- "manual.section.install": "Instalacion",
60
- "manual.section.first_run": "Primera ejecucion",
61
- "manual.section.voice": "Comandos por voz",
62
- "manual.section.spec_ingest": "Ingesta de especificaciones",
63
- "manual.section.troubleshooting": "Solucion de problemas",
64
- "manual.section.support": "Soporte",
65
- "lang.name.es": "Espanol",
66
- "lang.name.en": "English",
67
- "lang.name.pt": "Portugues",
68
- "lang.name.fr": "Francais",
69
- "lang.name.ja": "Nihongo",
70
- "lang.name.zh": "Zhongwen",
71
- "lang.name.hi": "Hindi",
72
- "lang.name.ar": "Arabi",
73
- "lang.name.de": "Deutsch",
74
- "lang.name.it": "Italiano",
75
- "recap.fallback_period": ".",
76
- "recap.empty": "No hay nada que recordar todavia.",
77
- "error_ui.severity.info": "INFO",
78
- "error_ui.severity.warning": "ATENCION",
79
- "error_ui.severity.error": "ERROR",
80
- "error_ui.severity.fatal": "FATAL",
81
- "error_ui.label.what": "Que paso",
82
- "error_ui.label.why": "Por que",
83
- "error_ui.label.fix": "Como destrabar",
84
- "error_ui.label.cmd": "Comando",
85
- "error_ui.label.docs": "Docs locales",
86
- "error_ui.label.retry": "Reintentar en",
87
- "error_ui.copy_btn": "Copiar comando",
88
- "error_ui.unknown.what": "Forge encontro un error interno (codigo desconocido).",
89
- "error_ui.unknown.why": "El codigo {code} no esta en el catalogo. Es un bug.",
90
- "error_ui.unknown.fix": "Abri un issue en https://github.com/yujinapp/yujin-forge/issues con el codigo + traceback.",
91
- "error.cap_frontier_exhausted.what": "Se agoto el cap mensual de tokens del tier frontier (modelo grande).",
92
- "error.cap_frontier_exhausted.why": "Tu plan {plan} permite hasta {cap} tokens/mes en frontier. Usaste {used}. Resetea al inicio del proximo mes UTC.",
93
- "error.cap_frontier_exhausted.fix": "Pasa a BYOK Anthropic directo: bypassea el cap mensual del worker. Tu costo pasa a ser lo que cobra Anthropic.",
94
- "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
- "error.cap_eco_exhausted.what": "Se agoto el cap mensual de tokens del tier eco (modelo chico).",
96
- "error.cap_eco_exhausted.why": "Tu plan {plan} permite hasta {cap} tokens/mes en eco. Usaste {used}. Resetea al inicio del proximo mes UTC.",
97
- "error.cap_eco_exhausted.fix": "Pasa a BYOK directo o sube de plan. BYOK bypassea el cap del 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": "El tier {tier} no esta habilitado en tu plan.",
100
- "error.tier_not_in_plan.why": "Tu plan {plan} no incluye el tier {tier}. Probablemente sos free-public o tu license expiro.",
101
- "error.tier_not_in_plan.fix": "Activa una licencia paga o pasa a BYOK directo (tu costo, sin cap del worker).",
102
- "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
- "error.response_truncated.what": "La respuesta del modelo se corto antes de terminar.",
104
- "error.response_truncated.why": "Limite managed_max_tokens_per_turn = {limit} tokens alcanzado a mitad del turno. El modelo paro de generar.",
105
- "error.response_truncated.fix": "Subi el limite via yf limits. Aplica al proximo turno sin reiniciar el chat.",
106
- "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
- "error.response_truncated.banner": "[Respuesta truncada por max_tokens={max}. Subi el limite con: yf limits set managed_max_tokens_per_turn {suggested}]",
108
- "error.modal_trace_stale.what": "El modal de aprobacion expiro o quedo huerfano.",
109
- "error.modal_trace_stale.why": "El trace_id {trace_id} no tiene approval pendiente en el dispatcher. Probable race condition entre invoke y panel state, o cancel previo dejo el trace zombie.",
110
- "error.modal_trace_stale.fix": "Reintenta el verbo desde el chat: arranca un nuevo trace limpio. Si persiste, corre yf doctor para chequear el panel.",
111
- "error.modal_trace_stale.cmd": "yf doctor",
112
- "error.byok_key_missing.what": "Falta la API key para el provider {provider}.",
113
- "error.byok_key_missing.why": "Configuraste {provider} como provider del tier {tier} pero el slot byok_{slot} no esta en el Vault encriptado.",
114
- "error.byok_key_missing.fix": "Configura la key con yf keys set (atomico, mode 0600, nunca se logguea).",
115
- "error.byok_key_missing.cmd": "yf keys set {slot}",
116
- "error.worker_unreachable.what": "No pude alcanzar el worker yujin.app.",
117
- "error.worker_unreachable.why": "Network timeout o worker caido (HTTP {status}). Reintente {attempts} veces.",
118
- "error.worker_unreachable.fix": "Chequea tu internet. Si esta OK, pasa temporalmente a BYOK directo para no depender del worker.",
119
- "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
- "error.vault_decrypt_failed.what": "No pude desencriptar una clave del Vault.",
121
- "error.vault_decrypt_failed.why": "La master key es incorrecta o el archivo del Vault esta corrupto. Puede pasar si moviste config entre maquinas sin migrar la master o por disk error.",
122
- "error.vault_decrypt_failed.fix": "Traete la copia del server (re-encripta con tu master local) si tenes server backup activo.",
123
- "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
- "error.shell_exec_rejected.what": "Rechazaste el modal R8 de yujin.shell.exec.",
125
- "error.shell_exec_rejected.why": "El comando {command} se clasifico como {classification}. shell.exec siempre pide aprobacion por seguridad, aunque sea read-only.",
126
- "error.shell_exec_rejected.fix": "Si el comando era read-only (yf projects active, git status, ls), usa el verb nativo equivalente. Si era necesario y lo rechazaste por error, reinvoca.",
127
- "error.project_not_registered.what": "No hay proyecto adopter registrado.",
128
- "error.project_not_registered.why": "El verb que invocaste requiere project root activo pero ~/.yujin-forge/projects.json no tiene entradas.",
129
- "error.project_not_registered.fix": "Crea uno con yujin.project.init o registra uno existente con 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 + sub-agentes registrados en este proyecto",
134
- "panel.agents.empty.title": "Aun no hay agentes",
135
- "panel.agents.empty.body": "Corre `yf agent install --defaults` para registrar el Director y los 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 no iniciado",
140
- "panel.agents.event.running": "Corriendo",
141
- "panel.agents.event.idle": "En espera",
142
- "panel.agents.tick.live": "Conectado",
143
- "panel.agents.tick.lost": "Conexion perdida",
144
- "workflow.phase.i": "Triage e intencion",
145
- "workflow.phase.ii": "Clarificacion (funcional + 4 NFR + bloques)",
146
- "workflow.phase.iii": "Especificaciones (RFP + Arch + Design + aprobaciones)",
147
- "workflow.phase.iv": "Bootstrap",
148
- "workflow.phase.v": "Desarrollo por bloques",
149
- "workflow.phase.vi": "Deploy + post-lanzamiento",
150
- "wizard.title": "Bienvenido a Yujin Forge",
151
- "wizard.close": "Cerrar",
152
- "wizard.intro": "Para empezar, configura como Forge se conecta a tu modelo de IA. Podes cambiar la eleccion mas tarde desde Settings.",
153
- "wizard.back": "Volver",
154
- "wizard.start": "Empezar",
155
- "wizard.plan.badge": "Recomendado",
156
- "wizard.plan.title": "Plan de Claude",
157
- "wizard.plan.desc": "Suscripcion mensual de Claude. La opcion mas economica para uso continuo. Forge usa tu sesion de claude -p.",
158
- "wizard.plan.price": "Costo fijo mensual (Plan)",
159
- "wizard.plan.step.title": "Conectar tu Plan de Claude",
160
- "wizard.plan.step.1": "Abri una terminal nueva.",
161
- "wizard.plan.step.2": "Corre el comando claude (sin argumentos) y completa el login en el browser.",
162
- "wizard.plan.step.3": "Volve aca y hace click en Ya estoy loggeado para verificar.",
163
- "wizard.plan.done": "Ya estoy loggeado",
164
- "wizard.byok.title": "Tu propia API key (BYOK)",
165
- "wizard.byok.desc": "Tu propia key de cualquier proveedor (Anthropic, OpenAI, Google, DeepSeek...). Pagas por uso en tu cuenta.",
166
- "wizard.byok.price": "Pago por uso (Console)",
167
- "wizard.byok.step.title": "Elegi tu proveedor y pega tu API key",
168
- "wizard.byok.step.intro": "Elegi el proveedor del menu y pega su API key. Forge la guarda encriptada en el Vault local; nunca sale de tu maquina.",
169
- "wizard.byok.test": "Validar y guardar",
170
- "wizard.skip.title": "Ya tengo todo configurado",
171
- "wizard.skip.desc": "Saltar el wizard. Podes invocarlo despues desde Settings.",
172
- "wizard.done.kanji": "完",
173
- "wizard.done.title": "Listo",
174
- "wizard.done.msg": "Forge esta configurado. Empeza a chatear.",
175
- "pizarron.button.read": "Leerme",
176
- "pizarron.button.copy": "Copiar",
177
- "pizarron.button.edit": "Editar",
178
- "pizarron.graph.refresh": "Refrescar",
179
- "pizarron.graph.regenerating": "Regenerando...",
180
- "pizarron.graph.detail.hint": "Toca un nodo para ver el detalle.",
181
- "pizarron.graph.detail.empty": "Sin detalle para este nodo.",
1
+ {
2
+ "panel.brand": "Yujin Forge",
3
+ "panel.brand.kanji": "侑",
4
+ "panel.tagline": "Asistente de desarrollo por voz",
5
+ "panel.input.placeholder": "Preguntale a Yujin",
6
+ "panel.button.send": "Enviar",
7
+ "panel.button.mic": "Hablar (mantener presionado)",
8
+ "panel.button.mic.recording": "Presione para detener la grabacion",
9
+ "panel.button.tts": "Voz activada",
10
+ "panel.button.keys": "Claves",
11
+ "panel.button.minimise": "Reducir",
12
+ "panel.button.maximise": "Maximizar",
13
+ "panel.button.close": "Cerrar",
14
+ "panel.button.language": "Idioma",
15
+ "panel.trace.title": "Trace de acciones",
16
+ "panel.trace.count.one": "{n} llamada a herramienta",
17
+ "panel.trace.count.other": "{n} llamadas a herramientas",
18
+ "panel.trace.empty.kanji": "空",
19
+ "panel.trace.empty.body": "Yujin Forge muestra aca cada herramienta que invoca para responderte: lectura del manifest, busqueda en el SPEC, edicion de componentes, lectura de documentos. Hace una pregunta que requiera consultarlos.",
20
+ "panel.trace.badge.tool": "TOOL",
21
+ "panel.trace.badge.voice": "VOZ",
22
+ "panel.trace.badge.error": "ERROR",
23
+ "panel.stream.empty.kanji": "侑仁",
24
+ "panel.stream.empty.body": "Yujin Forge en linea. Pedile cambios al proyecto.",
25
+ "panel.status.no_audio": "No se capturo audio. Probablemente el microfono no recibio nada.",
26
+ "panel.status.did_not_catch": "No te entendi. Probemos de nuevo.",
27
+ "panel.status.mic_denied": "Permiso de microfono denegado o no disponible: {error}",
28
+ "panel.status.voice_failed": "La voz fallo: {error}",
29
+ "panel.status.voice_reply_failed": "No pude reproducir la respuesta: {error}",
30
+ "panel.status.audio_play_error": "No pude reproducir el audio: {error}",
31
+ "panel.status.reading": "Leyendo {filename}...",
32
+ "panel.status.ingest_failed": "La ingesta fallo: {error}",
33
+ "panel.status.read_failed": "No pude leer la especificacion: {error}",
34
+ "panel.drop.title": "Solta la especificacion aca",
35
+ "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
+ "panel.ingest.spec_attached": "Especificacion adjunta: {filename}, {kb} KB",
37
+ "panel.ingest.read_label": "Leida.",
38
+ "panel.ingest.title_label": "Titulo: {title}",
39
+ "panel.ingest.no_title": "(sin titulo)",
40
+ "panel.ingest.format_label": "Formato: {format} / {sections} seccion(es) / {kb} KB",
41
+ "panel.ingest.first_lines": "Primeras lineas:",
42
+ "panel.ingest.action_done": "Accion {tool} completada.",
43
+ "vault.modal.title": "Credenciales (vault)",
44
+ "vault.modal.aria.close": "Cerrar modal de credenciales",
45
+ "vault.tab.list": "Slots cargados",
46
+ "vault.tab.add": "Agregar",
47
+ "vault.list.loading": "Cargando...",
48
+ "vault.list.empty": "Todavia no cargaste ninguna clave. Hace click en la pestana \"Agregar\" para empezar.",
49
+ "vault.add.slot_label": "Nombre del slot",
50
+ "vault.add.slot_hint": "Letras minusculas, digitos, guion bajo, guion. Tiene que empezar con letra.",
51
+ "vault.add.value_label": "Valor en texto plano (oculto)",
52
+ "vault.add.value_hint": "Se muestra una sola vez al guardar. Despues solo se puede reemplazar, no leer.",
53
+ "vault.add.button_save": "Guardar",
54
+ "vault.add.button_cancel": "Cancelar",
55
+ "vault.add.success": "Slot {slot} guardado.",
56
+ "vault.add.overwrite": "Slot {slot} sobrescrito.",
57
+ "manual.intro": "Yujin Forge -- manual de usuario",
58
+ "manual.section.welcome": "Bienvenida",
59
+ "manual.section.install": "Instalacion",
60
+ "manual.section.first_run": "Primera ejecucion",
61
+ "manual.section.voice": "Comandos por voz",
62
+ "manual.section.spec_ingest": "Ingesta de especificaciones",
63
+ "manual.section.troubleshooting": "Solucion de problemas",
64
+ "manual.section.support": "Soporte",
65
+ "lang.name.es": "Espanol",
66
+ "lang.name.en": "English",
67
+ "lang.name.pt": "Portugues",
68
+ "lang.name.fr": "Francais",
69
+ "lang.name.ja": "Nihongo",
70
+ "lang.name.zh": "Zhongwen",
71
+ "lang.name.hi": "Hindi",
72
+ "lang.name.ar": "Arabi",
73
+ "lang.name.de": "Deutsch",
74
+ "lang.name.it": "Italiano",
75
+ "recap.fallback_period": ".",
76
+ "recap.empty": "No hay nada que recordar todavia.",
77
+ "error_ui.severity.info": "INFO",
78
+ "error_ui.severity.warning": "ATENCION",
79
+ "error_ui.severity.error": "ERROR",
80
+ "error_ui.severity.fatal": "FATAL",
81
+ "error_ui.label.what": "Que paso",
82
+ "error_ui.label.why": "Por que",
83
+ "error_ui.label.fix": "Como destrabar",
84
+ "error_ui.label.cmd": "Comando",
85
+ "error_ui.label.docs": "Docs locales",
86
+ "error_ui.label.retry": "Reintentar en",
87
+ "error_ui.copy_btn": "Copiar comando",
88
+ "error_ui.unknown.what": "Forge encontro un error interno (codigo desconocido).",
89
+ "error_ui.unknown.why": "El codigo {code} no esta en el catalogo. Es un bug.",
90
+ "error_ui.unknown.fix": "Abri un issue en https://github.com/yujinapp/yujin-forge/issues con el codigo + traceback.",
91
+ "error.cap_frontier_exhausted.what": "Se agoto el cap mensual de tokens del tier frontier (modelo grande).",
92
+ "error.cap_frontier_exhausted.why": "Tu plan {plan} permite hasta {cap} tokens/mes en frontier. Usaste {used}. Resetea al inicio del proximo mes UTC.",
93
+ "error.cap_frontier_exhausted.fix": "Pasa a BYOK Anthropic directo: bypassea el cap mensual del worker. Tu costo pasa a ser lo que cobra Anthropic.",
94
+ "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
+ "error.cap_eco_exhausted.what": "Se agoto el cap mensual de tokens del tier eco (modelo chico).",
96
+ "error.cap_eco_exhausted.why": "Tu plan {plan} permite hasta {cap} tokens/mes en eco. Usaste {used}. Resetea al inicio del proximo mes UTC.",
97
+ "error.cap_eco_exhausted.fix": "Pasa a BYOK directo o sube de plan. BYOK bypassea el cap del 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": "El tier {tier} no esta habilitado en tu plan.",
100
+ "error.tier_not_in_plan.why": "Tu plan {plan} no incluye el tier {tier}. Probablemente sos free-public o tu license expiro.",
101
+ "error.tier_not_in_plan.fix": "Activa una licencia paga o pasa a BYOK directo (tu costo, sin cap del worker).",
102
+ "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
+ "error.response_truncated.what": "La respuesta del modelo se corto antes de terminar.",
104
+ "error.response_truncated.why": "Limite managed_max_tokens_per_turn = {limit} tokens alcanzado a mitad del turno. El modelo paro de generar.",
105
+ "error.response_truncated.fix": "Subi el limite via yf limits. Aplica al proximo turno sin reiniciar el chat.",
106
+ "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
+ "error.response_truncated.banner": "[Respuesta truncada por max_tokens={max}. Subi el limite con: yf limits set managed_max_tokens_per_turn {suggested}]",
108
+ "error.modal_trace_stale.what": "El modal de aprobacion expiro o quedo huerfano.",
109
+ "error.modal_trace_stale.why": "El trace_id {trace_id} no tiene approval pendiente en el dispatcher. Probable race condition entre invoke y panel state, o cancel previo dejo el trace zombie.",
110
+ "error.modal_trace_stale.fix": "Reintenta el verbo desde el chat: arranca un nuevo trace limpio. Si persiste, corre yf doctor para chequear el panel.",
111
+ "error.modal_trace_stale.cmd": "yf doctor",
112
+ "error.byok_key_missing.what": "Falta la API key para el provider {provider}.",
113
+ "error.byok_key_missing.why": "Configuraste {provider} como provider del tier {tier} pero el slot byok_{slot} no esta en el Vault encriptado.",
114
+ "error.byok_key_missing.fix": "Configura la key con yf keys set (atomico, mode 0600, nunca se logguea).",
115
+ "error.byok_key_missing.cmd": "yf keys set {slot}",
116
+ "error.worker_unreachable.what": "No pude alcanzar el worker yujin.app.",
117
+ "error.worker_unreachable.why": "Network timeout o worker caido (HTTP {status}). Reintente {attempts} veces.",
118
+ "error.worker_unreachable.fix": "Chequea tu internet. Si esta OK, pasa temporalmente a BYOK directo para no depender del worker.",
119
+ "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
+ "error.vault_decrypt_failed.what": "No pude desencriptar una clave del Vault.",
121
+ "error.vault_decrypt_failed.why": "La master key es incorrecta o el archivo del Vault esta corrupto. Puede pasar si moviste config entre maquinas sin migrar la master o por disk error.",
122
+ "error.vault_decrypt_failed.fix": "Traete la copia del server (re-encripta con tu master local) si tenes server backup activo.",
123
+ "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
+ "error.shell_exec_rejected.what": "Rechazaste el modal R8 de yujin.shell.exec.",
125
+ "error.shell_exec_rejected.why": "El comando {command} se clasifico como {classification}. shell.exec siempre pide aprobacion por seguridad, aunque sea read-only.",
126
+ "error.shell_exec_rejected.fix": "Si el comando era read-only (yf projects active, git status, ls), usa el verb nativo equivalente. Si era necesario y lo rechazaste por error, reinvoca.",
127
+ "error.project_not_registered.what": "No hay proyecto adopter registrado.",
128
+ "error.project_not_registered.why": "El verb que invocaste requiere project root activo pero ~/.yujin-forge/projects.json no tiene entradas.",
129
+ "error.project_not_registered.fix": "Crea uno con yujin.project.init o registra uno existente con 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 + sub-agentes registrados en este proyecto",
134
+ "panel.agents.empty.title": "Aun no hay agentes",
135
+ "panel.agents.empty.body": "Corre `yf agent install --defaults` para registrar el Director y los 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 no iniciado",
140
+ "panel.agents.event.running": "Corriendo",
141
+ "panel.agents.event.idle": "En espera",
142
+ "panel.agents.tick.live": "Conectado",
143
+ "panel.agents.tick.lost": "Conexion perdida",
144
+ "workflow.phase.i": "Triage e intencion",
145
+ "workflow.phase.ii": "Clarificacion (funcional + 4 NFR + bloques)",
146
+ "workflow.phase.iii": "Especificaciones (RFP + Arch + Design + aprobaciones)",
147
+ "workflow.phase.iv": "Bootstrap",
148
+ "workflow.phase.v": "Desarrollo por bloques",
149
+ "workflow.phase.vi": "Deploy + post-lanzamiento",
150
+ "wizard.title": "Bienvenido a Yujin Forge",
151
+ "wizard.close": "Cerrar",
152
+ "wizard.intro": "Para empezar, configura como Forge se conecta a tu modelo de IA. Podes cambiar la eleccion mas tarde desde Settings.",
153
+ "wizard.back": "Volver",
154
+ "wizard.start": "Empezar",
155
+ "wizard.plan.badge": "Recomendado",
156
+ "wizard.plan.title": "Plan de Claude",
157
+ "wizard.plan.desc": "Suscripcion mensual de Claude. La opcion mas economica para uso continuo. Forge usa tu sesion de claude -p.",
158
+ "wizard.plan.price": "Costo fijo mensual (Plan)",
159
+ "wizard.plan.step.title": "Conectar tu Plan de Claude",
160
+ "wizard.plan.step.1": "Abri una terminal nueva.",
161
+ "wizard.plan.step.2": "Corre el comando claude (sin argumentos) y completa el login en el browser.",
162
+ "wizard.plan.step.3": "Volve aca y hace click en Ya estoy loggeado para verificar.",
163
+ "wizard.plan.done": "Ya estoy loggeado",
164
+ "wizard.byok.title": "Tu propia API key (BYOK)",
165
+ "wizard.byok.desc": "Tu propia key de cualquier proveedor (Anthropic, OpenAI, Google, DeepSeek...). Pagas por uso en tu cuenta.",
166
+ "wizard.byok.price": "Pago por uso (Console)",
167
+ "wizard.byok.step.title": "Elegi tu proveedor y pega tu API key",
168
+ "wizard.byok.step.intro": "Elegi el proveedor del menu y pega su API key. Forge la guarda encriptada en el Vault local; nunca sale de tu maquina.",
169
+ "wizard.byok.test": "Validar y guardar",
170
+ "wizard.skip.title": "Ya tengo todo configurado",
171
+ "wizard.skip.desc": "Saltar el wizard. Podes invocarlo despues desde Settings.",
172
+ "wizard.done.kanji": "完",
173
+ "wizard.done.title": "Listo",
174
+ "wizard.done.msg": "Forge esta configurado. Empeza a chatear.",
175
+ "pizarron.button.read": "Leerme",
176
+ "pizarron.button.copy": "Copiar",
177
+ "pizarron.button.edit": "Editar",
178
+ "pizarron.graph.refresh": "Refrescar",
179
+ "pizarron.graph.regenerating": "Regenerando...",
180
+ "pizarron.graph.detail.hint": "Toca un nodo para ver el detalle.",
181
+ "pizarron.graph.detail.empty": "Sin detalle para este nodo.",
182
182
  "pizarron.graph.detail.weight": "peso",
183
183
  "pizarron.graph.orbit": "Orbita",
184
- "pizarron.graph.orbit.speed": "Velocidad orbital",
185
- "startup.tab.graph": "Grafo grafico",
186
- "startup.tab.graphSem": "Grafo semantico",
187
- "startup.tab.pendings": "Pendientes",
188
- "startup.tab.workflow": "Workflow",
189
- "settings.startupTabs": "Pestanas al abrir (grafo, pendings, workflow)",
190
- "graph.term.nodes": "nodos",
191
- "graph.term.edges": "aristas",
192
- "coding.read": "Leyendo {x}",
193
- "coding.read_bare": "Leyendo un archivo",
194
- "coding.edit": "Editando {x}",
195
- "coding.edit_bare": "Editando un archivo",
196
- "coding.write": "Escribiendo {x}",
197
- "coding.write_bare": "Escribiendo un archivo",
198
- "coding.notebook_bare": "Editando notebook",
199
- "coding.bash": "Ejecutando: {x}",
200
- "coding.bash_bare": "Ejecutando un comando",
201
- "coding.grep": "Buscando \"{x}\"",
202
- "coding.grep_bare": "Buscando en el codigo",
203
- "coding.glob": "Listando {x}",
204
- "coding.glob_bare": "Listando archivos",
205
- "coding.web_bare": "Leyendo la web",
206
- "coding.websearch": "Buscando en la web: {x}",
207
- "coding.websearch_bare": "Buscando en la web",
208
- "coding.task": "Sub-agente: {x}",
209
- "coding.task_bare": "Lanzando un sub-agente",
210
- "coding.todo": "Actualizando su lista de tareas",
211
- "coding.verb_bare": "Ejecutando un verbo yujin",
212
- "panel.button.stop": "Detener",
213
- "panel.status.stopping": "Deteniendo...",
214
- "panel.status.noActiveTurn": "No habia ningun turno en curso.",
215
- "panel.status.interruptFailed": "No se pudo enviar la interrupcion.",
216
- "panel.status.turnInterrupted": "Turno interrumpido.",
217
- "panel.label.interrupted": "(interrumpido)",
218
- "panel.queue.label": "En cola",
219
- "panel.queue.remove": "Quitar de la cola",
220
- "panel.project.switchHint": "Cambiar de proyecto",
221
- "panel.project.title": "Proyectos",
222
- "panel.project.add": "Anadir proyecto...",
223
- "panel.project.addPrompt": "Ruta absoluta del proyecto a anadir:",
224
- "panel.project.switching": "Cambiando de proyecto...",
225
- "startup.tab.files": "Archivos",
226
- "panel.project.remove": "Quitar de la lista",
227
- "panel.project.removeConfirm": "Quitar este proyecto de la lista? (no borra los archivos del disco)",
228
- "panel.project.removed": "Proyecto quitado de la lista",
229
- "panel.files.refresh": "Actualizar",
230
- "panel.files.loading": "Cargando...",
231
- "panel.files.error": "No pude leer los archivos.",
232
- "panel.files.empty": "(sin archivos)",
233
- "panel.files.truncated": "(lista truncada)",
234
- "panel.files.opened": "Abierto",
235
- "panel.files.openFailed": "No se pudo abrir el archivo.",
236
- "startup.tab.tasks": "Tareas",
237
- "settings.bridge.title": "Coordinacion entre instancias",
238
- "settings.bridge.accept": "Aceptar mensajes dirigidos de otras instancias (los inyecta como chat)",
239
- "settings.bridge.composePlaceholder": "Mensaje a las otras 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": "TTS engine",
246
- "settings.voice.ttsBrowser": "TTS navegador",
247
- "settings.voice.ttsVoice": "Voz TTS (solo Google)",
248
- "settings.vad.title": "VAD (deteccion de silencio)",
249
- "settings.vad.resetDefaults": "Reset defaults",
250
- "settings.vad.engine": "Motor",
251
- "settings.vad.engineAmplitude": "Amplitud (RMS)",
252
- "settings.vad.engineBand": "Banda 80-400Hz",
253
- "settings.vad.baselineWindow": "Baseline window",
254
- "settings.vad.thresholdMult": "Threshold mult (baseline x N)",
255
- "settings.vad.thresholdMin": "Threshold minimo",
256
- "settings.vad.thresholdMax": "Threshold maximo",
257
- "settings.vad.silence": "Silencio para cerrar",
258
- "settings.vad.minVoiced": "Voz minima (anti-blip)",
259
- "settings.vad.tick": "Tick del VAD",
260
- "settings.vad.bandLow": "Banda voz: low (Hz)",
261
- "settings.vad.bandHigh": "Banda voz: high (Hz)",
262
- "settings.vad.showOverlay": "Mostrar overlay live",
263
- "settings.vad.logStats": "Loggear stats por sesion",
264
- "settings.brain.anthropicMode": "Anthropic: modalidad",
265
- "settings.brain.modePlan": "Plan (suscripcion Claude)",
266
- "settings.brain.modeConsole": "Console (API key)",
267
- "settings.brain.modeNote": "Se aplica al reabrir el panel.",
268
- "settings.brain.ecoEnabled": "Modo eco habilitado",
269
- "settings.brain.ecoHint": "apagado = frontier siempre",
270
- "settings.brain.modelEco": "Modelo eco",
271
- "settings.brain.modelFrontier": "Modelo frontier",
272
- "settings.brain.modelMultimodal": "Modelo multimodal",
273
- "settings.brain.multimodalClearTitle": "Quitar el brain multimodal dedicado (vuelve al ruteo de vision automatico)",
274
- "settings.brain.auto": "Auto",
275
- "settings.brain.multimodalHint": "Brain dedicado para turnos con imagen. Auto = ruteo de vision automatico (el frontier si ve, o aviso si no).",
276
- "settings.brain.geminiCache": "Cache explicito de Gemini (CachedContent)",
277
- "settings.brain.geminiCacheHint": "Opt-in. Conviene en sesiones largas con Gemini Pro; en sesiones cortas el cache implicito gratis de 2.5 ya alcanza.",
278
- "settings.federation.title": "Federacion de brain",
279
- "settings.federation.intro": "Usa el brain de otro Forge (su key nunca sale de su maquina) o presta el tuyo. Tu codigo se ejecuta local; solo la inferencia viaja.",
280
- "settings.federation.connectedTo": "Conectado a",
281
- "settings.federation.disconnect": "Desconectar",
282
- "settings.federation.connectMe": "Conectarme",
283
- "settings.federation.tokenPlaceholder": "Pega el codigo de federacion",
284
- "settings.federation.connect": "Conectar",
285
- "settings.federation.lendBrain": "Prestar mi brain",
286
- "settings.federation.generateCode": "Generar codigo",
287
- "settings.federation.host": "Hospedar (responder a los hijos)",
288
- "settings.federation.fedBrain": "Brain de federacion",
289
- "settings.federation.fedBrainNote": "El que responde a los hijos. API directa (DeepSeek por defecto). Claude Plan no sirve para hospedar; necesita una key con saldo.",
290
- "settings.federation.codeOnce": "Codigo (1 solo uso)",
291
- "settings.federation.copy": "Copiar",
292
- "settings.keys.title": "API keys (BYOK)",
293
- "settings.keys.configure": "Configurar",
294
- "settings.keys.remove": "Quitar",
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": "Panel + voz",
308
- "settings.lang.changeButton": "Cambiar 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": "Conecta tu cuenta de Polar. Pone el email con el que pagaste y sincronizamos tu plan automaticamente.",
315
- "settings.license.emailPlaceholder": "email@ejemplo.com",
316
- "settings.license.connect": "Conectar",
317
- "settings.license.sync": "Sincronizar con Polar",
318
- "settings.license.buy": "Comprar / activar plan",
319
- "settings.budget.title": "Presupuesto este mes",
320
- "settings.budget.renews": "Renueva",
321
- "settings.budget.tokensEco": "Tokens eco",
322
- "settings.budget.tokensFrontier": "Tokens frontier",
323
- "settings.budget.buyExtension": "Comprar extension de tokens",
324
- "settings.limits.title": "Limites (avanzado)",
325
- "settings.limits.editHint": "Editar cualquier valor + tab/blur guarda.",
326
- "settings.limits.reset": "Reset a defaults",
327
- "settings.bookmarks.title": "Reader bookmarks",
328
- "settings.graph.title": "Project knowledge graph",
329
- "settings.pair.title": "Vincular telefono",
330
- "settings.pair.hint": "Abri Forge Mobile, toca \"Vincular\" y escanea este QR. Listo.",
331
- "settings.pair.generateQr": "Generar QR",
332
- "settings.pair.cantRead": "La camara no lee el QR? Copia este codigo y pegalo en Forge Mobile:",
333
- "settings.audit.viewFull": "Ver completo",
334
- "settings.audit.close": "Cerrar",
335
- "settings.audit.allKinds": "Todos los kinds",
336
- "settings.audit.allModes": "Todos los modes",
337
- "settings.audit.copyJson": "Copiar JSON",
338
- "settings.audit.closeDetail": "Cerrar detalle",
339
- "settings.about.title": "Acerca de",
340
- "settings.danger.title": "Zona de peligro",
341
- "settings.danger.warning": "Cuando esta ON, Yujin ejecuta TODA accion sin pedir confirmacion (incluye shell.exec, rm, git push --force, etc). Velocidad sobre seguridad. Todo queda registrado en audit log.",
342
- "settings.keyEditor.placeholder": "Pega aqui tu API key",
343
- "settings.license.title": "Licencia",
344
- "settings.plan": "Plan",
345
- "settings.audit.title": "Registro de auditoría",
346
- "settings.legal.title": "Legal",
347
- "panel.status.projectSwitchFail": "No se pudo cambiar de proyecto.",
348
- "panel.status.projectRemoveFail": "No se pudo quitar el proyecto.",
349
- "panel.status.projectAddFail": "No se pudo anadir el proyecto.",
350
- "panel.status.cancelFail": "No se pudo cancelar: {reason}",
351
- "panel.status.cancelNetError": "Error de red al cancelar shell.",
352
- "panel.status.notEditable": "Este tipo de contenido no es editable.",
353
- "panel.status.savedAsPicker": "Guardado como: {name} (en la ruta que elegiste en el dialog).",
354
- "panel.status.saveAsFail": "Error en Guardar como: {error} -- usando fallback.",
355
- "panel.status.saveFail": "Error al guardar: {error}",
356
- "panel.status.savedAs": "Guardado como: {path} ({bytes} bytes)",
357
- "panel.status.netError": "Error de red: {error}",
358
- "panel.status.savedTabOnly": "Cambios guardados en la pestana (no en disco -- sin file_path).",
359
- "panel.status.saved": "Guardado: {path} ({bytes} bytes)",
360
- "panel.status.copied": "Copiado al portapapeles.",
361
- "panel.status.copyFail": "No se pudo copiar.",
362
- "panel.status.modeAvailable": "Modos disponibles: didactico, tecnico. Uso: /modo tecnico",
363
- "panel.status.modeChangeFail": "No pude cambiar el modo: {error}",
364
- "panel.status.modeChanged": "Modo cambiado a {target}. El proximo turno ya usa este modo.",
365
- "panel.status.genericError": "Error: {error}",
366
- "panel.status.brainTierAuto": "Brain tier vuelve a auto (router decide segun verbo / phase).",
367
- "panel.status.brainTierForced": "Brain tier forzado a \"{target}\" para esta sesion. /auto vuelve al router.",
368
- "panel.confirm.tabUnsaved": "La pestana \"{title}\" tiene cambios sin guardar. ¿Cerrar igual?",
369
- "panel.confirm.tabsUnsaved": "Hay pestanas con cambios sin guardar. ¿Cerrar todo igual?",
370
- "panel.confirm.discardChanges": "Descartar los cambios sin guardar?",
371
- "panel.confirm.removeSlot": "Quitar el slot \"{slot}\"? Esto no se puede deshacer.",
372
- "panel.confirm.removeKey": "Quitar la key de {slot}?",
373
- "panel.prompt.saveAs": "Guardar como (path relativo al proyecto):",
374
- "panel.voice.sttFallback": "STT del navegador no disponible; usando fallback del servidor.",
375
- "panel.voice.noMicSupport": "Tu navegador no soporta el acceso al microfono.",
376
- "panel.voice.recordingCountdown": "Grabando... auto-stop en {n}s",
377
- "panel.voice.autoStopped": "Grabacion detenida automaticamente a los 55s (limite de 1 min de Google STT). Proba con algo mas corto.",
378
- "panel.voice.noAudio": "No se capturo audio. Proba de nuevo.",
379
- "panel.voice.audioTooLong": "Audio demasiado largo (>1 min). Limite sincronico de Google STT. Proba con algo mas corto.",
380
- "panel.voice.ttsUnavailable": "TTS del navegador no disponible; volve a Google en la configuracion.",
381
- "panel.voice.micClosedHalfDuplex": "Mic cerrado mientras Yujin habla (half-duplex).",
382
- "panel.voice.micBlocked": "Microfono bloqueado. Permiti el microfono para esta app en los ajustes del navegador y volve a intentar.",
383
- "panel.voice.noMicDevice": "No detecto microfono en este dispositivo.",
384
- "panel.voice.micOpenFail": "No pude abrir el microfono: {error}",
385
- "panel.voice.micOpenListening": "Mic abierto, escuchando...",
386
- "panel.voice.listening": "Te escucho...",
387
- "panel.voice.listeningInterim": "Te escucho... {text}",
388
- "panel.voice.micBlockedBrowser": "Microfono bloqueado por el navegador. Hace click en el icono del candado en la barra de URL y permiti microfono, despues recarga la pagina. O cambia STT a \"google\" / \"whisper\" en la configuracion si tenes la API key.",
389
- "panel.voice.noMicPhysical": "No detecto microfono fisico. Conecta uno o cambia STT a \"google\" / \"whisper\" en la configuracion.",
390
- "panel.voice.networkRequired": "Web Speech requiere conexion a internet (Chrome usa Google detras). Probate sin conexion intermitente o cambia STT a \"whisper\" si tenes API key.",
391
- "panel.voice.langNotSupported": "Tu navegador no soporta este idioma para STT. Cambia el idioma del panel a uno soportado (en, es, pt) o cambia STT a \"google\" / \"whisper\".",
392
- "panel.voice.micError": "Error de mic: {error}",
393
- "panel.voice.noAudioToRecognizer": "No llego audio al reconocedor: el dictado del navegador no esta capturando en esta app.",
394
- "panel.voice.micOpenNoVoice": "Mic abierto pero no detecte voz. Acerca el microfono y habla mas fuerte; si sigue, el dictado gratis no funciona en esta PWA.",
395
- "panel.voice.voiceNoText": "Detecte voz pero el navegador no devolvio texto (STT gratis no disponible en esta PWA).",
396
- "panel.voice.startingDictation": "Iniciando dictado...",
397
- "panel.voice.couldNotStartMic": "No pude iniciar el mic: {error}",
398
- "panel.status.imageTooLarge": "Imagen muy grande (>6MB): {name}",
399
- "panel.status.imageReady": "Imagen lista para enviar: {name}",
400
- "panel.status.imageReadFail": "No pude leer la imagen: {error}",
401
- "panel.tip.attachFile": "Adjuntar archivo",
402
- "panel.tip.refreshDiscovery": "Refrescar discovery",
403
- "panel.tip.refreshNow": "Refrescar ahora",
404
- "panel.tip.filterByProject": "Filtrar por proyecto",
405
- "panel.tip.concurrentRuns": "Ejecuciones concurrentes: limites global / por proyecto",
406
- "panel.tip.mcpBridges": "MCP Bridges (F101)",
407
- "panel.tip.activity": "Actividad de agentes + inspector de bridge + chat por agente",
408
- "panel.tip.settings": "Ajustes (modo voz, STT, TTS, claves, idioma)",
409
- "panel.tip.zoomOut": "Reducir zoom (Ctrl -)",
410
- "panel.tip.zoomReset": "Restablecer zoom (Ctrl 0)",
411
- "panel.tip.zoomIn": "Aumentar zoom (Ctrl +)",
412
- "panel.tip.maximize": "Maximizar / restaurar (pantalla completa)",
413
- "panel.tip.closeBoard": "Cerrar todo el pizarron",
414
- "panel.tip.openInEditor": "Abrir en mi editor",
415
- "panel.tip.open": "Abrir",
416
- "panel.tip.saveAs": "Guardar como -- elegi nuevo path (relativo al proyecto)",
417
- "panel.tip.codeModeDetail": "Detallado: archivos, diffs y comandos en vivo",
418
- "panel.tip.codeModeZen": "Sumi-e: arte con texto ocasional",
419
- "panel.tip.cancelShell": "Cancelar comando shell",
420
- "panel.tip.closeTab": "Cerrar pestana",
421
- "panel.tip.reopenNativeTabs": "Reabrir pestanas nativas cerradas",
422
- "panel.tip.notTestedYet": "todavia no probado",
423
- "panel.aria.activity": "Actividad",
424
- "panel.aria.settings": "Ajustes",
425
- "panel.aria.zoomOut": "Reducir zoom",
426
- "panel.aria.zoomIn": "Aumentar zoom",
427
- "panel.aria.maximize": "Maximizar",
428
- "panel.aria.closeBoard": "cerrar todo",
429
- "panel.aria.thinking": "pensando",
430
- "panel.hint.boardEmpty": "Aqui se muestra contenido estructurado: codigo, tablas, documentos. Pedile a Yujin que escriba o edite algo.",
431
- "panel.hint.planMode": "Estas en modo Plan (suscripcion). El pizarron se dibuja cuando el brain corre en modo API: cambialo en <strong>Ajustes &gt; Brain &gt; Anthropic: modalidad &gt; Console</strong> y reabri el panel.",
432
- "panel.hint.bookmarksEmpty": "Sin bookmarks. Pedile a Yujin \"marca este punto como ...\" al leer un doc.",
433
- "panel.voice.replyFailed": "Fallo la respuesta de voz: {err}",
434
- "panel.voice.replyError": "Error en la respuesta de voz: {err}",
435
- "panel.status.languageSwitchFailed": "Fallo el cambio de idioma: {err}",
436
- "panel.status.languageListFailed": "No se pudo cargar la lista de idiomas",
437
- "panel.legal.loading": "Cargando...",
438
- "panel.legal.loadError": "Error {status} cargando el documento.",
439
- "panel.legal.networkError": "Error de red: {err}",
440
- "panel.legal.defaultTitle": "Legal",
441
- "panel.feedback.copied": "Copiado",
442
- "panel.feedback.copyFailed": "Fallo el copiado",
443
- "panel.feedback.clipboardUnavailable": "Clipboard no disponible",
444
- "panel.feedback.saving": "Guardando...",
445
- "panel.feedback.saved": "Guardado.",
446
- "panel.feedback.saveError": "error guardando",
447
- "panel.feedback.netError": "error de red",
448
- "panel.feedback.netErrorSaving": "error de red guardando",
449
- "panel.feedback.errorPrefix": "Error: {detail}",
450
- "panel.pair.generating": "Generando...",
451
- "panel.pair.generateQr": "Generar QR",
452
- "panel.pair.copy": "Copiar",
453
- "panel.pair.expiry": "Expira en ~{mins} min. Generalo de nuevo si caduca.",
454
- "panel.pair.qrNetError": "Error de red al generar el QR.",
455
- "panel.audit.copyJson": "Copiar JSON",
456
- "panel.limits.resetApplied": "Reset a defaults aplicado",
457
- "panel.nac3.effects": "Efectos: {list}",
458
- "panel.nac3.effectsUnknown": "desconocidos",
459
- "panel.nac3.cancel": "Cancelar",
460
- "panel.nac3.reject": "Rechazar",
461
- "panel.nac3.approve": "Aprobar",
462
- "panel.nac3.approveDestructive": "Aprobar (destructivo)",
463
- "panel.nac3.executing": "Ejecutando...",
464
- "panel.tts.providerBrowser": "TTS navegador",
465
- "panel.tts.providerGoogle": "TTS Google",
466
- "panel.tts.providerTitle": "Tocar para alternar entre navegador (SpeechSynthesis nativo, voces del SO) y 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": "Tocar para alternar entre navegador (rapido + es-AR nativo + gratis), Google Cloud STT (server-side, BYOK) o Whisper (server-side, BYOK).",
471
- "panel.tts.voiceTitle": "Voz actual: {id} / {persona} ({gender}) -- {style}. Tocar para ciclar. Studio = articula s claro; Neural2 = natural espanol (aspira s finales).",
472
- "panel.license.lendNeedsLicense": "activa tu licencia para prestar tu brain",
473
- "panel.license.emailInvalid": "Pone un email valido (con @).",
474
- "panel.license.connecting": "Conectando...",
475
- "panel.license.savingEmail": "Guardando email + sincronizando con Polar...",
476
- "panel.license.syncFailedRetry": "Email guardado, pero sync fallo: {err}{http}. Si recien pagaste, espera 1-2 min y dale a \"Sincronizar con Polar\".",
477
- "panel.license.planOk": "OK -- plan: {plan}.",
478
- "panel.license.netError": "Error de red: {err}",
479
- "panel.license.syncing": "Sincronizando...",
480
- "panel.license.querying": "Consultando servidor...",
481
- "panel.license.syncError": "Error de sync: {err}{http}",
482
- "panel.license.planUnchanged": "Plan sin cambios: {plan}",
483
- "panel.license.planUpdated": "Plan actualizado: {before} -> {after}",
484
- "panel.license.syncWithPolar": "Sincronizar con Polar",
485
- "panel.license.errorWithCode": "error: {code}",
486
- "panel.keyEditor.keyTooShort": "Key demasiado corta (min 8 chars).",
487
- "panel.bridge.coordUnavailable": "Coordinacion no disponible.",
488
- "panel.bridge.statusUnavailable": "no disponible",
489
- "panel.mcp.loadingBridges": "Cargando bridges...",
490
- "panel.tools.loading": "Cargando tools...",
491
- "panel.agentsChat.backPairs": "< Pares",
492
- "panel.agentsChat.noMessages": "Sin mensajes en este par.",
493
- "panel.agentsChat.noAgents": "sin agentes",
494
- "panel.agentsChat.pickAgent": "Elegi un agente + escribe texto antes de enviar.",
495
- "panel.agentsChat.sending": "Enviando...",
496
- "panel.agentsChat.errorGeneric": "Error: {err}",
497
- "panel.whatsNew.dismiss": "Cerrar",
498
- "panel.alert.noEditor": "No hay editor en el PATH. Copie el path: {path}",
499
- "panel.alert.pathRelative": "El path debe ser relativo al proyecto (sin \"/\" inicial ni \"..\").",
500
- "panel.tip.saveTo": "Guardar en {path}",
501
- "panel.tip.saveToMemory": "(memoria)",
502
- "panel.button.saveAs": "Guardar como...",
503
- "panel.aria.concurrentRuns": "Ejecuciones concurrentes",
504
- "panel.activity.allProjects": "Todos los proyectos",
505
- "panel.activity.loadingFeed": "Cargando feed...",
506
- "panel.feedback.savedShort": "guardado",
507
- "panel.pair.qrFailed": "No pude generar el QR.",
508
- "panel.brain.modePlan": "Plan (suscripcion)",
509
- "panel.brain.modeConsole": "Console (API key)",
510
- "panel.brain.applying": "aplicando {mode}...",
511
- "panel.brain.applied": "{mode} aplicado. El proximo turno ya usa este modo.",
512
- "panel.brain.reopenHint": "Se aplica al reabrir el panel.",
513
- "panel.brain.active": "{mode} activo",
514
- "panel.bridge.roleHost": "host",
515
- "panel.bridge.roleClient": "cliente",
516
- "panel.bridge.instanceOne": "instancia",
517
- "panel.bridge.instanceMany": "instancias",
518
- "panel.bridge.you": "vos",
519
- "panel.tip.deleteTask": "Eliminar tarea",
520
- "panel.tasks.cmdPlaceholder": "comando (ej: pnpm install)...",
521
- "panel.readAloud.code": "Codigo",
522
- "panel.readAloud.codeLang": "Codigo en {lang}",
523
- "panel.readAloud.file": "Archivo {file}",
524
- "panel.readAloud.content": "Contenido: {content}",
525
- "panel.pizarron.tabOne": "pestana",
526
- "panel.pizarron.tabMany": "pestanas"
527
- }
184
+ "pizarron.graph.orbit.speed": "Velocidad orbital",
185
+ "startup.tab.graph": "Grafo grafico",
186
+ "startup.tab.graphSem": "Grafo semantico",
187
+ "startup.tab.pendings": "Pendientes",
188
+ "startup.tab.workflow": "Workflow",
189
+ "settings.startupTabs": "Pestanas al abrir (grafo, pendings, workflow)",
190
+ "graph.term.nodes": "nodos",
191
+ "graph.term.edges": "aristas",
192
+ "coding.read": "Leyendo {x}",
193
+ "coding.read_bare": "Leyendo un archivo",
194
+ "coding.edit": "Editando {x}",
195
+ "coding.edit_bare": "Editando un archivo",
196
+ "coding.write": "Escribiendo {x}",
197
+ "coding.write_bare": "Escribiendo un archivo",
198
+ "coding.notebook_bare": "Editando notebook",
199
+ "coding.bash": "Ejecutando: {x}",
200
+ "coding.bash_bare": "Ejecutando un comando",
201
+ "coding.grep": "Buscando \"{x}\"",
202
+ "coding.grep_bare": "Buscando en el codigo",
203
+ "coding.glob": "Listando {x}",
204
+ "coding.glob_bare": "Listando archivos",
205
+ "coding.web_bare": "Leyendo la web",
206
+ "coding.websearch": "Buscando en la web: {x}",
207
+ "coding.websearch_bare": "Buscando en la web",
208
+ "coding.task": "Sub-agente: {x}",
209
+ "coding.task_bare": "Lanzando un sub-agente",
210
+ "coding.todo": "Actualizando su lista de tareas",
211
+ "coding.verb_bare": "Ejecutando un verbo yujin",
212
+ "panel.button.stop": "Detener",
213
+ "panel.status.stopping": "Deteniendo...",
214
+ "panel.status.noActiveTurn": "No habia ningun turno en curso.",
215
+ "panel.status.interruptFailed": "No se pudo enviar la interrupcion.",
216
+ "panel.status.turnInterrupted": "Turno interrumpido.",
217
+ "panel.label.interrupted": "(interrumpido)",
218
+ "panel.queue.label": "En cola",
219
+ "panel.queue.remove": "Quitar de la cola",
220
+ "panel.project.switchHint": "Cambiar de proyecto",
221
+ "panel.project.title": "Proyectos",
222
+ "panel.project.add": "Anadir proyecto...",
223
+ "panel.project.addPrompt": "Ruta absoluta del proyecto a anadir:",
224
+ "panel.project.switching": "Cambiando de proyecto...",
225
+ "startup.tab.files": "Archivos",
226
+ "panel.project.remove": "Quitar de la lista",
227
+ "panel.project.removeConfirm": "Quitar este proyecto de la lista? (no borra los archivos del disco)",
228
+ "panel.project.removed": "Proyecto quitado de la lista",
229
+ "panel.files.refresh": "Actualizar",
230
+ "panel.files.loading": "Cargando...",
231
+ "panel.files.error": "No pude leer los archivos.",
232
+ "panel.files.empty": "(sin archivos)",
233
+ "panel.files.truncated": "(lista truncada)",
234
+ "panel.files.opened": "Abierto",
235
+ "panel.files.openFailed": "No se pudo abrir el archivo.",
236
+ "panel.files.searchName": "Filtrar por nombre",
237
+ "panel.files.searchType": "Tipo (ej: ts, png)",
238
+ "panel.files.matches": "{n} coincidencias",
239
+ "panel.files.noMatches": "Sin coincidencias",
240
+ "panel.files.sortBy": "Ordenar por",
241
+ "panel.files.sortName": "Nombre",
242
+ "panel.files.sortSize": "Tamano",
243
+ "panel.files.sortType": "Tipo",
244
+ "startup.tab.tasks": "Tareas",
245
+ "settings.bridge.title": "Coordinacion entre instancias",
246
+ "settings.bridge.accept": "Aceptar mensajes dirigidos de otras instancias (los inyecta como chat)",
247
+ "settings.bridge.composePlaceholder": "Mensaje a las otras instancias...",
248
+ "settings.voice.title": "Voz",
249
+ "settings.voice.mode": "Modo",
250
+ "settings.voice.modeMic": "modo mic",
251
+ "settings.voice.stt": "STT",
252
+ "settings.voice.sttBrowser": "STT navegador",
253
+ "settings.voice.ttsEngine": "TTS engine",
254
+ "settings.voice.ttsBrowser": "TTS navegador",
255
+ "settings.voice.ttsVoice": "Voz TTS (solo Google)",
256
+ "settings.vad.title": "VAD (deteccion de silencio)",
257
+ "settings.vad.resetDefaults": "Reset defaults",
258
+ "settings.vad.engine": "Motor",
259
+ "settings.vad.engineAmplitude": "Amplitud (RMS)",
260
+ "settings.vad.engineBand": "Banda 80-400Hz",
261
+ "settings.vad.baselineWindow": "Baseline window",
262
+ "settings.vad.thresholdMult": "Threshold mult (baseline x N)",
263
+ "settings.vad.thresholdMin": "Threshold minimo",
264
+ "settings.vad.thresholdMax": "Threshold maximo",
265
+ "settings.vad.silence": "Silencio para cerrar",
266
+ "settings.vad.minVoiced": "Voz minima (anti-blip)",
267
+ "settings.vad.tick": "Tick del VAD",
268
+ "settings.vad.bandLow": "Banda voz: low (Hz)",
269
+ "settings.vad.bandHigh": "Banda voz: high (Hz)",
270
+ "settings.vad.showOverlay": "Mostrar overlay live",
271
+ "settings.vad.logStats": "Loggear stats por sesion",
272
+ "settings.brain.anthropicMode": "Anthropic: modalidad",
273
+ "settings.brain.modePlan": "Plan (suscripcion Claude)",
274
+ "settings.brain.modeConsole": "Console (API key)",
275
+ "settings.brain.modeNote": "Se aplica al reabrir el panel.",
276
+ "settings.brain.ecoEnabled": "Modo eco habilitado",
277
+ "settings.brain.ecoHint": "apagado = frontier siempre",
278
+ "settings.brain.modelEco": "Modelo eco",
279
+ "settings.brain.modelFrontier": "Modelo frontier",
280
+ "settings.brain.modelMultimodal": "Modelo multimodal",
281
+ "settings.brain.multimodalClearTitle": "Quitar el brain multimodal dedicado (vuelve al ruteo de vision automatico)",
282
+ "settings.brain.auto": "Auto",
283
+ "settings.brain.multimodalHint": "Brain dedicado para turnos con imagen. Auto = ruteo de vision automatico (el frontier si ve, o aviso si no).",
284
+ "settings.brain.geminiCache": "Cache explicito de Gemini (CachedContent)",
285
+ "settings.brain.geminiCacheHint": "Opt-in. Conviene en sesiones largas con Gemini Pro; en sesiones cortas el cache implicito gratis de 2.5 ya alcanza.",
286
+ "settings.federation.title": "Federacion de brain",
287
+ "settings.federation.intro": "Usa el brain de otro Forge (su key nunca sale de su maquina) o presta el tuyo. Tu codigo se ejecuta local; solo la inferencia viaja.",
288
+ "settings.federation.connectedTo": "Conectado a",
289
+ "settings.federation.disconnect": "Desconectar",
290
+ "settings.federation.connectMe": "Conectarme",
291
+ "settings.federation.tokenPlaceholder": "Pega el codigo de federacion",
292
+ "settings.federation.connect": "Conectar",
293
+ "settings.federation.lendBrain": "Prestar mi brain",
294
+ "settings.federation.generateCode": "Generar codigo",
295
+ "settings.federation.host": "Hospedar (responder a los hijos)",
296
+ "settings.federation.fedBrain": "Brain de federacion",
297
+ "settings.federation.fedBrainNote": "El que responde a los hijos. API directa (DeepSeek por defecto). Claude Plan no sirve para hospedar; necesita una key con saldo.",
298
+ "settings.federation.codeOnce": "Codigo (1 solo uso)",
299
+ "settings.federation.copy": "Copiar",
300
+ "settings.keys.title": "API keys (BYOK)",
301
+ "settings.keys.configure": "Configurar",
302
+ "settings.keys.remove": "Quitar",
303
+ "settings.keys.brainAnthropic": "Brain (Anthropic)",
304
+ "settings.keys.brainOpenai": "Brain (OpenAI)",
305
+ "settings.keys.brainGoogle": "Brain (Google IA)",
306
+ "settings.keys.brainDeepseek": "Brain (DeepSeek)",
307
+ "settings.keys.brainXai": "Brain (xAI / Grok)",
308
+ "settings.keys.brainMistral": "Brain (Mistral)",
309
+ "settings.keys.brainCohere": "Brain (Cohere)",
310
+ "settings.keys.sttGoogle": "STT Google",
311
+ "settings.keys.ttsGoogle": "TTS Google",
312
+ "settings.keys.ttsElevenlabs": "TTS ElevenLabs",
313
+ "settings.keys.sttWhisper": "STT Whisper",
314
+ "settings.lang.title": "Idioma",
315
+ "settings.lang.panelVoice": "Panel + voz",
316
+ "settings.lang.changeButton": "Cambiar idioma",
317
+ "settings.vault.title": "Vault (encriptado)",
318
+ "settings.vault.slots": "Slots",
319
+ "settings.vault.open": "Abrir vault",
320
+ "settings.license.email": "Email",
321
+ "settings.license.validated": "Validado",
322
+ "settings.license.connectHint": "Conecta tu cuenta de Polar. Pone el email con el que pagaste y sincronizamos tu plan automaticamente.",
323
+ "settings.license.emailPlaceholder": "email@ejemplo.com",
324
+ "settings.license.connect": "Conectar",
325
+ "settings.license.sync": "Sincronizar con Polar",
326
+ "settings.license.buy": "Comprar / activar plan",
327
+ "settings.budget.title": "Presupuesto este mes",
328
+ "settings.budget.renews": "Renueva",
329
+ "settings.budget.tokensEco": "Tokens eco",
330
+ "settings.budget.tokensFrontier": "Tokens frontier",
331
+ "settings.budget.buyExtension": "Comprar extension de tokens",
332
+ "settings.limits.title": "Limites (avanzado)",
333
+ "settings.limits.editHint": "Editar cualquier valor + tab/blur guarda.",
334
+ "settings.limits.reset": "Reset a defaults",
335
+ "settings.bookmarks.title": "Reader bookmarks",
336
+ "settings.graph.title": "Project knowledge graph",
337
+ "settings.pair.title": "Vincular telefono",
338
+ "settings.pair.hint": "Abri Forge Mobile, toca \"Vincular\" y escanea este QR. Listo.",
339
+ "settings.pair.generateQr": "Generar QR",
340
+ "settings.pair.cantRead": "La camara no lee el QR? Copia este codigo y pegalo en Forge Mobile:",
341
+ "settings.audit.viewFull": "Ver completo",
342
+ "settings.audit.close": "Cerrar",
343
+ "settings.audit.allKinds": "Todos los kinds",
344
+ "settings.audit.allModes": "Todos los modes",
345
+ "settings.audit.copyJson": "Copiar JSON",
346
+ "settings.audit.closeDetail": "Cerrar detalle",
347
+ "settings.about.title": "Acerca de",
348
+ "settings.danger.title": "Zona de peligro",
349
+ "settings.danger.warning": "Cuando esta ON, Yujin ejecuta TODA accion sin pedir confirmacion (incluye shell.exec, rm, git push --force, etc). Velocidad sobre seguridad. Todo queda registrado en audit log.",
350
+ "settings.keyEditor.placeholder": "Pega aqui tu API key",
351
+ "settings.license.title": "Licencia",
352
+ "settings.plan": "Plan",
353
+ "settings.audit.title": "Registro de auditoría",
354
+ "settings.legal.title": "Legal",
355
+ "panel.status.projectSwitchFail": "No se pudo cambiar de proyecto.",
356
+ "panel.status.projectRemoveFail": "No se pudo quitar el proyecto.",
357
+ "panel.status.projectAddFail": "No se pudo anadir el proyecto.",
358
+ "panel.status.cancelFail": "No se pudo cancelar: {reason}",
359
+ "panel.status.cancelNetError": "Error de red al cancelar shell.",
360
+ "panel.status.notEditable": "Este tipo de contenido no es editable.",
361
+ "panel.status.savedAsPicker": "Guardado como: {name} (en la ruta que elegiste en el dialog).",
362
+ "panel.status.saveAsFail": "Error en Guardar como: {error} -- usando fallback.",
363
+ "panel.status.saveFail": "Error al guardar: {error}",
364
+ "panel.status.savedAs": "Guardado como: {path} ({bytes} bytes)",
365
+ "panel.status.netError": "Error de red: {error}",
366
+ "panel.status.savedTabOnly": "Cambios guardados en la pestana (no en disco -- sin file_path).",
367
+ "panel.status.saved": "Guardado: {path} ({bytes} bytes)",
368
+ "panel.status.copied": "Copiado al portapapeles.",
369
+ "panel.status.copyFail": "No se pudo copiar.",
370
+ "panel.status.modeAvailable": "Modos disponibles: didactico, tecnico. Uso: /modo tecnico",
371
+ "panel.status.modeChangeFail": "No pude cambiar el modo: {error}",
372
+ "panel.status.modeChanged": "Modo cambiado a {target}. El proximo turno ya usa este modo.",
373
+ "panel.status.genericError": "Error: {error}",
374
+ "panel.status.brainTierAuto": "Brain tier vuelve a auto (router decide segun verbo / phase).",
375
+ "panel.status.brainTierForced": "Brain tier forzado a \"{target}\" para esta sesion. /auto vuelve al router.",
376
+ "panel.confirm.tabUnsaved": "La pestana \"{title}\" tiene cambios sin guardar. ¿Cerrar igual?",
377
+ "panel.confirm.tabsUnsaved": "Hay pestanas con cambios sin guardar. ¿Cerrar todo igual?",
378
+ "panel.confirm.discardChanges": "Descartar los cambios sin guardar?",
379
+ "panel.confirm.removeSlot": "Quitar el slot \"{slot}\"? Esto no se puede deshacer.",
380
+ "panel.confirm.removeKey": "Quitar la key de {slot}?",
381
+ "panel.prompt.saveAs": "Guardar como (path relativo al proyecto):",
382
+ "panel.voice.sttFallback": "STT del navegador no disponible; usando fallback del servidor.",
383
+ "panel.voice.noMicSupport": "Tu navegador no soporta el acceso al microfono.",
384
+ "panel.voice.recordingCountdown": "Grabando... auto-stop en {n}s",
385
+ "panel.voice.autoStopped": "Grabacion detenida automaticamente a los 55s (limite de 1 min de Google STT). Proba con algo mas corto.",
386
+ "panel.voice.noAudio": "No se capturo audio. Proba de nuevo.",
387
+ "panel.voice.audioTooLong": "Audio demasiado largo (>1 min). Limite sincronico de Google STT. Proba con algo mas corto.",
388
+ "panel.voice.ttsUnavailable": "TTS del navegador no disponible; volve a Google en la configuracion.",
389
+ "panel.voice.micClosedHalfDuplex": "Mic cerrado mientras Yujin habla (half-duplex).",
390
+ "panel.voice.micBlocked": "Microfono bloqueado. Permiti el microfono para esta app en los ajustes del navegador y volve a intentar.",
391
+ "panel.voice.noMicDevice": "No detecto microfono en este dispositivo.",
392
+ "panel.voice.micOpenFail": "No pude abrir el microfono: {error}",
393
+ "panel.voice.micOpenListening": "Mic abierto, escuchando...",
394
+ "panel.voice.listening": "Te escucho...",
395
+ "panel.voice.listeningInterim": "Te escucho... {text}",
396
+ "panel.voice.micBlockedBrowser": "Microfono bloqueado por el navegador. Hace click en el icono del candado en la barra de URL y permiti microfono, despues recarga la pagina. O cambia STT a \"google\" / \"whisper\" en la configuracion si tenes la API key.",
397
+ "panel.voice.noMicPhysical": "No detecto microfono fisico. Conecta uno o cambia STT a \"google\" / \"whisper\" en la configuracion.",
398
+ "panel.voice.networkRequired": "Web Speech requiere conexion a internet (Chrome usa Google detras). Probate sin conexion intermitente o cambia STT a \"whisper\" si tenes API key.",
399
+ "panel.voice.langNotSupported": "Tu navegador no soporta este idioma para STT. Cambia el idioma del panel a uno soportado (en, es, pt) o cambia STT a \"google\" / \"whisper\".",
400
+ "panel.voice.micError": "Error de mic: {error}",
401
+ "panel.voice.noAudioToRecognizer": "No llego audio al reconocedor: el dictado del navegador no esta capturando en esta app.",
402
+ "panel.voice.micOpenNoVoice": "Mic abierto pero no detecte voz. Acerca el microfono y habla mas fuerte; si sigue, el dictado gratis no funciona en esta PWA.",
403
+ "panel.voice.voiceNoText": "Detecte voz pero el navegador no devolvio texto (STT gratis no disponible en esta PWA).",
404
+ "panel.voice.startingDictation": "Iniciando dictado...",
405
+ "panel.voice.couldNotStartMic": "No pude iniciar el mic: {error}",
406
+ "panel.status.imageTooLarge": "Imagen muy grande (>6MB): {name}",
407
+ "panel.status.imageReady": "Imagen lista para enviar: {name}",
408
+ "panel.status.imageReadFail": "No pude leer la imagen: {error}",
409
+ "panel.tip.attachFile": "Adjuntar archivo",
410
+ "panel.tip.refreshDiscovery": "Refrescar discovery",
411
+ "panel.tip.refreshNow": "Refrescar ahora",
412
+ "panel.tip.filterByProject": "Filtrar por proyecto",
413
+ "panel.tip.concurrentRuns": "Ejecuciones concurrentes: limites global / por proyecto",
414
+ "panel.tip.mcpBridges": "MCP Bridges (F101)",
415
+ "panel.tip.activity": "Actividad de agentes + inspector de bridge + chat por agente",
416
+ "panel.tip.settings": "Ajustes (modo voz, STT, TTS, claves, idioma)",
417
+ "panel.tip.zoomOut": "Reducir zoom (Ctrl -)",
418
+ "panel.tip.zoomReset": "Restablecer zoom (Ctrl 0)",
419
+ "panel.tip.zoomIn": "Aumentar zoom (Ctrl +)",
420
+ "panel.tip.maximize": "Maximizar / restaurar (pantalla completa)",
421
+ "panel.tip.closeBoard": "Cerrar todo el pizarron",
422
+ "panel.tip.openInEditor": "Abrir en mi editor",
423
+ "panel.tip.open": "Abrir",
424
+ "panel.tip.saveAs": "Guardar como -- elegi nuevo path (relativo al proyecto)",
425
+ "panel.tip.codeModeDetail": "Detallado: archivos, diffs y comandos en vivo",
426
+ "panel.tip.codeModeZen": "Sumi-e: arte con texto ocasional",
427
+ "panel.tip.cancelShell": "Cancelar comando shell",
428
+ "panel.tip.closeTab": "Cerrar pestana",
429
+ "panel.tip.reopenNativeTabs": "Reabrir pestanas nativas cerradas",
430
+ "panel.tip.notTestedYet": "todavia no probado",
431
+ "panel.aria.activity": "Actividad",
432
+ "panel.aria.settings": "Ajustes",
433
+ "panel.aria.zoomOut": "Reducir zoom",
434
+ "panel.aria.zoomIn": "Aumentar zoom",
435
+ "panel.aria.maximize": "Maximizar",
436
+ "panel.aria.closeBoard": "cerrar todo",
437
+ "panel.aria.thinking": "pensando",
438
+ "panel.hint.boardEmpty": "Aqui se muestra contenido estructurado: codigo, tablas, documentos. Pedile a Yujin que escriba o edite algo.",
439
+ "panel.hint.planMode": "Estas en modo Plan (suscripcion). El pizarron se dibuja cuando el brain corre en modo API: cambialo en <strong>Ajustes &gt; Brain &gt; Anthropic: modalidad &gt; Console</strong> y reabri el panel.",
440
+ "panel.hint.bookmarksEmpty": "Sin bookmarks. Pedile a Yujin \"marca este punto como ...\" al leer un doc.",
441
+ "panel.voice.replyFailed": "Fallo la respuesta de voz: {err}",
442
+ "panel.voice.replyError": "Error en la respuesta de voz: {err}",
443
+ "panel.status.languageSwitchFailed": "Fallo el cambio de idioma: {err}",
444
+ "panel.status.languageListFailed": "No se pudo cargar la lista de idiomas",
445
+ "panel.legal.loading": "Cargando...",
446
+ "panel.legal.loadError": "Error {status} cargando el documento.",
447
+ "panel.legal.networkError": "Error de red: {err}",
448
+ "panel.legal.defaultTitle": "Legal",
449
+ "panel.feedback.copied": "Copiado",
450
+ "panel.feedback.copyFailed": "Fallo el copiado",
451
+ "panel.feedback.clipboardUnavailable": "Clipboard no disponible",
452
+ "panel.feedback.saving": "Guardando...",
453
+ "panel.feedback.saved": "Guardado.",
454
+ "panel.feedback.saveError": "error guardando",
455
+ "panel.feedback.netError": "error de red",
456
+ "panel.feedback.netErrorSaving": "error de red guardando",
457
+ "panel.feedback.errorPrefix": "Error: {detail}",
458
+ "panel.pair.generating": "Generando...",
459
+ "panel.pair.generateQr": "Generar QR",
460
+ "panel.pair.copy": "Copiar",
461
+ "panel.pair.expiry": "Expira en ~{mins} min. Generalo de nuevo si caduca.",
462
+ "panel.pair.qrNetError": "Error de red al generar el QR.",
463
+ "panel.audit.copyJson": "Copiar JSON",
464
+ "panel.limits.resetApplied": "Reset a defaults aplicado",
465
+ "panel.nac3.effects": "Efectos: {list}",
466
+ "panel.nac3.effectsUnknown": "desconocidos",
467
+ "panel.nac3.cancel": "Cancelar",
468
+ "panel.nac3.reject": "Rechazar",
469
+ "panel.nac3.approve": "Aprobar",
470
+ "panel.nac3.approveDestructive": "Aprobar (destructivo)",
471
+ "panel.nac3.executing": "Ejecutando...",
472
+ "panel.tts.providerBrowser": "TTS navegador",
473
+ "panel.tts.providerGoogle": "TTS Google",
474
+ "panel.tts.providerTitle": "Tocar para alternar entre navegador (SpeechSynthesis nativo, voces del SO) y Google Cloud TTS (server-side).",
475
+ "panel.stt.providerBrowser": "STT navegador",
476
+ "panel.stt.providerGoogle": "STT Google",
477
+ "panel.stt.providerWhisper": "STT Whisper",
478
+ "panel.stt.providerTitle": "Tocar para alternar entre navegador (rapido + es-AR nativo + gratis), Google Cloud STT (server-side, BYOK) o Whisper (server-side, BYOK).",
479
+ "panel.tts.voiceTitle": "Voz actual: {id} / {persona} ({gender}) -- {style}. Tocar para ciclar. Studio = articula s claro; Neural2 = natural espanol (aspira s finales).",
480
+ "panel.license.lendNeedsLicense": "activa tu licencia para prestar tu brain",
481
+ "panel.license.emailInvalid": "Pone un email valido (con @).",
482
+ "panel.license.connecting": "Conectando...",
483
+ "panel.license.savingEmail": "Guardando email + sincronizando con Polar...",
484
+ "panel.license.syncFailedRetry": "Email guardado, pero sync fallo: {err}{http}. Si recien pagaste, espera 1-2 min y dale a \"Sincronizar con Polar\".",
485
+ "panel.license.planOk": "OK -- plan: {plan}.",
486
+ "panel.license.netError": "Error de red: {err}",
487
+ "panel.license.syncing": "Sincronizando...",
488
+ "panel.license.querying": "Consultando servidor...",
489
+ "panel.license.syncError": "Error de sync: {err}{http}",
490
+ "panel.license.planUnchanged": "Plan sin cambios: {plan}",
491
+ "panel.license.planUpdated": "Plan actualizado: {before} -> {after}",
492
+ "panel.license.syncWithPolar": "Sincronizar con Polar",
493
+ "panel.license.errorWithCode": "error: {code}",
494
+ "panel.keyEditor.keyTooShort": "Key demasiado corta (min 8 chars).",
495
+ "panel.bridge.coordUnavailable": "Coordinacion no disponible.",
496
+ "panel.bridge.statusUnavailable": "no disponible",
497
+ "panel.mcp.loadingBridges": "Cargando bridges...",
498
+ "panel.tools.loading": "Cargando tools...",
499
+ "panel.agentsChat.backPairs": "< Pares",
500
+ "panel.agentsChat.noMessages": "Sin mensajes en este par.",
501
+ "panel.agentsChat.noAgents": "sin agentes",
502
+ "panel.agentsChat.pickAgent": "Elegi un agente + escribe texto antes de enviar.",
503
+ "panel.agentsChat.sending": "Enviando...",
504
+ "panel.agentsChat.errorGeneric": "Error: {err}",
505
+ "panel.whatsNew.dismiss": "Cerrar",
506
+ "panel.alert.noEditor": "No hay editor en el PATH. Copie el path: {path}",
507
+ "panel.alert.pathRelative": "El path debe ser relativo al proyecto (sin \"/\" inicial ni \"..\").",
508
+ "panel.tip.saveTo": "Guardar en {path}",
509
+ "panel.tip.saveToMemory": "(memoria)",
510
+ "panel.button.saveAs": "Guardar como...",
511
+ "panel.aria.concurrentRuns": "Ejecuciones concurrentes",
512
+ "panel.activity.allProjects": "Todos los proyectos",
513
+ "panel.activity.loadingFeed": "Cargando feed...",
514
+ "panel.feedback.savedShort": "guardado",
515
+ "panel.pair.qrFailed": "No pude generar el QR.",
516
+ "panel.brain.modePlan": "Plan (suscripcion)",
517
+ "panel.brain.modeConsole": "Console (API key)",
518
+ "panel.brain.applying": "aplicando {mode}...",
519
+ "panel.brain.applied": "{mode} aplicado. El proximo turno ya usa este modo.",
520
+ "panel.brain.reopenHint": "Se aplica al reabrir el panel.",
521
+ "panel.brain.active": "{mode} activo",
522
+ "panel.bridge.roleHost": "host",
523
+ "panel.bridge.roleClient": "cliente",
524
+ "panel.bridge.instanceOne": "instancia",
525
+ "panel.bridge.instanceMany": "instancias",
526
+ "panel.bridge.you": "vos",
527
+ "panel.tip.deleteTask": "Eliminar tarea",
528
+ "panel.tasks.cmdPlaceholder": "comando (ej: pnpm install)...",
529
+ "panel.readAloud.code": "Codigo",
530
+ "panel.readAloud.codeLang": "Codigo en {lang}",
531
+ "panel.readAloud.file": "Archivo {file}",
532
+ "panel.readAloud.content": "Contenido: {content}",
533
+ "panel.pizarron.tabOne": "pestana",
534
+ "panel.pizarron.tabMany": "pestanas"
535
+ }