ha-mcp-dev 8.4.3.dev2539__tar.gz → 8.4.3.dev2544__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-8.4.3.dev2539/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2544}/PKG-INFO +4 -4
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/README.md +3 -3
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/pyproject.toml +1 -1
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/backup_manager.py +54 -6
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/config.py +5 -5
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/en.json +1 -1
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.js +1 -1
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_bug_report.py +22 -3
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_search.py +4 -1
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/util_helpers.py +3 -1
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/setup.cfg +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/tests/test_env_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 8.4.3.
|
|
3
|
+
Version: 8.4.3.dev2544
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -40,7 +40,7 @@ Dynamic: license-file
|
|
|
40
40
|
<!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
|
|
41
41
|
|
|
42
42
|
<p align="center">
|
|
43
|
-
<img src="https://img.shields.io/badge/tools-
|
|
43
|
+
<img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
|
|
44
44
|
<a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
|
|
45
45
|
<a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
|
|
46
46
|
<a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
|
|
@@ -247,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
247
247
|
<details>
|
|
248
248
|
<!-- TOOLS_TABLE_START -->
|
|
249
249
|
|
|
250
|
-
<summary><b>Complete Tool List (
|
|
250
|
+
<summary><b>Complete Tool List (87 tools)</b></summary>
|
|
251
251
|
|
|
252
252
|
| Category | Tools |
|
|
253
253
|
|----------|-------|
|
|
@@ -255,7 +255,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
255
255
|
| **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
|
|
256
256
|
| **Assist** | `ha_manage_pipeline` |
|
|
257
257
|
| **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
|
|
258
|
-
| **Blueprints** | `
|
|
258
|
+
| **Blueprints** | `ha_manage_blueprints` |
|
|
259
259
|
| **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
|
|
260
260
|
| **Camera** | `ha_get_camera_image` |
|
|
261
261
|
| **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<img src="https://img.shields.io/badge/tools-
|
|
11
|
+
<img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
|
|
12
12
|
<a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
|
|
13
13
|
<a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
|
|
14
14
|
<a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
|
|
@@ -215,7 +215,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
215
215
|
<details>
|
|
216
216
|
<!-- TOOLS_TABLE_START -->
|
|
217
217
|
|
|
218
|
-
<summary><b>Complete Tool List (
|
|
218
|
+
<summary><b>Complete Tool List (87 tools)</b></summary>
|
|
219
219
|
|
|
220
220
|
| Category | Tools |
|
|
221
221
|
|----------|-------|
|
|
@@ -223,7 +223,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
223
223
|
| **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
|
|
224
224
|
| **Assist** | `ha_manage_pipeline` |
|
|
225
225
|
| **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
|
|
226
|
-
| **Blueprints** | `
|
|
226
|
+
| **Blueprints** | `ha_manage_blueprints` |
|
|
227
227
|
| **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
|
|
228
228
|
| **Camera** | `ha_get_camera_image` |
|
|
229
229
|
| **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.4.3.
|
|
7
|
+
version = "8.4.3.dev2544"
|
|
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
|
|
@@ -7,7 +7,11 @@ Storage path resolution
|
|
|
7
7
|
-----------------------
|
|
8
8
|
``Settings.auto_backup_dir`` overrides; otherwise defaults to
|
|
9
9
|
``/data/ha_mcp_backups`` in the add-on (SUPERVISOR_TOKEN set + ``/data``
|
|
10
|
-
exists), else
|
|
10
|
+
exists), else ``<data dir>/backups`` where the data dir is what
|
|
11
|
+
``utils.data_paths.get_data_dir`` resolves (``HA_MCP_CONFIG_DIR``,
|
|
12
|
+
``~/.ha-mcp``, or the tmpdir fallback). Installs that still hold snapshots
|
|
13
|
+
under the pre-#2372 default ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``
|
|
14
|
+
keep using that directory; see ``_resolve_default_dir``.
|
|
11
15
|
|
|
12
16
|
File format
|
|
13
17
|
-----------
|
|
@@ -55,6 +59,7 @@ import yaml # type: ignore[import-untyped]
|
|
|
55
59
|
from fastmcp.exceptions import ToolError
|
|
56
60
|
|
|
57
61
|
from .client.rest_client import HomeAssistantConnectionError, HomeAssistantError
|
|
62
|
+
from .utils.data_paths import get_data_dir
|
|
58
63
|
|
|
59
64
|
logger = logging.getLogger(__name__)
|
|
60
65
|
|
|
@@ -263,17 +268,60 @@ def _now_iso() -> str:
|
|
|
263
268
|
return datetime.now(UTC).isoformat()
|
|
264
269
|
|
|
265
270
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
+
# Add-on default. Named in the add-on option descriptions, so it stays put.
|
|
272
|
+
_ADDON_BACKUP_DIR = Path("/data/ha_mcp_backups")
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def _legacy_default_dir() -> Path:
|
|
276
|
+
"""The non-add-on default before #2372: XDG user-data, outside the data dir."""
|
|
271
277
|
xdg = os.environ.get("XDG_DATA_HOME")
|
|
272
278
|
if xdg:
|
|
273
279
|
return Path(xdg) / "ha_mcp" / "backups"
|
|
274
280
|
return (Path.home() / ".local" / "share" / "ha_mcp" / "backups").resolve()
|
|
275
281
|
|
|
276
282
|
|
|
283
|
+
def _holds_files(path: Path) -> bool:
|
|
284
|
+
"""Whether ``path`` is a directory with at least one entry.
|
|
285
|
+
|
|
286
|
+
An unreadable or missing directory counts as empty: nothing in it can be
|
|
287
|
+
listed or restored from, so there is nothing to keep using.
|
|
288
|
+
"""
|
|
289
|
+
try:
|
|
290
|
+
return any(path.iterdir())
|
|
291
|
+
except OSError:
|
|
292
|
+
return False
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def _resolve_default_dir() -> Path:
|
|
296
|
+
"""Pick a sane default backup directory for the current deployment mode.
|
|
297
|
+
|
|
298
|
+
Add-on (Supervisor sets ``SUPERVISOR_TOKEN`` and ``/data`` exists):
|
|
299
|
+
``/data/ha_mcp_backups``. Otherwise ``backups/`` inside the data dir, the
|
|
300
|
+
directory that already holds the settings and that every documented
|
|
301
|
+
Docker recipe persists as the ``ha-mcp-data`` volume. The previous default,
|
|
302
|
+
``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``, sat outside that
|
|
303
|
+
volume: under a ``read_only`` root it was EROFS, which fails the mandatory
|
|
304
|
+
pre-write snapshots closed, and on a writable root the snapshots were
|
|
305
|
+
discarded with the container (#2372).
|
|
306
|
+
|
|
307
|
+
An install that already holds snapshots under the previous default keeps
|
|
308
|
+
using it so its restore points stay listed and rotation keeps counting
|
|
309
|
+
them; only installs with nothing there move to the data dir.
|
|
310
|
+
"""
|
|
311
|
+
if os.environ.get("SUPERVISOR_TOKEN") and _ADDON_BACKUP_DIR.parent.is_dir():
|
|
312
|
+
return _ADDON_BACKUP_DIR
|
|
313
|
+
legacy = _legacy_default_dir()
|
|
314
|
+
if _holds_files(legacy):
|
|
315
|
+
logger.info(
|
|
316
|
+
"Auto-backup: keeping existing backup dir %s (new installs default "
|
|
317
|
+
"to %s; set HAMCP_BACKUP_DIR to choose explicitly)",
|
|
318
|
+
legacy,
|
|
319
|
+
get_data_dir() / "backups",
|
|
320
|
+
)
|
|
321
|
+
return legacy
|
|
322
|
+
return get_data_dir() / "backups"
|
|
323
|
+
|
|
324
|
+
|
|
277
325
|
# Sentinel returned by ``BackupManager._fetch_config_for_snapshot`` when there
|
|
278
326
|
# is nothing to snapshot — a handled transient fetch failure (already logged),
|
|
279
327
|
# or a None config for an entity that did not exist. Distinct from any real
|
|
@@ -400,7 +400,7 @@ class Settings(BaseSettings):
|
|
|
400
400
|
|
|
401
401
|
# Backup directory override. Empty ("") resolves at runtime to a
|
|
402
402
|
# deployment-mode default: ``/data/ha_mcp_backups`` in the add-on,
|
|
403
|
-
# otherwise
|
|
403
|
+
# otherwise ``<data dir>/backups`` (see ``backup_manager._resolve_default_dir``).
|
|
404
404
|
auto_backup_dir: str = Field("", alias="HAMCP_BACKUP_DIR")
|
|
405
405
|
|
|
406
406
|
# Calendar event backups query an ahead-of-now window to locate the
|
|
@@ -776,8 +776,8 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
|
|
|
776
776
|
)
|
|
777
777
|
|
|
778
778
|
# Override-file location is the same data dir that holds tool_config.json
|
|
779
|
-
# (resolved via ``utils.data_paths.get_data_dir`` —
|
|
780
|
-
#
|
|
779
|
+
# (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
|
|
780
|
+
# addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
|
|
781
781
|
# Imported lazily inside helpers to avoid a circular import at module
|
|
782
782
|
# load.
|
|
783
783
|
_FEATURE_FLAG_OVERRIDE_FILENAME = "feature_flags.json"
|
|
@@ -1656,8 +1656,8 @@ BACKUP_OVERRIDE_FIELDS: tuple[BackupOverrideField, ...] = (
|
|
|
1656
1656
|
)
|
|
1657
1657
|
|
|
1658
1658
|
# Override-file location is the same data dir that holds tool_config.json
|
|
1659
|
-
# (resolved via ``utils.data_paths.get_data_dir`` —
|
|
1660
|
-
#
|
|
1659
|
+
# (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
|
|
1660
|
+
# addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
|
|
1661
1661
|
# Imported lazily inside helpers to avoid a circular import at module
|
|
1662
1662
|
# load (``utils.data_paths`` imports from ``_version`` which imports
|
|
1663
1663
|
# from ``config`` transitively in some test layouts).
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/en.json
RENAMED
|
@@ -251,7 +251,7 @@
|
|
|
251
251
|
"backup.fields.auto_backup_retain_per_entity.label": "Retain per entity",
|
|
252
252
|
"backup.fields.auto_backup_retain_per_entity.help": "Maximum snapshots kept per entity (1–10000). Older ones rotate out.",
|
|
253
253
|
"backup.fields.auto_backup_dir.label": "Backup directory override",
|
|
254
|
-
"backup.fields.auto_backup_dir.help": "Leave empty
|
|
254
|
+
"backup.fields.auto_backup_dir.help": "Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.",
|
|
255
255
|
"backup.fields.auto_backup_calendar_lookahead_days.label": "Calendar lookahead (days)",
|
|
256
256
|
"backup.fields.auto_backup_calendar_lookahead_days.help": "How far ahead to query calendar events for pre-edit snapshots. Range 1–365.",
|
|
257
257
|
"backup.fields.enable_snapshot_delete.label": "Allow snapshot deletion",
|
|
@@ -1438,7 +1438,7 @@ const BACKUP_FIELD_LABELS = {
|
|
|
1438
1438
|
},
|
|
1439
1439
|
auto_backup_dir: {
|
|
1440
1440
|
label: 'Backup directory override',
|
|
1441
|
-
help: '
|
|
1441
|
+
help: 'Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.',
|
|
1442
1442
|
},
|
|
1443
1443
|
auto_backup_calendar_lookahead_days: {
|
|
1444
1444
|
label: 'Calendar lookahead (days)',
|
|
@@ -29,14 +29,20 @@ from ha_mcp import __version__
|
|
|
29
29
|
from .._version import get_version, is_embedded, is_running_in_addon
|
|
30
30
|
from ..client.supervisor_client import make_supervisor_httpx_client
|
|
31
31
|
from ..config import Settings, get_global_settings
|
|
32
|
+
from ..errors import create_validation_error
|
|
32
33
|
from ..utils.usage_logger import (
|
|
33
34
|
AVG_LOG_ENTRIES_PER_TOOL,
|
|
34
35
|
get_recent_logs,
|
|
35
36
|
get_startup_logs,
|
|
36
37
|
)
|
|
37
38
|
from .component_api import get_component_caps
|
|
38
|
-
from .helpers import log_tool_usage, register_tool_methods
|
|
39
|
-
from .util_helpers import
|
|
39
|
+
from .helpers import log_tool_usage, raise_tool_error, register_tool_methods
|
|
40
|
+
from .util_helpers import (
|
|
41
|
+
ANSI_ESCAPE_RE,
|
|
42
|
+
JSON_STRING_COERCION,
|
|
43
|
+
parse_string_list_param,
|
|
44
|
+
project_fields,
|
|
45
|
+
)
|
|
40
46
|
|
|
41
47
|
logger = logging.getLogger(__name__)
|
|
42
48
|
|
|
@@ -948,6 +954,19 @@ class BugReportTools:
|
|
|
948
954
|
usual cause, and refreshing the MCP connection is the fix
|
|
949
955
|
- `suggested_title`, `duplicate_check_urls`, `anonymization_guide`
|
|
950
956
|
"""
|
|
957
|
+
# Validate fields= before anything is collected: the projection at the
|
|
958
|
+
# end was the only parse, outside any ValueError handler, so a
|
|
959
|
+
# malformed value reached FastMCP as a bare exception after the whole
|
|
960
|
+
# report had been assembled.
|
|
961
|
+
parsed_fields: list[str] | None = None
|
|
962
|
+
if fields is not None:
|
|
963
|
+
try:
|
|
964
|
+
parsed_fields = parse_string_list_param(
|
|
965
|
+
fields, "fields", allow_csv=True
|
|
966
|
+
)
|
|
967
|
+
except ValueError as exc:
|
|
968
|
+
raise_tool_error(create_validation_error(str(exc), parameter="fields"))
|
|
969
|
+
|
|
951
970
|
# Detect installation method, platform, and runtime config.
|
|
952
971
|
install_method = _detect_installation_method()
|
|
953
972
|
platform_info = _detect_platform()
|
|
@@ -1166,7 +1185,7 @@ class BugReportTools:
|
|
|
1166
1185
|
"CRITICAL: Always ANONYMIZE the report BEFORE presenting it in markdown code blocks!"
|
|
1167
1186
|
),
|
|
1168
1187
|
}
|
|
1169
|
-
return project_fields(result,
|
|
1188
|
+
return project_fields(result, parsed_fields)
|
|
1170
1189
|
|
|
1171
1190
|
|
|
1172
1191
|
def register_bug_report_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
|
|
@@ -4121,7 +4121,10 @@ class SearchTools:
|
|
|
4121
4121
|
)
|
|
4122
4122
|
include_dismissed_repairs_bool = bool(include_dismissed_repairs)
|
|
4123
4123
|
|
|
4124
|
-
|
|
4124
|
+
try:
|
|
4125
|
+
parsed_domains = parse_string_list_param(domains, "domains", allow_csv=True)
|
|
4126
|
+
except ValueError as exc:
|
|
4127
|
+
raise_tool_error(create_validation_error(str(exc), parameter="domains"))
|
|
4125
4128
|
|
|
4126
4129
|
result = await self._collect_overview(
|
|
4127
4130
|
_OverviewInputs(
|
|
@@ -205,7 +205,9 @@ def _parse_json_to_str_list(s: str, param_name: str) -> list[str]:
|
|
|
205
205
|
if not all(isinstance(item, str) for item in parsed):
|
|
206
206
|
raise ValueError(f"{param_name} must be a JSON array of strings")
|
|
207
207
|
return parsed
|
|
208
|
-
except json.JSONDecodeError as e:
|
|
208
|
+
except (json.JSONDecodeError, RecursionError) as e:
|
|
209
|
+
# RecursionError: nested past the interpreter's limit is still
|
|
210
|
+
# "not valid JSON" to the caller, which expects ValueError here.
|
|
209
211
|
raise ValueError(f"Invalid JSON in {param_name}: {e}") from e
|
|
210
212
|
|
|
211
213
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 8.4.3.
|
|
3
|
+
Version: 8.4.3.dev2544
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -40,7 +40,7 @@ Dynamic: license-file
|
|
|
40
40
|
<!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
|
|
41
41
|
|
|
42
42
|
<p align="center">
|
|
43
|
-
<img src="https://img.shields.io/badge/tools-
|
|
43
|
+
<img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
|
|
44
44
|
<a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
|
|
45
45
|
<a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
|
|
46
46
|
<a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
|
|
@@ -247,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
247
247
|
<details>
|
|
248
248
|
<!-- TOOLS_TABLE_START -->
|
|
249
249
|
|
|
250
|
-
<summary><b>Complete Tool List (
|
|
250
|
+
<summary><b>Complete Tool List (87 tools)</b></summary>
|
|
251
251
|
|
|
252
252
|
| Category | Tools |
|
|
253
253
|
|----------|-------|
|
|
@@ -255,7 +255,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
255
255
|
| **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
|
|
256
256
|
| **Assist** | `ha_manage_pipeline` |
|
|
257
257
|
| **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
|
|
258
|
-
| **Blueprints** | `
|
|
258
|
+
| **Blueprints** | `ha_manage_blueprints` |
|
|
259
259
|
| **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
|
|
260
260
|
| **Camera** | `ha_get_camera_image` |
|
|
261
261
|
| **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |
|
|
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.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/VENDORED
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/frames.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/headers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/http11.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/imports.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/auth.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/http.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/protocol.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/proxy.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/py.typed
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/streams.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/typing.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/content.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/paths.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|