@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.
Files changed (79) hide show
  1. package/README.md +81 -3
  2. package/package.json +1 -1
  3. package/src/core/mascot.js +80 -80
  4. package/src/host/daemon/api/agents.js +6 -0
  5. package/src/host/daemon/api/conversations.js +9 -2
  6. package/src/host/daemon/api/web.js +20 -1
  7. package/src/host/daemon/desktop-ws.js +31 -0
  8. package/src/host/daemon/index.js +12 -2
  9. package/src/interfaces/cli/commands/agent.js +20 -0
  10. package/src/interfaces/cli/commands/chat.js +15 -6
  11. package/src/interfaces/cli/commands/identity.js +20 -1
  12. package/src/interfaces/cli/commands/update.js +2 -0
  13. package/src/interfaces/cli/index.js +14 -0
  14. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js +629 -0
  15. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js.map +1 -0
  16. package/src/interfaces/web/dist/assets/index-hwxuTPcK.css +1 -0
  17. package/src/interfaces/web/dist/index.html +2 -2
  18. package/src/interfaces/web/src/App.tsx +20 -9
  19. package/src/interfaces/web/src/components/ModelCombobox.tsx +1 -1
  20. package/src/interfaces/web/src/components/Roby.tsx +96 -0
  21. package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +11 -11
  22. package/src/interfaces/web/src/components/TelegramSendDialog.tsx +5 -5
  23. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +2 -2
  24. package/src/interfaces/web/src/components/chat/ModelPicker.tsx +5 -5
  25. package/src/interfaces/web/src/components/chat/ToolCall.tsx +23 -19
  26. package/src/interfaces/web/src/components/code/CodeArtifactsTab.tsx +10 -10
  27. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +7 -7
  28. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +3 -2
  29. package/src/interfaces/web/src/components/common/TabNav.tsx +3 -2
  30. package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +3 -2
  31. package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +2 -2
  32. package/src/interfaces/web/src/components/config/global-config-sections.ts +9 -9
  33. package/src/interfaces/web/src/components/config/project-config-sections.ts +61 -54
  34. package/src/interfaces/web/src/components/deck/DaemonCard.tsx +6 -5
  35. package/src/interfaces/web/src/components/inputs/KeyValueList.tsx +5 -4
  36. package/src/interfaces/web/src/components/inputs/VarTokenInput.tsx +3 -3
  37. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +22 -9
  38. package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +1 -1
  39. package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +1 -1
  40. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +14 -14
  41. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +3 -3
  42. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +7 -7
  43. package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +2 -2
  44. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +37 -37
  45. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +44 -35
  46. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +5 -5
  47. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +3 -3
  48. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +1 -1
  49. package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +3 -3
  50. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +1 -1
  51. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +6 -6
  52. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +36 -36
  53. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +15 -14
  54. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +22 -22
  55. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +18 -17
  56. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +19 -18
  57. package/src/interfaces/web/src/hooks/useChat.ts +6 -5
  58. package/src/interfaces/web/src/i18n/en.ts +519 -2
  59. package/src/interfaces/web/src/i18n/es.ts +519 -2
  60. package/src/interfaces/web/src/i18n/index.ts +1 -1
  61. package/src/interfaces/web/src/lib/api/voice.ts +5 -5
  62. package/src/interfaces/web/src/screens/ProjectScreen.tsx +14 -1
  63. package/src/interfaces/web/src/screens/SettingsScreen.tsx +1 -1
  64. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +8 -8
  65. package/src/interfaces/web/src/screens/base/ComingSoon.tsx +3 -2
  66. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +12 -12
  67. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +15 -15
  68. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +37 -37
  69. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +8 -8
  70. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +16 -10
  71. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +25 -24
  72. package/src/interfaces/web/src/screens/project/ChatTab.tsx +2 -2
  73. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +3 -3
  74. package/src/interfaces/web/src/screens/project/McpsTab.tsx +6 -9
  75. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +66 -52
  76. package/src/interfaces/web/src/screens/project/TelegramTab.tsx +1 -1
  77. package/src/interfaces/web/dist/assets/index-Cm0KyPoZ.css +0 -1
  78. package/src/interfaces/web/dist/assets/index-DJKA763h.js +0 -628
  79. package/src/interfaces/web/dist/assets/index-DJKA763h.js.map +0 -1
@@ -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.",
@@ -817,7 +818,8 @@ export const en = {
817
818
 
818
819
  not_found: {
819
820
  title: "404",
820
- message: "That route does not exist.",
821
+ message: "Roby got lost: this page doesn't exist or has moved.",
822
+ home: "Back to home",
821
823
  },
822
824
 
823
825
  ask_panel: {
@@ -915,28 +917,142 @@ export const en = {
915
917
 
916
918
  memory_panel: {
917
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)",
918
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).",
919
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.",
920
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.",
921
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)",
922
964
  },
923
965
 
924
966
  router_panel: {
925
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.",
926
984
  },
927
985
 
928
986
  engines_panel: {
929
987
  title: "Providers",
930
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}?",
931
996
  },
932
997
 
933
998
  providers_modal: {
934
999
  new_title: "New provider",
935
1000
  edit_title: "Edit {name}",
1001
+ description: "LLM provider. The engine defines which adapter it uses (openai, ollama, …).",
936
1002
  list_models_hint: "List the provider's actual models",
937
1003
  toggle_active: "Active · click to deactivate",
938
1004
  toggle_inactive: "Inactive · click to activate",
939
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)",
940
1056
  },
941
1057
 
942
1058
  chat_ui: {
@@ -962,4 +1078,405 @@ export const en = {
962
1078
  agent_detail_extra: {
963
1079
  skills_title: "Skills & tools",
964
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
+ },
965
1482
  } as const;