@agentprojectcontext/apx 1.37.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 +11 -0
- package/package.json +1 -1
- package/src/core/mascot.js +80 -80
- 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-B6sYFQFa.css → index-hwxuTPcK.css} +1 -1
- package/src/interfaces/web/dist/index.html +2 -2
- package/src/interfaces/web/src/App.tsx +15 -24
- 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 +517 -1
- package/src/interfaces/web/src/i18n/es.ts +517 -1
- 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-DsADpObh.js +0 -633
- 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 || "
|
|
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 || "
|
|
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: "
|
|
330
|
+
parts: [...m.parts, { kind: "text", text: t("code_module.stopped") }],
|
|
330
331
|
}));
|
|
331
332
|
} else {
|
|
332
|
-
onError?.((e as Error)?.message || "
|
|
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 || "
|
|
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: "
|
|
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;
|