feat: Wave 5 Python parity — outlook COM + time tracker
Outlook COM (`outlook_handlers.py`, agent):
- 4 handlers mirroring Rust pack: unread_count, latest, send_clipboard,
summarize_inbox. Uses `win32com.client` with lazy import so the module
loads even when pywin32 is missing — handlers degrade gracefully and
speak a "Outlook недоступен" reply.
- `requirements.txt`: pywin32>=305 (optional).
- 7 unit tests mock `_outlook_session` via unittest.mock.
Time tracker (`time_tracker_handlers.py`, agent):
- 5 handlers: start, stop, today, week, reset. JSON store at
`<here>/time_tracker.json`, atomic write-then-rename.
- Same shape as the Rust pack's `jarvis.state` blob: current_session_start
+ sessions[{start,end}]. Local-calendar today boundary.
- Full Russian pluralisation (час/часа/часов, минута/минуты/минут).
- 14 unit tests using the existing `isolated_state` fixture in conftest.py.
`extensions.py` + `main.py`: imports + 9 new proxy do_* functions + 9
new dispatch elifs. `commands.yaml`: 9 new entries.
Tests: 60 → 81 (+14 tracker + 7 outlook).
This commit is contained in:
parent
45d9425ed7
commit
5265cb0fbe
8 changed files with 971 additions and 0 deletions
|
|
@ -29,6 +29,8 @@ import dev_handlers
|
|||
import llm_backend
|
||||
import wave1_handlers
|
||||
import personality_handlers
|
||||
import time_tracker_handlers
|
||||
import outlook_handlers
|
||||
|
||||
_speak_fn = print
|
||||
_set_clipboard_fn = None
|
||||
|
|
@ -43,6 +45,8 @@ def set_speak(fn):
|
|||
dev_handlers.set_speak(fn)
|
||||
wave1_handlers.set_speak(fn)
|
||||
personality_handlers.set_speak(fn)
|
||||
time_tracker_handlers.set_speak(fn)
|
||||
outlook_handlers.set_speak(fn)
|
||||
|
||||
|
||||
def set_clipboard_fn(fn):
|
||||
|
|
@ -1130,3 +1134,20 @@ def do_personality_thanks(a, v): personality_handlers.do_personality_thanks(a, v
|
|||
def do_personality_compliment(a, v): personality_handlers.do_personality_compliment(a, v)
|
||||
def do_personality_how_are_you(a, v): personality_handlers.do_personality_how_are_you(a, v)
|
||||
def do_personality_tony_quote(a, v): personality_handlers.do_personality_tony_quote(a, v)
|
||||
|
||||
|
||||
# ── Time tracker proxies (to time_tracker_handlers) ─────────────────────────
|
||||
|
||||
def do_tracker_start(a, v): time_tracker_handlers.do_tracker_start(a, v)
|
||||
def do_tracker_stop(a, v): time_tracker_handlers.do_tracker_stop(a, v)
|
||||
def do_tracker_today(a, v): time_tracker_handlers.do_tracker_today(a, v)
|
||||
def do_tracker_week(a, v): time_tracker_handlers.do_tracker_week(a, v)
|
||||
def do_tracker_reset(a, v): time_tracker_handlers.do_tracker_reset(a, v)
|
||||
|
||||
|
||||
# ── Outlook proxies (to outlook_handlers) ───────────────────────────────────
|
||||
|
||||
def do_outlook_unread_count(a, v): outlook_handlers.do_outlook_unread_count(a, v)
|
||||
def do_outlook_latest(a, v): outlook_handlers.do_outlook_latest(a, v)
|
||||
def do_outlook_send_clipboard(a, v): outlook_handlers.do_outlook_send_clipboard(a, v)
|
||||
def do_outlook_summarize_inbox(a, v): outlook_handlers.do_outlook_summarize_inbox(a, v)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue