ha-mcp-dev 8.4.3.dev2559__tar.gz → 8.4.3.dev2561__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.4.3.dev2559/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2561}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/pyproject.toml +1 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/requirements.txt +1 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +16 -16
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/VENDORED +1 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/client.py +24 -62
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +4 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/router.py +3 -2
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/server.py +2 -2
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/client.py +49 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +7 -1
- ha_mcp_dev-8.4.3.dev2561/src/ha_mcp/_vendor/websockets/sync/client.py +1116 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/connection.py +11 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/router.py +3 -2
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/server.py +5 -4
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/client.py +33 -18
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/connection.py +2 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/messages.py +5 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/typing.py +4 -2
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/version.py +1 -1
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- ha_mcp_dev-8.4.3.dev2559/src/ha_mcp/_vendor/websockets/sync/client.py +0 -644
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/setup.cfg +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/tests/test_env_manager.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.4.3.
|
|
7
|
+
version = "8.4.3.dev2561"
|
|
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
|
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
# bump, including the source, license, and manifest in the same update.
|
|
6
6
|
# tests/src/unit/test_vendored_websockets.py still rejects stale or altered trees.
|
|
7
7
|
# For a manual pin change, run the same generator and commit its outputs.
|
|
8
|
-
websockets==17.
|
|
8
|
+
websockets==17.1
|
{ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
3d6a0c050d8bec52fabad502e45fb25bd02bcadbd70dea34d447b6a0ff4e6da8 LICENSE
|
|
2
|
-
|
|
2
|
+
e7a0229f98e8331a0e109d2e5a05d98fe445782329e54e418d0312589687c5af VENDORED
|
|
3
3
|
ce6042263ec421ae99244403a787487739dfcc025403c756e35fa3ec49be4034 __init__.py
|
|
4
4
|
c2ee4ddb093c9af060cafaf68219907f8a6b7b301ed3f8bea75db7555adec987 __main__.py
|
|
5
5
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 asyncio/__init__.py
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
76cd6b1f39464325281925529b466d73640be5c2ce8942bdf79edb3b42baf8e6 asyncio/client.py
|
|
7
|
+
f2eb6ad56371fab33839a7ad2694e4b5610bea839bf92ae1f76e6d0a63f1e346 asyncio/connection.py
|
|
8
8
|
bc13ddf7722e2f72c4d0e4b179a202223cefca886de7792687efd9868f9b1b35 asyncio/messages.py
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
2453543482e4001e4ff5fb7a3cba2035a66aea9f765b3d7dbc89717f1d434e58 asyncio/router.py
|
|
10
|
+
df846da778379c058b0da052731b9ba1f73390da0320c33330f03074b14ac6fc asyncio/server.py
|
|
11
11
|
53f2709a7e7d65143a11e7293af322cd0086fd96c0be051fd6293b85a6510b77 auth.py
|
|
12
12
|
7d87f462aad6231fe224303e45675cce1e6f8cef69e99c59be613beb56d4420d cli.py
|
|
13
|
-
|
|
13
|
+
eaf4e66220a92297bc794adc98494e63ea0aae21fa394c72a7e846a535af3cc7 client.py
|
|
14
14
|
38b88c56435ddb9ffceac07c43b0ab0b00685f2f6703438281d80b440f16511f connection.py
|
|
15
15
|
5c64efbe015d6527af355fd3ebe2e8f83c66d951f125c80a9789750cd43a7d4f datastructures.py
|
|
16
16
|
b69d3f132a907ddec260d3879b102278e1fc11df4f49016dd7c7be0ae45e4ce6 exceptions.py
|
|
@@ -28,7 +28,7 @@ e6826ead47333dd7578bc45d7b97c0da10f7578a67bfffd9eb8a514573fa1c1b legacy/client.
|
|
|
28
28
|
6f4c0cc7cdd74c85d56683bad299770226ca1db4250dbeeb040ca114491a3029 legacy/framing.py
|
|
29
29
|
d8dcebe40376c6f0c2e4474d3fe901de539cac069436562e8fffa1aff8efee93 legacy/handshake.py
|
|
30
30
|
70e0909835a120a4269bc5161973d6ec20d9834df08e8802b1bd0b3fda1eb4d4 legacy/http.py
|
|
31
|
-
|
|
31
|
+
dcc4e1d7ed24b564ad4425f4d252d5ebd80bcc5ffd8009fc60b144fdb664cd8c legacy/protocol.py
|
|
32
32
|
8529389c54ec23778c45bbb925c2388177a2f546f0d3b452ad28ed2f878cda07 legacy/server.py
|
|
33
33
|
dc7b8204c2d324cc69f491dde49301aad4c5f384ac636f62b871f4cb39ee0ff4 protocol.py
|
|
34
34
|
a05adb118b5ab185aff960dc9e239b0fd9c1479439aa41e9c8254b9e0c7b58c4 proxy.py
|
|
@@ -36,20 +36,20 @@ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 py.typed
|
|
|
36
36
|
ee41092f540414ef294c1f74c0fe1f51b9336060dc6e44daee34ef762499b509 server.py
|
|
37
37
|
ac9ac33522fd872dc42587353c51e3631e2b75dd6f10b0ae6b40b074588737ff streams.py
|
|
38
38
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 sync/__init__.py
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
5b20fde3794aee3e0d40b23b3eaa3158411d77d98c2098e96b4344c71d3c3e3e sync/client.py
|
|
40
|
+
019a800cd64e13779c4e2a93ed636ad67b146eea23683169ccd89c10df702054 sync/connection.py
|
|
41
41
|
abc2b5bf176ba959356ef9f7cd6d49c74f5395a908592c9870e1c2eee7854269 sync/messages.py
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
c0e180bc66cac17caa98d1050425993f77da1efcbfd8c28deced977842fc9c62 sync/router.py
|
|
43
|
+
5534fa4ec47e27e352596e657bc51531334d14dccfa7ac1b656b9541487e8d89 sync/server.py
|
|
44
44
|
4ed5be9dc605bc99a2496da03bcea7804d8156c9e705d2fee07f3c91634361b8 sync/utils.py
|
|
45
45
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 trio/__init__.py
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
9b637921a141acf61c52da755423d4a3cb49d94162d9f4381bef793382423b15 trio/client.py
|
|
47
|
+
d571c39156caddefccf75a4e186798793d286b350ce4d8ea1cea30d0590dae06 trio/connection.py
|
|
48
|
+
4a66c0d64fe58c41ae10764d2741cf0def3ea231ed313897191db41eb3c9b8a9 trio/messages.py
|
|
49
49
|
a992fdfb8e268bd48e393194dc22c13ee68237369f406a99f9f265f61569bfeb trio/router.py
|
|
50
50
|
8d1b6b7d97f7847a75690a3a7df34c37bb22696cef65586a0b58aad7f3e3d2c0 trio/server.py
|
|
51
51
|
035d8d6143ce8d06a21aeb1a938de85b33c8702c618a429390024b5ed649bdc6 trio/utils.py
|
|
52
|
-
|
|
52
|
+
72ef3d9ff5d05e7a3f83da8fa459a12db6f39c4f8c2956b3500a30b36bb926a5 typing.py
|
|
53
53
|
d9f14cc3e01b289e47547342bb0d51c7532790290d591a688315a184cdf4114e uri.py
|
|
54
54
|
59db6c876a908872eb5d40449e9dcb6ad30b253663076084adb78e16fadd5ef1 utils.py
|
|
55
|
-
|
|
55
|
+
fa82d6b7f153a88ea409283331194af48235ef365eece9cbc359d6d99bea5c4b version.py
|
{ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/VENDORED
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
websockets==17.
|
|
1
|
+
websockets==17.1
|
|
2
2
|
Vendored by scripts/vendor_websockets.py — do not edit by hand.
|
|
@@ -11,10 +11,9 @@ from collections.abc import AsyncIterator, Generator, Sequence
|
|
|
11
11
|
from types import TracebackType
|
|
12
12
|
from typing import Any, Callable, Literal, cast
|
|
13
13
|
|
|
14
|
-
from ..client import ClientProtocol, backoff
|
|
14
|
+
from ..client import ClientProtocol, backoff, process_exception
|
|
15
15
|
from ..datastructures import Headers, HeadersLike
|
|
16
16
|
from ..exceptions import (
|
|
17
|
-
InvalidMessage,
|
|
18
17
|
InvalidProxyMessage,
|
|
19
18
|
InvalidProxyStatus,
|
|
20
19
|
InvalidStatus,
|
|
@@ -28,7 +27,7 @@ from ..http11 import USER_AGENT, Response
|
|
|
28
27
|
from ..protocol import CONNECTING, Event
|
|
29
28
|
from ..proxy import Proxy, get_proxy, parse_proxy, prepare_connect_request
|
|
30
29
|
from ..streams import StreamReader
|
|
31
|
-
from ..typing import LoggerLike, Origin, Subprotocol
|
|
30
|
+
from ..typing import LoggerLike, Origin, PathLike, Subprotocol
|
|
32
31
|
from ..uri import WebSocketURI, parse_uri
|
|
33
32
|
from .connection import Connection
|
|
34
33
|
|
|
@@ -128,59 +127,14 @@ class ClientConnection(Connection):
|
|
|
128
127
|
super().process_event(event)
|
|
129
128
|
|
|
130
129
|
|
|
131
|
-
def process_exception(exc: Exception) -> Exception | None:
|
|
132
|
-
"""
|
|
133
|
-
Determine whether a connection error is retryable or fatal.
|
|
134
|
-
|
|
135
|
-
When reconnecting automatically with ``async for ... in connect(...)``, if a
|
|
136
|
-
connection attempt fails, :func:`process_exception` is called to determine
|
|
137
|
-
whether to retry connecting or to raise the exception.
|
|
138
|
-
|
|
139
|
-
This function defines the default behavior, which is to retry on:
|
|
140
|
-
|
|
141
|
-
* :exc:`EOFError`, :exc:`OSError`, :exc:`asyncio.TimeoutError`: network
|
|
142
|
-
errors;
|
|
143
|
-
* :exc:`~websockets.exceptions.InvalidStatus` when the status code is 500,
|
|
144
|
-
502, 503, or 504: server or proxy errors.
|
|
145
|
-
|
|
146
|
-
All other exceptions are considered fatal.
|
|
147
|
-
|
|
148
|
-
You can change this behavior with the ``process_exception`` argument of
|
|
149
|
-
:func:`connect`.
|
|
150
|
-
|
|
151
|
-
Return :obj:`None` if the exception is retryable i.e. when the error could
|
|
152
|
-
be transient and trying to reconnect with the same parameters could succeed.
|
|
153
|
-
The exception will be logged at the ``INFO`` level.
|
|
154
|
-
|
|
155
|
-
Return an exception, either ``exc`` or a new exception, if the exception is
|
|
156
|
-
fatal i.e. when trying to reconnect will most likely produce the same error.
|
|
157
|
-
That exception will be raised, breaking out of the retry loop.
|
|
158
|
-
|
|
159
|
-
"""
|
|
160
|
-
# This catches python-socks' ProxyConnectionError and ProxyTimeoutError.
|
|
161
|
-
if isinstance(exc, (OSError, TimeoutError)):
|
|
162
|
-
return None
|
|
163
|
-
if isinstance(exc, InvalidMessage) and isinstance(exc.__cause__, EOFError):
|
|
164
|
-
return None
|
|
165
|
-
if isinstance(exc, InvalidStatus) and exc.response.status_code in [
|
|
166
|
-
500, # Internal Server Error
|
|
167
|
-
502, # Bad Gateway
|
|
168
|
-
503, # Service Unavailable
|
|
169
|
-
504, # Gateway Timeout
|
|
170
|
-
]:
|
|
171
|
-
return None
|
|
172
|
-
return exc
|
|
173
|
-
|
|
174
|
-
|
|
175
130
|
# This is spelled in lower case because it's exposed as a callable in the API.
|
|
176
131
|
class connect:
|
|
177
132
|
"""
|
|
178
133
|
Connect to the WebSocket server at ``uri``.
|
|
179
134
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
:func:`connect` may be used as an asynchronous context manager::
|
|
135
|
+
:func:`connect` should be treated as an asynchronous context manager
|
|
136
|
+
yielding a :class:`ClientConnection`, which can then receive and send
|
|
137
|
+
messages::
|
|
184
138
|
|
|
185
139
|
from websockets.asyncio.client import connect
|
|
186
140
|
|
|
@@ -189,8 +143,8 @@ class connect:
|
|
|
189
143
|
|
|
190
144
|
The connection is closed automatically when exiting the context.
|
|
191
145
|
|
|
192
|
-
:func:`connect` can be
|
|
193
|
-
reconnect automatically on errors::
|
|
146
|
+
:func:`connect` can also be treated as an infinite asynchronous iterator
|
|
147
|
+
to reconnect automatically on errors::
|
|
194
148
|
|
|
195
149
|
async for websocket in connect(...):
|
|
196
150
|
try:
|
|
@@ -204,6 +158,13 @@ class connect:
|
|
|
204
158
|
|
|
205
159
|
The connection is closed automatically after each iteration of the loop.
|
|
206
160
|
|
|
161
|
+
:func:`connect` can be awaited directly::
|
|
162
|
+
|
|
163
|
+
websocket = await connect(...)
|
|
164
|
+
|
|
165
|
+
In that case, you're responsible for closing the connection with
|
|
166
|
+
:meth:`ClientConnection.close` when no longer needed.
|
|
167
|
+
|
|
207
168
|
Args:
|
|
208
169
|
uri: URI of the WebSocket server.
|
|
209
170
|
origin: Value of the ``Origin`` header, for servers that require it.
|
|
@@ -225,7 +186,8 @@ class connect:
|
|
|
225
186
|
<../../topics/proxies>` for details.
|
|
226
187
|
process_exception: When reconnecting automatically, tell whether an
|
|
227
188
|
error is transient or fatal. The default behavior is defined by
|
|
228
|
-
:func
|
|
189
|
+
:func:`~websockets.client.process_exception`. Refer to its
|
|
190
|
+
documentation for details.
|
|
229
191
|
open_timeout: Timeout for opening the connection in seconds.
|
|
230
192
|
:obj:`None` disables the timeout.
|
|
231
193
|
ping_interval: Interval between keepalive pings in seconds.
|
|
@@ -555,13 +517,7 @@ class connect:
|
|
|
555
517
|
|
|
556
518
|
return new_uri
|
|
557
519
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
def __await__(self) -> Generator[Any, None, ClientConnection]:
|
|
561
|
-
# Create a suitable iterator by calling __await__ on a coroutine.
|
|
562
|
-
return self.__await_impl__().__await__()
|
|
563
|
-
|
|
564
|
-
async def __await_impl__(self) -> ClientConnection:
|
|
520
|
+
async def connect(self) -> ClientConnection:
|
|
565
521
|
try:
|
|
566
522
|
async with asyncio.timeout(self.open_timeout):
|
|
567
523
|
for _ in range(MAX_REDIRECTS):
|
|
@@ -606,6 +562,12 @@ class connect:
|
|
|
606
562
|
# Re-raise exception with an informative error message.
|
|
607
563
|
raise TimeoutError("timed out during opening handshake") from exc
|
|
608
564
|
|
|
565
|
+
# ... = await connect(...)
|
|
566
|
+
|
|
567
|
+
def __await__(self) -> Generator[Any, None, ClientConnection]:
|
|
568
|
+
# Create a suitable iterator by calling __await__ on a coroutine.
|
|
569
|
+
return self.connect().__await__()
|
|
570
|
+
|
|
609
571
|
# async with connect(...) as ...: ...
|
|
610
572
|
|
|
611
573
|
async def __aenter__(self) -> ClientConnection:
|
|
@@ -668,7 +630,7 @@ class connect:
|
|
|
668
630
|
|
|
669
631
|
|
|
670
632
|
def unix_connect(
|
|
671
|
-
path:
|
|
633
|
+
path: PathLike | None = None,
|
|
672
634
|
uri: str | None = None,
|
|
673
635
|
**kwargs: Any,
|
|
674
636
|
) -> connect:
|
|
@@ -8,6 +8,7 @@ import random
|
|
|
8
8
|
import struct
|
|
9
9
|
import traceback
|
|
10
10
|
import uuid
|
|
11
|
+
import weakref
|
|
11
12
|
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
|
|
12
13
|
from types import TracebackType
|
|
13
14
|
from typing import Any, Literal, Self, cast, overload
|
|
@@ -67,7 +68,7 @@ class Connection(asyncio.Protocol):
|
|
|
67
68
|
# Inject reference to this instance in the protocol's logger.
|
|
68
69
|
self.protocol.logger = logging.LoggerAdapter(
|
|
69
70
|
self.protocol.logger,
|
|
70
|
-
{"websocket": self},
|
|
71
|
+
{"websocket": weakref.proxy(self)},
|
|
71
72
|
)
|
|
72
73
|
|
|
73
74
|
# Copy attributes from the protocol for convenience.
|
|
@@ -1025,6 +1026,8 @@ class Connection(asyncio.Protocol):
|
|
|
1025
1026
|
|
|
1026
1027
|
if self.keepalive_task is not None:
|
|
1027
1028
|
self.keepalive_task.cancel()
|
|
1029
|
+
# Break reference cycle to allow immediate garbage collection.
|
|
1030
|
+
self.keepalive_task = None
|
|
1028
1031
|
|
|
1029
1032
|
# If self.connection_lost_waiter isn't pending, that's a bug, because:
|
|
1030
1033
|
# - it's set only here in connection_lost() which is called only once;
|
|
@@ -6,6 +6,7 @@ import urllib.parse
|
|
|
6
6
|
from typing import Any, Awaitable, Callable, Literal
|
|
7
7
|
|
|
8
8
|
from ..http11 import Request, Response
|
|
9
|
+
from ..typing import PathLike
|
|
9
10
|
from .server import Server, ServerConnection, serve
|
|
10
11
|
|
|
11
12
|
|
|
@@ -30,7 +31,7 @@ except ImportError:
|
|
|
30
31
|
|
|
31
32
|
def unix_route(
|
|
32
33
|
url_map: Map,
|
|
33
|
-
path:
|
|
34
|
+
path: PathLike | None = None,
|
|
34
35
|
**kwargs: Any,
|
|
35
36
|
) -> Server:
|
|
36
37
|
raise ImportError("unix_route() requires werkzeug")
|
|
@@ -155,7 +156,7 @@ else:
|
|
|
155
156
|
|
|
156
157
|
def unix_route(
|
|
157
158
|
url_map: Map,
|
|
158
|
-
path:
|
|
159
|
+
path: PathLike | None = None,
|
|
159
160
|
**kwargs: Any,
|
|
160
161
|
) -> Server:
|
|
161
162
|
"""
|
|
@@ -22,7 +22,7 @@ from ..headers import (
|
|
|
22
22
|
from ..http11 import SERVER, Request, Response
|
|
23
23
|
from ..protocol import CONNECTING, OPEN, Event
|
|
24
24
|
from ..server import ServerProtocol
|
|
25
|
-
from ..typing import LoggerLike, Origin, StatusLike, Subprotocol
|
|
25
|
+
from ..typing import LoggerLike, Origin, PathLike, StatusLike, Subprotocol
|
|
26
26
|
from ..utils import get_socket_name
|
|
27
27
|
from .connection import Connection, broadcast
|
|
28
28
|
|
|
@@ -769,7 +769,7 @@ def serve(
|
|
|
769
769
|
|
|
770
770
|
def unix_serve(
|
|
771
771
|
handler: Callable[[ServerConnection], Awaitable[None]],
|
|
772
|
-
path:
|
|
772
|
+
path: PathLike | None = None,
|
|
773
773
|
**kwargs: Any,
|
|
774
774
|
) -> Server:
|
|
775
775
|
"""
|
{ha_mcp_dev-8.4.3.dev2559 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/client.py
RENAMED
|
@@ -357,6 +357,55 @@ class ClientConnection(ClientProtocol):
|
|
|
357
357
|
super().__init__(*args, **kwargs)
|
|
358
358
|
|
|
359
359
|
|
|
360
|
+
def process_exception(exc: Exception) -> Exception | None:
|
|
361
|
+
"""
|
|
362
|
+
Determine whether a connection error is retryable or fatal.
|
|
363
|
+
|
|
364
|
+
When reconnecting automatically with ``async for ... in connect(...)``
|
|
365
|
+
(:mod:`asyncio`, :mod:`trio`) or ``for ... in reconnect(...)``
|
|
366
|
+
(:mod:`threading`), whenever a connection attempt fails,
|
|
367
|
+
:func:`process_exception` determines whether to retry connecting or to raise
|
|
368
|
+
the exception.
|
|
369
|
+
|
|
370
|
+
This function defines the default behavior, which is to retry on:
|
|
371
|
+
|
|
372
|
+
* :exc:`OSError` and :exc:`asyncio.TimeoutError`: network errors;
|
|
373
|
+
* :exc:`~websockets.exceptions.InvalidMessage` when it stems from an
|
|
374
|
+
:exc:`EOFError`: also network errors;
|
|
375
|
+
* :exc:`~websockets.exceptions.InvalidStatus` when the status code is 500,
|
|
376
|
+
502, 503, or 504: server or proxy errors.
|
|
377
|
+
|
|
378
|
+
All other exceptions are considered fatal.
|
|
379
|
+
|
|
380
|
+
You can change this behavior with the ``process_exception`` argument of
|
|
381
|
+
:func:`~websockets.asyncio.client.connect` (:mod:`asyncio`),
|
|
382
|
+
:func:`~websockets.trio.client.connect` (:mod:`trio`), or
|
|
383
|
+
:func:`~websockets.sync.client.reconnect` (:mod:`threading`).
|
|
384
|
+
|
|
385
|
+
Return :obj:`None` if the exception is retryable i.e. when the error could
|
|
386
|
+
be transient and trying to reconnect with the same parameters could succeed.
|
|
387
|
+
The exception will be logged at the ``INFO`` level.
|
|
388
|
+
|
|
389
|
+
Return an exception, either ``exc`` or a new exception, if the exception is
|
|
390
|
+
fatal i.e. when trying to reconnect will most likely produce the same error.
|
|
391
|
+
That exception will be raised, breaking out of the retry loop.
|
|
392
|
+
|
|
393
|
+
"""
|
|
394
|
+
# This catches python-socks' ProxyConnectionError and ProxyTimeoutError.
|
|
395
|
+
if isinstance(exc, (OSError, TimeoutError)):
|
|
396
|
+
return None
|
|
397
|
+
if isinstance(exc, InvalidMessage) and isinstance(exc.__cause__, EOFError):
|
|
398
|
+
return None
|
|
399
|
+
if isinstance(exc, InvalidStatus) and exc.response.status_code in [
|
|
400
|
+
500, # Internal Server Error
|
|
401
|
+
502, # Bad Gateway
|
|
402
|
+
503, # Service Unavailable
|
|
403
|
+
504, # Gateway Timeout
|
|
404
|
+
]:
|
|
405
|
+
return None
|
|
406
|
+
return exc
|
|
407
|
+
|
|
408
|
+
|
|
360
409
|
BACKOFF_INITIAL_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_INITIAL_DELAY", "5"))
|
|
361
410
|
BACKOFF_MIN_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_MIN_DELAY", "3.1"))
|
|
362
411
|
BACKOFF_MAX_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_MAX_DELAY", "90.0"))
|
|
@@ -11,6 +11,7 @@ import time
|
|
|
11
11
|
import traceback
|
|
12
12
|
import uuid
|
|
13
13
|
import warnings
|
|
14
|
+
import weakref
|
|
14
15
|
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
|
|
15
16
|
from typing import Any, Callable, Deque, cast
|
|
16
17
|
|
|
@@ -205,7 +206,10 @@ class WebSocketCommonProtocol(asyncio.Protocol):
|
|
|
205
206
|
# Logger or LoggerAdapter for this connection.
|
|
206
207
|
if logger is None:
|
|
207
208
|
logger = logging.getLogger("websockets.protocol")
|
|
208
|
-
self.logger: LoggerLike = logging.LoggerAdapter(
|
|
209
|
+
self.logger: LoggerLike = logging.LoggerAdapter(
|
|
210
|
+
logger,
|
|
211
|
+
{"websocket": weakref.proxy(self)},
|
|
212
|
+
)
|
|
209
213
|
"""Logger for this connection."""
|
|
210
214
|
|
|
211
215
|
# Track if DEBUG is enabled. Shortcut logging calls if it isn't.
|
|
@@ -1278,6 +1282,8 @@ class WebSocketCommonProtocol(asyncio.Protocol):
|
|
|
1278
1282
|
# Cancel the keepalive ping task.
|
|
1279
1283
|
if hasattr(self, "keepalive_ping_task"):
|
|
1280
1284
|
self.keepalive_ping_task.cancel()
|
|
1285
|
+
# Break reference cycle to allow immediate garbage collection.
|
|
1286
|
+
del self.keepalive_ping_task
|
|
1281
1287
|
|
|
1282
1288
|
# A client should wait for a TCP close from the server.
|
|
1283
1289
|
if self.is_client and hasattr(self, "transfer_data_task"):
|