ha-mcp-dev 8.3.0.dev2418__tar.gz → 8.3.0.dev2422__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.3.0.dev2418/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.3.0.dev2422}/PKG-INFO +1 -1
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/pyproject.toml +3 -2
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/rest_client.py +42 -40
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/supervisor_client.py +13 -22
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/websocket_client.py +13 -5
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow.py +17 -2
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_form.py +441 -29
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_walker.py +55 -7
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_reconfigure.py +8 -1
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_addons.py +824 -452
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_helpers.py +12 -1
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_dev.py +48 -29
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_integrations.py +14 -2
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/LICENSE +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/README.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/setup.cfg +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/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.3.0.
|
|
7
|
+
version = "8.3.0.dev2422"
|
|
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
|
|
@@ -256,8 +256,9 @@ markers = [
|
|
|
256
256
|
"error_handling: error handling and edge case tests",
|
|
257
257
|
"cleanup: tests that create entities needing cleanup",
|
|
258
258
|
"performance: performance measurement and regression tests",
|
|
259
|
-
"external_only:
|
|
259
|
+
"external_only: in-process-server tiers only; skips inaddon, stdio, container-embedded, and HAOS-embedded servers",
|
|
260
260
|
"inaddon_only: only runs on HAOS inaddon tier",
|
|
261
|
+
"beta_haos_only: beta HAOS image lanes with Supervisor/Core version expectations configured",
|
|
261
262
|
]
|
|
262
263
|
asyncio_mode = "auto"
|
|
263
264
|
|
|
@@ -704,8 +704,9 @@ class HomeAssistantClient:
|
|
|
704
704
|
async def get_addon_logs(self, slug: str, lines: int | None = None) -> str:
|
|
705
705
|
"""Fetch an add-on's container logs.
|
|
706
706
|
|
|
707
|
-
Branch on ``is_running_in_addon()
|
|
708
|
-
|
|
707
|
+
Branch on ``is_running_in_addon()``, which requires a truthy
|
|
708
|
+
``SUPERVISOR_TOKEN`` and excludes ``HA_MCP_EMBEDDED``: inside the app
|
|
709
|
+
(add-on) container goes directly to the Supervisor
|
|
709
710
|
REST API at ``http://supervisor/addons/{slug}/logs`` with the
|
|
710
711
|
Supervisor token. The HA Core proxy at
|
|
711
712
|
``/api/hassio/addons/{slug}/logs`` rejects this token+path combination
|
|
@@ -730,8 +731,9 @@ class HomeAssistantClient:
|
|
|
730
731
|
Raises:
|
|
731
732
|
HomeAssistantAuthError: 401 response, or ``SUPERVISOR_TOKEN`` empty
|
|
732
733
|
at call time on the addon branch.
|
|
733
|
-
HomeAssistantAPIError: 403 (
|
|
734
|
-
``
|
|
734
|
+
HomeAssistantAPIError: 403 (unrecognized token, missing
|
|
735
|
+
``hassio_api``, or insufficient ``hassio_role``), 404
|
|
736
|
+
(unknown slug), or other non-2xx. The
|
|
735
737
|
``status_code`` attribute lets callers map to specific
|
|
736
738
|
suggestions.
|
|
737
739
|
HomeAssistantConnectionError: Network, timeout, or transport error.
|
|
@@ -775,25 +777,28 @@ class HomeAssistantClient:
|
|
|
775
777
|
|
|
776
778
|
``path`` is everything between ``http://supervisor/`` and ``/logs``:
|
|
777
779
|
|
|
778
|
-
- ``"addons/<slug>"`` for add-on container logs
|
|
780
|
+
- ``"addons/<slug>"`` for app (add-on) container logs
|
|
779
781
|
- ``"<service>"`` (where service ∈ {supervisor, host, core, dns, audio,
|
|
780
782
|
cli, multicast, observer}) for system-service logs
|
|
781
783
|
|
|
782
784
|
``lines`` maps to the endpoint's ``?lines=`` journald-window query
|
|
783
785
|
param; omitted → Supervisor's 100-line default window.
|
|
784
786
|
|
|
785
|
-
Bypasses ``HomeAssistantClient.httpx_client`` because
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
787
|
+
Bypasses ``HomeAssistantClient.httpx_client`` because that client targets
|
|
788
|
+
Home Assistant Core through ``http://supervisor/core/api``, while logs
|
|
789
|
+
belong to Supervisor at ``http://supervisor``. Both clients use the same
|
|
790
|
+
``SUPERVISOR_TOKEN``; the Core proxy requires ``homeassistant_api``, while
|
|
791
|
+
system-service and arbitrary app-log paths require ``hassio_api`` and
|
|
792
|
+
``hassio_role: manager``. The recognized-app-token exception is
|
|
793
|
+
``/addons/self/logs``.
|
|
790
794
|
|
|
791
795
|
Raises:
|
|
792
796
|
HomeAssistantAuthError: ``SUPERVISOR_TOKEN`` absent at call time,
|
|
793
797
|
or 401 from Supervisor.
|
|
794
|
-
HomeAssistantAPIError: 403 (
|
|
795
|
-
role
|
|
796
|
-
``{"result":"error","message":"..."}``
|
|
798
|
+
HomeAssistantAPIError: 403 (unrecognized token, missing
|
|
799
|
+
``hassio_api``, or insufficient role), 404, other 4xx/5xx.
|
|
800
|
+
Parses Supervisor's ``{"result":"error","message":"..."}``
|
|
801
|
+
JSON envelope before
|
|
797
802
|
falling back to text body / reason phrase / placeholder.
|
|
798
803
|
HomeAssistantConnectionError: Timeout or transport error, with
|
|
799
804
|
distinct messages so callers can tell them apart.
|
|
@@ -839,18 +844,19 @@ class HomeAssistantClient:
|
|
|
839
844
|
if response.status_code == 401:
|
|
840
845
|
raise HomeAssistantAuthError(f"Invalid Supervisor token for /{path}/logs")
|
|
841
846
|
if response.status_code == 403:
|
|
842
|
-
#
|
|
843
|
-
#
|
|
844
|
-
#
|
|
845
|
-
#
|
|
847
|
+
# Supervisor uses 403 for an unrecognized app token, missing
|
|
848
|
+
# hassio_api permission, or a hassio_role that cannot access this
|
|
849
|
+
# endpoint. The default-to-manager role bump fixed #1116, but it is
|
|
850
|
+
# not the only possible cause.
|
|
846
851
|
logger.warning(
|
|
847
|
-
"Supervisor returned 403 for /%s/logs —
|
|
848
|
-
"
|
|
852
|
+
"Supervisor returned 403 for /%s/logs — check token, hassio_api, "
|
|
853
|
+
"and hassio_role (need 'manager')",
|
|
849
854
|
path,
|
|
850
855
|
)
|
|
851
856
|
raise HomeAssistantAPIError(
|
|
852
|
-
f"Supervisor forbids /{path}/logs (403) —
|
|
853
|
-
"may
|
|
857
|
+
f"Supervisor forbids /{path}/logs (403) — token may be unrecognized, "
|
|
858
|
+
"app may lack hassio_api, or hassio_role may not allow this endpoint "
|
|
859
|
+
"(manager required)",
|
|
854
860
|
status_code=403,
|
|
855
861
|
response_data={"path": path},
|
|
856
862
|
)
|
|
@@ -873,14 +879,15 @@ class HomeAssistantClient:
|
|
|
873
879
|
async def _get_addon_logs_via_supervisor(
|
|
874
880
|
self, slug: str, lines: int | None = None
|
|
875
881
|
) -> str:
|
|
876
|
-
"""Fetch add-on container logs directly from Supervisor
|
|
882
|
+
"""Fetch app (add-on) container logs directly from Supervisor REST.
|
|
877
883
|
|
|
878
|
-
Distinct from ``tools_bug_report._fetch_addon_logs``: that
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
+
Distinct from ``tools_bug_report._fetch_addon_logs``: that auxiliary
|
|
885
|
+
helper uses the app self-service path ``/addons/self/logs`` and may skip
|
|
886
|
+
failures. This helper takes arbitrary slugs and surfaces failures because
|
|
887
|
+
callers (``ha_get_logs(source="supervisor", slug=...)``) need them.
|
|
888
|
+
Arbitrary app-log slugs require a recognized app token with ``hassio_api``
|
|
889
|
+
and ``hassio_role: manager``; ``/addons/self/logs`` bypasses the role and
|
|
890
|
+
API-permission checks but still requires a recognized app token.
|
|
884
891
|
|
|
885
892
|
Delegates to ``_supervisor_logs_get`` so error handling stays in
|
|
886
893
|
lockstep with ``_get_system_service_logs``.
|
|
@@ -895,26 +902,21 @@ class HomeAssistantClient:
|
|
|
895
902
|
``service`` must be one of the eight Supervisor-managed services:
|
|
896
903
|
``supervisor``, ``host``, ``core``, ``dns``, ``audio``, ``cli``,
|
|
897
904
|
``multicast``, ``observer``. Caller is responsible for validating
|
|
898
|
-
``service
|
|
899
|
-
|
|
905
|
+
``service``; this helper performs no validation, and unsupported paths
|
|
906
|
+
are rejected by the selected direct-Supervisor or Core-proxy route.
|
|
900
907
|
|
|
901
908
|
Branch on ``is_running_in_addon()`` — mirror of ``get_addon_logs``:
|
|
902
|
-
inside the
|
|
909
|
+
inside the app (add-on) container goes directly to Supervisor at
|
|
903
910
|
``http://supervisor/{service}/logs`` with the Supervisor token
|
|
904
|
-
(``hassio_role: manager`` required). On non-
|
|
911
|
+
(``hassio_api`` and ``hassio_role: manager`` required). On non-app
|
|
912
|
+
installs (Docker
|
|
905
913
|
without Supervisor, pyinstaller, pip pointing at a normal HA URL),
|
|
906
914
|
falls back to the HA Core proxy at ``/api/hassio/{service}/logs``.
|
|
907
915
|
|
|
908
|
-
All
|
|
916
|
+
All eight service slugs are whitelisted in HA Core's hassio proxy
|
|
909
917
|
(``homeassistant/components/hassio/http.py`` — ``PATHS_ADMIN``), so
|
|
910
918
|
an admin LLA is sufficient to reach any of them from outside the
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
Closes #1260: pre-fix this method had only the addon-direct branch,
|
|
914
|
-
so non-addon installs (the Docker image, uvx ha-mcp, etc.) hit the
|
|
915
|
-
``SUPERVISOR_TOKEN``-absent fail-fast in ``_supervisor_logs_get`` for
|
|
916
|
-
every service, while the sibling ``source="supervisor"`` (addon
|
|
917
|
-
logs) call kept working through its own Core-proxy fallback.
|
|
919
|
+
app.
|
|
918
920
|
"""
|
|
919
921
|
if is_running_in_addon():
|
|
920
922
|
return await self._supervisor_logs_get(service, lines=lines)
|
{ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
"""Shared factory for direct-Supervisor httpx clients.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
``
|
|
6
|
-
|
|
3
|
+
Several code paths call the Home Assistant Supervisor REST API directly with
|
|
4
|
+
a short-lived client configured for the Supervisor base URL and
|
|
5
|
+
``SUPERVISOR_TOKEN``. Callers cover log collection, app (add-on) management
|
|
6
|
+
and restart, backup operations, and screenshot-engine discovery.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- :func:`ha_mcp.settings_ui._handlers_server._restart_addon` — POSTs
|
|
13
|
-
``/addons/self/restart`` from the settings UI
|
|
14
|
-
|
|
15
|
-
All three share the same boilerplate (base URL, ``Authorization: Bearer
|
|
16
|
-
${SUPERVISOR_TOKEN}`` header), so this module supplies a single factory and
|
|
17
|
-
keeps the three sites consistent.
|
|
8
|
+
These calls cannot use ``HomeAssistantClient.httpx_client``, which targets
|
|
9
|
+
Home Assistant Core rather than Supervisor. In app mode it carries the same
|
|
10
|
+
token value, but requests use a different base URL and authorization surface.
|
|
11
|
+
This module centralizes the direct transport setup.
|
|
18
12
|
"""
|
|
19
13
|
|
|
20
14
|
from __future__ import annotations
|
|
@@ -56,14 +50,11 @@ def make_supervisor_httpx_client(
|
|
|
56
50
|
|
|
57
51
|
Raises:
|
|
58
52
|
RuntimeError: ``SUPERVISOR_TOKEN`` is unset or empty in the
|
|
59
|
-
environment.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
``Authorization: Bearer `` header from being read as a token
|
|
65
|
-
rejection by Supervisor, which would mask the missing-env-var
|
|
66
|
-
root cause.
|
|
53
|
+
environment. Callers must either gate construction on token
|
|
54
|
+
presence or translate this exception for their response surface.
|
|
55
|
+
Detecting it here prevents a malformed
|
|
56
|
+
``Authorization: Bearer `` header from masking the missing
|
|
57
|
+
environment variable as a token rejection from Supervisor.
|
|
67
58
|
|
|
68
59
|
Note:
|
|
69
60
|
``SUPERVISOR_TOKEN`` is read from env at construction time and
|
|
@@ -46,6 +46,13 @@ logger = logging.getLogger(__name__)
|
|
|
46
46
|
# overflowed the previous 20MB cap (#1721).
|
|
47
47
|
MAX_WS_MESSAGE_BYTES = 64 * 1024 * 1024
|
|
48
48
|
|
|
49
|
+
# How long :meth:`HomeAssistantWebSocketClient.send_command` waits for a reply
|
|
50
|
+
# when the caller names no ``_wait_timeout``. Named rather than inlined because
|
|
51
|
+
# callers that schedule retries have to budget around it: a caller whose retry
|
|
52
|
+
# delay assumes a fast failure will start its next attempt one whole timeout
|
|
53
|
+
# later than it planned when the command hangs instead.
|
|
54
|
+
DEFAULT_COMMAND_WAIT_TIMEOUT = 30.0
|
|
55
|
+
|
|
49
56
|
|
|
50
57
|
def _extract_ws_error(error: Any) -> tuple[str, str | None]:
|
|
51
58
|
"""Split an HA WebSocket ``error`` payload into ``(message, code)``.
|
|
@@ -621,10 +628,11 @@ class HomeAssistantWebSocketClient:
|
|
|
621
628
|
Args:
|
|
622
629
|
command_type: Type of command to send
|
|
623
630
|
_wait_timeout: Seconds to wait for the response (consumed from
|
|
624
|
-
``kwargs``, not forwarded to Home Assistant). Defaults to
|
|
625
|
-
which suits fast commands;
|
|
626
|
-
``supervisor/api`` add-on install)
|
|
627
|
-
client doesn't give up before Home
|
|
631
|
+
``kwargs``, not forwarded to Home Assistant). Defaults to
|
|
632
|
+
``DEFAULT_COMMAND_WAIT_TIMEOUT``, which suits fast commands;
|
|
633
|
+
long-running ones (e.g. a ``supervisor/api`` add-on install)
|
|
634
|
+
must raise this so the client doesn't give up before Home
|
|
635
|
+
Assistant replies.
|
|
628
636
|
**kwargs: Command parameters (merged into the outgoing message)
|
|
629
637
|
|
|
630
638
|
Returns:
|
|
@@ -644,7 +652,7 @@ class HomeAssistantWebSocketClient:
|
|
|
644
652
|
# break that call shape under mypy. The leading underscore keeps it out
|
|
645
653
|
# of the HA message namespace — HA WebSocket fields never start with
|
|
646
654
|
# one — so it can never shadow a real command field when popped.
|
|
647
|
-
wait_timeout: float = kwargs.pop("_wait_timeout",
|
|
655
|
+
wait_timeout: float = kwargs.pop("_wait_timeout", DEFAULT_COMMAND_WAIT_TIMEOUT)
|
|
648
656
|
|
|
649
657
|
message_id = self.get_next_message_id()
|
|
650
658
|
message = {"id": message_id, "type": command_type, **kwargs}
|
|
@@ -168,8 +168,10 @@ async def set_config_subentry(
|
|
|
168
168
|
|
|
169
169
|
The reconfigure branch fails when the flow leaves any supplied config key
|
|
170
170
|
unconsumed, where it previously returned success plus a warning — see
|
|
171
|
-
:func:`_handle_config_subentry_flow_steps` for why.
|
|
172
|
-
|
|
171
|
+
:func:`_handle_config_subentry_flow_steps` for why. It also walks with
|
|
172
|
+
``keep_current_values`` (issue #2254), so a partial patch keeps the
|
|
173
|
+
subentry fields it does not name instead of resetting them. The create
|
|
174
|
+
branch is unchanged on both counts.
|
|
173
175
|
"""
|
|
174
176
|
_reject_redaction_sentinels(config_dict)
|
|
175
177
|
flow_result = await client.start_config_subentry_flow(
|
|
@@ -205,6 +207,7 @@ async def set_config_subentry(
|
|
|
205
207
|
flow_result,
|
|
206
208
|
config_dict,
|
|
207
209
|
is_reconfigure=subentry_id is not None,
|
|
210
|
+
keep_current_values=subentry_id is not None,
|
|
208
211
|
)
|
|
209
212
|
except asyncio.CancelledError:
|
|
210
213
|
await _abort_subentry_flow_best_effort(client, flow_id)
|
|
@@ -289,6 +292,17 @@ async def update_config_entry_options(
|
|
|
289
292
|
``ha_set_integration`` path passes ``None`` to accept any domain). Starts
|
|
290
293
|
an options flow, walks the flow steps, and returns the result. Aborts the
|
|
291
294
|
flow on error. ``noun`` only affects response wording.
|
|
295
|
+
|
|
296
|
+
This edits an existing entry, so the walk runs with
|
|
297
|
+
``keep_current_values``: every field an options step declares that
|
|
298
|
+
``config_dict`` does not name is submitted with the value the step itself
|
|
299
|
+
carries, exactly as the HA UI's "Configure" dialog posts back the boxes
|
|
300
|
+
nobody touched. Before issue #2254 those keys were dropped and voluptuous
|
|
301
|
+
substituted each field's static default, so a one-key patch silently reset
|
|
302
|
+
the rest of the entry's options. A key the caller sets to ``None`` is the
|
|
303
|
+
opposite request and is honoured as a clear, which for a field carrying a
|
|
304
|
+
schema default means submitting the ``None`` for Home Assistant to
|
|
305
|
+
validate rather than omitting it into that default.
|
|
292
306
|
"""
|
|
293
307
|
_reject_redaction_sentinels(config_dict)
|
|
294
308
|
config_entry = await client.get_config_entry(entry_id)
|
|
@@ -332,6 +346,7 @@ async def update_config_entry_options(
|
|
|
332
346
|
config_dict,
|
|
333
347
|
submit_fn=client.submit_options_flow_step,
|
|
334
348
|
helper_type=expected_domain,
|
|
349
|
+
keep_current_values=True,
|
|
335
350
|
)
|
|
336
351
|
except Exception:
|
|
337
352
|
try:
|