feat: Python parity for wol / banter / conversation / ddg_answer + 11 tests
New `wave59_handlers.py` (~250 lines) mirroring four Rust-only packs: - wol: pure-Python magic packet via socket + SO_BROADCAST. No PowerShell shellout (unlike the Rust pack). Reads MAC from memory_store under 'wol_<alias>' or JARVIS_WOL_TARGET env. Same MAC format tolerance (colons / dashes / dots / bare) as the Rust normaliser. - banter: pause/resume state + fire-one. Python edition doesn't run a background banter thread (the Rust daemon already does), so this is just the user-facing surface — same voice phrases work. - conversation: do_conversation_summary calls Groq with last 12 turns from main.py's `message_log`. set_history_ref() injects the live list reference at startup so the handler reads up-to-date history without a circular import. Offline-safe: GROQ_TOKEN missing → speak the last user message instead. do_conversation_repeat re-speaks the last assistant turn. - ddg_answer: urllib + DuckDuckGo Instant Answer JSON. Picks AbstractText → Answer → Definition → RelatedTopics[0]. Opens duckduckgo.com search fallback when nothing instant. extensions.py / main.py / commands.yaml: 7 new dispatch entries + proxy fns. commands.yaml now at 207 entries. tests/test_wave59_handlers.py: 11 unit tests for MAC normalisation, magic packet shape, WOL error paths, banter state machine, DDG trigger stripping, conversation history handling. Network calls deliberately NOT exercised here — they belong to integration tests. Tests: 104 → 115 (+11).
This commit is contained in:
parent
cdd331af35
commit
633850d0f7
5 changed files with 536 additions and 0 deletions
|
|
@ -33,6 +33,7 @@ import time_tracker_handlers
|
|||
import outlook_handlers
|
||||
import wave68_handlers
|
||||
import expenses_handlers
|
||||
import wave59_handlers
|
||||
|
||||
_speak_fn = print
|
||||
_set_clipboard_fn = None
|
||||
|
|
@ -51,6 +52,7 @@ def set_speak(fn):
|
|||
outlook_handlers.set_speak(fn)
|
||||
wave68_handlers.set_speak(fn)
|
||||
expenses_handlers.set_speak(fn)
|
||||
wave59_handlers.set_speak(fn)
|
||||
|
||||
|
||||
def set_clipboard_fn(fn):
|
||||
|
|
@ -1176,3 +1178,14 @@ def do_expenses_log(a, v): expenses_handlers.do_expenses_log(a, v)
|
|||
def do_expenses_today(a, v): expenses_handlers.do_expenses_today(a, v)
|
||||
def do_expenses_week(a, v): expenses_handlers.do_expenses_week(a, v)
|
||||
def do_expenses_breakdown(a, v): expenses_handlers.do_expenses_breakdown(a, v)
|
||||
|
||||
|
||||
# ── Wave 5-9 proxies (wol / banter / conversation / ddg_answer) ────────────
|
||||
|
||||
def do_wol(a, v): wave59_handlers.do_wol(a, v)
|
||||
def do_banter_fire(a, v): wave59_handlers.do_banter_fire(a, v)
|
||||
def do_banter_pause(a, v): wave59_handlers.do_banter_pause(a, v)
|
||||
def do_banter_resume(a, v): wave59_handlers.do_banter_resume(a, v)
|
||||
def do_conversation_summary(a, v): wave59_handlers.do_conversation_summary(a, v)
|
||||
def do_conversation_repeat(a, v): wave59_handlers.do_conversation_repeat(a, v)
|
||||
def do_ddg_answer(a, v): wave59_handlers.do_ddg_answer(a, v)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue