[build-system]
requires = ["setuptools>=77.0.0,<78.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "rain-assistant"
version = "1.0.15"
description = "AI-powered coding assistant with voice, plugins, web UI, and Telegram bot"
readme = "README.md"
license = "Apache-2.0"
requires-python = ">=3.11"
authors = [
    { name = "Rain Assistant Contributors" },
]
keywords = ["ai", "assistant", "claude", "openai", "gemini", "voice", "coding", "plugins"]
classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Topic :: Software Development",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
]

dependencies = [
    "fastapi>=0.100,<1.0",
    "uvicorn[standard]>=0.20,<1.0",
    "python-multipart>=0.0.6,<1.0",
    "claude-agent-sdk>=0.1.0,<1.0",
    "openai>=1.0.0,<2.0",
    "google-generativeai>=0.8.0,<1.0",
    "faster-whisper>=1.0.0,<2.0",
    "edge-tts>=6.1.0,<7.0",
    "bcrypt>=4.0.0,<5.0",
    "cryptography>=41.0,<45.0",
    "keyring>=24.0,<25.0",
    "pyyaml>=6.0,<7.0",
    "httpx>=0.24,<1.0",
]

[project.optional-dependencies]
telegram = ["aiogram>=3.0.0,<4.0"]
computer-use = [
    "anthropic>=0.79.0,<1.0",
    "pyautogui>=0.9.54,<1.0",
    "mss>=9.0.0,<10.0",
    "Pillow>=10.0.0,<11.0",
    "pyperclip>=1.8.0,<2.0",
    "imagehash>=4.3.0,<5.0",
]
browser = ["playwright>=1.40.0,<2.0"]
scheduler = ["croniter>=1.3.0,<2.0"]
ollama = ["ollama>=0.4.0,<1.0"]
tunnel = ["pycloudflared>=0.2.0,<1.0", "certifi>=2023.0,<2027.0"]
memory = ["sentence-transformers>=2.2.0,<3.0", "pypdf>=3.0,<4.0"]
documents = [
    "python-docx>=0.8.11,<2.0",
    "beautifulsoup4>=4.12.0,<5.0",
    "ebooklib>=0.18,<1.0",
    "lxml>=4.9.0,<6.0",
]
vision = ["pytesseract>=0.3.10,<1.0"]
ann = ["faiss-cpu>=1.7.0,<2.0"]
voice = [
    "torch>=2.0,<3.0",
    "openwakeword>=0.6,<1.0",
    "onnxruntime>=1.15,<2.0",
]
dev = [
    "pytest>=7.0,<8.0",
    "pytest-asyncio>=0.21,<1.0",
    "httpx>=0.24,<1.0",
    "ruff",
]
all = [
    "rain-assistant[telegram,computer-use,browser,scheduler,ollama,tunnel,memory,voice,documents,vision,ann]",
]

[project.scripts]
rain = "server:main"
rain-assistant = "server:main"

[project.urls]
Homepage = "https://github.com/camilo-gutierrez/rain-assistant"
Documentation = "https://github.com/camilo-gutierrez/rain-assistant#readme"
"Bug Tracker" = "https://github.com/camilo-gutierrez/rain-assistant/issues"

[tool.setuptools]
py-modules = [
    "server",
    "shared_state",
    "database",
    "key_manager",
    "prompt_composer",
    "transcriber",
    "synthesizer",
    "permission_classifier",
    "rate_limiter",
    "tunnel",
    "computer_use",
    "computer_use_safety",
    "computer_use_vision",
    "computer_use_recorder",
    "telegram_bot",
    "telegram_config",
    "claude_client",
    "logging_config",
    "metrics",
    "recorder",
]
include-package-data = true

[tool.setuptools.packages.find]
include = ["rain_assistant*", "plugins*", "providers*", "tools*", "memories*", "documents*", "alter_egos*", "scheduled_tasks*", "subagents*", "marketplace*", "voice*", "routes*", "a2ui*", "utils*", "directors*", "static"]
exclude = ["static_backup*", "tests*", "rain_flutter*", "frontend*"]

[tool.setuptools.package-data]
static = ["**/*"]

[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
filterwarnings = [
    "ignore::DeprecationWarning",
]
markers = [
    "smoke: Quick smoke tests that verify basic functionality",
    "e2e: Full end-to-end integration tests (may require API keys)",
    "timeout: Test timeout in seconds",
]

[tool.coverage.run]
source = ["."]
omit = [
    "tests/*",
    "frontend/*",
    "rain_flutter/*",
    "static/*",
    "a2ui/*",
]

[tool.coverage.report]
show_missing = true
skip_empty = true

[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = ["E", "F", "I"]
