J.A.R.V.I.S-rust/resources/commands/scheduler/command.toml
Bossiara13 12b1ed4ccb feat(scheduler): IMBA-5 proactive scheduler — reminders, daily briefings, intervals
Background thread that wakes J.A.R.V.I.S. on a schedule to speak reminders.
Nothing else competes here on desktop — Алиса/Сири are reactive-only.

Core (crates/jarvis-core/src/scheduler.rs)
  - Schedule::{Daily{h,m}, Interval{secs}, Once{at}} with Schedule::parse for
    "daily HH:MM" / "at HH:MM" / "every N minutes|hours" / "in N minutes|hours".
    Russian units (час/часа/часов/минут/секунд) also accepted.
  - ScheduledTask {id, name, schedule, action, last_fired, enabled, created_at}.
    Action::Speak{text} | Action::Lua{script_path}.
  - JSON persistence at <APP_CONFIG_DIR>/schedule.json, atomic write-through.
  - add/remove/clear/list/find; mark_fired auto-deletes Once tasks.
  - start_background() spawns a 30-second tick thread (idempotent). Each tick
    calls due_tasks(), fires Action via tts::speak_default (after voices::play_reply
    "ahem" cue) or Lua engine.
  - 7 unit tests (all passing).

Lua API (crates/jarvis-core/src/lua/api/scheduler.rs)
  - jarvis.scheduler.add({name, schedule, action={type, text|script_path}})
  - jarvis.scheduler.{list, count, remove(id), clear}.
  - Tasks come back as {id, name, schedule_human, action, enabled, last_fired}.

Wire-up (crates/jarvis-app/src/main.rs)
  - scheduler::init() + scheduler::start_background() after profiles::init.
  - Tasks survive restarts via schedule.json.

Voice commands (resources/commands/scheduler/, 6 ids)
  - scheduler.add_reminder    "напомни через 5 минут выключить кофеварку"
  - scheduler.add_at          "напомни в 18:00 забрать ребёнка"
  - scheduler.add_recurring   "каждые 2 часа напоминай попить воды"
  - scheduler.add_daily       "каждый день в 9:00 делай briefing"
  - scheduler.list            "что у меня запланировано"
  - scheduler.clear           "очисти расписание"

Russian-aware parsers (час/часа/часов, минут/минуту/минуты) live inside the Lua
packs — easy to extend without touching Rust.

Tests: 31/31 jarvis-core unit tests pass (24 prior + 7 scheduler).
Build: cargo build --release -p jarvis-app and -p jarvis-gui both green.
2026-05-15 15:43:04 +03:00

109 lines
2.5 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# IMBA-5: Proactive scheduler — recurring reminders, daily briefings, intervals.
[[commands]]
id = "scheduler.add_reminder"
type = "lua"
script = "add_reminder.lua"
sandbox = "standard"
timeout = 5000
[commands.phrases]
ru = [
"напомни мне через", "напомни через",
"поставь напоминалку через", "поставь напоминание через",
"разбуди через",
]
en = ["remind me in", "set a reminder in"]
ua = ["нагадай через", "постав нагадування через"]
[[commands]]
id = "scheduler.add_at"
type = "lua"
script = "add_at.lua"
sandbox = "standard"
timeout = 5000
[commands.phrases]
ru = [
"напомни в",
"напомни сегодня в",
"разбуди в",
"поставь напоминалку на",
]
en = ["remind me at", "wake me at"]
ua = ["нагадай о", "розбуди о"]
[[commands]]
id = "scheduler.add_recurring"
type = "lua"
script = "add_recurring.lua"
sandbox = "standard"
timeout = 5000
[commands.phrases]
ru = [
"каждые",
"каждый час",
"каждые два часа",
"напоминай каждые",
"напоминай каждый",
]
en = ["every", "remind me every"]
ua = ["кожні", "нагадуй кожні"]
[[commands]]
id = "scheduler.add_daily"
type = "lua"
script = "add_daily.lua"
sandbox = "standard"
timeout = 5000
[commands.phrases]
ru = [
"каждый день в",
"каждое утро в",
"ежедневно в",
"по утрам в",
]
en = ["every day at", "daily at"]
ua = ["щодня о", "кожен день о"]
[[commands]]
id = "scheduler.list"
type = "lua"
script = "list.lua"
sandbox = "minimal"
timeout = 3000
[commands.phrases]
ru = [
"что у меня запланировано",
"какие напоминания",
"покажи расписание",
"какие задачи у меня",
"что в расписании",
]
en = ["what's on my schedule", "show schedule", "list reminders"]
ua = ["що в розкладі", "покажи розклад"]
[[commands]]
id = "scheduler.clear"
type = "lua"
script = "clear.lua"
sandbox = "minimal"
timeout = 3000
[commands.phrases]
ru = [
"очисти расписание",
"удали все напоминания",
"отмени все напоминания",
"сбрось расписание",
]
en = ["clear schedule", "cancel all reminders"]
ua = ["очисти розклад", "скасуй всі нагадування"]