@agentprojectcontext/apx 1.37.0 → 1.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +11 -0
  2. package/package.json +1 -1
  3. package/src/core/mascot.js +80 -80
  4. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js +629 -0
  5. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js.map +1 -0
  6. package/src/interfaces/web/dist/assets/{index-B6sYFQFa.css → index-hwxuTPcK.css} +1 -1
  7. package/src/interfaces/web/dist/index.html +2 -2
  8. package/src/interfaces/web/src/App.tsx +15 -24
  9. package/src/interfaces/web/src/components/ModelCombobox.tsx +1 -1
  10. package/src/interfaces/web/src/components/Roby.tsx +96 -0
  11. package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +11 -11
  12. package/src/interfaces/web/src/components/TelegramSendDialog.tsx +5 -5
  13. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +2 -2
  14. package/src/interfaces/web/src/components/chat/ModelPicker.tsx +5 -5
  15. package/src/interfaces/web/src/components/chat/ToolCall.tsx +23 -19
  16. package/src/interfaces/web/src/components/code/CodeArtifactsTab.tsx +10 -10
  17. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +7 -7
  18. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +3 -2
  19. package/src/interfaces/web/src/components/common/TabNav.tsx +3 -2
  20. package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +3 -2
  21. package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +2 -2
  22. package/src/interfaces/web/src/components/config/global-config-sections.ts +9 -9
  23. package/src/interfaces/web/src/components/config/project-config-sections.ts +61 -54
  24. package/src/interfaces/web/src/components/deck/DaemonCard.tsx +6 -5
  25. package/src/interfaces/web/src/components/inputs/KeyValueList.tsx +5 -4
  26. package/src/interfaces/web/src/components/inputs/VarTokenInput.tsx +3 -3
  27. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +22 -9
  28. package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +1 -1
  29. package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +1 -1
  30. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +14 -14
  31. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +3 -3
  32. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +7 -7
  33. package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +2 -2
  34. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +37 -37
  35. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +44 -35
  36. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +5 -5
  37. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +3 -3
  38. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +1 -1
  39. package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +3 -3
  40. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +1 -1
  41. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +6 -6
  42. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +36 -36
  43. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +15 -14
  44. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +22 -22
  45. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +18 -17
  46. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +19 -18
  47. package/src/interfaces/web/src/hooks/useChat.ts +6 -5
  48. package/src/interfaces/web/src/i18n/en.ts +517 -1
  49. package/src/interfaces/web/src/i18n/es.ts +517 -1
  50. package/src/interfaces/web/src/i18n/index.ts +1 -1
  51. package/src/interfaces/web/src/lib/api/voice.ts +5 -5
  52. package/src/interfaces/web/src/screens/ProjectScreen.tsx +14 -1
  53. package/src/interfaces/web/src/screens/SettingsScreen.tsx +1 -1
  54. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +8 -8
  55. package/src/interfaces/web/src/screens/base/ComingSoon.tsx +3 -2
  56. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +12 -12
  57. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +15 -15
  58. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +37 -37
  59. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +8 -8
  60. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +16 -10
  61. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +25 -24
  62. package/src/interfaces/web/src/screens/project/ChatTab.tsx +2 -2
  63. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +3 -3
  64. package/src/interfaces/web/src/screens/project/McpsTab.tsx +6 -9
  65. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +66 -52
  66. package/src/interfaces/web/src/screens/project/TelegramTab.tsx +1 -1
  67. package/src/interfaces/web/dist/assets/index-DsADpObh.js +0 -633
  68. package/src/interfaces/web/dist/assets/index-DsADpObh.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { useCallback, useRef, useState } from "react";
2
2
  import { SuperAgent, Agents, Conversations } from "../lib/api";
3
3
  import type { ChatStreamEvent, ChatUsage, ConversationMessage } from "../types/daemon";
4
+ import { t } from "../i18n";
4
5
 
5
6
  export type ToolStatus = "running" | "done" | "error" | "deduped";
6
7
 
@@ -259,7 +260,7 @@ export function useChat(pid: string, onError?: (msg: string) => void): UseChatRe
259
260
  const applyEvent = useCallback(
260
261
  (ev: ChatStreamEvent) => {
261
262
  if (ev.type === "error") {
262
- onError?.(ev.error || "stream error");
263
+ onError?.(ev.error || t("shared_ui.err_stream"));
263
264
  return;
264
265
  }
265
266
  patchLast((m) => applyStreamEvent(m, ev));
@@ -302,7 +303,7 @@ export function useChat(pid: string, onError?: (msg: string) => void): UseChatRe
302
303
  parts: [{ kind: "text", text: out.text }],
303
304
  }));
304
305
  } catch (e) {
305
- onError?.((e as Error)?.message || "fallo");
306
+ onError?.((e as Error)?.message || t("shared_ui.err_chat_failed"));
306
307
  setMsgs((curr) => curr.filter((_, i) => i !== curr.length - 1));
307
308
  } finally {
308
309
  setStreaming(false);
@@ -326,10 +327,10 @@ export function useChat(pid: string, onError?: (msg: string) => void): UseChatRe
326
327
  patchLast((m) => ({
327
328
  ...m,
328
329
  pending: false,
329
- parts: [...m.parts, { kind: "text", text: "[detenido]" }],
330
+ parts: [...m.parts, { kind: "text", text: t("code_module.stopped") }],
330
331
  }));
331
332
  } else {
332
- onError?.((e as Error)?.message || "stream falló");
333
+ onError?.((e as Error)?.message || t("shared_ui.err_stream_failed"));
333
334
  setMsgs((curr) => curr.filter((_, i) => i !== curr.length - 1));
334
335
  }
335
336
  } finally {
@@ -364,7 +365,7 @@ export function useChat(pid: string, onError?: (msg: string) => void): UseChatRe
364
365
  setConversationId(conversationId);
365
366
  setMsgs(loaded);
366
367
  } catch (e) {
367
- onError?.((e as Error)?.message || "could not load conversation");
368
+ onError?.((e as Error)?.message || t("shared_ui.err_load_conversation"));
368
369
  }
369
370
  },
370
371
  [pid, streaming, onError],
@@ -204,6 +204,7 @@ export const en = {
204
204
  permission_mode: "Permission mode",
205
205
  system: "Extra prompt (system)",
206
206
  system_hint: "Text prepended to the base system prompt.",
207
+ system_ph: "(Empty = the base prompt from core/agent/prompts/super-agent-base.md is used)",
207
208
  fallback_title: "Fallback chain",
208
209
  fallback_hint: "If the active model fails, these are tried in order.",
209
210
  fallback_add: "Add model to chain",
@@ -246,7 +247,7 @@ export const en = {
246
247
  },
247
248
  },
248
249
  project: {
249
- not_found: "Project {pid} not found.",
250
+ not_found: "Roby couldn't find project {pid}: it may have been unregistered, or the ID is wrong.",
250
251
  rebuild: "Rebuild context",
251
252
  rebuild_done: "Rebuild OK.",
252
253
  unregister_confirm: "Unregister {label}? The folder is not deleted.",
@@ -916,28 +917,142 @@ export const en = {
916
917
 
917
918
  memory_panel: {
918
919
  embeddings_title: "Embeddings (RAG)",
920
+ embeddings_desc: "Model that vectorizes the history of all channels for relevant memory. Just like TTS/STT: pick a provider and model. 'Automatic' tries local first and falls back to offline if nothing is available.",
921
+ provider_label: "Provider",
922
+ provider_hint: "Ollama is local and free. Gemini/OpenAI use the API key from their section in Models (or the one below).",
923
+ mode_label: "Selection mode",
924
+ mode_hint: "Chain falls back to the next if one fails; Single uses exactly the chosen provider.",
925
+ available: "available",
926
+ unavailable: "unavail.",
927
+ test_btn: "Test embedding",
928
+ reindex_btn: "Reindex memory",
929
+ test_ok: "Embedding OK with {embedder}",
930
+ test_failed: "Test failed: {msg}",
931
+ reindexed: "Reindexed: {indexed} chunks (cleared {cleared}).",
932
+ reindex_failed: "Reindex failed: {msg}",
933
+ save_failed: "Could not save: {msg}",
934
+ provider_auto: "Automatic (chain: Ollama → Gemini → OpenAI → offline)",
935
+ provider_ollama: "Ollama — local, no API key (nomic-embed-text)",
936
+ provider_gemini: "Gemini — free tier with key (text-embedding-004)",
937
+ provider_openai: "OpenAI — text-embedding-3-small (cloud)",
938
+ provider_tf: "Offline (term-frequency, no model — degraded)",
939
+ mode_chain: "Chain (automatic fallback)",
940
+ mode_single: "Single (uses only the chosen one)",
919
941
  ollama_title: "Ollama (local)",
942
+ ollama_desc: "No API key. Runs nomic-embed-text on your local or cloud Ollama.",
943
+ model_label: "Model",
944
+ base_url_label: "Base URL",
945
+ ollama_base_url_hint:"Empty uses engines.ollama.base_url (default http://localhost:11434).",
920
946
  openai_title: "OpenAI",
947
+ openai_desc: "text-embedding-3-small (1536 dims) or another compatible model.",
948
+ api_key_label: "API key",
949
+ openai_key_hint: "Empty reuses engines.openai.api_key. Leave it blank to keep the saved one.",
921
950
  gemini_title: "Gemini",
951
+ gemini_desc: "text-embedding-004 (768 dims). Free tier with a Google API key.",
952
+ gemini_key_hint: "Empty reuses engines.gemini.api_key.",
922
953
  compaction_title: "History compaction",
954
+ compaction_desc: "When a chat exceeds the turn threshold, the oldest turns are summarized with a lightweight (local) LLM and saved as [COMPACTED SUMMARY], keeping context bounded. Runs off the hot-path: the current turn uses whatever summary already exists.",
955
+ threshold_label: "Compaction threshold",
956
+ threshold_hint: "Compact once the chat exceeds these turns (default 60).",
957
+ keep_recent_label: "Recent turns to preserve",
958
+ keep_recent_hint: "Verbatim turns that are NEVER compacted (default 40). Must be lower than the threshold.",
959
+ compact_model_label: "Compaction model",
960
+ compact_model_hint: "Lightweight LLM for summarizing. Ideally a local one (Ollama) to avoid cost. Format provider:model.",
961
+ compact_fallback_label: "Fallback model",
962
+ compact_fallback_hint: "Used if the compaction one fails. Empty falls back to the super-agent model.",
963
+ compact_fallback_ph: "(empty → super-agent model)",
923
964
  },
924
965
 
925
966
  router_panel: {
926
967
  title: "Model router",
968
+ description: "A single general router (no per-task cases). Pick a provider and model; if the active one fails, it tries the fallback chain in order.",
969
+ badge_default: "default",
970
+ no_providers: "Add a provider below to be able to pick models.",
971
+ active_model_label: "Active model (default)",
972
+ active_model_hint: "Provider + model. Saved as provider:model.",
973
+ fallback_title: "Fallback chain",
974
+ fallback_desc: "If the active model fails, it tries these in order. Click one to edit it.",
975
+ fallback_empty: "No fallback configured.",
976
+ add_to_chain: "Add to the chain",
977
+ done: "done",
978
+ save: "Save router",
979
+ saved: "Saved",
980
+ saved_toast: "Router saved.",
981
+ provider_ph: "— provider —",
982
+ provider_not_found: "⚠ {name} (not found)",
983
+ provider_not_configured: "The provider \"{name}\" is not configured.",
927
984
  },
928
985
 
929
986
  engines_panel: {
930
987
  title: "Providers",
931
988
  new_btn: "New provider",
989
+ description: "LLM providers (API). Each provider uses an engine/adapter (openai, ollama, …) with its key and URL.",
990
+ empty: "No providers. Add one with the button above.",
991
+ add_card: "Add provider",
992
+ saved: "Provider saved.",
993
+ saved_json: "Provider saved (JSON).",
994
+ deleted: "Provider deleted.",
995
+ delete_confirm: "Delete provider {name}?",
932
996
  },
933
997
 
934
998
  providers_modal: {
935
999
  new_title: "New provider",
936
1000
  edit_title: "Edit {name}",
1001
+ description: "LLM provider. The engine defines which adapter it uses (openai, ollama, …).",
937
1002
  list_models_hint: "List the provider's actual models",
938
1003
  toggle_active: "Active · click to deactivate",
939
1004
  toggle_inactive: "Inactive · click to activate",
940
1005
  delete: "Delete",
1006
+ custom: "Custom",
1007
+ json_mode: "JSON",
1008
+ form_mode: "Back to form",
1009
+ json_label: "Provider config (JSON)",
1010
+ json_hint: "Saved as engines.{slug} in config.json",
1011
+ json_help: "Must be a valid JSON object with at least engine. The slug is taken from the form.",
1012
+ name_label: "Name",
1013
+ name_ph: "My provider",
1014
+ engine_label: "Engine",
1015
+ base_url_label: "Base URL (base_url)",
1016
+ base_url_hint: "Auto-filled when you pick a provider.",
1017
+ base_url_ph: "https://api.openai.com/v1",
1018
+ api_key_label: "API key",
1019
+ api_key_hint_existing: "Leave blank to keep the current one.",
1020
+ api_key_hint_env: "Stored as a secret. Suggested env: {env}",
1021
+ api_key_hint: "Stored as a secret.",
1022
+ api_key_set: "…{suffix} (already set)",
1023
+ model_label: "Default model",
1024
+ load_models: "Load models",
1025
+ max_tokens_label: "Max tokens (max_tokens)",
1026
+ temperature_label: "Temperature: {value}",
1027
+ pricing_summary: "Token analysis / pricing (optional)",
1028
+ context_limit_label: "Context limit (tokens)",
1029
+ price_input: "$ input / 1M",
1030
+ price_output: "$ output / 1M",
1031
+ price_cache_read: "$ cache read / 1M",
1032
+ price_cache_write: "$ cache write / 1M",
1033
+ model_limits_label: "Per-model context limits (JSON)",
1034
+ active_label: "Active (agents can use it)",
1035
+ err_slug_required: "Slug required.",
1036
+ err_slug_required_form: "Slug required (in the form).",
1037
+ err_slug_exists: "A provider \"{slug}\" already exists.",
1038
+ err_model_limits_json: "Per-model context limits: invalid JSON.",
1039
+ err_json_invalid: "Invalid JSON: check the syntax.",
1040
+ err_json_object: "The JSON must be an object with the provider config.",
1041
+ err_engine_missing: "Missing \"engine\" (e.g. \"anthropic\", \"ollama\").",
1042
+ err_save: "Error saving.",
1043
+ err_no_models: "No models. Correct key/URL?",
1044
+ err_list_models: "Could not list models.",
1045
+ },
1046
+
1047
+ providers_card: {
1048
+ active: "Active",
1049
+ off: "Off",
1050
+ model: "Model",
1051
+ base_url: "Base URL",
1052
+ api_key: "API key",
1053
+ key_set: "✓ set",
1054
+ temp: "Temp",
1055
+ price_io: "$ in/out (1M)",
941
1056
  },
942
1057
 
943
1058
  chat_ui: {
@@ -963,4 +1078,405 @@ export const en = {
963
1078
  agent_detail_extra: {
964
1079
  skills_title: "Skills & tools",
965
1080
  },
1081
+
1082
+ voice_ui: {
1083
+ api_key_label: "API key",
1084
+ api_key_set: "…{suffix} (already set)",
1085
+ api_key_keep_hint: "Leave blank to keep the current one.",
1086
+ api_key_secret_hint: "Stored as a secret. Env: {env}",
1087
+ api_key_reuse_hint: "Reuses {engine} if left blank. Env: {env}",
1088
+ err_save: "Error while saving.",
1089
+ model_label: "Model",
1090
+ voice_label: "Voice",
1091
+ format_label: "Format",
1092
+ output_format_label: "Output format",
1093
+ voice_id_label: "Voice ID",
1094
+ voice_id_hint: "ElevenLabs voice id (empty = default).",
1095
+ gemini_model_hint: "Gemini TTS is still in preview.",
1096
+ style_label: "Style (how it should speak)",
1097
+ style_hint: "Natural-language instruction. Empty = no style. E.g.: 'speak in a cheerful, unhurried tone'.",
1098
+ style_ph: "speak in a cheerful, energetic tone",
1099
+ piper_bin_label: "Binary (bin)",
1100
+ piper_bin_hint: "Path or name of the piper CLI (PATH).",
1101
+ piper_model_label: "Model (.onnx)",
1102
+ piper_model_hint: "Absolute path to the piper voice model.",
1103
+ piper_speaker_label: "Speaker (optional)",
1104
+ piper_speaker_hint: "Speaker id for multi-voice models.",
1105
+ mock_desc: "The mock engine generates a silent test WAV. It has no parameters: it serves as a guaranteed fallback when no other engine is configured.",
1106
+ selection_mode: "Selection mode",
1107
+ mode_chain_desc: "Chain with fallback: uses the first available engine following the order below.",
1108
+ mode_single_desc: "Default engine only: always uses the chosen one; the rest stay configured for other purposes.",
1109
+ mode_chain_btn: "Chain (router)",
1110
+ mode_single_btn: "Default engine only",
1111
+ move_up: "Move up",
1112
+ move_down: "Move down",
1113
+ badge_local: "local",
1114
+ badge_available: "available",
1115
+ badge_unavailable: "configured, unavailable",
1116
+ badge_not_configured: "not configured",
1117
+ badge_default: "default",
1118
+ set_as_default: "Set as default",
1119
+ configure: "Configure",
1120
+ stt_engine_label: "Transcription engine",
1121
+ stt_engine_hint: "Local uses faster-whisper (requires python3 + faster-whisper). OpenAI uses the engines.openai key.",
1122
+ stt_model_label: "Local model (whisper)",
1123
+ stt_model_hint: "Bigger = more accurate and slower.",
1124
+ stt_language_label: "Language",
1125
+ stt_language_hint: "For Spanish, setting \"Spanish\" improves accuracy.",
1126
+ stt_provider_auto: "Automatic (local, then OpenAI)",
1127
+ stt_provider_local: "Local — faster-whisper (offline)",
1128
+ stt_provider_openai: "OpenAI — Whisper-1 (cloud)",
1129
+ lang_auto: "Auto-detect",
1130
+ lang_es: "Spanish",
1131
+ lang_en: "English",
1132
+ lang_pt: "Portuguese",
1133
+ lang_fr: "French",
1134
+ lang_it: "Italian",
1135
+ lang_de: "German",
1136
+ test_default_text: "Hi, I'm APX. This is a voice test.",
1137
+ test_default_engine: "Default ({name})",
1138
+ test_default_chain: "Default (chain)",
1139
+ test_unavailable_suffix: " · unavailable",
1140
+ test_empty_error: "Type something to say.",
1141
+ test_synth_error: "Could not synthesize.",
1142
+ test_engine_label: "Engine",
1143
+ test_engine_hint: "Override the default for testing.",
1144
+ test_style_label: "Style (Gemini only)",
1145
+ test_style_hint: "How it should speak. Empty = no style.",
1146
+ test_text_label: "Text to say",
1147
+ test_text_ph: "Type what you want it to say…",
1148
+ say_this: "Say this",
1149
+ stop: "Stop",
1150
+ replay: "Replay",
1151
+ engine_result: "Engine",
1152
+ providers_desc: "Synthesis engines. Status is reported live by the daemon. Pick which one to use by default.",
1153
+ providers_load_error: "Could not load providers: {msg}",
1154
+ test_desc: "Pick which engine to synthesize with and, if applicable, how it should speak.",
1155
+ stt_desc: "Speech-to-text engine used by the deck, Telegram, and the CLI when listening.",
1156
+ toast_default_engine: "Default engine: {id}.",
1157
+ toast_mode_chain: "Mode: chain with fallback.",
1158
+ toast_mode_single: "Mode: default engine only.",
1159
+ toast_config_saved: "Voice configuration saved.",
1160
+ toast_transcription_updated: "Transcription updated.",
1161
+ },
1162
+
1163
+ telegram_ui: {
1164
+ channel_dialog_desc: "POST /telegram/channels (upsert) — PATCH /telegram/channels/:name (partial).",
1165
+ bot_token_hint: "BotFather token. Stored in ~/.apx/config.json.",
1166
+ bot_token_hint_short: "BotFather token.",
1167
+ secret_set_replace: "(set — type to replace)",
1168
+ secret_already_set: "(already set)",
1169
+ empty_keep: "— empty = keep",
1170
+ message_sent: "Message sent.",
1171
+ message_label: "Text",
1172
+ send_chat_id: "chat_id: {id}",
1173
+ default_apx: "default APX",
1174
+ yes: "yes",
1175
+ no: "no",
1176
+ user_id_fallback: "user_id {id}",
1177
+ role_assigned: "{name} → {role}",
1178
+ },
1179
+
1180
+ agents_ui: {
1181
+ model_router_default: "model: router default",
1182
+ slug_kebab_hint: "kebab-case, e.g. reviewer, my-agent, content-writer",
1183
+ comma_separated: "comma-separated",
1184
+ body_hint: "markdown — extends the agent's system prompt",
1185
+ source_user: "user",
1186
+ source_override: "override",
1187
+ source_bundled: "bundled",
1188
+ tab_explorer: "Explorer",
1189
+ type_none: "— no type —",
1190
+ type_orchestrator: "Orchestrator",
1191
+ type_orchestrator_desc: "Coordinates the team and delegates.",
1192
+ type_specialist: "Specialist",
1193
+ type_specialist_desc: "Domain expert; runs tasks.",
1194
+ type_assistant: "Assistant",
1195
+ type_assistant_desc: "Conversational helper.",
1196
+ type_worker: "Worker",
1197
+ type_worker_desc: "Runs autonomous tasks.",
1198
+ type_monitor: "Monitor",
1199
+ type_monitor_desc: "Watches state and reports.",
1200
+ stat_threads: "Threads",
1201
+ stat_records: "Records",
1202
+ stat_tasks: "Tasks",
1203
+ stat_heartbeats: "Heartbeats",
1204
+ config_def_desc: "definition (frontmatter + system prompt).",
1205
+ memory_durable_desc: "durable facts the agent remembers.",
1206
+ running: "running",
1207
+ paused: "paused",
1208
+ last_error: "last: error",
1209
+ field_tick: "Tick",
1210
+ field_next_tick: "Next tick",
1211
+ field_last_tick: "Last tick",
1212
+ field_last_run: "Last run",
1213
+ tools_label: "Tools",
1214
+ kind_agent: "agent",
1215
+ kind_memory: "memory",
1216
+ kind_thread: "thread",
1217
+ kind_task: "task",
1218
+ kind_routine: "routine",
1219
+ kind_hierarchy: "hierarchy",
1220
+ nodes_drag_hint: "{n} nodes · drag to rearrange",
1221
+ kind_exec_agent: "Project agent",
1222
+ kind_exec_agent_desc: "Runs a project agent with a prompt. You pick which one.",
1223
+ kind_super_agent: "Super-agent",
1224
+ kind_super_agent_desc: "Calls the APX super-agent with a prompt.",
1225
+ kind_telegram: "Telegram",
1226
+ kind_telegram_desc: "Sends a fixed message to a Telegram channel. No model or agent.",
1227
+ kind_shell: "Shell",
1228
+ kind_shell_desc: "Runs a shell command. No prompt or pre/post — the command is the action.",
1229
+ kind_heartbeat: "Heartbeat",
1230
+ kind_heartbeat_desc: "Does nothing except write a line to the logs each time it runs. Useful to confirm the scheduler is alive. If you don't know whether you need it, don't use it.",
1231
+ unit_seconds: "seconds",
1232
+ unit_minutes: "minutes",
1233
+ unit_hours: "hours",
1234
+ unit_days: "days",
1235
+ every_n_unit: "every {n} {unit}",
1236
+ every_v: "every {v}",
1237
+ preset_every_10m: "every 10 min",
1238
+ preset_hourly: "hourly",
1239
+ preset_daily_9am: "daily 9am",
1240
+ preset_weekdays_9am: "weekdays 9am",
1241
+ preset_manual: "Manual",
1242
+ var_pre_output_prompt: "Output of the pre-commands, injected into the prompt.",
1243
+ var_llm_output: "Response from the agent / super-agent.",
1244
+ var_status: "ok | error.",
1245
+ var_skipped: "1 if the action was skipped.",
1246
+ var_pre_output: "Output of the pre-commands.",
1247
+ var_pre_output_file: "File with the pre output (for large outputs).",
1248
+ var_pre_exit: "Exit code of the pre-commands.",
1249
+ var_routine: "Name of the routine.",
1250
+ summary_runs_agent: "Runs the agent \"{agent}\"",
1251
+ summary_runs_agent_none: "Runs an agent (none chosen yet)",
1252
+ summary_super_agent: "Calls the super-agent",
1253
+ summary_telegram: "Sends Telegram to \"{channel}\"",
1254
+ summary_runs_cmd: "Runs: {cmd}",
1255
+ summary_shell: "Runs a shell command",
1256
+ summary_heartbeat: "Leaves a heartbeat in the logs",
1257
+ action_agent_answers: "Agent \"{agent}\" answers the prompt",
1258
+ action_agent_pick_answers: "Agent (pick one) answers the prompt",
1259
+ action_super_answers: "The super-agent answers the prompt",
1260
+ action_telegram_channel: "Sends Telegram to channel \"{channel}\"",
1261
+ action_runs_shell: "Runs the shell command",
1262
+ step_pre: "Pre",
1263
+ step_post: "Post",
1264
+ last_label: "last:",
1265
+ tg_chat_id_ph: "(uses the channel's)",
1266
+ tg_text_ph: "message to send",
1267
+ hb_message_ph: "still alive",
1268
+ arg_placeholder: "--flag or value",
1269
+ remove_arg: "remove arg",
1270
+ super_agent_label: "{persona} (super-agent)",
1271
+ super_agent_badge: "super-agent",
1272
+ },
1273
+
1274
+ modules_ui: {
1275
+ desktop_pos_left: "Left",
1276
+ desktop_pos_center: "Center",
1277
+ desktop_pos_right: "Right",
1278
+ desktop_theme_light: "Light",
1279
+ desktop_theme_dark: "Dark",
1280
+ desktop_status_desc: "The window launches from the terminal or via autostart.",
1281
+ desktop_running: "Running",
1282
+ desktop_stopped: "Stopped",
1283
+ desktop_refresh: "refresh",
1284
+ desktop_from_terminal: "From terminal:",
1285
+ desktop_autostart_desc: "Launches the window at user login. Equivalent to `apx desktop install` (no sudo required).",
1286
+ desktop_platform: "platform: {platform}",
1287
+ desktop_shortcut_desc: "Global hotkey that shows/hides the window and starts listening.",
1288
+ desktop_accelerator: "Accelerator",
1289
+ desktop_accelerator_hint:"Electron format, e.g. \"CommandOrControl+G\" or \"CommandOrControl+Shift+Space\". Restart the window to apply.",
1290
+ desktop_shortcut_saved: "Shortcut saved. Restart the window (apx desktop stop && start) to apply it.",
1291
+ desktop_autostart_on: "Autostart enabled for the next login.",
1292
+ desktop_autostart_off: "Autostart disabled.",
1293
+ desktop_appearance_desc: "Window theme and position on the screen.",
1294
+ desktop_theme: "Theme",
1295
+ desktop_restart_apply: "Restart the window to apply.",
1296
+ desktop_theme_set: "Theme: {value}.",
1297
+ desktop_position: "Position",
1298
+ desktop_position_hint: "\"left\" / \"center\" / \"right\" of the top edge.",
1299
+ desktop_position_set: "Position: {value}.",
1300
+ desktop_activation_desc: "The daemon plugin processes the messages. STT is configured in Voices.",
1301
+ desktop_enabled_toast: "Desktop enabled.",
1302
+ desktop_disabled_toast: "Desktop disabled.",
1303
+ desktop_plugin_on: "Plugin enabled (replies to messages)",
1304
+ desktop_plugin_off: "Plugin disabled",
1305
+ desktop_stt_engine: "Speech-to-text engine:",
1306
+ desktop_stt_engine_suffix:"(local whisper, language, model).",
1307
+ desktop_last_conv_desc: "The latest exchange with the agent from the floating window.",
1308
+ desktop_no_messages: "No messages yet. Send something to the desktop window for it to appear here.",
1309
+ desktop_you: "You",
1310
+ desktop_roby: "Roby",
1311
+ desktop_empty_msg: "(empty)",
1312
+ deck_widget_enabled: "Widget {id} enabled.",
1313
+ deck_widget_disabled: "Widget {id} disabled.",
1314
+ deck_save_error: "Error while saving",
1315
+ deck_loading_manifest: "Loading manifest…",
1316
+ deck_manifest_error: "Error loading the manifest.",
1317
+ deck_widgets_summary: "{count} widgets · {enabled} external enabled",
1318
+ deck_loading_manifest_full:"Loading the Deck manifest…",
1319
+ deck_manifest_load_failed:"Could not load the Deck manifest.",
1320
+ deck_retry: "Retry",
1321
+ deck_no_widgets: "No widgets in the manifest.",
1322
+ deck_context_desc: "Information the Deck sees from the daemon.",
1323
+ deck_active_project: "Active project:",
1324
+ deck_none: "none",
1325
+ deck_registered_projects:"Registered projects:",
1326
+ deck_active_plugins: "Active plugins:",
1327
+ deck_daemon_active: "active · {uptime}",
1328
+ deck_daemon_started: "started",
1329
+ deck_safety_no_shell: "no direct shell",
1330
+ deck_safety_no_arbitrary:"arbitrary commands blocked",
1331
+ deck_safety_confirm: "dangerous actions require confirmation",
1332
+ code_copied: "Copied.",
1333
+ code_saved: "Saved.",
1334
+ code_file_empty: "(empty)",
1335
+ code_file_error: "Error: {msg}",
1336
+ code_stream_error: "error",
1337
+ code_super_agent: "super-agent",
1338
+ code_super_agent_desc: "Main agent with all tools",
1339
+ code_chat_tab: "Chat",
1340
+ code_panel_sessions: "Session list",
1341
+ code_panel_tree: "File tree",
1342
+ code_panel_terminal: "Terminal",
1343
+ code_panel_context: "Context panel",
1344
+ code_ctx_auto: "auto",
1345
+ code_ctx_mode: "Mode",
1346
+ code_ctx_agent: "Agent",
1347
+ code_ctx_msgs_value: "{user} user · {assistant} assistant",
1348
+ code_ctx_tokens_total: "Total Tokens",
1349
+ code_ctx_created: "Created",
1350
+ code_ctx_activity: "Activity",
1351
+ code_project_fallback: "project {id}",
1352
+ code_pick_project_ph: "Pick a project…",
1353
+ code_artifact_exit_ok: "exit 0 — {ms}ms",
1354
+ code_artifact_exit_fail: "exit {code}{timeout}",
1355
+ code_artifact_timeout_suffix:" (timeout)",
1356
+ code_artifact_view_short:"View",
1357
+ code_artifact_edit_short:"Edit",
1358
+ code_artifact_exit_badge:"exit {code}",
1359
+ code_artifact_timeout: "timeout",
1360
+ code_artifact_truncated: "truncated",
1361
+ },
1362
+
1363
+ settings_ui: {
1364
+ bearer_label: "Bearer",
1365
+ global_config_desc: "General config in ~/.apx/config.json. Editable by tabs; JSON stays separate.",
1366
+ global_json_desc: "Redacted secrets are not overwritten.",
1367
+ save_json: "Save JSON",
1368
+ expand_menu: "Expand menu",
1369
+ collapse_menu: "Collapse menu",
1370
+ documentation: "Documentation",
1371
+ kind_personal: "Personal",
1372
+ kind_company: "Company",
1373
+ kind_app: "App",
1374
+ kind_software: "Software",
1375
+ kind_default: "Default",
1376
+ kind_other: "Other",
1377
+ base_menu_view: "Base menu view (general workspace).",
1378
+ coming_soon: "Coming soon",
1379
+ inspector_title: "Skill Inspector (per-turn RAG)",
1380
+ inspector_desc: "Experimental feature. When active, the agent does NOT receive the full skill list in its prompt; on each message a local RAG decides which skill(s) to load — the full body on a strong match, a suggestion on a medium match, nothing if it doesn't apply. It is re-evaluated every turn: a skill that stopped being relevant disappears from the context.",
1381
+ enable_inspector: "Enable inspector",
1382
+ enable_inspector_hint: "Off = classic behavior (slug list + passive suggestion). On = the RAG decides per turn.",
1383
+ on: "On",
1384
+ off: "Off",
1385
+ index_count: "Index: {n} skills",
1386
+ not_indexed: "not indexed",
1387
+ dim: "dim {dim}",
1388
+ updated_at: "updated {date}",
1389
+ reindex: "Reindex",
1390
+ reindex_forced: "Reindex (forced)",
1391
+ embedder_source: "The embedder comes from Memory (RAG). Local with Ollama, or offline if no provider is set.",
1392
+ thresholds_title: "Thresholds and limits",
1393
+ thresholds_desc: "Tune how aggressive the inspector is. Raising the thresholds = fewer false positives but more risk of missing a skill; lowering them = the opposite.",
1394
+ test_title: "Test (dry-run)",
1395
+ test_desc: "Type a message the way a user would and see which skills the inspector would load/suggest — without calling the model. Forces the inspector on even if it's off above.",
1396
+ test_placeholder: "e.g.: I need to create a promo video with voiceover",
1397
+ test_btn: "Test",
1398
+ jit_empty_index: "JIT (empty index)",
1399
+ loaded_label: "Loaded:",
1400
+ suggested_label: "Suggested:",
1401
+ could_not_save: "Could not save: {msg}",
1402
+ indexed_with: "Indexed with {embedder} (dim {dim}): +{added} ~{refreshed} -{removed}.",
1403
+ index_failed: "Index failed: {msg}",
1404
+ dry_run_failed: "Dry-run failed: {msg}",
1405
+ knob_load_threshold: "Load threshold",
1406
+ knob_load_threshold_hint: "Minimum similarity to inject the skill's BODY (high = stricter).",
1407
+ knob_hint_threshold: "Hint threshold",
1408
+ knob_hint_threshold_hint: "Minimum similarity to only SUGGEST the skill (so the agent loads it if it wants).",
1409
+ knob_margin: "Margin over the 2nd",
1410
+ knob_margin_hint: "The top must beat the second by this margin to load its body (avoids weak ties).",
1411
+ knob_max_loaded: "Max. loaded bodies",
1412
+ knob_max_loaded_hint: "How many skills are injected in full per turn.",
1413
+ knob_max_hints: "Max. hints",
1414
+ knob_max_hints_hint: "How many extra skills are named as a suggestion.",
1415
+ knob_prompt_floor: "Minimum prompt length",
1416
+ knob_prompt_floor_hint: "Messages shorter than this are ignored (avoids 'ok', 'hi').",
1417
+ knob_body_char_cap: "Body char cap",
1418
+ knob_body_char_cap_hint: "Trims long skill bodies so they don't bloat the context.",
1419
+ cfg_overrides_label: "Overrides",
1420
+ cfg_overrides_desc: ".apc/config.json. Only project-specific values; empty inherits global/effective.",
1421
+ cfg_route_to_agent: "Route to agent",
1422
+ cfg_super_agent_model: "Super-agent model",
1423
+ cfg_permission_mode: "Permission mode",
1424
+ cfg_extra_prompt: "Extra prompt",
1425
+ cfg_telegram_label: "Telegram",
1426
+ cfg_chat_id: "Chat ID",
1427
+ cfg_bot_token: "Bot token",
1428
+ cfg_respond_with_engine: "Respond with engine",
1429
+ cfg_engines_label: "Engines",
1430
+ cfg_ollama_url: "Ollama URL",
1431
+ cfg_anthropic_key: "Anthropic API key",
1432
+ cfg_openai_key: "OpenAI API key",
1433
+ cfg_groq_key: "Groq API key",
1434
+ cfg_openrouter_key: "OpenRouter API key",
1435
+ cfg_gemini_key: "Gemini API key",
1436
+ cfg_project_label: "Project",
1437
+ cfg_project_desc: ".apc/project.json. Portable APC metadata; no secrets, no runtime.",
1438
+ cfg_name: "Name",
1439
+ cfg_version: "Version",
1440
+ cfg_apc_spec: "APC spec",
1441
+ cfg_apx_install: "APX install state",
1442
+ cfg_apx_storage_id: "APX storage id",
1443
+ },
1444
+
1445
+ shared_ui: {
1446
+ skill_inspector_title: "Skill Inspector ({embedder}) chose these skills for this turn",
1447
+ tools_count: "{n} tools",
1448
+ tool_read_file: "Read file",
1449
+ tool_write_file: "Write file",
1450
+ tool_edit_file: "Edit file",
1451
+ tool_list_files: "List files",
1452
+ tool_search_files: "Search in files",
1453
+ tool_search_messages: "Search messages",
1454
+ tool_tail_messages: "Latest messages",
1455
+ tool_run_shell: "Run shell",
1456
+ tool_send_telegram: "Send Telegram",
1457
+ tool_call_agent: "Call agent",
1458
+ tool_call_mcp: "Call MCP",
1459
+ tool_call_runtime: "Call runtime",
1460
+ tool_create_task: "Create task",
1461
+ dedup: "dedup",
1462
+ args: "args",
1463
+ result: "result",
1464
+ auto: "Auto",
1465
+ auto_router: "Auto (router decides)",
1466
+ model_filter_ph: "filter or type a model…",
1467
+ loading_models: "loading models…",
1468
+ use_value: "use “{value}”",
1469
+ model_combobox_ph: "pick or type a model…",
1470
+ search_variable_ph: "search variable…",
1471
+ no_matches: "no matches",
1472
+ create_variable: "Create new variable…",
1473
+ kv_key_ph: "KEY",
1474
+ kv_value_ph: "value",
1475
+ remove_row: "remove row",
1476
+ add_row: "Add row",
1477
+ err_chat_failed: "Chat failed.",
1478
+ err_stream_failed: "Stream failed.",
1479
+ err_load_conversation: "Could not load conversation.",
1480
+ err_stream: "Stream error.",
1481
+ },
966
1482
  } as const;