[project] name = "hold-slayer" version = "0.1.0" description = "AI PSTN Gateway - Hold Slayer: Navigate IVRs, wait on hold, connect you when a human answers" readme = "README.md" requires-python = ">=3.12" license = "MIT" authors = [ {name = "Robert"}, ] dependencies = [ # Web framework "fastapi>=0.115.0", "uvicorn[standard]>=0.32.0", "websockets>=13.0", # Database "sqlalchemy[asyncio]>=2.0.36", "asyncpg>=0.30.0", "alembic>=1.14.0", # Settings & validation "pydantic>=2.10.0", "pydantic-settings>=2.6.0", # SIP signaling "sippy>=1.2.0", # Audio analysis "numpy>=1.26.0", "librosa>=0.10.0", "soundfile>=0.12.0", # HTTP client (for Speaches STT) "httpx>=0.28.0", # MCP server "fastmcp>=2.0.0", # Utilities "python-slugify>=8.0.0", "python-multipart>=0.0.12", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.24.0", "pytest-cov>=6.0.0", "httpx>=0.28.0", "ruff>=0.8.0", ] [tool.setuptools.packages.find] include = ["api*", "core*", "db*", "models*", "services*", "mcp_server*"] [build-system] requires = ["setuptools>=75.0", "wheel"] build-backend = "setuptools.build_meta" [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] [tool.ruff] target-version = "py312" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"]