content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [project]
  name = "voice-mode"
  dynamic = ["version"]
  description = "VoiceMode - Voice interaction capabilities for AI assistants (formerly voice-mcp)"
  readme = "README.md"
  requires-python = ">=3.10"
  license = {text = "MIT"}
  authors = [
      {name = "mbailey", email = "mbailey@example.com"},
  ]
  keywords = ["mcp", "voice", "livekit", "speech", "tts", "stt", "ai", "llm"]
  classifiers = [
      "Development Status :: 4 - Beta",
      "Intended Audience :: Developers",
      "License :: OSI Approved :: MIT License",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.8",
      "Programming Language :: Python :: 3.9",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Topic :: Software Development :: Libraries",
      "Topic :: Multimedia :: Sound/Audio :: Speech",
  ]
  
  dependencies = [
      "uv>=0.4.0",
      "fastmcp>=2.0.0",
      "numpy",
      "sounddevice",
      "scipy",
      "openai>=1.0.0",
      "pydub",
      "audioop-lts; python_version >= '3.13'",
      "simpleaudio",
      "httpx",
      "psutil>=5.9.0",
      "setuptools",  # Required for pkg_resources used by webrtcvad
      "webrtcvad>=2.0.10",
      "livekit>=0.13.1",
      "livekit-agents>=0.10.2",
      "livekit-plugins-openai>=0.10.1",
      "livekit-plugins-silero>=0.6.5",
      "click>=8.0.0",
      "pyyaml>=6.0.0",
  ]
  
  [project.optional-dependencies]
  coreml = [
      "torch>=2.0.0",
      "coremltools>=7.0",
      "transformers",
      "ane-transformers",
  ]
  dev = [
      "build>=1.0.0",
      "twine>=4.0.0",
      "pytest>=7.0.0",
      "pytest-asyncio>=0.21.0",
      "pytest-cov>=4.0.0",
      "pytest-mock>=3.10.0",
  ]
  test = [
      "pytest>=7.0.0",
      "pytest-asyncio>=0.21.0",
      "pytest-cov>=4.1.0",
      "pytest-mock>=3.10.0",
      "pytest-xdist>=3.5.0",  # For parallel testing
      "pytest-timeout>=2.2.0",  # For test timeouts
      "coverage[toml]>=7.4.0",
  ]
  notebooks = [
      "gradio>=4.0.0",
      "jupyter>=1.0.0",
      "notebook>=7.0.0",
      "pandas>=2.0.0",
  ]
  scripts = [
      "flask>=3.0.0",
  ]
  docs = [
      "mkdocs>=1.5.0",
      "mkdocs-material[imaging]>=9.0.0",
      "pymdown-extensions>=10.0",
      "mkdocs-git-revision-date-localized-plugin>=1.2.0",
      "mkdocs-minify-plugin>=0.7.0",
      "mkdocs-gen-files>=0.5.0",
  ]
  
  [project.urls]
  Homepage = "https://github.com/mbailey/voicemode"
  Repository = "https://github.com/mbailey/voicemode"
  Issues = "https://github.com/mbailey/voicemode/issues"
  
  [project.scripts]
  voice-mode = "voice_mode.cli:voice_mode"
  voicemode = "voice_mode.cli:voice_mode"
  
  [tool.hatch.build.targets.wheel]
  packages = ["voice_mode"]
  include = [
    "voice_mode/**/*.py",
    "voice_mode/**/*.sh",
    "voice_mode/**/*.plist",
    "voice_mode/**/*.service",
    "voice_mode/templates/**/*",
  ]
  exclude = [
    "**/__pycache__",
    "**/*.pyc", 
    "**/*.pyo",
    "**/*.pyd",
    "**/.DS_Store",
    "**/*.log",
    "**/node_modules",
    "**/.next/cache",
    "**/tests",
    "**/.env",
    "**/.git",
  ]
  
  [tool.hatch.build.hooks.custom]
  path = "build_hooks.py"
  
  [tool.hatch.build.targets.sdist]
  include = [
    "/voice_mode",
    "/README.md",
    "/LICENSE",
    "/pyproject.toml",
    "/CHANGELOG.md",
    "/build_hooks.py",
  ]
  exclude = [
    "**/__pycache__",
    "**/*.pyc",
    "**/*.pyo",
    "**/*.pyd",
    "**/.DS_Store",
    "**/*.log",
  ]
  
  [tool.hatch.version]
  path = "voice_mode/__version__.py"
  
  [tool.hatch.metadata]
  allow-direct-references = true
  
  [tool.pytest.ini_options]
  minversion = "7.0"
  testpaths = ["tests"]
  python_files = "test_*.py"
  python_classes = "Test*"
  python_functions = "test_*"
  asyncio_mode = "auto"
  addopts = [
      "-ra",
      "--strict-markers",
      "--strict-config",
      "--ignore=tests/manual",
      "--cov=voice_mode",
      "--cov-branch",
      "--cov-report=term-missing:skip-covered",
      "--cov-report=html",
      "--cov-report=xml",
  ]
  markers = [
      "unit: Unit tests (fast, isolated)",
      "integration: Integration tests (may interact with services)",
      "slow: Tests that take > 1s",
      "manual: Manual tests requiring human interaction",
  ]
  filterwarnings = [
      "ignore::DeprecationWarning",
  ]
  
  [tool.coverage.run]
  source = ["voice_mode"]
  branch = true
  parallel = true
  omit = [
      "*/tests/*",
      "*/test_*.py",
      "*/__pycache__/*",
      "*/site-packages/*",
      "test-env/*",
  ]
  
  [tool.coverage.report]
  exclude_lines = [
      "pragma: no cover",
      "def __repr__",
      "if TYPE_CHECKING:",
      "raise NotImplementedError",
      "if __name__ == .__main__.:",
      "@abstractmethod",
      "except ImportError:",
  ]
  precision = 2
  skip_covered = true
  show_missing = true
  
  [tool.coverage.html]
  directory = "htmlcov"
  
  [tool.coverage.xml]
  output = "coverage.xml"
  
  [dependency-groups]
  dev = [
      "pytest>=8.4.2",
      "pytest-asyncio>=1.2.0",
      "pytest-cov>=7.0.0",
      "pytest-mock>=3.15.0",
  ]
  