[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "timmy-time" version = "1.0.0" description = "Mission Control for sovereign AI agents" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } dependencies = [ "agno[sqlite]>=1.4.0", "ollama>=0.3.0", "openai>=1.0.0", "fastapi>=0.115.0", "uvicorn[standard]>=0.32.0", "jinja2>=3.1.0", "httpx>=0.27.0", "python-multipart>=0.0.12", "aiofiles>=24.0.0", "typer>=0.12.0", "rich>=13.0.0", "pydantic-settings>=2.0.0", "websockets>=12.0", "GitPython>=3.1.40", "moviepy>=2.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.24.0", "pytest-cov>=5.0.0", ] # Big-brain: run 8B / 70B / 405B models locally via layer-by-layer loading. # pip install ".[bigbrain]" # On Apple Silicon: pip install "airllm[mlx]" for the MLX-accelerated backend. bigbrain = [ "airllm>=2.9.0", ] # Swarm: Redis-backed pub/sub for multi-agent communication. # pip install ".[swarm]" swarm = [ "redis>=5.0.0", ] # Voice: text-to-speech output via pyttsx3. # pip install ".[voice]" voice = [ "pyttsx3>=2.90", ] # Telegram: bridge Telegram messages to Timmy via python-telegram-bot. # pip install ".[telegram]" telegram = [ "python-telegram-bot>=21.0", ] # Discord: bridge Discord messages to Timmy with native thread support. # pip install ".[discord]" # Optional: pip install pyzbar Pillow (for QR code invite detection) discord = [ "discord.py>=2.3.0", ] # Creative: GPU-accelerated image, music, and video generation. # pip install ".[creative]" creative = [ "diffusers>=0.30.0", "transformers>=4.40.0", "accelerate>=0.30.0", "torch>=2.2.0", "safetensors>=0.4.0", "ace-step>=1.5.0", ] [project.scripts] timmy = "timmy.cli:main" timmy-serve = "timmy_serve.cli:main" self-tdd = "self_tdd.watchdog:main" [tool.hatch.build.targets.wheel] sources = {"src" = ""} include = [ "src/timmy", "src/timmy_serve", "src/dashboard", "src/config.py", "src/self_tdd", "src/swarm", "src/websocket", "src/voice", "src/notifications", "src/shortcuts", "src/telegram_bot", "src/chat_bridge", "src/spark", "src/tools", "src/creative", "src/agent_core", "src/lightning", ] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["src", "tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" addopts = "-v --tb=short" [tool.coverage.run] source = ["src"] omit = [ "*/tests/*", "src/dashboard/routes/mobile_test.py", ] [tool.coverage.report] show_missing = true skip_empty = true precision = 1 exclude_lines = [ "pragma: no cover", "if __name__ == .__main__.", "if TYPE_CHECKING:", "raise NotImplementedError", "@abstractmethod", ] # Fail CI if coverage drops below this threshold fail_under = 60 [tool.coverage.html] directory = "htmlcov" [tool.coverage.xml] output = "coverage.xml"