websockets>=17.0
pyautogui>=0.9.54
pyperclip>=1.11.0
psutil>=7.0.0
pygetwindow>=0.0.9 ; sys_platform == "win32"
# Real gap found+fixed live 2026-09-08: pyautogui's screenshot/vision path
# (take_screenshot, capture_screenshot_bytes) depends on Pillow but it was
# never actually listed here -- untested until this pass because no prior
# session had run take_screenshot for real. On Linux, pyautogui's
# screenshot backend also shells out to scrot (preferred, no flash) or
# gnome-screenshot; scrot is the lighter of the two -- install via
# `sudo apt install scrot` if this ever runs on a real Linux desktop
# (Windows/Mac need no extra system package, only this Pillow wheel).
Pillow>=9.2.0

# Phase 2 (--listen, background wake-word mode) only -- not needed if you
# never pass --listen. Linux additionally needs the system PortAudio
# library first: `sudo apt install libportaudio2` (Debian/Ubuntu) or your
# distro's equivalent -- sounddevice bundles PortAudio in its Windows/Mac
# wheels but not the Linux one.
sounddevice>=0.5.6
soundfile>=0.12.1
numpy>=1.26
# Pinned EXACT (not >=): a real crash on the user's Windows PC, 2026-09-09,
# traced to openwakeword's own pip package no longer bundling model
# weights as of this version, plus a deprecated constructor kwarg
# (wakeword_model_paths -> wakeword_models) -- both confirmed directly
# against this exact wheel. wake_model_provisioning.py handles the model
# files itself now (with real SHA-256 verification), but the CONSTRUCTOR
# API itself must match exactly what's pinned here, so an unbounded range
# can't silently reintroduce a different breaking API change later.
openwakeword==0.6.0
# Direct dependency as of the same fix -- wake_model_provisioning.py uses
# it for its own verified download (previously only a transitive dep via
# openwakeword itself).
requests>=2.31.0

# Phase 20 (local Windows STT/TTS) -- same engines as the VPS's own
# voice_worker service, chosen for the identical reason: faster-whisper
# "small" is the smallest model that keeps Hindi Devanagari output
# correct (real, measured live 2026-09-09 -- "base" breaks it entirely).
# Neither pulls in PyTorch/CUDA (verified: faster-whisper uses
# ctranslate2, piper-tts uses onnxruntime, already a dependency here via
# openwakeword) -- consistent with this agent's existing "no heavy ML
# framework" resource posture (see vad.py's own docstring for why the
# silero-vad PyPI package was avoided for the same reason).
faster-whisper>=1.2.1
piper-tts>=1.8.0

# Real interactive browser control (2026-09-12, adapters/browser_control.py)
# -- distinct from open_url/web_search's webbrowser.open() (fire-and-forget,
# no way to interact further). Requires a one-time `playwright install
# chromium` after pip install (not run automatically here -- a ~150MB
# browser download shouldn't happen silently); update.ps1/install.ps1
# handle this.
playwright>=1.62.0

# System tray application (2026-09-12, tray_app.py) -- cross-platform
# (win32/appindicator-or-xorg/cocoa backend chosen automatically per OS).
# Pillow (already a dependency above) generates the tray icon image itself,
# no external image asset file needed.
pystray>=0.19.5
