J.A.R.V.I.S-rust/resources/commands/memory_pack/list.lua

16 lines
427 B
Lua
Raw Permalink Normal View History

feat: TTS backend abstraction + 4 'imba' features + Lua packs Big push driven by user feedback ("делай имбу") and web research on what voice assistants need to be the ideal: TTS backend abstraction (P0.1) - new module crates/jarvis-core/src/tts/{mod,sapi,piper,silero}.rs - TtsBackend trait with SapiBackend (current PowerShell), PiperBackend (rhasspy/piper, neural quality), SileroBackend (python subprocess) - JARVIS_TTS env var picks (sapi|piper|silero). Auto-detect Piper if binary + voice present in tools/piper/. Falls back to SAPI on missing. - SpeakOpts {lang, detached, raw} replaces ad-hoc args. text_utils sanitiser applied unless raw=true. - llm_fallback + lua/api/tts both routed through tts::backend(). - tools/piper/install.ps1 downloads piper.exe + ru_RU-irina-medium.onnx from rhasspy releases + huggingface. Smoke-test included. - tools/silero/silero_tts.py helper (PyTorch); rust spawns it as subprocess. IMBA-1 Agentic LLM router - crates/jarvis-app/src/llm_router.rs - When fuzzy/intent matcher fails, LLM picks the closest command from the full registry. Returns JSON {command_id, confidence, reason}. - Threshold-gated re-dispatch via substitute phrase. JARVIS_LLM_ROUTER=1 enables; JARVIS_LLM_ROUTER_THRESHOLD overrides 0.55 default. - Inserted in app.rs::execute_command between "no match" and existing llm_fallback chat fallback. IMBA-2 Long-term memory - crates/jarvis-core/src/long_term_memory.rs — JSON store at APP_CONFIG_DIR/long_term_memory.json. Atomic write-through. - remember/recall/search/forget/all/build_context API. - Lua bindings: jarvis.memory.* (5 functions). - llm_fallback auto-injects relevant facts (substring search of prompt) into system message before LLM call. - Pack resources/commands/memory_pack/ with 4 commands: remember, recall, forget, list. IMBA-3 Profile switching (work/game/sleep/driving/default) - crates/jarvis-core/src/profiles.rs — JSON profiles at APP_CONFIG_DIR/profiles/ Auto-seeds 5 defaults on first run with personality + allow/deny lists + greetings + emoji icons. - active_profile.txt persists choice across restart. - Lua bindings: jarvis.profile.{active,set,list,allows,active_name}. - llm_fallback prepends profile personality to system prompt. - Pack resources/commands/profile_switch/ with 6 voice triggers. IMBA-4 Multimodal screenshot + vision LLM - crates/jarvis-core/src/lua/api/vision.rs — gated on HTTP sandbox. - jarvis.vision.screenshot() captures via PowerShell System.Drawing. - jarvis.vision.describe(prompt?) sends base64 PNG to Groq vision model (default llama-3.2-11b-vision-preview, override via GROQ_VISION_MODEL). - Pack resources/commands/vision/ with 2 commands: describe + read_error. P0.2 Continuous conversation grace window - config::CONVERSATION_GRACE_MS = 30_000. - app.rs: after command result, if grace_ms > 0 keep listening WITHOUT re-wake for the grace duration. Existing CMS_WAIT_DELAY back-dated so the existing timeout fires at start + grace_ms. Tests: 24/24 jarvis-core unit tests pass (including 5 text_utils). Build: cargo build --release -p jarvis-app and -p jarvis-gui both succeed on Windows MSVC (VS 2026 Enterprise vcvars64). Notes for setup: - Piper voice install: pwsh tools/piper/install.ps1 (downloads ~90 MB). - GROQ_TOKEN needed for IMBA-1 (router) and IMBA-4 (vision). - All features are opt-in via env vars or auto-detect; existing SAPI + fuzzy match path remains the default.
2026-05-15 15:32:44 +03:00
local recs = jarvis.memory.all()
if #recs == 0 then
refactor: maintainability pass — dedup, central env config, cmd helpers, tests, ARCHITECTURE.md User asked the code stays easy to fix/extend as the feature surface grows. This commit refactors what was duplicated, centralises what was scattered, adds tests where there were none, and writes the architecture doc that contributors will need. Deduplication - tts::play_wav extracted to tts/mod.rs as pub(crate). Was identical in piper.rs and silero.rs (~25 lines × 2). Both backends now call super::play_wav. Centralised env config - new crates/jarvis-core/src/runtime_config.rs — single doc-file for every JARVIS_* / GROQ_* / OLLAMA_* env var. Includes: - ENV_* constants with doc comments - get(name) / get_bool(name, default) / get_parse(name, default) helpers - feature-flag wrappers: llm_tts_enabled(), llm_router_enabled(), llm_router_threshold() - log_effective_config() prints active values on startup - migrated llm_fallback (JARVIS_LLM_TTS), llm_router (JARVIS_LLM_ROUTER, JARVIS_LLM_ROUTER_THRESHOLD) to use the new helpers. Pattern set for future migrations. Lua boilerplate killer - new crates/jarvis-core/src/lua/api/cmd.rs exposing: jarvis.cmd.ok(msg?) — play_ok + speak + {chain=false} jarvis.cmd.chain_ok(msg?) — same but chain=true jarvis.cmd.error(msg?) — play_error + speak + {chain=false} jarvis.cmd.not_found(msg?) — play_not_found + speak + {chain=false} jarvis.cmd.silent_ok / silent_error - refactored 5 packs (daily_briefing/off, memory_pack/list, pomodoro/stop, habit_nudge/stop_all, scheduler/clear) — each lost 3-4 lines of repetitive play_*/speak/return boilerplate. Pattern for future packs documented in ARCHITECTURE.md. Tests (was 32, now 49) - long_term_memory: 8 new tests for normalize_key, search_in (rank, limit, empty), build_context_from (empty + populated), serde round-trips for MemoryRecord and Store. Extracted pure logic (search_in, build_context_from) into pub(crate) functions to enable testing without global state. - profiles: 6 new tests for Profile::allows_command (empty/whitelist/blacklist/ deny-wins-over-allow), serde round-trip with all fields + minimal-fields tolerance via #[serde(default)]. - runtime_config: 2 tests for get_bool / get_parse defaults. - All 49 tests pass. New mood/energy log pack - resources/commands/mood_log/ with 2 commands: mood.record "запиши настроение 7" / "сегодня мне грустно" → stores timestamped entry via jarvis.memory.remember mood.recap "как прошла неделя" → LLM summarises last 30 entries - Showcase: composes memory + llm + cmd helpers in <30 lines per script. ARCHITECTURE.md (new, 250 lines) - Crate layout, data flow diagram (mic→action 10 steps), per-module responsibility table, configuration layers, TTS pipeline diagram, Lua sandbox details with API quick-ref, background-services overview, "how to add a pack/feature/TTS backend" recipes, test coverage map, build instructions with MSVC env, git workflow with Forgejo NO_PROXY trick. - Aimed at someone who just cloned the repo and needs to fix a bug fast. Build: cargo build --release -p jarvis-app -p jarvis-gui both green. Tests: 49/49 jarvis-core unit tests pass.
2026-05-15 16:06:18 +03:00
return jarvis.cmd.ok("Я пока ничего о вас не запомнил.")
feat: TTS backend abstraction + 4 'imba' features + Lua packs Big push driven by user feedback ("делай имбу") and web research on what voice assistants need to be the ideal: TTS backend abstraction (P0.1) - new module crates/jarvis-core/src/tts/{mod,sapi,piper,silero}.rs - TtsBackend trait with SapiBackend (current PowerShell), PiperBackend (rhasspy/piper, neural quality), SileroBackend (python subprocess) - JARVIS_TTS env var picks (sapi|piper|silero). Auto-detect Piper if binary + voice present in tools/piper/. Falls back to SAPI on missing. - SpeakOpts {lang, detached, raw} replaces ad-hoc args. text_utils sanitiser applied unless raw=true. - llm_fallback + lua/api/tts both routed through tts::backend(). - tools/piper/install.ps1 downloads piper.exe + ru_RU-irina-medium.onnx from rhasspy releases + huggingface. Smoke-test included. - tools/silero/silero_tts.py helper (PyTorch); rust spawns it as subprocess. IMBA-1 Agentic LLM router - crates/jarvis-app/src/llm_router.rs - When fuzzy/intent matcher fails, LLM picks the closest command from the full registry. Returns JSON {command_id, confidence, reason}. - Threshold-gated re-dispatch via substitute phrase. JARVIS_LLM_ROUTER=1 enables; JARVIS_LLM_ROUTER_THRESHOLD overrides 0.55 default. - Inserted in app.rs::execute_command between "no match" and existing llm_fallback chat fallback. IMBA-2 Long-term memory - crates/jarvis-core/src/long_term_memory.rs — JSON store at APP_CONFIG_DIR/long_term_memory.json. Atomic write-through. - remember/recall/search/forget/all/build_context API. - Lua bindings: jarvis.memory.* (5 functions). - llm_fallback auto-injects relevant facts (substring search of prompt) into system message before LLM call. - Pack resources/commands/memory_pack/ with 4 commands: remember, recall, forget, list. IMBA-3 Profile switching (work/game/sleep/driving/default) - crates/jarvis-core/src/profiles.rs — JSON profiles at APP_CONFIG_DIR/profiles/ Auto-seeds 5 defaults on first run with personality + allow/deny lists + greetings + emoji icons. - active_profile.txt persists choice across restart. - Lua bindings: jarvis.profile.{active,set,list,allows,active_name}. - llm_fallback prepends profile personality to system prompt. - Pack resources/commands/profile_switch/ with 6 voice triggers. IMBA-4 Multimodal screenshot + vision LLM - crates/jarvis-core/src/lua/api/vision.rs — gated on HTTP sandbox. - jarvis.vision.screenshot() captures via PowerShell System.Drawing. - jarvis.vision.describe(prompt?) sends base64 PNG to Groq vision model (default llama-3.2-11b-vision-preview, override via GROQ_VISION_MODEL). - Pack resources/commands/vision/ with 2 commands: describe + read_error. P0.2 Continuous conversation grace window - config::CONVERSATION_GRACE_MS = 30_000. - app.rs: after command result, if grace_ms > 0 keep listening WITHOUT re-wake for the grace duration. Existing CMS_WAIT_DELAY back-dated so the existing timeout fires at start + grace_ms. Tests: 24/24 jarvis-core unit tests pass (including 5 text_utils). Build: cargo build --release -p jarvis-app and -p jarvis-gui both succeed on Windows MSVC (VS 2026 Enterprise vcvars64). Notes for setup: - Piper voice install: pwsh tools/piper/install.ps1 (downloads ~90 MB). - GROQ_TOKEN needed for IMBA-1 (router) and IMBA-4 (vision). - All features are opt-in via env vars or auto-detect; existing SAPI + fuzzy match path remains the default.
2026-05-15 15:32:44 +03:00
end
local count = #recs
local sample = math.min(count, 5)
local line = string.format("Помню %d фактов. Первые: ", count)
for i = 1, sample do
line = line .. recs[i].key
if i < sample then line = line .. ", " end
end
line = line .. "."
refactor: maintainability pass — dedup, central env config, cmd helpers, tests, ARCHITECTURE.md User asked the code stays easy to fix/extend as the feature surface grows. This commit refactors what was duplicated, centralises what was scattered, adds tests where there were none, and writes the architecture doc that contributors will need. Deduplication - tts::play_wav extracted to tts/mod.rs as pub(crate). Was identical in piper.rs and silero.rs (~25 lines × 2). Both backends now call super::play_wav. Centralised env config - new crates/jarvis-core/src/runtime_config.rs — single doc-file for every JARVIS_* / GROQ_* / OLLAMA_* env var. Includes: - ENV_* constants with doc comments - get(name) / get_bool(name, default) / get_parse(name, default) helpers - feature-flag wrappers: llm_tts_enabled(), llm_router_enabled(), llm_router_threshold() - log_effective_config() prints active values on startup - migrated llm_fallback (JARVIS_LLM_TTS), llm_router (JARVIS_LLM_ROUTER, JARVIS_LLM_ROUTER_THRESHOLD) to use the new helpers. Pattern set for future migrations. Lua boilerplate killer - new crates/jarvis-core/src/lua/api/cmd.rs exposing: jarvis.cmd.ok(msg?) — play_ok + speak + {chain=false} jarvis.cmd.chain_ok(msg?) — same but chain=true jarvis.cmd.error(msg?) — play_error + speak + {chain=false} jarvis.cmd.not_found(msg?) — play_not_found + speak + {chain=false} jarvis.cmd.silent_ok / silent_error - refactored 5 packs (daily_briefing/off, memory_pack/list, pomodoro/stop, habit_nudge/stop_all, scheduler/clear) — each lost 3-4 lines of repetitive play_*/speak/return boilerplate. Pattern for future packs documented in ARCHITECTURE.md. Tests (was 32, now 49) - long_term_memory: 8 new tests for normalize_key, search_in (rank, limit, empty), build_context_from (empty + populated), serde round-trips for MemoryRecord and Store. Extracted pure logic (search_in, build_context_from) into pub(crate) functions to enable testing without global state. - profiles: 6 new tests for Profile::allows_command (empty/whitelist/blacklist/ deny-wins-over-allow), serde round-trip with all fields + minimal-fields tolerance via #[serde(default)]. - runtime_config: 2 tests for get_bool / get_parse defaults. - All 49 tests pass. New mood/energy log pack - resources/commands/mood_log/ with 2 commands: mood.record "запиши настроение 7" / "сегодня мне грустно" → stores timestamped entry via jarvis.memory.remember mood.recap "как прошла неделя" → LLM summarises last 30 entries - Showcase: composes memory + llm + cmd helpers in <30 lines per script. ARCHITECTURE.md (new, 250 lines) - Crate layout, data flow diagram (mic→action 10 steps), per-module responsibility table, configuration layers, TTS pipeline diagram, Lua sandbox details with API quick-ref, background-services overview, "how to add a pack/feature/TTS backend" recipes, test coverage map, build instructions with MSVC env, git workflow with Forgejo NO_PROXY trick. - Aimed at someone who just cloned the repo and needs to fix a bug fast. Build: cargo build --release -p jarvis-app -p jarvis-gui both green. Tests: 49/49 jarvis-core unit tests pass.
2026-05-15 16:06:18 +03:00
return jarvis.cmd.ok(line)