feat: Wave 6 — focus mode, cooking timer, memory admin
Focus mode (`focus/`):
- focus.start ("режим фокуса" / "focus mode"): three side-effects in one
voice trigger:
1. switch profile to "work" (silences fun/banter)
2. enable Windows Focus Assist via registry tweak (QuietHours key)
3. schedule a stretch reminder in 50 minutes through the persistent
scheduler — so it survives daemon restart
- focus.stop: undoes all three, including cancelling pending stretch
reminders by matching their scheduler name. Best-effort: any one
failing doesn't block the others.
Cooking timer (`cooking/`):
- Recognises 16+ dish names (чай, кофе, омлет, яйца, макароны, паста,
рис, гречка, картошка, курица, пицца, etc.) and starts a preset-
duration scheduler reminder ("Сэр, чай готов.").
- Single Lua script, table-driven — adding a recipe is one line.
- EN phrases for the same dishes ("boiling pasta", "frying eggs", ...).
Memory admin (`memory_admin/`):
- memory_admin.count → speak fact count with full RU pluralisation.
- memory_admin.list → speak 5 most-recent + toast the rest.
- memory_admin.wipe → ONLY fires on "точно забудь все" prefix (not bare
"забудь все") so we can't disaster-wipe by accident.
- Adds `long_term_memory::clear_all() -> usize` returning removed count
+ Lua binding `jarvis.memory.clear_all()`.
- One extra unit test for `clear_all`.
Tests: 139 → 140 (+1). Pack count: 92 → 95.
This commit is contained in:
parent
df799b6cd2
commit
8f46bd735a
11 changed files with 467 additions and 0 deletions
37
resources/commands/memory_admin/list.lua
Normal file
37
resources/commands/memory_admin/list.lua
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
-- Read out the first ~5 keys + value previews; the rest is just a count.
|
||||
-- TTS doesn't handle long enumerations well, so we keep it short and notify
|
||||
-- the full dump as a Windows toast for visual scan.
|
||||
|
||||
local lang = jarvis.context.language
|
||||
local facts = jarvis.memory.all() or {}
|
||||
|
||||
if #facts == 0 then
|
||||
return jarvis.cmd.not_found(lang == "ru"
|
||||
and "Память пуста, сэр."
|
||||
or "Memory is empty, sir.")
|
||||
end
|
||||
|
||||
-- Sort by most-recently-used so the user hears what's actually fresh.
|
||||
table.sort(facts, function(a, b) return (a.last_used_at or 0) > (b.last_used_at or 0) end)
|
||||
|
||||
local speak_lines = {}
|
||||
local notify_lines = {}
|
||||
for i, f in ipairs(facts) do
|
||||
local v = (f.value or ""):sub(1, 60)
|
||||
local line = f.key .. ": " .. v
|
||||
table.insert(notify_lines, line)
|
||||
if i <= 5 then
|
||||
table.insert(speak_lines, f.key .. " — " .. v)
|
||||
end
|
||||
end
|
||||
|
||||
jarvis.system.notify(
|
||||
lang == "ru" and ("Память (" .. tostring(#facts) .. ")") or ("Memory (" .. tostring(#facts) .. ")"),
|
||||
table.concat(notify_lines, "\n")
|
||||
)
|
||||
|
||||
local preview = table.concat(speak_lines, ", ")
|
||||
local extra = #facts > 5
|
||||
and string.format(lang == "ru" and ". И ещё %d." or ". And %d more.", #facts - 5)
|
||||
or "."
|
||||
return jarvis.cmd.ok(preview .. extra)
|
||||
Loading…
Add table
Add a link
Reference in a new issue