# Headless backend (mugi_backend.py / SwiftUI app). No PyObjC — avoids build failures.
# Keep in sync with requirements.txt minus the PyObjC block.
# dulwich: pure-Python Git for cloning Homebrew without system git/Xcode CLI.

setuptools>=70.0,<71
dulwich>=0.22,<1.0
# tomllib (stdlib 3.11+) reads TOML but cannot write it; this is the writer used
# for mugi_config.toml. persistence.py keeps a hand-rolled fallback when absent.
tomli-w>=1.0,<2.0
fastapi>=0.100,<1.0
uvicorn>=0.12,<1.0
websockets>=12.0,<17.0
python-multipart>=0.0.6
openai>=1.0,<3.0
langchain-core>=1.0,<2.0
langchain-community>=0.3,<1.0
langgraph>=1.0,<2.0
pydantic>=2.7,<3.0
mcp>=1.20,<2.0

# Messaging, crypto, keychain
discord.py>=2.0,<3.0
cryptography>=42.0,<47.0
keyring>=25.0,<27.0
zeroconf>=0.131,<1.0

# Scheduled tasks (schedule_tools / cron_scheduler)
croniter>=2.0,<4.0

# Phase 2b: filesystem watcher (optional; polling fallback when missing)
watchdog>=4.0,<7.0

# Dashboard System tile (CPU/RAM/disk/network/top processes)
psutil>=5.9,<8

# PDF, images, HTTP, parsing, OCR
pypdf>=4.0,<5.0
pymupdf>=1.24,<2.0
pdf2image>=1.16,<3.0
numpy>=1.24,<3.0
# Charts/run_python_code (matplotlib, seaborn, pandas)
matplotlib>=3.7,<4.0
pandas>=2.0,<3.0
seaborn>=0.12,<1.0
certifi>=2024.0.0
requests>=2.28,<3.0
httpx>=0.27,<1.0
readability-lxml>=0.8,<1.0
beautifulsoup4>=4.12,<5.0
# Word export renders markdown -> HTML -> docx. bootstrap.py syncs the backend
# venv from this file (not requirements.txt), so leaving it out only here made
# the Results "Word Document (.docx)…" button fail with 415 on every install
# while the tests that cover it passed for anyone who had it locally.
markdown>=3.5,<4.0
python-docx>=1.1,<2.0
openpyxl>=3.1,<4.0
python-pptx>=1.0,<2.0
firecrawl-anydoc>=0.2,<1.0
xlrd>=2.0,<3.0
odfpy>=1.4,<2.0
ebooklib>=0.18,<1.0
striprtf>=0.0.29,<1.0
opencv-python>=4.8,<5.0
pytesseract>=0.3.10
Pillow>=10.0,<11.0

# TTS (optional: Supertonic on-device)
supertonic>=0.1.0

# sqlite-vec ANN for session/knowledge semantic search (optional; brute-force fallback if unloadable)
sqlite-vec==0.1.9

# Testing
pytest>=7.0,<9.0
# Enforces the per-test `timeout` in pytest.ini so a test that blocks on a model
# call names itself instead of stalling the whole run.
pytest-timeout>=2.1,<3.0
starlette>=0.27,<1.0
