ha-mcp-dev 8.4.0.dev2496__tar.gz → 8.4.0.dev2497__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.0.dev2496/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.0.dev2497}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/pyproject.toml +1 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/__main__.py +1 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/server.py +1 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/README.md +92 -8
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/best_practice_result.py +3 -2
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/bulk_selector.py +2 -2
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/error_log_parsing.py +3 -2
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/log_common.py +4 -4
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/log_sources.py +2 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/log_sources_supervisor.py +2 -1
- ha_mcp_dev-8.4.0.dev2497/src/ha_mcp/tools/radio/__init__.py +7 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_dashboards.py +3 -3
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_logs.py +2 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_service.py +4 -4
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_system.py +1 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_utility.py +2 -1
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/util_helpers.py +2 -2
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- ha_mcp_dev-8.4.0.dev2496/src/ha_mcp/tools/radio/__init__.py +0 -6
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/README.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/setup.cfg +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/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.0.
|
|
7
|
+
version = "8.4.0.dev2497"
|
|
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
|
|
@@ -1040,7 +1040,7 @@ def _is_running_in_container() -> bool:
|
|
|
1040
1040
|
so the bind host alone can't tell a loopback-only deployment from a
|
|
1041
1041
|
LAN-reachable one — the default-path warning would be a false positive
|
|
1042
1042
|
for every container. Container deployments are hardened through the
|
|
1043
|
-
published guidance instead (
|
|
1043
|
+
published guidance instead (docs/agents/development.md -> Docker; the add-on
|
|
1044
1044
|
auto-generates a secret path).
|
|
1045
1045
|
"""
|
|
1046
1046
|
# Docker writes /.dockerenv; Podman writes /run/.containerenv.
|
|
@@ -1719,7 +1719,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
1719
1719
|
predicates honest. Tier 2/3 in degraded mode raise so the
|
|
1720
1720
|
caller gets a clear error instead of a confusing empty result.
|
|
1721
1721
|
Tool-level failures raise ``ToolError`` (via
|
|
1722
|
-
``raise_tool_error``) per
|
|
1722
|
+
``raise_tool_error``) per .gemini/styleguide.md, so clients see
|
|
1723
1723
|
``isError=true`` rather than a success payload with an
|
|
1724
1724
|
embedded error.
|
|
1725
1725
|
"""
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/settings_ui/locales/README.md
RENAMED
|
@@ -16,14 +16,18 @@ cross-surface wording cannot drift.
|
|
|
16
16
|
|
|
17
17
|
## Adding a language
|
|
18
18
|
|
|
19
|
-
A language ships on **all four** translated surfaces or not at all,
|
|
20
|
-
Home Assistant language code
|
|
19
|
+
A language ships on **all four** translated surfaces or not at all, with one
|
|
20
|
+
Home Assistant language code used across every corresponding file:
|
|
21
21
|
|
|
22
22
|
- `src/ha_mcp/settings_ui/locales/<code>.json` (this directory; authored)
|
|
23
23
|
- `custom_components/ha_mcp_tools/translations/<code>.json` (authored)
|
|
24
24
|
- `homeassistant-addon/translations/<code>.yaml` (generated)
|
|
25
25
|
- `homeassistant-addon-dev/translations/<code>.yaml` (generated)
|
|
26
26
|
|
|
27
|
+
<!-- Keep the following marker line intact; locale parity tests parse it. -->
|
|
28
|
+
The current code set `cs`, `de`, `eo`, `es`, `fr`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tlh`, and `zh-Hans` names every file:
|
|
29
|
+
the parity test keeps this documentation aligned with the shipped catalogs.
|
|
30
|
+
|
|
27
31
|
Klingon (`tlh`) is the one best-effort exception. Its catalogs may be edited
|
|
28
32
|
manually and still ship, but the automatic translation planner never queues
|
|
29
33
|
them. Missing strings use English fallback; invalid or stale Klingon catalogs
|
|
@@ -57,10 +61,9 @@ surface resting on a single anchor loses its register in exactly that run —
|
|
|
57
61
|
`test_component_samples_survive_their_own_anchor_being_queued` pins the
|
|
58
62
|
survival. To fill them in your own PR instead, run
|
|
59
63
|
`scripts/translate_locales.py` yourself and review its output like any
|
|
60
|
-
other diff. Also add the new code to the
|
|
61
|
-
`
|
|
62
|
-
|
|
63
|
-
`test_agents_md_lists_every_shipped_locale`. The engine reads the target
|
|
64
|
+
other diff. Also add the new code to the current code set near the top of this
|
|
65
|
+
guide; `test_locale_readme_lists_every_shipped_locale` pins that list to the
|
|
66
|
+
shipped catalogs. The engine reads the target
|
|
64
67
|
language from `meta.native_name`, so any language an LLM can write — natural
|
|
65
68
|
or constructed — needs no pipeline change.
|
|
66
69
|
|
|
@@ -109,6 +112,10 @@ In PR CI (ungated — `tests/src/unit/test_locale_parity.py` unless another file
|
|
|
109
112
|
is named):
|
|
110
113
|
|
|
111
114
|
- Every surface carries the same set of language codes.
|
|
115
|
+
- Settings UI `messages` may omit keys because English is the per-key
|
|
116
|
+
fallback, but a locale may not carry a key absent from `en.json`: nothing
|
|
117
|
+
can render it. `tool_groups` and `tools` must instead match the renderable
|
|
118
|
+
keys exactly.
|
|
112
119
|
- Every decided `Decision` outcome (all but `pending`) and every
|
|
113
120
|
`PredicateOp` operator has a word in every catalog, non-blank — and in every
|
|
114
121
|
catalog but `en.json` not still spelled the way the backend does
|
|
@@ -148,9 +155,14 @@ In the post-merge `locale-sync.yml` workflow only (the same files, gated behind
|
|
|
148
155
|
these, and the daily sync owes them afterwards):
|
|
149
156
|
|
|
150
157
|
- `tool_groups` and `tools` name exactly the renderable groups and tools.
|
|
158
|
+
The check parses the registered tool set from source rather than trusting
|
|
159
|
+
generated `tools.json`, so a broken generator cannot validate its own stale
|
|
160
|
+
output.
|
|
151
161
|
- At most 5% of this catalog's `messages`, and 5% of its `tools` texts, may be
|
|
152
|
-
byte-identical to English or missing outright
|
|
153
|
-
|
|
162
|
+
byte-identical to English or missing outright. The 5% ceiling also applies
|
|
163
|
+
independently to each generated app projection computed from the canonical
|
|
164
|
+
store. Component catalogs allow 15%, because they carry product names as
|
|
165
|
+
keys of their own. A single tool
|
|
154
166
|
whose `title` *and* `description` are both still English fails by name
|
|
155
167
|
however small the share.
|
|
156
168
|
- The English each translation was written against is hashed in
|
|
@@ -159,3 +171,75 @@ these, and the daily sync owes them afterwards):
|
|
|
159
171
|
`scripts/translate_locales.py` retranslates exactly those keys and repins
|
|
160
172
|
the baseline. Adding a language does not change any English source, so no
|
|
161
173
|
baseline regeneration is needed for it.
|
|
174
|
+
`test_locale_sync_gate_shape.py` pins this gated workflow wiring. A successful
|
|
175
|
+
`locale-sync.yml` run pushes the regenerated catalogs straight to `master`
|
|
176
|
+
with the release App credential and can include everything merged since the
|
|
177
|
+
previous run.
|
|
178
|
+
|
|
179
|
+
## English changes and retranslation
|
|
180
|
+
|
|
181
|
+
An English change is a one-place edit:
|
|
182
|
+
|
|
183
|
+
- Settings messages: `en.json` `messages`.
|
|
184
|
+
- Tool title or summary: the tool definition; English `tools` is intentionally
|
|
185
|
+
empty in `en.json`.
|
|
186
|
+
- Component config flow: `strings.json` plus component `en.json`.
|
|
187
|
+
|
|
188
|
+
After a canonical app-option or feature string changes, run
|
|
189
|
+
`python scripts/generate_locales.py` so the generated projections match. A
|
|
190
|
+
pull request does not owe machine translations. The daily post-merge
|
|
191
|
+
`locale-sync.yml` compares English-source hashes in
|
|
192
|
+
`tests/src/unit/locale_source_baseline.json`, translates changed or missing
|
|
193
|
+
keys through the configured Gemini-compatible endpoint, validates placeholders
|
|
194
|
+
and markup, regenerates projections, and repins the baseline.
|
|
195
|
+
|
|
196
|
+
To supply a human translation in the same pull request, edit the authored
|
|
197
|
+
catalogs and run `python scripts/update_locale_baseline.py`. The baseline is
|
|
198
|
+
what tells the next sync that the translation covers the current English;
|
|
199
|
+
without that repin, the sync will correctly treat the value as stale and
|
|
200
|
+
replace it. Running `scripts/translate_locales.py` locally also repins after
|
|
201
|
+
its machine-generated pass.
|
|
202
|
+
|
|
203
|
+
A locale pull request that remained open while its English source changed needs
|
|
204
|
+
special review. Compare its affected values with that surface's current English
|
|
205
|
+
before merging. An old translated value can still have the right key and a
|
|
206
|
+
translated-looking value, so ordinary parity and untranslated-share checks
|
|
207
|
+
cannot detect the stale meaning. Repinning is not a repair because it blesses
|
|
208
|
+
the stale value; delete or update the value so the planner queues the correct
|
|
209
|
+
work. Issue #1993 is the precedent: an English policy changed from ALL-match
|
|
210
|
+
to ANY-match while one locale still asserted the opposite. Numbers and
|
|
211
|
+
code-like identifiers are the cheap signal because rewording often moves one;
|
|
212
|
+
`test_translations_keep_english_numbers_and_identifiers` checks them across
|
|
213
|
+
all three authored surfaces, but cannot replace semantic review.
|
|
214
|
+
|
|
215
|
+
Tool docstring summaries are English translation sources. Editing a summary
|
|
216
|
+
queues its translated title/description in every locale. `Field(description=)`
|
|
217
|
+
text is not in this baseline. For a feature-gated tool, the user-facing
|
|
218
|
+
`FEATURE_GATED_TOOLS` stub is the translation source; changing only the
|
|
219
|
+
parsed docstring holds that key stale until a human confirms the stub remains
|
|
220
|
+
accurate and runs `python scripts/update_locale_baseline.py`.
|
|
221
|
+
|
|
222
|
+
## Sync failures and recovery
|
|
223
|
+
|
|
224
|
+
The translation workflow uses conservative pacing and retries transient 429,
|
|
225
|
+
5xx, and timeout failures with backoff. A repeatedly failing request records
|
|
226
|
+
its strings as failed and continues; two dead batches stop the run before it
|
|
227
|
+
burns the remaining quota.
|
|
228
|
+
|
|
229
|
+
A partial run commits completed translations plus
|
|
230
|
+
`tests/src/unit/locale_sync_progress.json`. Rerun the workflow or wait for the
|
|
231
|
+
next daily run; it resumes from that file. Only a fully successful run repins
|
|
232
|
+
the baseline and removes progress, so incomplete translation work remains
|
|
233
|
+
visible as a red sync.
|
|
234
|
+
|
|
235
|
+
When the engine is unavailable, a human may translate the dry-run list, run
|
|
236
|
+
`python scripts/generate_locales.py` and
|
|
237
|
+
`python scripts/update_locale_baseline.py`, and open a normal pull request.
|
|
238
|
+
Human edits win because the machine touches only missing or stale strings. The
|
|
239
|
+
provider boundary is `_call_gemini`, configured by `GEMINI_API_URL`,
|
|
240
|
+
`GEMINI_MODEL`, and `GEMINI_API_KEY`.
|
|
241
|
+
|
|
242
|
+
The Webhook Proxy app and its bundled integration remain English-only by
|
|
243
|
+
decision. Their tests intentionally reject an accidental partial catalog.
|
|
244
|
+
Any other new catalog directory fails until it is translated across every
|
|
245
|
+
required surface or explicitly added to the English-only decision.
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/best_practice_result.py
RENAMED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"""Warning accumulator and skill-reference routing for the best-practice checks.
|
|
2
2
|
|
|
3
3
|
Split out of :mod:`best_practice_checker` so a check module can emit a warning
|
|
4
|
-
without importing the checker back (
|
|
5
|
-
inspects a config; it only carries
|
|
4
|
+
without importing the checker back (see `.gemini/styleguide.md` § Tool
|
|
5
|
+
Consolidation and Module Size). Nothing here inspects a config; it only carries
|
|
6
|
+
warnings and builds the ' See ...' suffix.
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
_SKILL_URI_PREFIX = "skill://home-assistant-best-practices/references"
|
|
@@ -837,8 +837,8 @@ async def resolve_bulk_selector(
|
|
|
837
837
|
hidden_count = len(directly_hidden | hidden_selected | excluded_and_hidden)
|
|
838
838
|
warnings: list[str] = list(visibility_warnings)
|
|
839
839
|
if hidden_count:
|
|
840
|
-
#
|
|
841
|
-
# top-level warnings
|
|
840
|
+
# .gemini/styleguide.md "Tool Tags and Return Values": a degraded
|
|
841
|
+
# result belongs in top-level warnings, not a bare count the caller has no
|
|
842
842
|
# actionable text for. `counts.hidden` alone cannot tell a user
|
|
843
843
|
# "three entities you wanted controlled were skipped" from "your
|
|
844
844
|
# exclusion was redundant" -- this at least names that something
|
|
@@ -10,8 +10,9 @@ It also owns the window/pagination unit the two response paths share: how
|
|
|
10
10
|
large a window one fetch asks for, and how the response describes where that
|
|
11
11
|
window sat and how to read further back.
|
|
12
12
|
|
|
13
|
-
Split out of ``tools_utility`` under
|
|
14
|
-
parsing nor
|
|
13
|
+
Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
|
|
14
|
+
Consolidation and Module Size: neither parsing nor window arithmetic touches
|
|
15
|
+
the client or tool plumbing.
|
|
15
16
|
"""
|
|
16
17
|
|
|
17
18
|
import re
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""Shared plumbing for the ``ha_get_logs`` log sources.
|
|
2
2
|
|
|
3
3
|
Constants, parameter coercion and the cross-source warning rules that every
|
|
4
|
-
source uses, with no dependency on any particular one
|
|
5
|
-
``tools_utility`` under
|
|
6
|
-
|
|
7
|
-
``tools_logs``.
|
|
4
|
+
source uses, with no dependency on any particular one. Split from
|
|
5
|
+
``tools_utility`` under `.gemini/styleguide.md` § Tool Consolidation and
|
|
6
|
+
Module Size; per-source fetchers live in ``log_sources`` and
|
|
7
|
+
``log_sources_supervisor``, and the tool surface in ``tools_logs``.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import re
|
|
@@ -6,7 +6,8 @@ alone: every fetcher here is a thin shell around one client call, and the
|
|
|
6
6
|
dispatch, validation and tool registration they share live with the host class.
|
|
7
7
|
The Supervisor-backed sources are in ``log_sources_supervisor``.
|
|
8
8
|
|
|
9
|
-
Split out of ``tools_utility`` under
|
|
9
|
+
Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
|
|
10
|
+
Consolidation and Module Size.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
import logging
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/log_sources_supervisor.py
RENAMED
|
@@ -5,7 +5,8 @@ Separate from ``log_sources`` because these two reach Home Assistant through
|
|
|
5
5
|
Supervisor rather than Core, and carry the whole token/role error vocabulary
|
|
6
6
|
that follows from it. Mixed into ``LogTools`` (``tools_logs``).
|
|
7
7
|
|
|
8
|
-
Split out of ``tools_utility`` under
|
|
8
|
+
Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
|
|
9
|
+
Consolidation and Module Size.
|
|
9
10
|
"""
|
|
10
11
|
|
|
11
12
|
from typing import Any, Literal, NoReturn
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Per-radio handler modules for the ``ha_manage_radio`` tool.
|
|
2
|
+
|
|
3
|
+
Each radio (Z-Wave, Zigbee/ZHA, Matter, Thread) gets its own handler module so
|
|
4
|
+
no single file spans every protocol (see `.gemini/styleguide.md` § Tool
|
|
5
|
+
Consolidation and Module Size). The ``tools_radio`` module wires them
|
|
6
|
+
together behind one MCP tool.
|
|
7
|
+
"""
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
@@ -2200,9 +2200,9 @@ class DashboardConfigTools:
|
|
|
2200
2200
|
|
|
2201
2201
|
config_hash: str | None = compute_config_hash(config)
|
|
2202
2202
|
|
|
2203
|
-
# Warn-don't-truncate (
|
|
2204
|
-
# cards / card / custom_fields / states
|
|
2205
|
-
# the depth bound, so neither a depth-truncated search nor a
|
|
2203
|
+
# Warn-don't-truncate (.gemini/styleguide.md Tool Tags and Return
|
|
2204
|
+
# Values): the walker covers cards / card / custom_fields / states and
|
|
2205
|
+
# stops at the depth bound, so neither a depth-truncated search nor a
|
|
2206
2206
|
# search over a dashboard carrying a non-traversed child-bearing
|
|
2207
2207
|
# shape may read as an authoritative complete result. Disclosure
|
|
2208
2208
|
# keys off the *presence* of such a shape (collected during the
|
|
@@ -5,7 +5,8 @@ registration. The sources themselves are mixed in from ``log_sources`` (Core)
|
|
|
5
5
|
and ``log_sources_supervisor`` (Supervisor), their shared plumbing lives in
|
|
6
6
|
``log_common``, and the error-log window arithmetic in ``error_log_parsing``.
|
|
7
7
|
|
|
8
|
-
Split out of ``tools_utility`` under
|
|
8
|
+
Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
|
|
9
|
+
Consolidation and Module Size.
|
|
9
10
|
"""
|
|
10
11
|
|
|
11
12
|
from typing import Annotated, Any, Literal
|
|
@@ -564,8 +564,8 @@ def _attach_resolution_to_response(
|
|
|
564
564
|
"""Attach ``resolution.summary()`` to a response, surfacing its warnings
|
|
565
565
|
at the top level.
|
|
566
566
|
|
|
567
|
-
Per
|
|
568
|
-
``list[str]``, never nested inside another field.
|
|
567
|
+
Per .gemini/styleguide.md "Tool Tags and Return Values", ``warnings``
|
|
568
|
+
is always a top-level ``list[str]``, never nested inside another field.
|
|
569
569
|
``resolution.summary()`` nests its own warnings (e.g. "N entities were
|
|
570
570
|
hidden") under ``resolution`` for internal cohesion, so this pops them
|
|
571
571
|
back out. ``response`` may already carry dispatch-time warnings (e.g.
|
|
@@ -2296,8 +2296,8 @@ class ServiceTools:
|
|
|
2296
2296
|
"""Resolve one structural selector and, unless ``dry_run``, dispatch it.
|
|
2297
2297
|
|
|
2298
2298
|
Split out of ``ha_bulk_control`` to keep that tool's own McCabe
|
|
2299
|
-
complexity under the repo's C901 threshold
|
|
2300
|
-
exemptions).
|
|
2299
|
+
complexity under the repo's C901 threshold
|
|
2300
|
+
(docs/agents/development.md — no per-file exemptions).
|
|
2301
2301
|
"""
|
|
2302
2302
|
if action is None:
|
|
2303
2303
|
raise_tool_error(
|
|
@@ -1970,7 +1970,7 @@ class SystemTools:
|
|
|
1970
1970
|
# A ToolError (incl. one re-raised by _reraise_if_fatal) carries the
|
|
1971
1971
|
# MCP isError contract — let it reach ha_get_system_health's own
|
|
1972
1972
|
# ``except ToolError: raise`` instead of being demoted to a section
|
|
1973
|
-
# error string here (
|
|
1973
|
+
# error string here (.gemini/styleguide.md structured-error guard pattern).
|
|
1974
1974
|
raise
|
|
1975
1975
|
except Exception as e:
|
|
1976
1976
|
_reraise_if_fatal(e)
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
Utility tools for Home Assistant MCP server.
|
|
3
3
|
|
|
4
4
|
Template evaluation. The log tools that used to share this module are in
|
|
5
|
-
``tools_logs`` and its
|
|
5
|
+
``tools_logs`` and its helpers, split out under `.gemini/styleguide.md` §
|
|
6
|
+
Tool Consolidation and Module Size.
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
import logging
|
|
@@ -1628,8 +1628,8 @@ async def apply_entity_category(
|
|
|
1628
1628
|
|
|
1629
1629
|
Updates result_dict in-place: sets ``'category'`` on success, or appends
|
|
1630
1630
|
to the top-level ``'warnings'`` list on failure. The list shape mirrors
|
|
1631
|
-
the canonical response contract documented in
|
|
1632
|
-
*
|
|
1631
|
+
the canonical response contract documented in ``.gemini/styleguide.md`` →
|
|
1632
|
+
*Tool Tags and Return Values*.
|
|
1633
1633
|
|
|
1634
1634
|
Args:
|
|
1635
1635
|
client: HomeAssistantClient instance
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"""Per-radio handler modules for the ``ha_manage_radio`` tool.
|
|
2
|
-
|
|
3
|
-
Each radio (Z-Wave, Zigbee/ZHA, Matter, Thread) gets its own handler module so
|
|
4
|
-
no single file spans every protocol (keeps modules focused per AGENTS.md). The
|
|
5
|
-
``tools_radio`` module wires them together behind one MCP tool.
|
|
6
|
-
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/VENDORED
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/frames.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/headers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/http11.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/imports.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/auth.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/http.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/legacy/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/protocol.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/proxy.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/py.typed
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/streams.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/sync/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/trio/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/typing.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/_vendor/websockets/version.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/content.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/paths.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2497}/src/ha_mcp/dashboard_screenshot/theme_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|