# Full pinned dependency set for the dev clone, CI, and the Docker image —
# i.e. everything, including all optional features. PyPI / pipx consumers
# get a LEANER default and opt into extras instead (see pyproject.toml
# [project.optional-dependencies]):
#
#   pip install watchtower-podman           # lean: API + DB + Podman + deploy
#   pip install 'watchtower-podman[ssh]'     # + SSH/rsync deploys (fabric)
#   pip install 'watchtower-podman[agent]'   # + LLM agent / self-heal (openai)
#   pip install 'watchtower-podman[queue]'   # + durable build queue (redis/rq)
#   pip install 'watchtower-podman[all]'     # the same full set as this file
#
# The fabric / openai / redis / rq lines below are the optional ones; they
# stay here so the dev clone and CI always exercise every code path.

# Core
fastapi==0.143.0
# Pin starlette explicitly: left transitive it resolved to 0.38.6, which has
# known CVEs (PYSEC-2026-161/248/249/1941/1943/2280/2281). The CVE fix versions
# are on the 1.x line; fastapi 0.142.x only needs >=0.46 (no upper bound) and
# sse-starlette needs >=0.49.1, so the fully-patched 1.7.x satisfies everyone.
# (security — pip-audit 2026-10-09)
starlette>=1.7.0,<2
uvicorn==0.54.0
# Required by FastAPI to parse multipart/form-data (photo-backup file uploads
# in api/photos.py). Declared in pyproject too — MUST stay here because the
# packaged desktop bundle installs deps from THIS file, and without it the
# backend crashes at startup when FastAPI registers the upload route.
python-multipart>=0.0.32
# Note: `[standard]` extras (uvloop, httptools, watchfiles) gave a small
# perf win on Linux/Mac but uvloop has no Windows wheels. When the
# Release workflow's Linux runner builds the win_amd64 Python bundle,
# pip evaluates the marker against the build host (Linux) instead of
# the target, tries to install uvloop, and fails. The perf gain isn't
# worth blocking Windows installer releases.
pydantic==2.14.0
pydantic-settings==2.15.0
python-dotenv==1.2.4

# Database
sqlalchemy==2.0.54
# Pin a floor, not an exact version: psycopg2-binary 2.9.13 only ships aarch64
# wheels for manylinux_2_27+, but the linux-arm64 cross-build targets an older
# glibc baseline (manylinux2014) whose newest published wheel is 2.9.11 — so
# ==2.9.13 broke the arm64 desktop build. A range lets each platform grab its
# newest compatible wheel (x86_64 gets 2.9.13, arm64-cross gets 2.9.11).
psycopg2-binary>=2.9.9,<2.10
alembic==1.20.0

# Utilities
pyyaml>=6.0
apscheduler>=3.10.0
requests>=2.34.2
# podman Python SDK only has Linux binaries — skip on macOS/Windows
podman==5.8.0; sys_platform == "linux"

# HTTP client (used in tests and health checks)
httpx==0.28.1

# Rate limiting — protects auth and webhook endpoints from brute force /
# DoS even on single-operator installs without a CDN/WAF in front.
slowapi>=0.1.9

# ── Optional features (pyproject extras; lazy-imported in code) ───────────────
# Present here so the dev clone / CI / Docker image exercise every path.
# Lean PyPI installs skip these unless the matching extra is requested.

# [ssh] SSH/rsync deploys (legacy JSON-file path). The DB-path deploy
# runner uses plain ssh/rsync, so fabric is only for watchtower-deploy.
fabric==3.2.3

# [queue] Durable build queue. watchtower.queue falls back to in-process
# execution when REDIS_URL is unset, so dev / desktop installs without
# Redis still work.
redis==8.1.0
rq==1.16.2
msgpack>=1.2.1  # security: GHSA-6v7p-g79w-8964 (rq transitive dep)

# [agent] LLM agent — talks to ANY OpenAI-compatible chat-completions
# endpoint (Ollama, LM Studio, vLLM, llama.cpp, OpenAI, OpenRouter,
# LiteLLM, etc.). WatchTower itself is provider-agnostic.
openai>=1.50.0
cryptography>=50.0.2  # security (pip-audit 2026-10-08)
pillow>=12.3.0  # security (pip-audit 2026-10-08)
PyJWT>=2.15.1  # security (pip-audit 2026-10-08)
paramiko>=5.0.0  # security (pip-audit 2026-10-08)
urllib3>=2.8.0  # security (pip-audit 2026-10-08)
