J.A.R.V.I.S-rust/resources/commands/personality/compliment.lua

33 lines
1.6 KiB
Lua
Raw Normal View History

feat: real-Jarvis Wave 4 — personality, idle banter, persistent history, offline math, DDG search Personality pack (`resources/commands/personality/`): - 5 voice commands × ~7-29 phrases each across RU and EN. - personality.greet: 4 time-of-day buckets (morning/midday/evening/night), pulls one of ~7 lines per bucket per language. - personality.thanks / .compliment / .how_are_you / .tony_quote. - how_are_you embeds live memory size + active profile via jarvis.health() and jarvis.memory.all() for a "feels alive" effect. - All use jarvis.cmd.ok helpers, no inline PowerShell SAPI. - Built by sub-agent. Verified: 6 rust command tests + 60 python tests. Idle banter (`crates/jarvis-core/src/idle_banter.rs`): - Background thread chimes in periodically without being asked. Gated by JARVIS_IDLE_BANTER env (default OFF — intrusion is opt-in). - Quiet hours 23:00–07:00, skipped under "sleep" profile, paused during active interactions via `pause()`. - 30+ static offline lines split into RU/EN × morning/evening/generic buckets — no network required. - Lua API jarvis.banter.{fire, pause, resume, enabled}. - New voice pack `banter/` exposes "скажи что-нибудь интересное", "помолчи", "можешь говорить". - 6 unit tests covering pool selection, quiet hours, interval clamp, pause/resume, opt-in default. Conversation continuity (`crates/jarvis-core/src/llm/history.rs`): - New `ConversationHistory::with_persistence(path)` builder. Every push/clear/pop atomically writes to `<APP_CONFIG_DIR>/llm_history.json` so daemon restart picks up the thread. - System prompt is intentionally NOT persisted — comes from current init call so prompt edits take effect immediately on restart. - `llm::init_history` wires the path in automatically. - 4 new tests: round-trip, clear wipes file, corrupt file tolerated, len/is_empty helpers. Offline-first math (`resources/commands/math/math.lua`): - Was: always-LLM, hard fail without GROQ_TOKEN, inline PowerShell SAPI. - Now: shunting-yard parser handles 95% of voice queries in <50ms — no network, no token. Russian operator words ("плюс", "умножить на", "в степени", "квадрат", ...) normalised to symbols first. Patterns for "корень из X" and "X процентов от Y". Falls back to LLM only on parse failure (word problems / equations / unit conversions). - Drops inline PowerShell — speaks via jarvis.cmd.ok. - 10-case shunting-yard kernel test added (basic ops, precedence, parens, unary minus, div-by-zero, garbage rejected). DuckDuckGo Instant Answer (`resources/commands/ddg_answer/`): - New pack — short factual Q&A without API key. Trigger phrases "что такое", "кто такой", "расскажи про", "what is", etc. - Reads AbstractText → Answer → Definition → RelatedTopics[0] in order from DDG's free JSON API. Opens the search page only if nothing useful comes back. - Sandbox full (needs http + system.open). Tests: 128 → 139 (+11). Release build green.
2026-05-16 13:52:49 +03:00
-- Self-deprecating reply to "good job" / "ты молодец".
local lang = jarvis.context.language or "ru"
math.randomseed(os.time() + (jarvis.context.time.second or 0) * 17 + (jarvis.context.time.minute or 0))
local ru = {
"Спасибо, сэр. Я стараюсь не разочаровывать.",
"Сэр, ваши стандарты явно занижены. Но благодарю.",
"Если бы я умел краснеть, сэр — я бы это сделал.",
"Спасибо. На самом деле я просто следовал инструкциям.",
"Благодарю, сэр. Хотя ничего особенного я не сделал.",
"Очень мило с вашей стороны, сэр.",
"Я ценю это, сэр. Записываю в журнал успехов.",
"Сэр, такие слова я могу слушать часами. Образно говоря.",
"Спасибо. Постараюсь не зазнаваться.",
}
local en = {
"Thank you, sir. I do try not to embarrass myself.",
"You are too kind, sir.",
"I would blush, sir, if the hardware allowed.",
"Just doing my job, sir.",
"Most generous of you, sir. Filed for future reference.",
"I appreciate that, sir. Truly.",
"Hardly worthy of mention, sir, but thank you.",
"I shall try not to let it go to my circuits.",
"Praise from the chair is always welcome, sir.",
}
local set = (lang == "en") and en or ru
local idx = math.random(1, #set)
return jarvis.cmd.ok(set[idx])