ha-mcp-dev 8.1.0.dev2245__tar.gz → 8.1.0.dev2247__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-8.1.0.dev2245/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.1.0.dev2247}/PKG-INFO +1 -2
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/pyproject.toml +36 -2
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/__init__.py +1 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/requirements.txt +8 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/LICENSE +24 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +55 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/VENDORED +2 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/__init__.py +249 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/__main__.py +5 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio/client.py +831 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio/connection.py +1253 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio/messages.py +316 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio/router.py +227 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio/server.py +911 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/auth.py +18 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/cli.py +227 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/client.py +398 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/connection.py +12 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/datastructures.py +225 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/exceptions.py +539 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/extensions/__init__.py +4 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/extensions/base.py +123 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +701 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/frames.py +544 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/headers.py +586 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/http11.py +493 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/imports.py +100 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/__init__.py +11 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/auth.py +190 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/client.py +709 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +71 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/framing.py +224 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/handshake.py +158 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/http.py +201 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/protocol.py +1631 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/legacy/server.py +1181 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/protocol.py +768 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/proxy.py +150 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/server.py +657 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/streams.py +167 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/client.py +644 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/connection.py +1226 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/messages.py +348 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/router.py +213 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/server.py +932 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/sync/utils.py +45 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/client.py +785 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/connection.py +1254 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/messages.py +286 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/router.py +207 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/server.py +658 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/trio/utils.py +36 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/typing.py +71 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/uri.py +107 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/utils.py +76 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/version.py +92 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/client/rest_client.py +1 -1
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/client/websocket_client.py +6 -2
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/smoke_test.py +1 -1
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_addons.py +3 -2
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_bug_report.py +77 -0
- ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -2
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp_dev.egg-info/SOURCES.txt +58 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp_dev.egg-info/requires.txt +0 -1
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/tests/test_constants.py +1 -1
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/LICENSE +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/README.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/setup.cfg +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.1.0.dev2245/src/ha_mcp/visibility → ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets/asyncio}/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245/src/ha_mcp → ha_mcp_dev-8.1.0.dev2247/src/ha_mcp/_vendor/websockets}/py.typed +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.1.0.dev2245 → ha_mcp_dev-8.1.0.dev2247}/tests/test_env_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 8.1.0.
|
|
3
|
+
Version: 8.1.0.dev2247
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -24,7 +24,6 @@ Requires-Dist: httpx[socks]==0.28.1
|
|
|
24
24
|
Requires-Dist: pydantic==2.13.4
|
|
25
25
|
Requires-Dist: python-dotenv==1.2.2
|
|
26
26
|
Requires-Dist: truststore==0.10.4
|
|
27
|
-
Requires-Dist: websockets==17.0
|
|
28
27
|
Requires-Dist: cryptography<51,>=48.0.0
|
|
29
28
|
Requires-Dist: pydantic-monty==0.0.18
|
|
30
29
|
Requires-Dist: tzdata>=2024.1
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.1.0.
|
|
7
|
+
version = "8.1.0.dev2247"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -33,7 +33,18 @@ dependencies = [
|
|
|
33
33
|
"pydantic==2.13.4",
|
|
34
34
|
"python-dotenv==1.2.2",
|
|
35
35
|
"truststore==0.10.4",
|
|
36
|
-
|
|
36
|
+
# websockets is deliberately ABSENT from this list: ha-mcp ships its own
|
|
37
|
+
# private copy (src/ha_mcp/_vendor/websockets, pinned in the vendor
|
|
38
|
+
# requirements.txt and synced by scripts/vendor_websockets.py) and never
|
|
39
|
+
# imports the shared site-packages copy. Inside Home Assistant that
|
|
40
|
+
# shared copy is unowned — ~20 integration libraries drag it in with
|
|
41
|
+
# conflicting version demands and any of their installs can replace or
|
|
42
|
+
# tear it in place (#2135/#2146); a declared dependency here would make
|
|
43
|
+
# ha-mcp PIN that contested copy, which is what forced the in-place
|
|
44
|
+
# replacements. A shared copy can still arrive transitively (fastmcp
|
|
45
|
+
# declares one), so what keeps us off it is the vendored import path,
|
|
46
|
+
# not the absence of this line — and the embedded no-stomp e2e guard is
|
|
47
|
+
# what proves no install of ours ever replaces the shared copy.
|
|
37
48
|
# Range (not a hard pin) so the resolver can satisfy Home Assistant's own
|
|
38
49
|
# cryptography constraint when ha-mcp is installed into the HA venv for
|
|
39
50
|
# in-process embedding (HA 2026.6 pins cryptography==48.0.0, 2026.7 pins
|
|
@@ -66,6 +77,11 @@ packages = { find = { where = ["src", "."], include = ["ha_mcp*", "tests"] } }
|
|
|
66
77
|
|
|
67
78
|
[tool.setuptools.package-data]
|
|
68
79
|
ha_mcp = ["py.typed", "_pypi_marker", "settings_ui/settings.html", "settings_ui/settings.js", "settings_ui/settings.css", "settings_ui/locales/*.json", "settings_ui/locales/README.md", "resources/skills-vendor/**/*"]
|
|
80
|
+
# The vendored websockets tree's non-Python files: the upstream LICENSE
|
|
81
|
+
# (BSD-3 requires shipping it), the VENDORED provenance marker, and the
|
|
82
|
+
# renovate-managed pin file the drift test reads.
|
|
83
|
+
"ha_mcp._vendor" = ["requirements.txt"]
|
|
84
|
+
"ha_mcp._vendor.websockets" = ["LICENSE", "VENDORED", "MANIFEST.sha256", "py.typed"]
|
|
69
85
|
|
|
70
86
|
[tool.mypy]
|
|
71
87
|
python_version = "3.13"
|
|
@@ -94,6 +110,14 @@ module = [
|
|
|
94
110
|
]
|
|
95
111
|
ignore_missing_imports = true
|
|
96
112
|
|
|
113
|
+
[[tool.mypy.overrides]]
|
|
114
|
+
# Vendored websockets: upstream's typing, not ours to check. follow_imports
|
|
115
|
+
# skip keeps our client code checked against Any instead of dragging the
|
|
116
|
+
# vendored tree into the run.
|
|
117
|
+
module = ["ha_mcp._vendor.*"]
|
|
118
|
+
follow_imports = "skip"
|
|
119
|
+
ignore_errors = true
|
|
120
|
+
|
|
97
121
|
[[tool.mypy.overrides]]
|
|
98
122
|
module = [
|
|
99
123
|
"homeassistant.*",
|
|
@@ -118,6 +142,9 @@ target-version = "py313"
|
|
|
118
142
|
line-length = 88
|
|
119
143
|
extend-exclude = [
|
|
120
144
|
"tests/initial_test_state",
|
|
145
|
+
# Vendored websockets — upstream's code style, not ours. Kept in sync
|
|
146
|
+
# with PATHS_IGNORE in scripts/codeql_quality_gate.py.
|
|
147
|
+
"src/ha_mcp/_vendor/websockets",
|
|
121
148
|
# HA integration manifests must be strict JSON (no trailing commas);
|
|
122
149
|
# ruff 0.15+ formats .json files as JSONC and inserts trailing commas
|
|
123
150
|
# which makes Python's json.load() reject the file at HA startup.
|
|
@@ -244,6 +271,13 @@ dev = [
|
|
|
244
271
|
# pins 3.14.3), so the version tested here is one a supported HA runs.
|
|
245
272
|
"aiohttp>=3.13.5",
|
|
246
273
|
"build>=1.2.2",
|
|
274
|
+
# Test infrastructure imports the SHARED websockets directly (the HAOS
|
|
275
|
+
# runtime harness, the image bake, wait_helpers) to talk to Home
|
|
276
|
+
# Assistant's own WebSocket API — that is test tooling driving HA, not
|
|
277
|
+
# ha-mcp code, so it does not go through the vendored copy. Declared
|
|
278
|
+
# here so the test suite never depends on it arriving transitively;
|
|
279
|
+
# it is NOT a runtime dependency (see the note in [project.dependencies]).
|
|
280
|
+
"websockets>=15.0.1",
|
|
247
281
|
"docker>=7.1.0",
|
|
248
282
|
"httpx2>=2.4.0",
|
|
249
283
|
"mypy>=1.17.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Vendored third-party libraries (see each subpackage's VENDORED marker)."""
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Vendored-library pins, bumped by the renovate custom manager that matches
|
|
2
|
+
# this exact path (see renovate.json — no stock manager sees this file).
|
|
3
|
+
#
|
|
4
|
+
# A bump lands here FIRST and the tree stays stale, so the drift test in
|
|
5
|
+
# tests/src/unit/test_vendored_websockets.py fails that PR on purpose:
|
|
6
|
+
# run `python scripts/vendor_websockets.py` and commit the regenerated tree
|
|
7
|
+
# to make it green. That red CI is the handoff, not a mistake.
|
|
8
|
+
websockets==17.0.1
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Copyright (c) Aymeric Augustin and contributors
|
|
2
|
+
|
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
|
4
|
+
modification, are permitted provided that the following conditions are met:
|
|
5
|
+
|
|
6
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
7
|
+
this list of conditions and the following disclaimer.
|
|
8
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
9
|
+
this list of conditions and the following disclaimer in the documentation
|
|
10
|
+
and/or other materials provided with the distribution.
|
|
11
|
+
* Neither the name of the copyright holder nor the names of its contributors
|
|
12
|
+
may be used to endorse or promote products derived from this software
|
|
13
|
+
without specific prior written permission.
|
|
14
|
+
|
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
16
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
17
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
19
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
20
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
21
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
22
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
23
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
24
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
3d6a0c050d8bec52fabad502e45fb25bd02bcadbd70dea34d447b6a0ff4e6da8 LICENSE
|
|
2
|
+
c7a15094e48d9870f5ca9292be2dbcf02c1236041a596c7364ecd7fb952a5a5a VENDORED
|
|
3
|
+
ce6042263ec421ae99244403a787487739dfcc025403c756e35fa3ec49be4034 __init__.py
|
|
4
|
+
c2ee4ddb093c9af060cafaf68219907f8a6b7b301ed3f8bea75db7555adec987 __main__.py
|
|
5
|
+
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 asyncio/__init__.py
|
|
6
|
+
a00be58048d15e2c6622bb6d6d0678020880f287ad03c123c6633fdfa6eaa151 asyncio/client.py
|
|
7
|
+
5772fe3eb5c6f2367fe88cad23ef5fb40f893a598a5e59c8f68092d605b1b083 asyncio/connection.py
|
|
8
|
+
bc13ddf7722e2f72c4d0e4b179a202223cefca886de7792687efd9868f9b1b35 asyncio/messages.py
|
|
9
|
+
8147589f675cfbe913fa434414e6bfab0a3f779bda5f7e16ca844db8f39256b5 asyncio/router.py
|
|
10
|
+
e97a29f917bc4aa84ab01504b6ba5cf3d7ad16e42258f3f273d833ec072b866a asyncio/server.py
|
|
11
|
+
53f2709a7e7d65143a11e7293af322cd0086fd96c0be051fd6293b85a6510b77 auth.py
|
|
12
|
+
7d87f462aad6231fe224303e45675cce1e6f8cef69e99c59be613beb56d4420d cli.py
|
|
13
|
+
0e9e23f3db8b9f35ec22d65ab03b3c855d38e587d1a57e9f60956e866b840c0d client.py
|
|
14
|
+
38b88c56435ddb9ffceac07c43b0ab0b00685f2f6703438281d80b440f16511f connection.py
|
|
15
|
+
5c64efbe015d6527af355fd3ebe2e8f83c66d951f125c80a9789750cd43a7d4f datastructures.py
|
|
16
|
+
b69d3f132a907ddec260d3879b102278e1fc11df4f49016dd7c7be0ae45e4ce6 exceptions.py
|
|
17
|
+
42466cc5a255965552a75ba1743e6e3c689b75bc7fd3dd46ad555f4b92d7729c extensions/__init__.py
|
|
18
|
+
24d7f2939e370bb56e3c7d103a86e2a8aa06af38c920b8deeaccf920bbce3e5e extensions/base.py
|
|
19
|
+
2005dd08663ad337dd8dab4a77a7c37d3322cce79062c9e1d3306d2fdbcfbb30 extensions/permessage_deflate.py
|
|
20
|
+
4f08aa9ff6eebd089b94446e81c4fe3039a73d9ee4b7e14c5c449ed8384e4fda frames.py
|
|
21
|
+
c909cf963559c15d7f57ea4e49128d2c6feef36ef0142d61ef671c8a88dc43c3 headers.py
|
|
22
|
+
b4b56e36f3400f0b7c775ba2e4a305299099313b49e82a9766f7a880b68f6dfd http11.py
|
|
23
|
+
4ff07d4d4987a1c78a310f8f36985d410007d97771031c1240d790120a882e41 imports.py
|
|
24
|
+
c10e7344810d1944bfe5e28d017f42444ef1d53c0a6a92a29ab40515637d4b1b legacy/__init__.py
|
|
25
|
+
0dc41c09279578ff7725c1fcbc5584d072092fe5fe7f6dcb6740ec2696afd52a legacy/auth.py
|
|
26
|
+
e6826ead47333dd7578bc45d7b97c0da10f7578a67bfffd9eb8a514573fa1c1b legacy/client.py
|
|
27
|
+
562123a684f4f5fcf1fd9a9fd1a3460d5b510cd8d768ec3481d0ad6b72e48c57 legacy/exceptions.py
|
|
28
|
+
6f4c0cc7cdd74c85d56683bad299770226ca1db4250dbeeb040ca114491a3029 legacy/framing.py
|
|
29
|
+
d8dcebe40376c6f0c2e4474d3fe901de539cac069436562e8fffa1aff8efee93 legacy/handshake.py
|
|
30
|
+
70e0909835a120a4269bc5161973d6ec20d9834df08e8802b1bd0b3fda1eb4d4 legacy/http.py
|
|
31
|
+
d56508cc31c17b0f8d6757b086672dfd64f4c9c753c53e070dd83e226ef5cf86 legacy/protocol.py
|
|
32
|
+
8529389c54ec23778c45bbb925c2388177a2f546f0d3b452ad28ed2f878cda07 legacy/server.py
|
|
33
|
+
dc7b8204c2d324cc69f491dde49301aad4c5f384ac636f62b871f4cb39ee0ff4 protocol.py
|
|
34
|
+
a05adb118b5ab185aff960dc9e239b0fd9c1479439aa41e9c8254b9e0c7b58c4 proxy.py
|
|
35
|
+
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 py.typed
|
|
36
|
+
ee41092f540414ef294c1f74c0fe1f51b9336060dc6e44daee34ef762499b509 server.py
|
|
37
|
+
ac9ac33522fd872dc42587353c51e3631e2b75dd6f10b0ae6b40b074588737ff streams.py
|
|
38
|
+
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 sync/__init__.py
|
|
39
|
+
8fd7efb0ec02cc98109da03239a558c3a893fc874f10cef42452e37aa5f3da3c sync/client.py
|
|
40
|
+
c497896596676c82c952170d83f94158bdba226bfeb768ec9e73b9cbf79c1dfe sync/connection.py
|
|
41
|
+
abc2b5bf176ba959356ef9f7cd6d49c74f5395a908592c9870e1c2eee7854269 sync/messages.py
|
|
42
|
+
06a29200a35962d45688ec6897da987b27e0c9746b30d27a16b4d364b35c5cc8 sync/router.py
|
|
43
|
+
7d565989a596f084a8a8570963964d6be301c6d2c26023f800b240b677201770 sync/server.py
|
|
44
|
+
4ed5be9dc605bc99a2496da03bcea7804d8156c9e705d2fee07f3c91634361b8 sync/utils.py
|
|
45
|
+
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 trio/__init__.py
|
|
46
|
+
570a49f5b6040883ccaecb17ece436aeb88d5630772e2b43a9748711f109c102 trio/client.py
|
|
47
|
+
95a970258845359a980cfedeebda28f4a5de6c536c6f233cc259a8aac31c7f4b trio/connection.py
|
|
48
|
+
8280dce6b7c8344c67bf27c44d66180d3dfeb6181125dec33ebe2e8f0243dcff trio/messages.py
|
|
49
|
+
a992fdfb8e268bd48e393194dc22c13ee68237369f406a99f9f265f61569bfeb trio/router.py
|
|
50
|
+
8d1b6b7d97f7847a75690a3a7df34c37bb22696cef65586a0b58aad7f3e3d2c0 trio/server.py
|
|
51
|
+
035d8d6143ce8d06a21aeb1a938de85b33c8702c618a429390024b5ed649bdc6 trio/utils.py
|
|
52
|
+
ccbe0f8bfa501c919594be1c4f215abaac6030100523907a75fbcc567ed2158b typing.py
|
|
53
|
+
d9f14cc3e01b289e47547342bb0d51c7532790290d591a688315a184cdf4114e uri.py
|
|
54
|
+
59db6c876a908872eb5d40449e9dcb6ad30b253663076084adb78e16fadd5ef1 utils.py
|
|
55
|
+
4c93e014e70be31b07f08d8a890bb55778fc9121db39dfc458a3559e73aef121 version.py
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
# Importing the typing module would conflict with websockets.typing.
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from .imports import lazy_import
|
|
7
|
+
from .version import version as __version__ # noqa: F401
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
# .asyncio.client
|
|
12
|
+
"connect",
|
|
13
|
+
"unix_connect",
|
|
14
|
+
"ClientConnection",
|
|
15
|
+
# .asyncio.router
|
|
16
|
+
"route",
|
|
17
|
+
"unix_route",
|
|
18
|
+
"Router",
|
|
19
|
+
# .asyncio.server
|
|
20
|
+
"basic_auth",
|
|
21
|
+
"broadcast",
|
|
22
|
+
"serve",
|
|
23
|
+
"unix_serve",
|
|
24
|
+
"ServerConnection",
|
|
25
|
+
"Server",
|
|
26
|
+
# .client
|
|
27
|
+
"ClientProtocol",
|
|
28
|
+
# .datastructures
|
|
29
|
+
"Headers",
|
|
30
|
+
"HeadersLike",
|
|
31
|
+
"MultipleValuesError",
|
|
32
|
+
# .exceptions
|
|
33
|
+
"ConcurrencyError",
|
|
34
|
+
"ConnectionClosed",
|
|
35
|
+
"ConnectionClosedError",
|
|
36
|
+
"ConnectionClosedOK",
|
|
37
|
+
"DuplicateParameter",
|
|
38
|
+
"HeaderLineTooLong",
|
|
39
|
+
"InvalidHandshake",
|
|
40
|
+
"InvalidHeader",
|
|
41
|
+
"InvalidHeaderFormat",
|
|
42
|
+
"InvalidHeaderValue",
|
|
43
|
+
"InvalidMessage",
|
|
44
|
+
"InvalidMethod",
|
|
45
|
+
"InvalidOrigin",
|
|
46
|
+
"InvalidParameterName",
|
|
47
|
+
"InvalidParameterValue",
|
|
48
|
+
"InvalidProtocol",
|
|
49
|
+
"InvalidProxy",
|
|
50
|
+
"InvalidProxyMessage",
|
|
51
|
+
"InvalidProxyStatus",
|
|
52
|
+
"InvalidState",
|
|
53
|
+
"InvalidStatus",
|
|
54
|
+
"InvalidUpgrade",
|
|
55
|
+
"InvalidURI",
|
|
56
|
+
"NegotiationError",
|
|
57
|
+
"PayloadTooBig",
|
|
58
|
+
"ProtocolError",
|
|
59
|
+
"ProxyError",
|
|
60
|
+
"RequestLineTooLong",
|
|
61
|
+
"SecurityError",
|
|
62
|
+
"StatusLineTooLong",
|
|
63
|
+
"TooManyHeaders",
|
|
64
|
+
"WebSocketException",
|
|
65
|
+
# .frames
|
|
66
|
+
"Close",
|
|
67
|
+
"CloseCode",
|
|
68
|
+
"Frame",
|
|
69
|
+
"Opcode",
|
|
70
|
+
# .http11
|
|
71
|
+
"Request",
|
|
72
|
+
"Response",
|
|
73
|
+
# .protocol
|
|
74
|
+
"Protocol",
|
|
75
|
+
"Side",
|
|
76
|
+
"State",
|
|
77
|
+
# .server
|
|
78
|
+
"ServerProtocol",
|
|
79
|
+
# .typing
|
|
80
|
+
"Data",
|
|
81
|
+
"ExtensionName",
|
|
82
|
+
"ExtensionParameter",
|
|
83
|
+
"LoggerLike",
|
|
84
|
+
"StatusLike",
|
|
85
|
+
"Origin",
|
|
86
|
+
"Subprotocol",
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
# When type checking, import non-deprecated aliases eagerly. Else, import on demand.
|
|
90
|
+
if TYPE_CHECKING:
|
|
91
|
+
from .asyncio.client import ClientConnection, connect, unix_connect
|
|
92
|
+
from .asyncio.router import Router, route, unix_route
|
|
93
|
+
from .asyncio.server import (
|
|
94
|
+
Server,
|
|
95
|
+
ServerConnection,
|
|
96
|
+
basic_auth,
|
|
97
|
+
broadcast,
|
|
98
|
+
serve,
|
|
99
|
+
unix_serve,
|
|
100
|
+
)
|
|
101
|
+
from .client import ClientProtocol
|
|
102
|
+
from .datastructures import Headers, HeadersLike, MultipleValuesError
|
|
103
|
+
from .exceptions import (
|
|
104
|
+
ConcurrencyError,
|
|
105
|
+
ConnectionClosed,
|
|
106
|
+
ConnectionClosedError,
|
|
107
|
+
ConnectionClosedOK,
|
|
108
|
+
DuplicateParameter,
|
|
109
|
+
HeaderLineTooLong,
|
|
110
|
+
InvalidHandshake,
|
|
111
|
+
InvalidHeader,
|
|
112
|
+
InvalidHeaderFormat,
|
|
113
|
+
InvalidHeaderValue,
|
|
114
|
+
InvalidMessage,
|
|
115
|
+
InvalidMethod,
|
|
116
|
+
InvalidOrigin,
|
|
117
|
+
InvalidParameterName,
|
|
118
|
+
InvalidParameterValue,
|
|
119
|
+
InvalidProtocol,
|
|
120
|
+
InvalidProxy,
|
|
121
|
+
InvalidProxyMessage,
|
|
122
|
+
InvalidProxyStatus,
|
|
123
|
+
InvalidState,
|
|
124
|
+
InvalidStatus,
|
|
125
|
+
InvalidUpgrade,
|
|
126
|
+
InvalidURI,
|
|
127
|
+
NegotiationError,
|
|
128
|
+
PayloadTooBig,
|
|
129
|
+
ProtocolError,
|
|
130
|
+
ProxyError,
|
|
131
|
+
RequestLineTooLong,
|
|
132
|
+
SecurityError,
|
|
133
|
+
StatusLineTooLong,
|
|
134
|
+
TooManyHeaders,
|
|
135
|
+
WebSocketException,
|
|
136
|
+
)
|
|
137
|
+
from .frames import Close, CloseCode, Frame, Opcode
|
|
138
|
+
from .http11 import Request, Response
|
|
139
|
+
from .protocol import Protocol, Side, State
|
|
140
|
+
from .server import ServerProtocol
|
|
141
|
+
from .typing import (
|
|
142
|
+
Data,
|
|
143
|
+
ExtensionName,
|
|
144
|
+
ExtensionParameter,
|
|
145
|
+
LoggerLike,
|
|
146
|
+
Origin,
|
|
147
|
+
StatusLike,
|
|
148
|
+
Subprotocol,
|
|
149
|
+
)
|
|
150
|
+
else:
|
|
151
|
+
lazy_import(
|
|
152
|
+
globals(),
|
|
153
|
+
aliases={
|
|
154
|
+
# .asyncio.client
|
|
155
|
+
"connect": ".asyncio.client",
|
|
156
|
+
"unix_connect": ".asyncio.client",
|
|
157
|
+
"ClientConnection": ".asyncio.client",
|
|
158
|
+
# .asyncio.router
|
|
159
|
+
"route": ".asyncio.router",
|
|
160
|
+
"unix_route": ".asyncio.router",
|
|
161
|
+
"Router": ".asyncio.router",
|
|
162
|
+
# .asyncio.server
|
|
163
|
+
"basic_auth": ".asyncio.server",
|
|
164
|
+
"broadcast": ".asyncio.server",
|
|
165
|
+
"serve": ".asyncio.server",
|
|
166
|
+
"unix_serve": ".asyncio.server",
|
|
167
|
+
"ServerConnection": ".asyncio.server",
|
|
168
|
+
"Server": ".asyncio.server",
|
|
169
|
+
# .client
|
|
170
|
+
"ClientProtocol": ".client",
|
|
171
|
+
# .datastructures
|
|
172
|
+
"Headers": ".datastructures",
|
|
173
|
+
"HeadersLike": ".datastructures",
|
|
174
|
+
"MultipleValuesError": ".datastructures",
|
|
175
|
+
# .exceptions
|
|
176
|
+
"ConcurrencyError": ".exceptions",
|
|
177
|
+
"ConnectionClosed": ".exceptions",
|
|
178
|
+
"ConnectionClosedError": ".exceptions",
|
|
179
|
+
"ConnectionClosedOK": ".exceptions",
|
|
180
|
+
"DuplicateParameter": ".exceptions",
|
|
181
|
+
"HeaderLineTooLong": ".exceptions",
|
|
182
|
+
"InvalidHandshake": ".exceptions",
|
|
183
|
+
"InvalidHeader": ".exceptions",
|
|
184
|
+
"InvalidHeaderFormat": ".exceptions",
|
|
185
|
+
"InvalidHeaderValue": ".exceptions",
|
|
186
|
+
"InvalidMessage": ".exceptions",
|
|
187
|
+
"InvalidMethod": ".exceptions",
|
|
188
|
+
"InvalidOrigin": ".exceptions",
|
|
189
|
+
"InvalidParameterName": ".exceptions",
|
|
190
|
+
"InvalidParameterValue": ".exceptions",
|
|
191
|
+
"InvalidProtocol": ".exceptions",
|
|
192
|
+
"InvalidProxy": ".exceptions",
|
|
193
|
+
"InvalidProxyMessage": ".exceptions",
|
|
194
|
+
"InvalidProxyStatus": ".exceptions",
|
|
195
|
+
"InvalidState": ".exceptions",
|
|
196
|
+
"InvalidStatus": ".exceptions",
|
|
197
|
+
"InvalidUpgrade": ".exceptions",
|
|
198
|
+
"InvalidURI": ".exceptions",
|
|
199
|
+
"NegotiationError": ".exceptions",
|
|
200
|
+
"PayloadTooBig": ".exceptions",
|
|
201
|
+
"ProtocolError": ".exceptions",
|
|
202
|
+
"ProxyError": ".exceptions",
|
|
203
|
+
"RequestLineTooLong": ".exceptions",
|
|
204
|
+
"SecurityError": ".exceptions",
|
|
205
|
+
"StatusLineTooLong": ".exceptions",
|
|
206
|
+
"TooManyHeaders": ".exceptions",
|
|
207
|
+
"WebSocketException": ".exceptions",
|
|
208
|
+
# .frames
|
|
209
|
+
"Close": ".frames",
|
|
210
|
+
"CloseCode": ".frames",
|
|
211
|
+
"Frame": ".frames",
|
|
212
|
+
"Opcode": ".frames",
|
|
213
|
+
# .http11
|
|
214
|
+
"Request": ".http11",
|
|
215
|
+
"Response": ".http11",
|
|
216
|
+
# .protocol
|
|
217
|
+
"Protocol": ".protocol",
|
|
218
|
+
"Side": ".protocol",
|
|
219
|
+
"State": ".protocol",
|
|
220
|
+
# .server
|
|
221
|
+
"ServerProtocol": ".server",
|
|
222
|
+
# .typing
|
|
223
|
+
"Data": ".typing",
|
|
224
|
+
"ExtensionName": ".typing",
|
|
225
|
+
"ExtensionParameter": ".typing",
|
|
226
|
+
"LoggerLike": ".typing",
|
|
227
|
+
"Origin": ".typing",
|
|
228
|
+
"StatusLike": ".typing",
|
|
229
|
+
"Subprotocol": ".typing",
|
|
230
|
+
},
|
|
231
|
+
deprecated_aliases={
|
|
232
|
+
# deprecated in 14.0 - 2024-11-09
|
|
233
|
+
# .legacy.auth
|
|
234
|
+
"BasicAuthWebSocketServerProtocol": ".legacy.auth",
|
|
235
|
+
"basic_auth_protocol_factory": ".legacy.auth",
|
|
236
|
+
# .legacy.client
|
|
237
|
+
"WebSocketClientProtocol": ".legacy.client",
|
|
238
|
+
# .legacy.exceptions
|
|
239
|
+
"AbortHandshake": ".legacy.exceptions",
|
|
240
|
+
"InvalidStatusCode": ".legacy.exceptions",
|
|
241
|
+
"RedirectHandshake": ".legacy.exceptions",
|
|
242
|
+
"WebSocketProtocolError": ".legacy.exceptions",
|
|
243
|
+
# .legacy.protocol
|
|
244
|
+
"WebSocketCommonProtocol": ".legacy.protocol",
|
|
245
|
+
# .legacy.server
|
|
246
|
+
"WebSocketServer": ".legacy.server",
|
|
247
|
+
"WebSocketServerProtocol": ".legacy.server",
|
|
248
|
+
},
|
|
249
|
+
)
|