@agentprojectcontext/apx 1.36.0 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -3
- package/package.json +1 -1
- package/src/core/mascot.js +80 -80
- package/src/host/daemon/api/agents.js +6 -0
- package/src/host/daemon/api/conversations.js +9 -2
- package/src/host/daemon/api/web.js +20 -1
- package/src/host/daemon/desktop-ws.js +31 -0
- package/src/host/daemon/index.js +12 -2
- package/src/interfaces/cli/commands/agent.js +20 -0
- package/src/interfaces/cli/commands/chat.js +15 -6
- package/src/interfaces/cli/commands/identity.js +20 -1
- package/src/interfaces/cli/commands/update.js +2 -0
- package/src/interfaces/cli/index.js +14 -0
- package/src/interfaces/web/dist/assets/index-CQc_5t8F.js +629 -0
- package/src/interfaces/web/dist/assets/index-CQc_5t8F.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-hwxuTPcK.css +1 -0
- package/src/interfaces/web/dist/index.html +2 -2
- package/src/interfaces/web/src/App.tsx +20 -9
- package/src/interfaces/web/src/components/ModelCombobox.tsx +1 -1
- package/src/interfaces/web/src/components/Roby.tsx +96 -0
- package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +11 -11
- package/src/interfaces/web/src/components/TelegramSendDialog.tsx +5 -5
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +2 -2
- package/src/interfaces/web/src/components/chat/ModelPicker.tsx +5 -5
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +23 -19
- package/src/interfaces/web/src/components/code/CodeArtifactsTab.tsx +10 -10
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +7 -7
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +3 -2
- package/src/interfaces/web/src/components/common/TabNav.tsx +3 -2
- package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +3 -2
- package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +2 -2
- package/src/interfaces/web/src/components/config/global-config-sections.ts +9 -9
- package/src/interfaces/web/src/components/config/project-config-sections.ts +61 -54
- package/src/interfaces/web/src/components/deck/DaemonCard.tsx +6 -5
- package/src/interfaces/web/src/components/inputs/KeyValueList.tsx +5 -4
- package/src/interfaces/web/src/components/inputs/VarTokenInput.tsx +3 -3
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +22 -9
- package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +14 -14
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +7 -7
- package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +2 -2
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +37 -37
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +44 -35
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +5 -5
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +6 -6
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +36 -36
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +15 -14
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +22 -22
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +18 -17
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +19 -18
- package/src/interfaces/web/src/hooks/useChat.ts +6 -5
- package/src/interfaces/web/src/i18n/en.ts +519 -2
- package/src/interfaces/web/src/i18n/es.ts +519 -2
- package/src/interfaces/web/src/i18n/index.ts +1 -1
- package/src/interfaces/web/src/lib/api/voice.ts +5 -5
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +14 -1
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +1 -1
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +8 -8
- package/src/interfaces/web/src/screens/base/ComingSoon.tsx +3 -2
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +12 -12
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +15 -15
- package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +37 -37
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +8 -8
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +16 -10
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +25 -24
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +2 -2
- package/src/interfaces/web/src/screens/project/ConfigTab.tsx +3 -3
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +6 -9
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +66 -52
- package/src/interfaces/web/src/screens/project/TelegramTab.tsx +1 -1
- package/src/interfaces/web/dist/assets/index-Cm0KyPoZ.css +0 -1
- package/src/interfaces/web/dist/assets/index-DJKA763h.js +0 -628
- package/src/interfaces/web/dist/assets/index-DJKA763h.js.map +0 -1
|
@@ -205,6 +205,7 @@ export const es = {
|
|
|
205
205
|
permission_mode: "Permission mode",
|
|
206
206
|
system: "Prompt extra (system)",
|
|
207
207
|
system_hint: "Texto que se prepende al system prompt base.",
|
|
208
|
+
system_ph: "(Vacío = se usa el prompt base de core/agent/prompts/super-agent-base.md)",
|
|
208
209
|
fallback_title: "Fallback chain",
|
|
209
210
|
fallback_hint: "Si el modelo activo falla, prueba estos en orden.",
|
|
210
211
|
fallback_add: "Agregar modelo a la cadena",
|
|
@@ -247,7 +248,7 @@ export const es = {
|
|
|
247
248
|
},
|
|
248
249
|
},
|
|
249
250
|
project: {
|
|
250
|
-
not_found: "
|
|
251
|
+
not_found: "Roby no encontró el proyecto {pid}: quizás se desregistró o el ID es incorrecto.",
|
|
251
252
|
rebuild: "Rebuild context",
|
|
252
253
|
rebuild_done: "Rebuild OK.",
|
|
253
254
|
unregister_confirm: "¿Desregistrar {label}? La carpeta no se borra.",
|
|
@@ -815,7 +816,8 @@ export const es = {
|
|
|
815
816
|
|
|
816
817
|
not_found: {
|
|
817
818
|
title: "404",
|
|
818
|
-
message: "
|
|
819
|
+
message: "Roby se perdió: esta página no existe o se movió.",
|
|
820
|
+
home: "Volver al inicio",
|
|
819
821
|
},
|
|
820
822
|
|
|
821
823
|
ask_panel: {
|
|
@@ -913,28 +915,142 @@ export const es = {
|
|
|
913
915
|
|
|
914
916
|
memory_panel: {
|
|
915
917
|
embeddings_title: "Embeddings (RAG)",
|
|
918
|
+
embeddings_desc: "Modelo que vectoriza el historial de todos los canales para la memoria relevante. Igual que TTS/STT: elegí un proveedor y un modelo. 'Automático' prueba local primero y cae a offline si no hay nada disponible.",
|
|
919
|
+
provider_label: "Proveedor",
|
|
920
|
+
provider_hint: "Ollama es local y gratis. Gemini/OpenAI usan la API key de su sección en Modelos (o la de abajo).",
|
|
921
|
+
mode_label: "Modo de selección",
|
|
922
|
+
mode_hint: "Cadena cae al siguiente si uno falla; Único usa exactamente el proveedor elegido.",
|
|
923
|
+
available: "disponible",
|
|
924
|
+
unavailable: "no disp.",
|
|
925
|
+
test_btn: "Probar embedding",
|
|
926
|
+
reindex_btn: "Reindexar memoria",
|
|
927
|
+
test_ok: "Embedding OK con {embedder}",
|
|
928
|
+
test_failed: "Test falló: {msg}",
|
|
929
|
+
reindexed: "Reindexado: {indexed} chunks (limpiados {cleared}).",
|
|
930
|
+
reindex_failed: "Reindex falló: {msg}",
|
|
931
|
+
save_failed: "No se pudo guardar: {msg}",
|
|
932
|
+
provider_auto: "Automático (cadena: Ollama → Gemini → OpenAI → offline)",
|
|
933
|
+
provider_ollama: "Ollama — local, sin API key (nomic-embed-text)",
|
|
934
|
+
provider_gemini: "Gemini — free tier con key (text-embedding-004)",
|
|
935
|
+
provider_openai: "OpenAI — text-embedding-3-small (cloud)",
|
|
936
|
+
provider_tf: "Offline (term-frequency, sin modelo — degradado)",
|
|
937
|
+
mode_chain: "Cadena (fallback automático)",
|
|
938
|
+
mode_single: "Único (usa solo el elegido)",
|
|
916
939
|
ollama_title: "Ollama (local)",
|
|
940
|
+
ollama_desc: "Sin API key. Corre nomic-embed-text en tu Ollama local o cloud.",
|
|
941
|
+
model_label: "Modelo",
|
|
942
|
+
base_url_label: "Base URL",
|
|
943
|
+
ollama_base_url_hint:"Vacío usa engines.ollama.base_url (default http://localhost:11434).",
|
|
917
944
|
openai_title: "OpenAI",
|
|
945
|
+
openai_desc: "text-embedding-3-small (1536 dims) u otro modelo compatible.",
|
|
946
|
+
api_key_label: "API key",
|
|
947
|
+
openai_key_hint: "Vacío reusa engines.openai.api_key. Dejalo en blanco para mantener la guardada.",
|
|
918
948
|
gemini_title: "Gemini",
|
|
949
|
+
gemini_desc: "text-embedding-004 (768 dims). Free tier con API key de Google.",
|
|
950
|
+
gemini_key_hint: "Vacío reusa engines.gemini.api_key.",
|
|
919
951
|
compaction_title: "Compactación de historial",
|
|
952
|
+
compaction_desc: "Cuando un chat supera el umbral de turnos, los más viejos se resumen con un LLM liviano (local) y se guardan como [RESUMEN COMPACTADO], manteniendo el contexto acotado. Corre fuera del hot-path: el turno actual usa el resumen que ya exista.",
|
|
953
|
+
threshold_label: "Umbral de compactación",
|
|
954
|
+
threshold_hint: "Compactar una vez que el chat supera estos turnos (por defecto 60).",
|
|
955
|
+
keep_recent_label: "Turnos recientes a preservar",
|
|
956
|
+
keep_recent_hint: "Turnos verbatim que NUNCA se compactan (por defecto 40). Debe ser menor al umbral.",
|
|
957
|
+
compact_model_label: "Modelo de compactación",
|
|
958
|
+
compact_model_hint: "LLM liviano para resumir. Ideal uno local (Ollama) para no gastar. Formato proveedor:modelo.",
|
|
959
|
+
compact_fallback_label: "Modelo de fallback",
|
|
960
|
+
compact_fallback_hint: "Se usa si el de compactación falla. Vacío cae al modelo del super-agente.",
|
|
961
|
+
compact_fallback_ph: "(vacío → modelo del super-agente)",
|
|
920
962
|
},
|
|
921
963
|
|
|
922
964
|
router_panel: {
|
|
923
965
|
title: "Router de modelos",
|
|
966
|
+
description: "Un único router general (sin casos por tarea). Elegí un proveedor y un modelo; si el activo falla, prueba la cadena de fallback en orden.",
|
|
967
|
+
badge_default: "default",
|
|
968
|
+
no_providers: "Agregá un proveedor abajo para poder elegir modelos.",
|
|
969
|
+
active_model_label: "Modelo activo (default)",
|
|
970
|
+
active_model_hint: "Proveedor + modelo. Se guarda como proveedor:modelo.",
|
|
971
|
+
fallback_title: "Cadena de fallback",
|
|
972
|
+
fallback_desc: "Si el modelo activo falla, prueba estos en orden. Click en uno para editarlo.",
|
|
973
|
+
fallback_empty: "Sin fallback configurado.",
|
|
974
|
+
add_to_chain: "Agregar a la cadena",
|
|
975
|
+
done: "listo",
|
|
976
|
+
save: "Guardar router",
|
|
977
|
+
saved: "Guardado",
|
|
978
|
+
saved_toast: "Router guardado.",
|
|
979
|
+
provider_ph: "— proveedor —",
|
|
980
|
+
provider_not_found: "⚠ {name} (no encontrado)",
|
|
981
|
+
provider_not_configured: "El proveedor \"{name}\" no está configurado.",
|
|
924
982
|
},
|
|
925
983
|
|
|
926
984
|
engines_panel: {
|
|
927
985
|
title: "Proveedores",
|
|
928
986
|
new_btn: "Nuevo proveedor",
|
|
987
|
+
description: "Proveedores LLM (API). Cada provider usa un engine/adapter (openai, ollama, …) con su key y URL.",
|
|
988
|
+
empty: "Sin providers. Agregá uno con el botón de arriba.",
|
|
989
|
+
add_card: "Agregar provider",
|
|
990
|
+
saved: "Provider guardado.",
|
|
991
|
+
saved_json: "Provider guardado (JSON).",
|
|
992
|
+
deleted: "Provider borrado.",
|
|
993
|
+
delete_confirm: "¿Borrar provider {name}?",
|
|
929
994
|
},
|
|
930
995
|
|
|
931
996
|
providers_modal: {
|
|
932
997
|
new_title: "Nuevo proveedor",
|
|
933
998
|
edit_title: "Editar {name}",
|
|
999
|
+
description: "Proveedor LLM. El motor (engine) define qué adapter usa (openai, ollama, …).",
|
|
934
1000
|
list_models_hint: "Listar los modelos reales del proveedor",
|
|
935
1001
|
toggle_active: "Activo · click para desactivar",
|
|
936
1002
|
toggle_inactive: "Inactivo · click para activar",
|
|
937
1003
|
delete: "Borrar",
|
|
1004
|
+
custom: "Custom",
|
|
1005
|
+
json_mode: "JSON",
|
|
1006
|
+
form_mode: "Volver al formulario",
|
|
1007
|
+
json_label: "Config del provider (JSON)",
|
|
1008
|
+
json_hint: "Se guarda como engines.{slug} en config.json",
|
|
1009
|
+
json_help: "Debe ser un objeto JSON válido con al menos engine. El slug se toma del formulario.",
|
|
1010
|
+
name_label: "Nombre",
|
|
1011
|
+
name_ph: "Mi provider",
|
|
1012
|
+
engine_label: "Motor (engine)",
|
|
1013
|
+
base_url_label: "URL base (base_url)",
|
|
1014
|
+
base_url_hint: "Se completa sola al elegir un proveedor.",
|
|
1015
|
+
base_url_ph: "https://api.openai.com/v1",
|
|
1016
|
+
api_key_label: "API key",
|
|
1017
|
+
api_key_hint_existing: "Dejá en blanco para mantener la actual.",
|
|
1018
|
+
api_key_hint_env: "Se guarda como secreto. Env sugerida: {env}",
|
|
1019
|
+
api_key_hint: "Se guarda como secreto.",
|
|
1020
|
+
api_key_set: "…{suffix} (ya seteada)",
|
|
1021
|
+
model_label: "Modelo por defecto",
|
|
1022
|
+
load_models: "Cargar modelos",
|
|
1023
|
+
max_tokens_label: "Máx. tokens (max_tokens)",
|
|
1024
|
+
temperature_label: "Temperatura: {value}",
|
|
1025
|
+
pricing_summary: "Análisis de tokens / pricing (opcional)",
|
|
1026
|
+
context_limit_label: "Límite de contexto (tokens)",
|
|
1027
|
+
price_input: "$ entrada / 1M",
|
|
1028
|
+
price_output: "$ salida / 1M",
|
|
1029
|
+
price_cache_read: "$ cache read / 1M",
|
|
1030
|
+
price_cache_write: "$ cache write / 1M",
|
|
1031
|
+
model_limits_label: "Límites de contexto por modelo (JSON)",
|
|
1032
|
+
active_label: "Activo (los agentes pueden usarlo)",
|
|
1033
|
+
err_slug_required: "Slug requerido.",
|
|
1034
|
+
err_slug_required_form: "Slug requerido (en el formulario).",
|
|
1035
|
+
err_slug_exists: "Ya existe un provider \"{slug}\".",
|
|
1036
|
+
err_model_limits_json: "Límites de contexto por modelo: JSON inválido.",
|
|
1037
|
+
err_json_invalid: "JSON inválido: revisá la sintaxis.",
|
|
1038
|
+
err_json_object: "El JSON debe ser un objeto con la config del provider.",
|
|
1039
|
+
err_engine_missing: "Falta \"engine\" (ej. \"anthropic\", \"ollama\").",
|
|
1040
|
+
err_save: "Error al guardar.",
|
|
1041
|
+
err_no_models: "Sin modelos. ¿Key/URL correctas?",
|
|
1042
|
+
err_list_models: "No se pudo listar modelos.",
|
|
1043
|
+
},
|
|
1044
|
+
|
|
1045
|
+
providers_card: {
|
|
1046
|
+
active: "Activo",
|
|
1047
|
+
off: "Off",
|
|
1048
|
+
model: "Modelo",
|
|
1049
|
+
base_url: "Base URL",
|
|
1050
|
+
api_key: "API key",
|
|
1051
|
+
key_set: "✓ seteada",
|
|
1052
|
+
temp: "Temp",
|
|
1053
|
+
price_io: "$ in/out (1M)",
|
|
938
1054
|
},
|
|
939
1055
|
|
|
940
1056
|
chat_ui: {
|
|
@@ -960,6 +1076,407 @@ export const es = {
|
|
|
960
1076
|
agent_detail_extra: {
|
|
961
1077
|
skills_title: "Skills & tools",
|
|
962
1078
|
},
|
|
1079
|
+
|
|
1080
|
+
voice_ui: {
|
|
1081
|
+
api_key_label: "API key",
|
|
1082
|
+
api_key_set: "…{suffix} (ya seteada)",
|
|
1083
|
+
api_key_keep_hint: "Dejá en blanco para mantener la actual.",
|
|
1084
|
+
api_key_secret_hint: "Se guarda como secreto. Env: {env}",
|
|
1085
|
+
api_key_reuse_hint: "Si lo dejás vacío, reusa {engine}. Env: {env}",
|
|
1086
|
+
err_save: "Error al guardar.",
|
|
1087
|
+
model_label: "Modelo",
|
|
1088
|
+
voice_label: "Voz",
|
|
1089
|
+
format_label: "Formato",
|
|
1090
|
+
output_format_label: "Formato de salida",
|
|
1091
|
+
voice_id_label: "Voice ID",
|
|
1092
|
+
voice_id_hint: "Voice id de ElevenLabs (vacío = default).",
|
|
1093
|
+
gemini_model_hint: "El TTS de Gemini todavía está en preview.",
|
|
1094
|
+
style_label: "Estilo (cómo debería hablar)",
|
|
1095
|
+
style_hint: "Instrucción en lenguaje natural. Vacío = sin estilo. Ej.: 'hablá en un tono alegre y pausado'.",
|
|
1096
|
+
style_ph: "hablá en un tono alegre y enérgico",
|
|
1097
|
+
piper_bin_label: "Binario (bin)",
|
|
1098
|
+
piper_bin_hint: "Ruta o nombre del CLI de piper (PATH).",
|
|
1099
|
+
piper_model_label: "Modelo (.onnx)",
|
|
1100
|
+
piper_model_hint: "Ruta absoluta al modelo de voz de piper.",
|
|
1101
|
+
piper_speaker_label: "Speaker (opcional)",
|
|
1102
|
+
piper_speaker_hint: "Speaker id para modelos multi-voz.",
|
|
1103
|
+
mock_desc: "El engine mock genera un WAV de prueba en silencio. No tiene parámetros: sirve como fallback garantizado cuando no hay ningún otro engine configurado.",
|
|
1104
|
+
selection_mode: "Modo de selección",
|
|
1105
|
+
mode_chain_desc: "Cadena con fallback: usa el primer engine disponible siguiendo el orden de abajo.",
|
|
1106
|
+
mode_single_desc: "Solo engine default: siempre usa el elegido; el resto queda configurado para otros usos.",
|
|
1107
|
+
mode_chain_btn: "Cadena (router)",
|
|
1108
|
+
mode_single_btn: "Solo engine default",
|
|
1109
|
+
move_up: "Subir",
|
|
1110
|
+
move_down: "Bajar",
|
|
1111
|
+
badge_local: "local",
|
|
1112
|
+
badge_available: "disponible",
|
|
1113
|
+
badge_unavailable: "configurado, no disponible",
|
|
1114
|
+
badge_not_configured: "sin configurar",
|
|
1115
|
+
badge_default: "default",
|
|
1116
|
+
set_as_default: "Usar como default",
|
|
1117
|
+
configure: "Configurar",
|
|
1118
|
+
stt_engine_label: "Engine de transcripción",
|
|
1119
|
+
stt_engine_hint: "Local usa faster-whisper (requiere python3 + faster-whisper). OpenAI usa la key de engines.openai.",
|
|
1120
|
+
stt_model_label: "Modelo local (whisper)",
|
|
1121
|
+
stt_model_hint: "Más grande = más preciso y más lento.",
|
|
1122
|
+
stt_language_label: "Idioma",
|
|
1123
|
+
stt_language_hint: "Para español, elegir \"Español\" mejora la precisión.",
|
|
1124
|
+
stt_provider_auto: "Automático (local, después OpenAI)",
|
|
1125
|
+
stt_provider_local: "Local — faster-whisper (offline)",
|
|
1126
|
+
stt_provider_openai: "OpenAI — Whisper-1 (cloud)",
|
|
1127
|
+
lang_auto: "Detección automática",
|
|
1128
|
+
lang_es: "Español",
|
|
1129
|
+
lang_en: "Inglés",
|
|
1130
|
+
lang_pt: "Portugués",
|
|
1131
|
+
lang_fr: "Francés",
|
|
1132
|
+
lang_it: "Italiano",
|
|
1133
|
+
lang_de: "Alemán",
|
|
1134
|
+
test_default_text: "Hola, soy APX. Esto es una prueba de voz.",
|
|
1135
|
+
test_default_engine: "Default ({name})",
|
|
1136
|
+
test_default_chain: "Default (cadena)",
|
|
1137
|
+
test_unavailable_suffix: " · no disponible",
|
|
1138
|
+
test_empty_error: "Escribí algo para decir.",
|
|
1139
|
+
test_synth_error: "No se pudo sintetizar.",
|
|
1140
|
+
test_engine_label: "Engine",
|
|
1141
|
+
test_engine_hint: "Override del default para probar.",
|
|
1142
|
+
test_style_label: "Estilo (solo Gemini)",
|
|
1143
|
+
test_style_hint: "Cómo debería hablar. Vacío = sin estilo.",
|
|
1144
|
+
test_text_label: "Texto a decir",
|
|
1145
|
+
test_text_ph: "Escribí lo que querés que diga…",
|
|
1146
|
+
say_this: "Decir esto",
|
|
1147
|
+
stop: "Detener",
|
|
1148
|
+
replay: "Repetir",
|
|
1149
|
+
engine_result: "Engine",
|
|
1150
|
+
providers_desc: "Engines de síntesis. El estado lo reporta el daemon en vivo. Elegí cuál usar por defecto.",
|
|
1151
|
+
providers_load_error: "No pude cargar los proveedores: {msg}",
|
|
1152
|
+
test_desc: "Elegí con qué engine sintetizar y, si aplica, cómo debería hablar.",
|
|
1153
|
+
stt_desc: "Engine de speech-to-text que usan el deck, Telegram y la CLI al escuchar.",
|
|
1154
|
+
toast_default_engine: "Engine default: {id}.",
|
|
1155
|
+
toast_mode_chain: "Modo: cadena con fallback.",
|
|
1156
|
+
toast_mode_single: "Modo: solo engine default.",
|
|
1157
|
+
toast_config_saved: "Configuración de voz guardada.",
|
|
1158
|
+
toast_transcription_updated: "Transcripción actualizada.",
|
|
1159
|
+
},
|
|
1160
|
+
|
|
1161
|
+
telegram_ui: {
|
|
1162
|
+
channel_dialog_desc: "POST /telegram/channels (upsert) — PATCH /telegram/channels/:name (parcial).",
|
|
1163
|
+
bot_token_hint: "Token de BotFather. Se guarda en ~/.apx/config.json.",
|
|
1164
|
+
bot_token_hint_short: "Token de BotFather.",
|
|
1165
|
+
secret_set_replace: "(seteado — escribí para reemplazar)",
|
|
1166
|
+
secret_already_set: "(ya seteado)",
|
|
1167
|
+
empty_keep: "— vacío = mantener",
|
|
1168
|
+
message_sent: "Mensaje enviado.",
|
|
1169
|
+
message_label: "Texto",
|
|
1170
|
+
send_chat_id: "chat_id: {id}",
|
|
1171
|
+
default_apx: "APX por defecto",
|
|
1172
|
+
yes: "sí",
|
|
1173
|
+
no: "no",
|
|
1174
|
+
user_id_fallback: "user_id {id}",
|
|
1175
|
+
role_assigned: "{name} → {role}",
|
|
1176
|
+
},
|
|
1177
|
+
|
|
1178
|
+
agents_ui: {
|
|
1179
|
+
model_router_default: "modelo: default del router",
|
|
1180
|
+
slug_kebab_hint: "kebab-case, ej. reviewer, my-agent, content-writer",
|
|
1181
|
+
comma_separated: "separadas por coma",
|
|
1182
|
+
body_hint: "markdown — extiende el system prompt del agente",
|
|
1183
|
+
source_user: "user",
|
|
1184
|
+
source_override: "override",
|
|
1185
|
+
source_bundled: "bundled",
|
|
1186
|
+
tab_explorer: "Explorador",
|
|
1187
|
+
type_none: "— sin tipo —",
|
|
1188
|
+
type_orchestrator: "Orquestador",
|
|
1189
|
+
type_orchestrator_desc: "Coordina el equipo y delega.",
|
|
1190
|
+
type_specialist: "Especialista",
|
|
1191
|
+
type_specialist_desc: "Experto en el dominio; corre tareas.",
|
|
1192
|
+
type_assistant: "Asistente",
|
|
1193
|
+
type_assistant_desc: "Ayudante conversacional.",
|
|
1194
|
+
type_worker: "Worker",
|
|
1195
|
+
type_worker_desc: "Corre tareas autónomas.",
|
|
1196
|
+
type_monitor: "Monitor",
|
|
1197
|
+
type_monitor_desc: "Vigila el estado y reporta.",
|
|
1198
|
+
stat_threads: "Threads",
|
|
1199
|
+
stat_records: "Records",
|
|
1200
|
+
stat_tasks: "Tasks",
|
|
1201
|
+
stat_heartbeats: "Heartbeats",
|
|
1202
|
+
config_def_desc: "definición (frontmatter + system prompt).",
|
|
1203
|
+
memory_durable_desc: "hechos durables que el agente recuerda.",
|
|
1204
|
+
running: "running",
|
|
1205
|
+
paused: "pausada",
|
|
1206
|
+
last_error: "última: error",
|
|
1207
|
+
field_tick: "Tick",
|
|
1208
|
+
field_next_tick: "Próximo tick",
|
|
1209
|
+
field_last_tick: "Último tick",
|
|
1210
|
+
field_last_run: "Última corrida",
|
|
1211
|
+
tools_label: "Tools",
|
|
1212
|
+
kind_agent: "agente",
|
|
1213
|
+
kind_memory: "memoria",
|
|
1214
|
+
kind_thread: "thread",
|
|
1215
|
+
kind_task: "task",
|
|
1216
|
+
kind_routine: "rutina",
|
|
1217
|
+
kind_hierarchy: "jerarquía",
|
|
1218
|
+
nodes_drag_hint: "{n} nodos · arrastrá para reordenar",
|
|
1219
|
+
kind_exec_agent: "Agente del proyecto",
|
|
1220
|
+
kind_exec_agent_desc: "Corre un agente del proyecto con un prompt. Vos elegís cuál.",
|
|
1221
|
+
kind_super_agent: "Super-agente",
|
|
1222
|
+
kind_super_agent_desc: "Llama al super-agente APX con un prompt.",
|
|
1223
|
+
kind_telegram: "Telegram",
|
|
1224
|
+
kind_telegram_desc: "Manda un mensaje fijo a un canal de Telegram. Sin modelo ni agente.",
|
|
1225
|
+
kind_shell: "Shell",
|
|
1226
|
+
kind_shell_desc: "Corre un comando shell. Sin prompt ni pre/post — el comando es la acción.",
|
|
1227
|
+
kind_heartbeat: "Heartbeat",
|
|
1228
|
+
kind_heartbeat_desc: "No hace nada salvo escribir una línea en los logs cada vez que corre. Sirve para confirmar que el scheduler está vivo. Si no sabés si lo necesitás, no lo uses.",
|
|
1229
|
+
unit_seconds: "segundos",
|
|
1230
|
+
unit_minutes: "minutos",
|
|
1231
|
+
unit_hours: "horas",
|
|
1232
|
+
unit_days: "días",
|
|
1233
|
+
every_n_unit: "cada {n} {unit}",
|
|
1234
|
+
every_v: "cada {v}",
|
|
1235
|
+
preset_every_10m: "cada 10 min",
|
|
1236
|
+
preset_hourly: "cada hora",
|
|
1237
|
+
preset_daily_9am: "diario 9am",
|
|
1238
|
+
preset_weekdays_9am: "días hábiles 9am",
|
|
1239
|
+
preset_manual: "Manual",
|
|
1240
|
+
var_pre_output_prompt: "Salida de los pre-commands, inyectada en el prompt.",
|
|
1241
|
+
var_llm_output: "Respuesta del agente / super-agente.",
|
|
1242
|
+
var_status: "ok | error.",
|
|
1243
|
+
var_skipped: "1 si la acción se salteó.",
|
|
1244
|
+
var_pre_output: "Salida de los pre-commands.",
|
|
1245
|
+
var_pre_output_file: "Archivo con la salida pre (para salidas grandes).",
|
|
1246
|
+
var_pre_exit: "Código de salida de los pre-commands.",
|
|
1247
|
+
var_routine: "Nombre de la rutina.",
|
|
1248
|
+
summary_runs_agent: "Corre el agente \"{agent}\"",
|
|
1249
|
+
summary_runs_agent_none: "Corre un agente (todavía no elegiste cuál)",
|
|
1250
|
+
summary_super_agent: "Llama al super-agente",
|
|
1251
|
+
summary_telegram: "Manda Telegram a \"{channel}\"",
|
|
1252
|
+
summary_runs_cmd: "Corre: {cmd}",
|
|
1253
|
+
summary_shell: "Corre un comando shell",
|
|
1254
|
+
summary_heartbeat: "Deja un heartbeat en los logs",
|
|
1255
|
+
action_agent_answers: "El agente \"{agent}\" responde el prompt",
|
|
1256
|
+
action_agent_pick_answers: "El agente (elegí uno) responde el prompt",
|
|
1257
|
+
action_super_answers: "El super-agente responde el prompt",
|
|
1258
|
+
action_telegram_channel: "Manda Telegram al canal \"{channel}\"",
|
|
1259
|
+
action_runs_shell: "Corre el comando shell",
|
|
1260
|
+
step_pre: "Pre",
|
|
1261
|
+
step_post: "Post",
|
|
1262
|
+
last_label: "última:",
|
|
1263
|
+
tg_chat_id_ph: "(usa el del canal)",
|
|
1264
|
+
tg_text_ph: "mensaje a enviar",
|
|
1265
|
+
hb_message_ph: "sigo vivo",
|
|
1266
|
+
arg_placeholder: "--flag o valor",
|
|
1267
|
+
remove_arg: "quitar arg",
|
|
1268
|
+
super_agent_label: "{persona} (super-agente)",
|
|
1269
|
+
super_agent_badge: "super-agente",
|
|
1270
|
+
},
|
|
1271
|
+
|
|
1272
|
+
modules_ui: {
|
|
1273
|
+
desktop_pos_left: "Izquierda",
|
|
1274
|
+
desktop_pos_center: "Centro",
|
|
1275
|
+
desktop_pos_right: "Derecha",
|
|
1276
|
+
desktop_theme_light: "Claro",
|
|
1277
|
+
desktop_theme_dark: "Oscuro",
|
|
1278
|
+
desktop_status_desc: "La ventana se abre desde la terminal o por arranque automático.",
|
|
1279
|
+
desktop_running: "Corriendo",
|
|
1280
|
+
desktop_stopped: "Detenida",
|
|
1281
|
+
desktop_refresh: "refrescar",
|
|
1282
|
+
desktop_from_terminal: "Desde la terminal:",
|
|
1283
|
+
desktop_autostart_desc: "Abre la ventana al iniciar sesión. Equivale a `apx desktop install` (no requiere sudo).",
|
|
1284
|
+
desktop_platform: "plataforma: {platform}",
|
|
1285
|
+
desktop_shortcut_desc: "Atajo global que muestra/oculta la ventana y empieza a escuchar.",
|
|
1286
|
+
desktop_accelerator: "Acelerador",
|
|
1287
|
+
desktop_accelerator_hint:"Formato Electron, ej. \"CommandOrControl+G\" o \"CommandOrControl+Shift+Space\". Reiniciá la ventana para aplicar.",
|
|
1288
|
+
desktop_shortcut_saved: "Atajo guardado. Reiniciá la ventana (apx desktop stop && start) para aplicarlo.",
|
|
1289
|
+
desktop_autostart_on: "Arranque automático habilitado para el próximo inicio de sesión.",
|
|
1290
|
+
desktop_autostart_off: "Arranque automático deshabilitado.",
|
|
1291
|
+
desktop_appearance_desc: "Tema de la ventana y posición en la pantalla.",
|
|
1292
|
+
desktop_theme: "Tema",
|
|
1293
|
+
desktop_restart_apply: "Reiniciá la ventana para aplicar.",
|
|
1294
|
+
desktop_theme_set: "Tema: {value}.",
|
|
1295
|
+
desktop_position: "Posición",
|
|
1296
|
+
desktop_position_hint: "\"izquierda\" / \"centro\" / \"derecha\" del borde superior.",
|
|
1297
|
+
desktop_position_set: "Posición: {value}.",
|
|
1298
|
+
desktop_activation_desc: "El plugin del daemon procesa los mensajes. El STT se configura en Voces.",
|
|
1299
|
+
desktop_enabled_toast: "Escritorio habilitado.",
|
|
1300
|
+
desktop_disabled_toast: "Escritorio deshabilitado.",
|
|
1301
|
+
desktop_plugin_on: "Plugin habilitado (responde mensajes)",
|
|
1302
|
+
desktop_plugin_off: "Plugin deshabilitado",
|
|
1303
|
+
desktop_stt_engine: "Motor de speech-to-text:",
|
|
1304
|
+
desktop_stt_engine_suffix:"(whisper local, idioma, modelo).",
|
|
1305
|
+
desktop_last_conv_desc: "El último intercambio con el agente desde la ventana flotante.",
|
|
1306
|
+
desktop_no_messages: "Todavía no hay mensajes. Mandá algo a la ventana de escritorio para que aparezca acá.",
|
|
1307
|
+
desktop_you: "Vos",
|
|
1308
|
+
desktop_roby: "Roby",
|
|
1309
|
+
desktop_empty_msg: "(vacío)",
|
|
1310
|
+
deck_widget_enabled: "Widget {id} habilitado.",
|
|
1311
|
+
deck_widget_disabled: "Widget {id} deshabilitado.",
|
|
1312
|
+
deck_save_error: "Error al guardar",
|
|
1313
|
+
deck_loading_manifest: "Cargando manifest…",
|
|
1314
|
+
deck_manifest_error: "Error al cargar el manifest.",
|
|
1315
|
+
deck_widgets_summary: "{count} widgets · {enabled} externos habilitados",
|
|
1316
|
+
deck_loading_manifest_full:"Cargando el manifest del Deck…",
|
|
1317
|
+
deck_manifest_load_failed:"No se pudo cargar el manifest del Deck.",
|
|
1318
|
+
deck_retry: "Reintentar",
|
|
1319
|
+
deck_no_widgets: "No hay widgets en el manifest.",
|
|
1320
|
+
deck_context_desc: "Información que el Deck ve desde el daemon.",
|
|
1321
|
+
deck_active_project: "Proyecto activo:",
|
|
1322
|
+
deck_none: "ninguno",
|
|
1323
|
+
deck_registered_projects:"Proyectos registrados:",
|
|
1324
|
+
deck_active_plugins: "Plugins activos:",
|
|
1325
|
+
deck_daemon_active: "activo · {uptime}",
|
|
1326
|
+
deck_daemon_started: "iniciado",
|
|
1327
|
+
deck_safety_no_shell: "sin shell directo",
|
|
1328
|
+
deck_safety_no_arbitrary:"comandos arbitrarios bloqueados",
|
|
1329
|
+
deck_safety_confirm: "las acciones peligrosas requieren confirmación",
|
|
1330
|
+
code_copied: "Copiado.",
|
|
1331
|
+
code_saved: "Guardado.",
|
|
1332
|
+
code_file_empty: "(vacío)",
|
|
1333
|
+
code_file_error: "Error: {msg}",
|
|
1334
|
+
code_stream_error: "error",
|
|
1335
|
+
code_super_agent: "super-agent",
|
|
1336
|
+
code_super_agent_desc: "Agente principal con todas las tools",
|
|
1337
|
+
code_chat_tab: "Chat",
|
|
1338
|
+
code_panel_sessions: "Lista de sesiones",
|
|
1339
|
+
code_panel_tree: "Árbol de archivos",
|
|
1340
|
+
code_panel_terminal: "Terminal",
|
|
1341
|
+
code_panel_context: "Panel de contexto",
|
|
1342
|
+
code_ctx_auto: "auto",
|
|
1343
|
+
code_ctx_mode: "Modo",
|
|
1344
|
+
code_ctx_agent: "Agente",
|
|
1345
|
+
code_ctx_msgs_value: "{user} usuario · {assistant} asistente",
|
|
1346
|
+
code_ctx_tokens_total: "Tokens Total",
|
|
1347
|
+
code_ctx_created: "Creado",
|
|
1348
|
+
code_ctx_activity: "Actividad",
|
|
1349
|
+
code_project_fallback: "proyecto {id}",
|
|
1350
|
+
code_pick_project_ph: "Elegí un proyecto…",
|
|
1351
|
+
code_artifact_exit_ok: "exit 0 — {ms}ms",
|
|
1352
|
+
code_artifact_exit_fail: "exit {code}{timeout}",
|
|
1353
|
+
code_artifact_timeout_suffix:" (timeout)",
|
|
1354
|
+
code_artifact_view_short:"Ver",
|
|
1355
|
+
code_artifact_edit_short:"Editar",
|
|
1356
|
+
code_artifact_exit_badge:"exit {code}",
|
|
1357
|
+
code_artifact_timeout: "timeout",
|
|
1358
|
+
code_artifact_truncated: "truncado",
|
|
1359
|
+
},
|
|
1360
|
+
|
|
1361
|
+
settings_ui: {
|
|
1362
|
+
bearer_label: "Bearer",
|
|
1363
|
+
global_config_desc: "Config general en ~/.apx/config.json. Editable por tabs; el JSON queda separado.",
|
|
1364
|
+
global_json_desc: "Los secretos redacted no se sobrescriben.",
|
|
1365
|
+
save_json: "Guardar JSON",
|
|
1366
|
+
expand_menu: "Expandir menú",
|
|
1367
|
+
collapse_menu: "Colapsar menú",
|
|
1368
|
+
documentation: "Documentación",
|
|
1369
|
+
kind_personal: "Personal",
|
|
1370
|
+
kind_company: "Empresa",
|
|
1371
|
+
kind_app: "App",
|
|
1372
|
+
kind_software: "Software",
|
|
1373
|
+
kind_default: "Default",
|
|
1374
|
+
kind_other: "Otro",
|
|
1375
|
+
base_menu_view: "Vista del menú Base (workspace general).",
|
|
1376
|
+
coming_soon: "Próximamente",
|
|
1377
|
+
inspector_title: "Skill Inspector (RAG por turno)",
|
|
1378
|
+
inspector_desc: "Función experimental. Cuando está activa, el agente NO recibe la lista completa de skills en su prompt; en cada mensaje un RAG local decide qué skill(s) cargar — el cuerpo completo si hay match fuerte, una sugerencia si es medio, nada si no aplica. Se reevalúa en cada turno: una skill que dejó de ser relevante desaparece del contexto.",
|
|
1379
|
+
enable_inspector: "Habilitar inspector",
|
|
1380
|
+
enable_inspector_hint: "Off = comportamiento clásico (lista de slugs + sugerencia pasiva). On = el RAG decide por turno.",
|
|
1381
|
+
on: "On",
|
|
1382
|
+
off: "Off",
|
|
1383
|
+
index_count: "Índice: {n} skills",
|
|
1384
|
+
not_indexed: "sin indexar",
|
|
1385
|
+
dim: "dim {dim}",
|
|
1386
|
+
updated_at: "actualizado {date}",
|
|
1387
|
+
reindex: "Reindexar",
|
|
1388
|
+
reindex_forced: "Reindexar (forzado)",
|
|
1389
|
+
embedder_source: "El embedder viene de Memoria (RAG). Local con Ollama, u offline si no hay proveedor configurado.",
|
|
1390
|
+
thresholds_title: "Umbrales y límites",
|
|
1391
|
+
thresholds_desc: "Ajustá qué tan agresivo es el inspector. Subir los umbrales = menos falsos positivos pero más riesgo de perderte una skill; bajarlos = al revés.",
|
|
1392
|
+
test_title: "Probar (dry-run)",
|
|
1393
|
+
test_desc: "Escribí un mensaje como lo haría un usuario y mirá qué skills cargaría/sugeriría el inspector — sin llamar al modelo. Fuerza el inspector aunque esté apagado arriba.",
|
|
1394
|
+
test_placeholder: "ej.: necesito crear un video promocional con voz en off",
|
|
1395
|
+
test_btn: "Probar",
|
|
1396
|
+
jit_empty_index: "JIT (índice vacío)",
|
|
1397
|
+
loaded_label: "Cargadas:",
|
|
1398
|
+
suggested_label: "Sugeridas:",
|
|
1399
|
+
could_not_save: "No se pudo guardar: {msg}",
|
|
1400
|
+
indexed_with: "Indexado con {embedder} (dim {dim}): +{added} ~{refreshed} -{removed}.",
|
|
1401
|
+
index_failed: "Falló el indexado: {msg}",
|
|
1402
|
+
dry_run_failed: "Falló el dry-run: {msg}",
|
|
1403
|
+
knob_load_threshold: "Umbral de carga",
|
|
1404
|
+
knob_load_threshold_hint: "Similaridad mínima para inyectar el CUERPO de la skill (alto = más estricto).",
|
|
1405
|
+
knob_hint_threshold: "Umbral de sugerencia",
|
|
1406
|
+
knob_hint_threshold_hint: "Similaridad mínima para solo SUGERIR la skill (así el agente la carga si quiere).",
|
|
1407
|
+
knob_margin: "Margen sobre la 2da",
|
|
1408
|
+
knob_margin_hint: "La primera tiene que superar a la segunda por este margen para cargar su cuerpo (evita empates flojos).",
|
|
1409
|
+
knob_max_loaded: "Máx. cuerpos cargados",
|
|
1410
|
+
knob_max_loaded_hint: "Cuántas skills se inyectan completas por turno.",
|
|
1411
|
+
knob_max_hints: "Máx. sugerencias",
|
|
1412
|
+
knob_max_hints_hint: "Cuántas skills extra se nombran como sugerencia.",
|
|
1413
|
+
knob_prompt_floor: "Largo mínimo del prompt",
|
|
1414
|
+
knob_prompt_floor_hint: "Los mensajes más cortos que esto se ignoran (evita 'ok', 'hola').",
|
|
1415
|
+
knob_body_char_cap: "Tope de chars del cuerpo",
|
|
1416
|
+
knob_body_char_cap_hint: "Recorta los cuerpos largos para que no inflen el contexto.",
|
|
1417
|
+
cfg_overrides_label: "Overrides",
|
|
1418
|
+
cfg_overrides_desc: ".apc/config.json. Solo valores específicos del proyecto; vacío hereda del global/effective.",
|
|
1419
|
+
cfg_route_to_agent: "Route to agent",
|
|
1420
|
+
cfg_super_agent_model: "Modelo del super-agente",
|
|
1421
|
+
cfg_permission_mode: "Permission mode",
|
|
1422
|
+
cfg_extra_prompt: "Prompt extra",
|
|
1423
|
+
cfg_telegram_label: "Telegram",
|
|
1424
|
+
cfg_chat_id: "Chat ID",
|
|
1425
|
+
cfg_bot_token: "Bot token",
|
|
1426
|
+
cfg_respond_with_engine: "Responder con engine",
|
|
1427
|
+
cfg_engines_label: "Engines",
|
|
1428
|
+
cfg_ollama_url: "Ollama URL",
|
|
1429
|
+
cfg_anthropic_key: "Anthropic API key",
|
|
1430
|
+
cfg_openai_key: "OpenAI API key",
|
|
1431
|
+
cfg_groq_key: "Groq API key",
|
|
1432
|
+
cfg_openrouter_key: "OpenRouter API key",
|
|
1433
|
+
cfg_gemini_key: "Gemini API key",
|
|
1434
|
+
cfg_project_label: "Proyecto",
|
|
1435
|
+
cfg_project_desc: ".apc/project.json. Metadata APC portable; sin secretos, sin runtime.",
|
|
1436
|
+
cfg_name: "Nombre",
|
|
1437
|
+
cfg_version: "Versión",
|
|
1438
|
+
cfg_apc_spec: "APC spec",
|
|
1439
|
+
cfg_apx_install: "Estado de instalación APX",
|
|
1440
|
+
cfg_apx_storage_id: "ID de storage APX",
|
|
1441
|
+
},
|
|
1442
|
+
|
|
1443
|
+
shared_ui: {
|
|
1444
|
+
skill_inspector_title: "Skill Inspector ({embedder}) eligió estas skills para este turno",
|
|
1445
|
+
tools_count: "{n} tools",
|
|
1446
|
+
tool_read_file: "Leer archivo",
|
|
1447
|
+
tool_write_file: "Escribir archivo",
|
|
1448
|
+
tool_edit_file: "Editar archivo",
|
|
1449
|
+
tool_list_files: "Listar archivos",
|
|
1450
|
+
tool_search_files: "Buscar en archivos",
|
|
1451
|
+
tool_search_messages: "Buscar mensajes",
|
|
1452
|
+
tool_tail_messages: "Últimos mensajes",
|
|
1453
|
+
tool_run_shell: "Correr shell",
|
|
1454
|
+
tool_send_telegram: "Enviar Telegram",
|
|
1455
|
+
tool_call_agent: "Llamar agente",
|
|
1456
|
+
tool_call_mcp: "Llamar MCP",
|
|
1457
|
+
tool_call_runtime: "Llamar runtime",
|
|
1458
|
+
tool_create_task: "Crear task",
|
|
1459
|
+
dedup: "dedup",
|
|
1460
|
+
args: "args",
|
|
1461
|
+
result: "result",
|
|
1462
|
+
auto: "Auto",
|
|
1463
|
+
auto_router: "Auto (decide el router)",
|
|
1464
|
+
model_filter_ph: "filtrar o escribir modelo…",
|
|
1465
|
+
loading_models: "cargando modelos…",
|
|
1466
|
+
use_value: "usar “{value}”",
|
|
1467
|
+
model_combobox_ph: "elegí o escribí un modelo…",
|
|
1468
|
+
search_variable_ph: "buscar variable…",
|
|
1469
|
+
no_matches: "sin coincidencias",
|
|
1470
|
+
create_variable: "Crear nueva variable…",
|
|
1471
|
+
kv_key_ph: "CLAVE",
|
|
1472
|
+
kv_value_ph: "valor",
|
|
1473
|
+
remove_row: "quitar fila",
|
|
1474
|
+
add_row: "Agregar fila",
|
|
1475
|
+
err_chat_failed: "Falló el chat.",
|
|
1476
|
+
err_stream_failed: "Falló el stream.",
|
|
1477
|
+
err_load_conversation: "No se pudo cargar la conversación.",
|
|
1478
|
+
err_stream: "Error de stream.",
|
|
1479
|
+
},
|
|
963
1480
|
} as const;
|
|
964
1481
|
|
|
965
1482
|
export type EsStrings = typeof es;
|
|
@@ -23,7 +23,7 @@ function readLocale(): Locale {
|
|
|
23
23
|
const saved = localStorage.getItem(STORAGE.language);
|
|
24
24
|
if (saved && saved in dictionaries) return saved as Locale;
|
|
25
25
|
} catch { /* ignore */ }
|
|
26
|
-
return "
|
|
26
|
+
return "en";
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
let activeLocale: Locale = readLocale();
|
|
@@ -114,11 +114,11 @@ export const WHISPER_MODELS = ["tiny", "base", "small", "medium", "large-v2", "l
|
|
|
114
114
|
// Friendly labels + ordering for the provider list. The daemon is the source
|
|
115
115
|
// of truth for availability; this only adds display names + a stable order.
|
|
116
116
|
export const TTS_PROVIDER_META: Record<string, { name: string; note: string; local?: boolean }> = {
|
|
117
|
-
piper: { name: "Piper", note: "Local, offline (CLI +
|
|
118
|
-
elevenlabs: { name: "ElevenLabs", note: "Cloud,
|
|
119
|
-
openai: { name: "OpenAI", note: "Cloud (tts-1 / tts-1-hd).
|
|
120
|
-
gemini: { name: "Gemini", note: "Cloud (preview).
|
|
121
|
-
mock: { name: "Mock", note: "
|
|
117
|
+
piper: { name: "Piper", note: "Local, offline (CLI + .onnx model). No API key.", local: true },
|
|
118
|
+
elevenlabs: { name: "ElevenLabs", note: "Cloud, multilingual. Requires an API key." },
|
|
119
|
+
openai: { name: "OpenAI", note: "Cloud (tts-1 / tts-1-hd). Uses your OpenAI key." },
|
|
120
|
+
gemini: { name: "Gemini", note: "Cloud (preview). Uses your Gemini key." },
|
|
121
|
+
mock: { name: "Mock", note: "Silent test engine. Always available as a fallback.", local: true },
|
|
122
122
|
};
|
|
123
123
|
|
|
124
124
|
export const TTS_PROVIDER_ORDER: TtsProviderId[] = ["piper", "elevenlabs", "openai", "gemini", "mock"];
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
} from "lucide-react";
|
|
8
8
|
import { useNavCollapse, type TabSection } from "../components/common/TabNav";
|
|
9
9
|
import { TabLayout } from "../components/common/TabLayout";
|
|
10
|
+
import { RobyEmpty } from "../components/Roby";
|
|
11
|
+
import { Button } from "../components/ui/button";
|
|
10
12
|
import { useProject } from "../hooks/useProjects";
|
|
11
13
|
import { STORAGE } from "../constants";
|
|
12
14
|
import { t } from "../i18n";
|
|
@@ -110,7 +112,18 @@ export function ProjectScreen() {
|
|
|
110
112
|
const active = (location.pathname.replace(`/p/${pid}`, "").replace(/^\//, "").split("/")[0]) as NavKey;
|
|
111
113
|
|
|
112
114
|
if (!project) {
|
|
113
|
-
return
|
|
115
|
+
return (
|
|
116
|
+
<RobyEmpty
|
|
117
|
+
testId="screen-project-not-found"
|
|
118
|
+
mood="confused"
|
|
119
|
+
message={t("project.not_found", { pid })}
|
|
120
|
+
action={
|
|
121
|
+
<Button variant="outline" onClick={() => navigate("/")}>
|
|
122
|
+
{t("not_found.home")}
|
|
123
|
+
</Button>
|
|
124
|
+
}
|
|
125
|
+
/>
|
|
126
|
+
);
|
|
114
127
|
}
|
|
115
128
|
|
|
116
129
|
const onTabChange = (key: string) => {
|
|
@@ -33,7 +33,7 @@ const SECTIONS: TabSection[] = [
|
|
|
33
33
|
items: [
|
|
34
34
|
{ key: "super_agent", label: t("settings.tabs.super_agent"), icon: Bot },
|
|
35
35
|
{ key: "engines", label: t("settings.tabs.engines"), icon: Cpu },
|
|
36
|
-
{ key: "memory", label: "
|
|
36
|
+
{ key: "memory", label: "Memory (RAG)", icon: Database },
|
|
37
37
|
{ key: "skills", label: "Skills (RAG)", icon: Sparkles },
|
|
38
38
|
],
|
|
39
39
|
},
|