ha-mcp-dev 8.2.0.dev2321__tar.gz → 8.2.0.dev2326__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.2.0.dev2321/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.2.0.dev2326}/PKG-INFO +1 -1
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/pyproject.toml +1 -1
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/client/rest_client.py +31 -12
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/de.json +2 -2
- ha_mcp_dev-8.2.0.dev2326/src/ha_mcp/settings_ui/locales/eo.json +846 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/es.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/fr.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/it.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/nl.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/pl.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/ru.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/sv.json +2 -2
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/zh-Hans.json +2 -2
- ha_mcp_dev-8.2.0.dev2326/src/ha_mcp/tools/error_log_parsing.py +365 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_utility.py +243 -48
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
- ha_mcp_dev-8.2.0.dev2321/src/ha_mcp/settings_ui/locales/eo.json +0 -26
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/setup.cfg +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/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.2.0.
|
|
7
|
+
version = "8.2.0.dev2326"
|
|
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
|
|
@@ -40,6 +40,10 @@ logger = logging.getLogger(__name__)
|
|
|
40
40
|
# so the request did not execute and retrying is safe even for writes.
|
|
41
41
|
_RETRYABLE_STATUS = frozenset({502, 503, 504})
|
|
42
42
|
_MAX_REQUEST_ATTEMPTS = 3
|
|
43
|
+
# Journald window requested for the Core error log on Supervisor-backed
|
|
44
|
+
# installs. Both such branches of get_error_log() build their request from this
|
|
45
|
+
# constant, so the window they ask for cannot drift apart.
|
|
46
|
+
_ERROR_LOG_LINES = 20000
|
|
43
47
|
|
|
44
48
|
|
|
45
49
|
class HomeAssistantError(Exception):
|
|
@@ -586,7 +590,11 @@ class HomeAssistantClient:
|
|
|
586
590
|
"""
|
|
587
591
|
if is_running_in_addon():
|
|
588
592
|
logger.debug("Fetching error log via Supervisor direct (core service)")
|
|
589
|
-
|
|
593
|
+
# An explicit `lines` is required: without it Supervisor applies its
|
|
594
|
+
# 100-line default, which is far too short a slice to tell what keeps
|
|
595
|
+
# repeating. `_get_supervisor_log` plumbs the same parameter for the
|
|
596
|
+
# same reason (#1734).
|
|
597
|
+
return await self._supervisor_logs_get("core", lines=_ERROR_LOG_LINES)
|
|
590
598
|
|
|
591
599
|
if await self._is_supervised_install():
|
|
592
600
|
logger.debug(
|
|
@@ -594,7 +602,7 @@ class HomeAssistantClient:
|
|
|
594
602
|
)
|
|
595
603
|
raw_response = await self._raw_request(
|
|
596
604
|
"GET",
|
|
597
|
-
"/hassio/core/logs?lines=
|
|
605
|
+
f"/hassio/core/logs?lines={_ERROR_LOG_LINES}",
|
|
598
606
|
headers={"Accept": "text/plain"},
|
|
599
607
|
)
|
|
600
608
|
return raw_response.text
|
|
@@ -619,11 +627,21 @@ class HomeAssistantClient:
|
|
|
619
627
|
glitch or HTTP error returns False without setting the cache,
|
|
620
628
|
so the next call re-probes. This is the only path that
|
|
621
629
|
intentionally fails open — caller proceeds on the historical
|
|
622
|
-
Container branch
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
630
|
+
Container branch.
|
|
631
|
+
|
|
632
|
+
A 401 is deliberately excluded from that fail-open: it is a
|
|
633
|
+
definitive answer about the credential rather than a transient
|
|
634
|
+
glitch, and swallowing it strands exactly the install class this
|
|
635
|
+
probe exists for. Failing open sends a Supervised caller down
|
|
636
|
+
the Container branch to ``/api/error_log``, which HA Core never
|
|
637
|
+
registers under ``SUPERVISOR`` (see ``get_error_log``), so the
|
|
638
|
+
auth failure resurfaces as a 404 and the caller answers with
|
|
639
|
+
connection advice instead of "re-create the LLAT". Letting
|
|
640
|
+
``HomeAssistantAuthError`` propagate reaches the auth handler
|
|
641
|
+
directly. Transport / HTTP fail-open is unchanged.
|
|
642
|
+
|
|
643
|
+
Connection / HTTP errors are caught explicitly; runtime bugs
|
|
644
|
+
(TypeError, AttributeError) and BaseException derivatives
|
|
627
645
|
(KeyboardInterrupt, CancelledError) deliberately propagate so
|
|
628
646
|
they're not silenced as "not supervised".
|
|
629
647
|
"""
|
|
@@ -632,16 +650,17 @@ class HomeAssistantClient:
|
|
|
632
650
|
try:
|
|
633
651
|
config = await self._request("GET", "/config")
|
|
634
652
|
except (
|
|
635
|
-
HomeAssistantAuthError,
|
|
636
653
|
HomeAssistantAPIError,
|
|
637
654
|
HomeAssistantConnectionError,
|
|
638
655
|
httpx.HTTPError,
|
|
639
656
|
TimeoutError,
|
|
640
657
|
) as exc:
|
|
641
|
-
# Fail-open on transport / HTTP-layer failures only.
|
|
642
|
-
#
|
|
643
|
-
#
|
|
644
|
-
#
|
|
658
|
+
# Fail-open on transport / HTTP-layer failures only.
|
|
659
|
+
# HomeAssistantAuthError is deliberately absent: a 401 is a
|
|
660
|
+
# definitive verdict on the credential, and failing open on
|
|
661
|
+
# it routes a Supervised caller to /api/error_log — a route
|
|
662
|
+
# that does not exist there — turning the auth error into a
|
|
663
|
+
# 404 (see the docstring).
|
|
645
664
|
# Logged at WARNING so it's visible at default log levels
|
|
646
665
|
# without spamming on every call (probe runs at most once
|
|
647
666
|
# per session per outcome).
|
{ha_mcp_dev-8.2.0.dev2321 → ha_mcp_dev-8.2.0.dev2326}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"features.enable_strict_mandatory_bps.label": "Strikter Best-Practices-Modus",
|
|
129
129
|
"features.enable_strict_mandatory_bps.help": "Strikter Modus: verhindert, dass der Client das Tool verwendet, bis er nachweisen kann, dass er die Best Practices gelesen hat. Während er eingeschaltet ist, werden die sechs Best-Practice-Schreibtools (Automatisierungen, Skripte, Szenen, Helfer, Dashboards, rohes YAML) blockiert und geben einen Fehler zurück, der den Client anweist, das Best-Practices-Skill über ha_get_skill_guide zu lesen und den dort erhaltenen Bestätigungsschlüssel zurückzugeben. Während er eingeschaltet ist, ist das ha_get_skill_guide-Tool gesperrt aktiviert – es ist der einzige Herausgeber des Bestätigungsschlüssels. Kind der Option Best-Practice-Skills bei Schreibvorgängen anhängen oben und inert, während dieser Elternteil ausgeschaltet ist. Erfordert Neustart, um wirksam zu werden.",
|
|
130
130
|
"features.enable_beta_features.label": "Beta-Funktionen aktivieren (Master)",
|
|
131
|
-
"features.enable_beta_features.help": "⚠ GEFAHR
|
|
131
|
+
"features.enable_beta_features.help": "⚠ GEFAHR — diese Tools können deine Home Assistant-Installation DAUERHAFT BESCHÄDIGEN. Sie schreiben in deine YAML-Konfiguration, dein Dateisystem, installieren benutzerdefinierte Komponenten, führen beliebigen sandboxed Python-Code aus und bearbeiten Tool-Docstrings, die die KI sieht. Es gibt keine Garantie und keine Support-Zusage — du aktivierst sie auf EIGENES RISIKO. Erstelle ein Home Assistant-Backup, bevor du dies aktivierst, und aktiviere es niemals in der Produktion ohne eines. Hauptschalter für die experimentellen Unter-Flags unten; Unter-Flags werden zur Laufzeit ignoriert, solange dieser Hauptschalter ausgeschaltet ist, selbst wenn sie explizit auf true gesetzt sind. Derselbe Schalter wird auch in der Web-Einstellungen-UI unter \"Beta-Funktionen (gefährlich)\" angezeigt — beide Oberflächen spiegeln sich beim Neustart wider.",
|
|
132
132
|
"features.enable_yaml_config_editing.label": "YAML-Konfigurations-Bearbeitung aktivieren (Beta)",
|
|
133
133
|
"features.enable_yaml_config_editing.help": "Beta-Funktion. Ermöglicht KI-Assistenten, Schlüssel der obersten Ebene in configuration.yaml und packages/*.yaml hinzuzufügen, zu ersetzen oder zu entfernen. Nur auf die Whitelist gesetzte Schlüssel sind erlaubt (z. B. template, sensor, command_line, mqtt, knx); Kernschlüssel wie homeassistant, http und recorder sind blockiert. Jede Bearbeitung validiert YAML-Syntax, führt eine Konfigurationsprüfung durch und erstellt ein automatisches Backup. Änderungen an den meisten Schlüsseln erfordern einen vollständigen HA-Neustart, um wirksam zu werden. Siehe docs/beta.md für bekannte Einschränkungen. Dedizierte Tools (Automatisierungen, Skripte, Szenen, Helfer, Template-Sensoren) sollten bevorzugt werden, wenn verfügbar. ERFORDERT, dass der Master-Schalter Beta-Funktionen aktivieren oben (und in der Web-UI) eingeschaltet ist – andernfalls wird dieses Unter-Flag zur Laufzeit ignoriert, unabhängig von seinem Wert hier.",
|
|
134
134
|
"features.enable_yaml_edit_confirm.label": "Bestätigung für YAML-Bearbeitungen erfordern (Diff-Vorschau)",
|
|
@@ -441,7 +441,7 @@
|
|
|
441
441
|
"addon.enable_security_policy_tool.name": "KI-Agenten erlauben, Tool-Sicherheitsrichtlinien zu bearbeiten",
|
|
442
442
|
"addon.enable_security_policy_tool.description": "Registriert das Tool ha_manage_security_policy, das verbundenen KI-Agenten erlaubt, die Tool-Sicherheitsrichtlinien zu lesen und neu zu schreiben — einschließlich des Entfernens von Genehmigungsschranken. Standardmäßig deaktiviert. Unabhängig von der Option „Tool-Sicherheitsrichtlinien“ oben: Dies steuert, wer die Regeln bearbeiten kann, nicht ob sie erzwungen werden. Das Tool kann ausstehende Genehmigungen nicht sehen oder entscheiden. Um einen Menschen in der Schleife zu halten, schütze das Tool, bevor du es aktivierst: Aktiviere „security gated“ für „Manage Security Policy“ auf dem Tab „Tools“ der Web-UI. Erfordert einen Neustart, um wirksam zu werden.",
|
|
443
443
|
"addon.enable_auto_backup.name": "Auto-Backup von Bearbeitungen aktivieren",
|
|
444
|
-
"addon.enable_auto_backup.description": "
|
|
444
|
+
"addon.enable_auto_backup.description": "Erstellt einen Snapshot pro Entität vor jedem umschlossenen Schreib-/destruktiven MCP-Tool-Aufruf (Automatisierung, Skript, Szene, Helfer, Dashboard, Dashboard-Ressource, Label, Kategorie, Gruppe, Zone, Bereich, Kalender, Todo, Entität, Gerät, Integration und zugehörige Entfernungs-/Lösch-Tools). Die Auto-Backup-Drosselung begrenzt, wie oft dies geschieht: 0 (Standard) erstellt bei jedem solchen Aufruf einen Snapshot, N>0 maximal einen Snapshot pro N Minuten pro Entität. Snapshots werden als YAML-Dateien unter /data/ha_mcp_backups/ (Überschreibung über HAMCP_BACKUP_DIR) gespeichert und können über den Tab „Backups“ in der Web-Einstellungen-UI oder über ha_manage_backup(scope='edits', ...) aufgelistet, wiederhergestellt oder gelöscht werden. Für diese Domänen ist die Erfassung ein Best-Effort-Versuch — ein Fehler protokolliert eine WARNING und der Schreibvorgang wird fortgesetzt. Die Datei- und Raw-YAML-Tools sind die Ausnahme: ha_write_file, ha_delete_file und ha_config_set_yaml behandeln den Snapshot als Vorbedingung, sodass ein Schreibvorgang über sie verweigert wird, solange dies deaktiviert ist, und eine fehlgeschlagene Erfassung ihn blockiert. Standardmäßig aktiviert; Deaktivieren meldet sich von den Best-Effort-Erfassungen ab und nimmt die Datei- und Raw-YAML-Tools mit ihnen außer Betrieb. Erfordert einen Neustart, um wirksam zu werden.",
|
|
445
445
|
"addon.auto_backup_throttle_minutes.name": "Auto-Backup-Drosselung (Minuten)",
|
|
446
446
|
"addon.auto_backup_throttle_minutes.description": "Pro-Entität-Drosselungsfenster. 0 (Standard) erfasst einen Snapshot bei jedem umschlossenen Schreibvorgang. N>0 erfasst höchstens einen Snapshot pro N Minuten pro Entität. Bereich 0–1440.",
|
|
447
447
|
"addon.auto_backup_retain_per_entity.name": "Auto-Backup-Aufbewahrung (pro Entität)",
|