[build-system]
requires = ["setuptools>=68.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "openspace"
version = "2.0.0"
description = "OpenSpace"
readme = "README.md"
requires-python = ">=3.12"
license = {text = "MIT"}
authors = [
    {name = "OpenSpace Team@HKUDS"}
]

dependencies = [
    "litellm>=1.70.0,<1.82.7",  # pinned to avoid PYSEC-2026-2 supply-chain compromise (1.82.7/1.82.8 were malicious)
    "python-dotenv>=1.0.0",
    "openai>=1.0.0",
    "jsonschema>=4.25.0",
    "bashlex>=0.18",
    "mcp>=1.0.0",
    "anthropic>=0.71.0",
    "pillow>=12.0.0",
    "numpy>=1.24.0",
    "colorama>=0.4.6",
    "flask>=3.1.0",
    "pyautogui>=0.9.54",
    "pydantic>=2.12.0",
    "aiohttp>=3.10.0",
    "requests>=2.32.0",
    "websockets>=13.0",
]

[project.optional-dependencies]
macos = [
    "pyobjc-core>=12.0",
    "pyobjc-framework-cocoa>=12.0",
    "pyobjc-framework-quartz>=12.0",
    "atomacos>=3.2.0",
]

linux = [
    "python-xlib>=0.33",
    "pyatspi>=2.38.0",
    "numpy>=1.24.0",
]

windows = [
    "pywinauto>=0.6.8",
    "pywin32>=306",
    "PyGetWindow>=0.0.9",
]

dev = [
    "pytest>=7.0.0",
    "pytest-asyncio>=0.21.0",
    "black>=23.0.0",
    "flake8>=6.0.0",
    "mypy>=1.0.0",
]

communication = [
    "lark-oapi>=1.4.20",
]

all = [
    "openspace[macos]; sys_platform == 'darwin'",
    "openspace[linux]; sys_platform == 'linux'",
    "openspace[windows]; sys_platform == 'win32'",
    "openspace[communication,dev]",
]

[project.urls]
Repository = "https://github.com/HKUDS/OpenSpace"
"Bug Tracker" = "https://github.com/HKUDS/OpenSpace/issues"

[project.scripts]
openspace = "openspace.entrypoints.cli.main:run_main"
openspace-server = "openspace.local_server.main:main"
openspace-mcp = "openspace.entrypoints.mcp.server:run_mcp_server"
openspace-cloud-auth = "openspace.cloud.cli.auth:main"
openspace-download-skill = "openspace.cloud.cli.download_skill:main"
openspace-upload-skill = "openspace.cloud.cli.upload_skill:main"
openspace-dashboard = "openspace.entrypoints.dashboard.server:main"
openspace-gateway = "openspace.entrypoints.gateway.server:run_main"

[tool.setuptools]
packages = {find = {where = ["."], include = ["openspace*"]}}

[tool.setuptools.package-data]
openspace = [
    ".env.example",
    "config/*.json",
    "config/*.json.example",
    "config/README.md",
    "communication/bridges/whatsapp/*",
    "local_server/config.json",
    "local_server/README.md",
    "local_server/requirements.txt",
    "local_server/run.sh",
    "host_skills/README.md",
    "host_skills/*/.skill_id",
    "host_skills/*/SKILL.md",
    "protocol/schema/*.json",
    "skills/*/.skill_id",
    "skills/*/SKILL.md",
    "packaged/tui/**/*",
    "packaged/dashboard/**/*",
]

[tool.setuptools.exclude-package-data]
openspace = [
    "packaged/tui/**/__tests__/*",
    "packaged/tui/**/*.test.*",
    "packaged/tui/**/*.spec.*",
    "packaged/tui/node_modules/@types/node/test.d.ts",
    "packaged/dashboard/**/__tests__/*",
    "packaged/dashboard/**/*.test.*",
    "packaged/dashboard/**/*.spec.*",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
markers = [
    "playwright: requires the Playwright Python package and a launchable Chromium browser; must fail instead of skipping when configured as a CI gate",
]
norecursedirs = [
    ".git",
    ".pytest_cache",
    "__pycache__",
    "build",
    "dist",
    "logs",
    "node_modules",
    "openspace.egg-info",
]
