ha-mcp-dev 8.4.0.dev2509__tar.gz → 8.4.1.dev2516__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.dev2509/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.1.dev2516}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/pyproject.toml +1 -1
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/en.json +2 -2
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/settings.html +2 -2
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_search.py +42 -21
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_service.py +73 -12
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/visibility/enforcement.py +270 -39
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/visibility/model.py +58 -11
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/visibility/resolver.py +147 -81
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/README.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/setup.cfg +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/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.
|
|
7
|
+
version = "8.4.1.dev2516"
|
|
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
|
{ha_mcp_dev-8.4.0.dev2509 → ha_mcp_dev-8.4.1.dev2516}/src/ha_mcp/settings_ui/locales/en.json
RENAMED
|
@@ -114,13 +114,13 @@
|
|
|
114
114
|
"visibility.entities.help": "One entity_id per line. These stay hidden even without an entity-registry entry.",
|
|
115
115
|
"visibility.entities.denied": "Denied entity IDs",
|
|
116
116
|
"visibility.allowlist.title": "Restrict to an allowlist",
|
|
117
|
-
"visibility.allowlist.help": "Advanced: when any allowlist field is set
|
|
117
|
+
"visibility.allowlist.help": "Advanced: when any allowlist field is set, nonmatching entities are hidden (including entities added later). A match overrides category, Home Assistant hidden-state, and Assist filters; denied entity IDs and excluded areas or labels still win. Leave all three empty to disable.",
|
|
118
118
|
"visibility.allowlist.areas": "Allowed areas",
|
|
119
119
|
"visibility.allowlist.labels": "Allowed labels",
|
|
120
120
|
"visibility.allowlist.entities_help": "Allowed entity IDs, one per line.",
|
|
121
121
|
"visibility.allowlist.entities": "Allowed entity IDs",
|
|
122
122
|
"visibility.assist.title": "Respect Assist exposure",
|
|
123
|
-
"visibility.assist.help": "Hide entities not exposed to Home Assistant's Assist (“conversation”) voice assistant, mirroring the Settings > Voice assistants > Expose list.
|
|
123
|
+
"visibility.assist.help": "Hide entities not exposed to Home Assistant's Assist (“conversation”) voice assistant, mirroring the Settings > Voice assistants > Expose list. Not applied while an allowlist is active; otherwise adds two websocket reads per search.",
|
|
124
124
|
"visibility.assist.only_exposed": "Only show entities exposed to Assist",
|
|
125
125
|
"features.enable_tool_search.label": "Enable tool search",
|
|
126
126
|
"features.enable_tool_search.help": "Replace the full tool catalog with search-based discovery. Reduces idle context by roughly 90%, to about 5K tokens. ⚠️ Do NOT enable this in clients with their own built-in tool search / deferred tools (claude.ai, Claude Desktop, Claude Code) — the two search layers conflict, and the client's built-in tool search is the better choice there; leave this off. Whether tools are deferred depends on your client and model combination: use this when your setup loads the full catalog up front — models without native deferred tools (e.g. Gemini, OpenAI-compatible local models, Claude Haiku), clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI), or smaller context windows. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily. Tools are found via ha_search_tools and executed via categorized proxies (read/write/delete). Requires restart to take effect.",
|
|
@@ -518,7 +518,7 @@
|
|
|
518
518
|
|
|
519
519
|
<section class="a11y-section">
|
|
520
520
|
<h2 class="a11y-section-title" data-i18n="visibility.allowlist.title">Restrict to an allowlist</h2>
|
|
521
|
-
<p class="a11y-section-help" data-i18n="visibility.allowlist.help">Advanced: when any allowlist field is set
|
|
521
|
+
<p class="a11y-section-help" data-i18n="visibility.allowlist.help">Advanced: when any allowlist field is set, nonmatching entities are hidden (including entities added later). A match overrides category, Home Assistant hidden-state, and Assist filters; denied entity IDs and excluded areas or labels still win. Leave all three empty to disable.</p>
|
|
522
522
|
<label class="visibility-field"><span data-i18n="visibility.allowlist.areas">Allowed areas</span> <input type="text" id="visibility-allow-areas" placeholder="living_room, kitchen"></label>
|
|
523
523
|
<label class="visibility-field"><span data-i18n="visibility.allowlist.labels">Allowed labels</span> <input type="text" id="visibility-allow-labels" placeholder="voice, main_floor"></label>
|
|
524
524
|
<p class="a11y-section-help" data-i18n="visibility.allowlist.entities_help">Allowed entity IDs, one per line.</p>
|
|
@@ -528,7 +528,7 @@
|
|
|
528
528
|
|
|
529
529
|
<section class="a11y-section">
|
|
530
530
|
<h2 class="a11y-section-title" data-i18n="visibility.assist.title">Respect Assist exposure</h2>
|
|
531
|
-
<p class="a11y-section-help" data-i18n="visibility.assist.help">Hide entities not exposed to Home Assistant's Assist (“conversation”) voice assistant, mirroring the Settings > Voice assistants > Expose list.
|
|
531
|
+
<p class="a11y-section-help" data-i18n="visibility.assist.help">Hide entities not exposed to Home Assistant's Assist (“conversation”) voice assistant, mirroring the Settings > Voice assistants > Expose list. Not applied while an allowlist is active; otherwise adds two websocket reads per search.</p>
|
|
532
532
|
<label class="a11y-option"><input type="checkbox" id="visibility-respect-assist"> <span data-i18n="visibility.assist.only_exposed">Only show entities exposed to Assist</span></label>
|
|
533
533
|
</section>
|
|
534
534
|
|
|
@@ -27,6 +27,7 @@ from ..errors import create_validation_error
|
|
|
27
27
|
from ..transforms.categorized_search import DEFAULT_PINNED_TOOLS
|
|
28
28
|
from ..utils.entity_membership import normalize_member_entity_ids
|
|
29
29
|
from ..utils.fuzzy_search import apply_hidden_penalty
|
|
30
|
+
from ..visibility.model import VisibilityWire, wire_has_allowlist_dimensions
|
|
30
31
|
from ..visibility.resolver import (
|
|
31
32
|
device_registry_needed_for_visibility,
|
|
32
33
|
load_hidden_set,
|
|
@@ -1321,6 +1322,11 @@ def _merge_component_visibility_warnings(
|
|
|
1321
1322
|
response,
|
|
1322
1323
|
[w for w in component_visibility_warnings if isinstance(w, str)],
|
|
1323
1324
|
)
|
|
1325
|
+
elif component_visibility_warnings is not None:
|
|
1326
|
+
logger.warning(
|
|
1327
|
+
"component visibility_warnings ignored: expected a list, got %s",
|
|
1328
|
+
type(component_visibility_warnings).__name__,
|
|
1329
|
+
)
|
|
1324
1330
|
|
|
1325
1331
|
|
|
1326
1332
|
async def _scrub_component_config_buckets(
|
|
@@ -2396,13 +2402,15 @@ class SearchTools:
|
|
|
2396
2402
|
# hidden entities through the fast path. The ``search_visibility``
|
|
2397
2403
|
# capability closes that: a component that advertises it accepts the raw
|
|
2398
2404
|
# hide config (``VisibilityConfig.to_wire``) as the ``visibility`` param
|
|
2399
|
-
# and excludes hidden entities before its own counts/pagination
|
|
2400
|
-
#
|
|
2401
|
-
#
|
|
2402
|
-
#
|
|
2403
|
-
#
|
|
2404
|
-
#
|
|
2405
|
-
#
|
|
2405
|
+
# and excludes hidden entities before its own counts/pagination. The
|
|
2406
|
+
# ``search_visibility_allowlist_authorization`` capability adds the
|
|
2407
|
+
# ``allowlist_authorization`` wire key, which opts the component into the
|
|
2408
|
+
# revised allowlist precedence; without it an active allowlist falls back
|
|
2409
|
+
# to legacy (see ``_resolve_component_search_visibility``). With no active
|
|
2410
|
+
# filter, the plain ``search`` route runs without a ``visibility`` param,
|
|
2411
|
+
# so old components
|
|
2412
|
+
# keep working. ``ha_get_overview`` needs no analogous gate — it reapplies
|
|
2413
|
+
# the filter over the component's raw slices. Checked only when it would
|
|
2406
2414
|
# serve, so the common (no-component / filter-off) install pays nothing.
|
|
2407
2415
|
if (
|
|
2408
2416
|
req.query_text
|
|
@@ -2429,7 +2437,7 @@ class SearchTools:
|
|
|
2429
2437
|
|
|
2430
2438
|
async def _resolve_component_search_visibility(
|
|
2431
2439
|
self, caps: Any
|
|
2432
|
-
) -> tuple[bool,
|
|
2440
|
+
) -> tuple[bool, VisibilityWire | None]:
|
|
2433
2441
|
"""Decide the ha_search route under the entity-visibility gate.
|
|
2434
2442
|
|
|
2435
2443
|
Returns ``(route_component, visibility_param)`` for a caller that has
|
|
@@ -2437,13 +2445,21 @@ class SearchTools:
|
|
|
2437
2445
|
|
|
2438
2446
|
- filter inactive → ``(True, None)``: the plain component search, no
|
|
2439
2447
|
``visibility`` param (parity with a pre-``search_visibility`` component).
|
|
2440
|
-
- filter active + ``search_visibility``
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2448
|
+
- filter active + ``search_visibility`` + config serialized:
|
|
2449
|
+
- component also advertises ``search_visibility_allowlist_authorization``
|
|
2450
|
+
→ ``(True, <wire dict + allowlist_authorization: True>)``. The key opts
|
|
2451
|
+
the component into the revised rule (an allow match authorizes past
|
|
2452
|
+
category, HA-hidden, and Assist filters). It is never sent to a
|
|
2453
|
+
component lacking the capability: that component's strict schema would
|
|
2454
|
+
reject it, and the key's absence is what keeps a newer component on the
|
|
2455
|
+
legacy precedence the released server still applies in its own
|
|
2456
|
+
outbound scan.
|
|
2457
|
+
- no allowlist dimensions → ``(True, <wire dict>)``: the nine-key wire;
|
|
2458
|
+
with no allow dimensions the two precedences agree.
|
|
2459
|
+
- allowlist active without the capability → ``(False, None)``.
|
|
2460
|
+
- config could not be loaded → ``(False, None)``: the legacy path applies
|
|
2461
|
+
the filter server-side before the counts/pagination (fail-closed to
|
|
2462
|
+
legacy, matching ``visibility_state_and_wire``'s fail-closed pairing).
|
|
2447
2463
|
|
|
2448
2464
|
``visibility_state_and_wire`` loads the config once for both the active
|
|
2449
2465
|
gate and its wire form, instead of the active check and the wire fetch
|
|
@@ -2452,16 +2468,21 @@ class SearchTools:
|
|
|
2452
2468
|
active, visibility = await visibility_state_and_wire()
|
|
2453
2469
|
if not active:
|
|
2454
2470
|
return True, None
|
|
2455
|
-
if component_supports(caps, "search_visibility")
|
|
2456
|
-
return
|
|
2457
|
-
|
|
2471
|
+
if not component_supports(caps, "search_visibility") or visibility is None:
|
|
2472
|
+
return False, None
|
|
2473
|
+
if component_supports(caps, "search_visibility_allowlist_authorization"):
|
|
2474
|
+
authorized: VisibilityWire = {**visibility, "allowlist_authorization": True}
|
|
2475
|
+
return True, authorized
|
|
2476
|
+
if wire_has_allowlist_dimensions(visibility):
|
|
2477
|
+
return False, None
|
|
2478
|
+
return True, visibility
|
|
2458
2479
|
|
|
2459
2480
|
async def _ha_search_via_component(
|
|
2460
2481
|
self,
|
|
2461
2482
|
req: _ResolvedSearch,
|
|
2462
2483
|
ctx: Context | None,
|
|
2463
2484
|
*,
|
|
2464
|
-
visibility:
|
|
2485
|
+
visibility: VisibilityWire | None = None,
|
|
2465
2486
|
caps: Any = None,
|
|
2466
2487
|
) -> dict[str, Any] | None:
|
|
2467
2488
|
"""Serve ha_search from the component; ``None`` ⇒ run the legacy path.
|
|
@@ -2540,7 +2561,7 @@ class SearchTools:
|
|
|
2540
2561
|
req: _ResolvedSearch,
|
|
2541
2562
|
ctx: Context | None,
|
|
2542
2563
|
*,
|
|
2543
|
-
visibility:
|
|
2564
|
+
visibility: VisibilityWire | None,
|
|
2544
2565
|
) -> dict[str, Any] | None:
|
|
2545
2566
|
"""Serve a ``dashboard``-including request from both legs (issue #2289).
|
|
2546
2567
|
|
|
@@ -2636,7 +2657,7 @@ class SearchTools:
|
|
|
2636
2657
|
async def _send_component_search(
|
|
2637
2658
|
self,
|
|
2638
2659
|
req: _ResolvedSearch,
|
|
2639
|
-
visibility:
|
|
2660
|
+
visibility: VisibilityWire | None = None,
|
|
2640
2661
|
*,
|
|
2641
2662
|
dashboard_split: bool = False,
|
|
2642
2663
|
) -> dict[str, Any]:
|
|
@@ -1824,12 +1824,74 @@ class ServiceTools:
|
|
|
1824
1824
|
@log_tool_usage
|
|
1825
1825
|
async def ha_call_service(
|
|
1826
1826
|
self,
|
|
1827
|
-
domain:
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1827
|
+
domain: Annotated[
|
|
1828
|
+
str | None,
|
|
1829
|
+
Field(
|
|
1830
|
+
description=(
|
|
1831
|
+
"Service domain (e.g. 'light', 'climate', 'automation'). "
|
|
1832
|
+
"Required for a service call; must be omitted when ws_command "
|
|
1833
|
+
"is set."
|
|
1834
|
+
),
|
|
1835
|
+
),
|
|
1836
|
+
] = None,
|
|
1837
|
+
service: Annotated[
|
|
1838
|
+
str | None,
|
|
1839
|
+
Field(
|
|
1840
|
+
description=(
|
|
1841
|
+
"Service name within domain (e.g. 'turn_on', 'set_temperature', "
|
|
1842
|
+
"'trigger'). Required for a service call; must be omitted when "
|
|
1843
|
+
"ws_command is set."
|
|
1844
|
+
),
|
|
1845
|
+
),
|
|
1846
|
+
] = None,
|
|
1847
|
+
entity_id: Annotated[
|
|
1848
|
+
str | None,
|
|
1849
|
+
Field(
|
|
1850
|
+
description=(
|
|
1851
|
+
"Entity ID(s) the service call targets — one ID "
|
|
1852
|
+
"('light.living_room') or several comma-separated "
|
|
1853
|
+
"('light.a,light.b'). Optional for services that don't target "
|
|
1854
|
+
"a specific entity. Must be omitted when ws_command is set."
|
|
1855
|
+
),
|
|
1856
|
+
),
|
|
1857
|
+
] = None,
|
|
1858
|
+
data: Annotated[
|
|
1859
|
+
dict[str, Any] | None,
|
|
1860
|
+
JSON_STRING_COERCION,
|
|
1861
|
+
Field(
|
|
1862
|
+
description=(
|
|
1863
|
+
"Extra service-call parameters beyond entity_id (e.g. "
|
|
1864
|
+
"{'temperature': 22} for climate.set_temperature). Also carries "
|
|
1865
|
+
"the raw command payload when ws_command is set. If entity_id "
|
|
1866
|
+
"is also present in data, the entity_id parameter wins."
|
|
1867
|
+
),
|
|
1868
|
+
),
|
|
1869
|
+
] = None,
|
|
1870
|
+
return_response: Annotated[
|
|
1871
|
+
bool,
|
|
1872
|
+
Field(
|
|
1873
|
+
description=(
|
|
1874
|
+
"If True, the service's response data is returned once, as "
|
|
1875
|
+
"the top-level 'service_response' key — never nested inside "
|
|
1876
|
+
"'result' (default: False). Must stay False when ws_command "
|
|
1877
|
+
"is set."
|
|
1878
|
+
),
|
|
1879
|
+
),
|
|
1880
|
+
] = False,
|
|
1881
|
+
wait: Annotated[
|
|
1882
|
+
bool,
|
|
1883
|
+
Field(
|
|
1884
|
+
description=(
|
|
1885
|
+
"If True (default), wait for the entity state to change "
|
|
1886
|
+
"before returning. Applies only to state-changing services "
|
|
1887
|
+
"called with a single entity_id. A comma-separated "
|
|
1888
|
+
"multi-target does not get confirmed by this: it falls "
|
|
1889
|
+
"through to a legacy path that polls for the literal "
|
|
1890
|
+
"composite entity_id and times out after 10s. Set "
|
|
1891
|
+
"wait=False for multi-target calls."
|
|
1892
|
+
),
|
|
1893
|
+
),
|
|
1894
|
+
] = True,
|
|
1833
1895
|
verbose: Annotated[
|
|
1834
1896
|
bool,
|
|
1835
1897
|
Field(
|
|
@@ -1911,8 +1973,6 @@ class ServiceTools:
|
|
|
1911
1973
|
```
|
|
1912
1974
|
|
|
1913
1975
|
**Key behavior:**
|
|
1914
|
-
- **wait** (default True): wait for the entity state to change before
|
|
1915
|
-
returning. Only applies to state-changing services on a single entity.
|
|
1916
1976
|
- **Result compaction (default ON)**: ``result`` is trimmed
|
|
1917
1977
|
to the targeted entity's record (drops parent-group propagation) and
|
|
1918
1978
|
stripped of ``context`` / ``last_*`` metadata and heavy attribute
|
|
@@ -1920,9 +1980,6 @@ class ServiceTools:
|
|
|
1920
1980
|
for the raw changed-state records, or ``result_fields`` /
|
|
1921
1981
|
``result_attribute_keys`` for explicit per-record projection (mirrors
|
|
1922
1982
|
``ha_get_state``).
|
|
1923
|
-
- **return_response** (default False): the service's response data is
|
|
1924
|
-
returned once, as the top-level ``service_response`` key — never nested
|
|
1925
|
-
inside ``result``, which carries the changed entity states.
|
|
1926
1983
|
|
|
1927
1984
|
**For detailed service documentation, use ha_get_skill_guide.**
|
|
1928
1985
|
|
|
@@ -1975,8 +2032,12 @@ class ServiceTools:
|
|
|
1975
2032
|
)
|
|
1976
2033
|
|
|
1977
2034
|
# Determine if we should wait for state change:
|
|
1978
|
-
# Only for state-changing services
|
|
2035
|
+
# Only for state-changing services with an entity_id set, not for
|
|
1979
2036
|
# trigger/reload/fire-and-forget services or services without entities.
|
|
2037
|
+
# A comma-separated multi-target entity_id is not excluded here — it
|
|
2038
|
+
# still falls through to the legacy path, which polls for the literal
|
|
2039
|
+
# composite entity_id and times out after 10s (see the wait Field
|
|
2040
|
+
# description and _maybe_component_call_service).
|
|
1980
2041
|
# This server-side decision (D6) also chooses whether to hand the
|
|
1981
2042
|
# component wait+entity_ids: a non-state-changing call passes wait
|
|
1982
2043
|
# implicitly false and no confirmation targets.
|