[build-system] requires = ["setuptools>=75", "wheel"] build-backend = "setuptools.build_meta" [project] name = "distinct-server" version = "0.1.0" description = "Session-only Gradio control plane for community-run open-weight LLM agents" requires-python = ">=3.10" dependencies = ["gradio[oauth]==6.24.0"] [project.optional-dependencies] agent = [ "dspy[deno]==3.3.0", "gradio_client==2.6.0", "pyRAPL==0.2.3.1; sys_platform == 'linux'", # The worker's own screen. Pinned rather than ranged because the frozen # build has to be reproducible, and because a Textual minor release can # change how a widget lays out, which is a visual regression no test in # this repository would catch. "textual==8.2.8", ] dev = [ "pytest==8.4.2", "ruff==0.12.11", ] [tool.setuptools.packages.find] include = [ "distinct_agent*", "distinct_mcp*", "distinct_protocol*", "distinct_server*", "distinct_skills*", "distinct_tools*", ] # A skill in `distinct_skills` is a directory of text, not a module: SKILL.md, # tool.json and the templates beside them. Without this they are left out of a # wheel, the digest table finds nothing on disk, and the repository degrades to # empty in exactly the build where nobody is watching a test run. [tool.setuptools.package-data] distinct_skills = ["NOTICE.md", "skills/**/*.md", "skills/**/*.json"] distinct_agent = ["deno.lock"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-q" [tool.ruff] target-version = "py310" line-length = 110 exclude = [".venv", "Measure-PcPower.ps1", "measure_pc_energy.py"] [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "I", "B"]