ha-mcp-dev 8.1.1.dev2286__tar.gz → 8.1.1.dev2289__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.1.1.dev2286/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.1.1.dev2289}/PKG-INFO +1 -1
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/pyproject.toml +1 -1
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/__main__.py +1 -8
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/hacs_auto_refresh.py +45 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/server.py +2 -0
- ha_mcp_dev-8.1.1.dev2289/src/ha_mcp/settings_ui/locales/sv.json +846 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- ha_mcp_dev-8.1.1.dev2286/src/ha_mcp/settings_ui/locales/sv.json +0 -22
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/setup.cfg +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/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.1.1.
|
|
7
|
+
version = "8.1.1.dev2289"
|
|
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
|
|
@@ -666,13 +666,6 @@ async def _run_with_shutdown(server_coro: Coroutine[Any, Any, Any]) -> None:
|
|
|
666
666
|
server_task = asyncio.create_task(server_coro)
|
|
667
667
|
shutdown_task = asyncio.create_task(_shutdown_event.wait())
|
|
668
668
|
|
|
669
|
-
# Fire-and-forget: ask HACS to surface a paired component update after a
|
|
670
|
-
# server update (advisory; see hacs_auto_refresh). Not in the wait set —
|
|
671
|
-
# its completion must not stop the server.
|
|
672
|
-
from ha_mcp.hacs_auto_refresh import maybe_refresh_hacs_after_update
|
|
673
|
-
|
|
674
|
-
hacs_refresh_task = asyncio.create_task(maybe_refresh_hacs_after_update())
|
|
675
|
-
|
|
676
669
|
try:
|
|
677
670
|
done, pending = await asyncio.wait(
|
|
678
671
|
[server_task, shutdown_task],
|
|
@@ -732,7 +725,7 @@ async def _run_with_shutdown(server_coro: Coroutine[Any, Any, Any]) -> None:
|
|
|
732
725
|
logger.warning("Resource cleanup timed out")
|
|
733
726
|
|
|
734
727
|
try:
|
|
735
|
-
await _cancel_tasks(server_task, shutdown_task
|
|
728
|
+
await _cancel_tasks(server_task, shutdown_task)
|
|
736
729
|
except Exception as e:
|
|
737
730
|
# Teardown must never mask the exception being propagated from the
|
|
738
731
|
# try block (Python drops the original if finally raises).
|
|
@@ -25,6 +25,8 @@ import asyncio
|
|
|
25
25
|
import hashlib
|
|
26
26
|
import json
|
|
27
27
|
import logging
|
|
28
|
+
from collections.abc import AsyncIterator
|
|
29
|
+
from contextlib import asynccontextmanager, suppress
|
|
28
30
|
from pathlib import Path
|
|
29
31
|
from typing import Any
|
|
30
32
|
|
|
@@ -222,8 +224,28 @@ async def maybe_refresh_hacs_after_update() -> None:
|
|
|
222
224
|
info = await asyncio.to_thread(get_update_info)
|
|
223
225
|
marker = await asyncio.to_thread(_read_marker, ha_url)
|
|
224
226
|
if not _nudge_due(current, info, marker):
|
|
227
|
+
# DEBUG, not INFO: the not-due return is the per-conversation
|
|
228
|
+
# stdio hot path and must stay quiet at default levels. The line
|
|
229
|
+
# exists so a DEBUG-level launcher (the HAOS add-on lane) can
|
|
230
|
+
# prove scheduling even when a completed earlier pass makes every
|
|
231
|
+
# later boot legitimately not due.
|
|
232
|
+
logger.debug(
|
|
233
|
+
"HACS auto-refresh: pass not due (marker current for server %s)",
|
|
234
|
+
current,
|
|
235
|
+
)
|
|
225
236
|
return
|
|
226
237
|
|
|
238
|
+
# The one unconditional line a due pass emits BEFORE any WebSocket
|
|
239
|
+
# work: it proves the launcher scheduled the nudge even where HACS
|
|
240
|
+
# is absent and the pass ends silently — the observable the HAOS
|
|
241
|
+
# add-on lane greps for, and the line whose absence exposed the
|
|
242
|
+
# launcher gap this module's lifespan wiring closed.
|
|
243
|
+
logger.info(
|
|
244
|
+
"HACS auto-refresh: startup pass due (server %s); "
|
|
245
|
+
"asking HACS for repository state",
|
|
246
|
+
current,
|
|
247
|
+
)
|
|
248
|
+
|
|
227
249
|
result = await _refresh_with_retries()
|
|
228
250
|
if result is None:
|
|
229
251
|
logger.debug(
|
|
@@ -250,3 +272,26 @@ async def maybe_refresh_hacs_after_update() -> None:
|
|
|
250
272
|
raise
|
|
251
273
|
except Exception:
|
|
252
274
|
logger.debug("HACS auto-refresh nudge skipped", exc_info=True)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
@asynccontextmanager
|
|
278
|
+
async def hacs_refresh_lifespan(_server: Any) -> AsyncIterator[dict[str, Any]]:
|
|
279
|
+
"""Schedule the startup nudge for the lifetime of any server run.
|
|
280
|
+
|
|
281
|
+
Attached as the FastMCP ``lifespan`` so it runs on EVERY launcher —
|
|
282
|
+
stdio, the HTTP CLI entry points, and the add-on's ``start.py``, which
|
|
283
|
+
calls ``mcp.run()`` directly and never passes through ``__main__``'s
|
|
284
|
+
``_run_with_shutdown`` (the wiring this replaces; the add-on gap was
|
|
285
|
+
found live, not by CI, because the e2e suites launch via the CLI
|
|
286
|
+
entry points).
|
|
287
|
+
"""
|
|
288
|
+
task = asyncio.create_task(maybe_refresh_hacs_after_update())
|
|
289
|
+
try:
|
|
290
|
+
yield {}
|
|
291
|
+
finally:
|
|
292
|
+
# The nudge may be mid-retry-sleep; a cancelled task must not
|
|
293
|
+
# stall shutdown. maybe_refresh_hacs_after_update re-raises
|
|
294
|
+
# CancelledError by design, so this await returns promptly.
|
|
295
|
+
task.cancel()
|
|
296
|
+
with suppress(asyncio.CancelledError):
|
|
297
|
+
await task
|
|
@@ -20,6 +20,7 @@ from pydantic import Field
|
|
|
20
20
|
|
|
21
21
|
from .config import _PACKAGE_VERSION, get_global_settings
|
|
22
22
|
from .errors import ErrorCode, create_error_response
|
|
23
|
+
from .hacs_auto_refresh import hacs_refresh_lifespan
|
|
23
24
|
from .tools.helpers import raise_tool_error
|
|
24
25
|
from .transforms import DEFAULT_PINNED_TOOLS
|
|
25
26
|
|
|
@@ -142,6 +143,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
142
143
|
version=server_version,
|
|
143
144
|
icons=SERVER_ICONS,
|
|
144
145
|
instructions=instructions,
|
|
146
|
+
lifespan=hacs_refresh_lifespan,
|
|
145
147
|
)
|
|
146
148
|
|
|
147
149
|
# Register all tools and expert prompts
|