ha-mcp-dev 8.7.0.dev3060__tar.gz → 8.7.0.dev3061__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.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/PKG-INFO +1 -1
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/pyproject.toml +1 -1
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_entity_ids.py +77 -0
- ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/backup_helper_target.py +183 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_manager.py +79 -83
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_tags.py +14 -13
- ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/backup_zones.py +107 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_backups.py +29 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/04_backups.js +16 -3
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup.py +18 -18
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_helper_collections.py +135 -24
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_registry_lookup.py +5 -4
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/create.py +84 -19
- ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/config_helpers/icon_route.py +31 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/update.py +64 -43
- ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/entity_removal.py +75 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/flow_helper_lookup.py +24 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_helpers.py +8 -6
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_entities.py +13 -14
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_integrations.py +49 -108
- ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/tools_zones.py +791 -0
- ha_mcp_dev-8.7.0.dev3060/src/ha_mcp/tools/tools_zones.py +0 -623
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.7.0.
|
|
7
|
+
version = "8.7.0.dev3061"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.7.0.
|
|
7
|
+
version = "8.7.0.dev3061"
|
|
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
|
|
@@ -9,6 +9,8 @@ from __future__ import annotations
|
|
|
9
9
|
from contextlib import AsyncExitStack
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
|
+
from ._vendor.websockets.exceptions import WebSocketException
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
def _manager() -> Any:
|
|
14
16
|
from . import backup_manager
|
|
@@ -16,6 +18,81 @@ def _manager() -> Any:
|
|
|
16
18
|
return backup_manager
|
|
17
19
|
|
|
18
20
|
|
|
21
|
+
async def registry_row(
|
|
22
|
+
client: Any, platform: str, unique_id: str
|
|
23
|
+
) -> dict[str, Any] | None:
|
|
24
|
+
"""The entity-registry row of ``platform``'s entity with ``unique_id``."""
|
|
25
|
+
rows = await _manager()._entity_registry_rows(client)
|
|
26
|
+
return next(
|
|
27
|
+
(
|
|
28
|
+
row
|
|
29
|
+
for row in rows
|
|
30
|
+
if row.get("platform") == platform and row.get("unique_id") == unique_id
|
|
31
|
+
),
|
|
32
|
+
None,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def with_registry_icon(
|
|
37
|
+
client: Any, platform: str, item: dict[str, Any]
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
"""The stored item plus the icon its entity's registry entry sets, if any.
|
|
40
|
+
|
|
41
|
+
The registry icon is the one the entity shows, and the helper tools write
|
|
42
|
+
it there (an update always; a create for a zone, or when Core's schema
|
|
43
|
+
has no icon field or cannot be read), so the stored item alone can miss
|
|
44
|
+
it. A failed registry read
|
|
45
|
+
propagates, so the capture reports it instead of saving a snapshot
|
|
46
|
+
without the icon.
|
|
47
|
+
"""
|
|
48
|
+
entity = await registry_row(client, platform, str(item.get("id")))
|
|
49
|
+
return {**item, "registry_icon": entity.get("icon") if entity else None}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def restore_registry_icon(
|
|
53
|
+
client: Any, platform: str, item_id: str, registry_icon: str | None
|
|
54
|
+
) -> list[str]:
|
|
55
|
+
"""Write the recorded registry icon back; problems come back as warnings,
|
|
56
|
+
because the stored item was already restored."""
|
|
57
|
+
bm = _manager()
|
|
58
|
+
try:
|
|
59
|
+
entity = await registry_row(client, platform, item_id)
|
|
60
|
+
if entity is None:
|
|
61
|
+
if registry_icon is None:
|
|
62
|
+
return []
|
|
63
|
+
return [
|
|
64
|
+
f"The registry icon {registry_icon} was not restored: "
|
|
65
|
+
f"{platform} {item_id} has no entity."
|
|
66
|
+
]
|
|
67
|
+
async with bm.registry_update_lock("entity", entity["entity_id"]):
|
|
68
|
+
await bm._ws_send(
|
|
69
|
+
client,
|
|
70
|
+
{
|
|
71
|
+
"type": "config/entity_registry/update",
|
|
72
|
+
"entity_id": entity["entity_id"],
|
|
73
|
+
"icon": registry_icon,
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
except (*bm._CAPTURE_TRANSIENT_ERRORS, WebSocketException) as err:
|
|
77
|
+
return [f"The {platform} was restored, but its registry icon was not: {err}"]
|
|
78
|
+
return []
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def update_with_registry_icon(
|
|
82
|
+
client: Any, platform: str, item_id: str, payload: dict[str, Any]
|
|
83
|
+
) -> Any:
|
|
84
|
+
"""``<platform>/update`` without the snapshot's registry icon, then the icon."""
|
|
85
|
+
recorded = "registry_icon" in payload
|
|
86
|
+
registry_icon = payload.pop("registry_icon", None)
|
|
87
|
+
result = await _manager()._ws_send(client, payload)
|
|
88
|
+
warnings = (
|
|
89
|
+
await restore_registry_icon(client, platform, item_id, registry_icon)
|
|
90
|
+
if recorded
|
|
91
|
+
else []
|
|
92
|
+
)
|
|
93
|
+
return {**result, "warnings": warnings} if warnings else result
|
|
94
|
+
|
|
95
|
+
|
|
19
96
|
def _recreated_unique_id(saved: dict[str, Any], old_entry: str, new_entry: str) -> str:
|
|
20
97
|
"""Core derives a helper entity's unique_id from its config-entry ID."""
|
|
21
98
|
return str(saved["unique_id"]).replace(old_entry, new_entry)
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"""The storage helper a helper tool writes, for its pre-write snapshot (#2632).
|
|
2
|
+
|
|
3
|
+
``ha_config_set_helper``, ``ha_remove_helpers_integrations`` and the zone tools
|
|
4
|
+
resolve their target as ``stored_target`` does: a bare id is a storage id,
|
|
5
|
+
and ``<type>.<name>`` is the entity_id of the helper's registry entry, whose
|
|
6
|
+
``unique_id`` is the storage id. A renamed entity can carry another helper's
|
|
7
|
+
id as its name, so a bare id never names an entity. The snapshot resolves
|
|
8
|
+
the same way, so it holds the item the write changes. A restore whose write
|
|
9
|
+
fails raises through ``raise_with_restore_outcome``, so its caller still learns
|
|
10
|
+
the safety backup to revert with.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
from typing import Any, NoReturn
|
|
17
|
+
|
|
18
|
+
from ._vendor.fastmcp.exceptions import ToolError
|
|
19
|
+
from .backup_entity_ids import _manager
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def _stored_items(client: Any, helper_type: str) -> list[Any]:
|
|
23
|
+
bm = _manager()
|
|
24
|
+
listed = await bm._ws_send(client, {"type": f"{helper_type}/list"})
|
|
25
|
+
if helper_type == "person" and isinstance(listed, dict):
|
|
26
|
+
listed = listed.get("storage") # YAML-defined persons are not editable
|
|
27
|
+
items: list[Any] = bm._require_list(listed, f"{helper_type}/list")
|
|
28
|
+
return items
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def stored_target(
|
|
32
|
+
helper_type: str, target: str, stored_ids: Any, rows: list[Any]
|
|
33
|
+
) -> tuple[str | None, str | None]:
|
|
34
|
+
"""The storage id and entity_id of the stored helper ``target`` names.
|
|
35
|
+
|
|
36
|
+
A bare ``target`` is a storage id; ``<type>.<name>`` is the entity_id of
|
|
37
|
+
a registry entry on the type's platform, whose unique_id is the storage id.
|
|
38
|
+
Its entity_id is None when the item has no registry entry, and both are
|
|
39
|
+
None when nothing matches. A storage id from the registry need not be
|
|
40
|
+
stored: a YAML helper has an entry but no stored item.
|
|
41
|
+
"""
|
|
42
|
+
ids = {str(i) for i in stored_ids}
|
|
43
|
+
own = [r for r in rows if r.get("platform") == helper_type]
|
|
44
|
+
if target in ids:
|
|
45
|
+
entity = next(
|
|
46
|
+
(r.get("entity_id") for r in own if r.get("unique_id") == target), None
|
|
47
|
+
)
|
|
48
|
+
return target, entity
|
|
49
|
+
row = next((r for r in own if r.get("entity_id") == target), None)
|
|
50
|
+
if row is None or not row.get("unique_id"):
|
|
51
|
+
return None, None
|
|
52
|
+
return str(row["unique_id"]), target
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def fetch_helper(client: Any, entity_id: str, helper_type: str) -> Any:
|
|
56
|
+
"""Fetch a storage helper's full config from its ``<helper_type>/list``.
|
|
57
|
+
|
|
58
|
+
Registered for the storage helper types only; flow helpers (config
|
|
59
|
+
entries) have their own handler family (``_make_flow_helper_handler``).
|
|
60
|
+
A failed list or registry read propagates: maybe_snapshot logs a WARNING,
|
|
61
|
+
or for a mandatory snapshot (a restore's safety backup) blocks the write,
|
|
62
|
+
rather than silently skipping.
|
|
63
|
+
"""
|
|
64
|
+
bm = _manager()
|
|
65
|
+
items = await _stored_items(client, helper_type)
|
|
66
|
+
by_id = {str(item.get("id")): item for item in items}
|
|
67
|
+
storage_id, _ = stored_target(
|
|
68
|
+
helper_type, entity_id, by_id, await bm._entity_registry_rows(client)
|
|
69
|
+
)
|
|
70
|
+
item = by_id.get(storage_id) if storage_id else None
|
|
71
|
+
return await bm._registry_snapshot(client, helper_type, item) if item else None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
async def safety_target(
|
|
75
|
+
client: Any, domain: str, entity_id: str, config: Any
|
|
76
|
+
) -> str | None:
|
|
77
|
+
"""The entity a restore's safety backup is taken under, None when the item
|
|
78
|
+
the restore writes no longer exists.
|
|
79
|
+
|
|
80
|
+
The restore writes a stored item by its id; the backup is keyed by the
|
|
81
|
+
entity_id the item had, which a rename since can leave naming nothing, or
|
|
82
|
+
another item. For a storage item the registry entry whose unique_id is the
|
|
83
|
+
stored id follows it. An item can outlive its registry entry, so only its
|
|
84
|
+
absence from the stored items means it is gone: the restore recreates it or
|
|
85
|
+
fails, and overwrites nothing that needs a backup.
|
|
86
|
+
"""
|
|
87
|
+
bm = _manager()
|
|
88
|
+
platform = domain.removeprefix("helper_")
|
|
89
|
+
stored = config.get("id") if isinstance(config, dict) else None
|
|
90
|
+
if not stored or platform not in bm._HELPER_LIST_TYPES:
|
|
91
|
+
return entity_id
|
|
92
|
+
try:
|
|
93
|
+
rows = await bm._entity_registry_rows(client)
|
|
94
|
+
except bm._CAPTURE_TRANSIENT_ERRORS as err:
|
|
95
|
+
raise bm.MandatoryBackupError(
|
|
96
|
+
f"the entity registry could not be read: {type(err).__name__}",
|
|
97
|
+
safe_detail="the entity registry could not be read",
|
|
98
|
+
) from err
|
|
99
|
+
target: str | None = next(
|
|
100
|
+
(
|
|
101
|
+
row["entity_id"]
|
|
102
|
+
for row in rows
|
|
103
|
+
if row.get("platform") == platform and row.get("unique_id") == str(stored)
|
|
104
|
+
),
|
|
105
|
+
None,
|
|
106
|
+
)
|
|
107
|
+
if target is not None:
|
|
108
|
+
return target
|
|
109
|
+
try:
|
|
110
|
+
items = await _stored_items(client, platform)
|
|
111
|
+
except bm._CAPTURE_TRANSIENT_ERRORS as err:
|
|
112
|
+
raise bm.MandatoryBackupError(
|
|
113
|
+
f"the stored {platform} items could not be read: {type(err).__name__}",
|
|
114
|
+
safe_detail=f"the stored {platform} items could not be read",
|
|
115
|
+
) from err
|
|
116
|
+
if not any(str(item.get("id")) == str(stored) for item in items):
|
|
117
|
+
return None
|
|
118
|
+
# Without a registry entry the item is found by its storage id.
|
|
119
|
+
return str(stored)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def require_holds(config: Any, stored: Any, entity_id: str) -> None:
|
|
123
|
+
"""Block a restore whose safety backup would hold another item than the
|
|
124
|
+
one it overwrites: an entity_id the registry cannot follow, renamed since
|
|
125
|
+
the backup, can name another item."""
|
|
126
|
+
held = config.get("id") if isinstance(config, dict) else None
|
|
127
|
+
if held != stored:
|
|
128
|
+
raise _manager().BackupRestoreError(
|
|
129
|
+
f"Restore blocked: the safety backup would hold {held}, not {stored}, "
|
|
130
|
+
f"which this restore overwrites: {entity_id} names another item since "
|
|
131
|
+
"this backup. Nothing was changed.",
|
|
132
|
+
reason="backup_capture_failed",
|
|
133
|
+
suggestions=[
|
|
134
|
+
f"Find the current entity_id of {stored} with ha_search",
|
|
135
|
+
f"If {stored} has no entity, rename the entity that holds {entity_id}",
|
|
136
|
+
],
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def raise_with_restore_outcome(err: BaseException, outcome: dict[str, Any]) -> NoReturn:
|
|
141
|
+
"""Raise a failed restore write's error with the restore's outcome.
|
|
142
|
+
|
|
143
|
+
Every error keeps the outcome as ``restore_outcome`` for the Settings
|
|
144
|
+
handler and is raised again as it is. A tool error reaches the MCP client
|
|
145
|
+
as its JSON text alone, so it is raised as a copy with the outcome in that
|
|
146
|
+
text as ``data``, chained to the original so logs keep where it failed.
|
|
147
|
+
"""
|
|
148
|
+
err.restore_outcome = outcome # type: ignore[attr-defined]
|
|
149
|
+
original: BaseException = err
|
|
150
|
+
if not isinstance(err, ToolError):
|
|
151
|
+
raise original
|
|
152
|
+
try:
|
|
153
|
+
reply = json.loads(str(err))
|
|
154
|
+
except ValueError:
|
|
155
|
+
reply = None # raised below, outside this handler, to keep its context
|
|
156
|
+
if not isinstance(reply, dict):
|
|
157
|
+
raise original
|
|
158
|
+
data = reply.get("data")
|
|
159
|
+
reply["data"] = {**data, **outcome} if isinstance(data, dict) else outcome
|
|
160
|
+
carried = ToolError(
|
|
161
|
+
json.dumps(reply, indent=2, default=str), log_level=err.log_level
|
|
162
|
+
)
|
|
163
|
+
carried.__dict__.update(err.__dict__)
|
|
164
|
+
raise carried from err
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def note_no_safety_backup(
|
|
168
|
+
outcome: Any, domain: str, target: str | None, config: Any
|
|
169
|
+
) -> None:
|
|
170
|
+
"""Say why a restore goes ahead without a safety backup."""
|
|
171
|
+
if target is None: # safety_target: the stored item no longer exists
|
|
172
|
+
stored = config.get("id") if isinstance(config, dict) else None
|
|
173
|
+
outcome["warnings"] = [
|
|
174
|
+
f"No safety backup was taken: {domain.removeprefix('helper_')} "
|
|
175
|
+
f"{stored} no longer exists, "
|
|
176
|
+
"so this restore overwrites none of its state."
|
|
177
|
+
]
|
|
178
|
+
return
|
|
179
|
+
outcome["warnings"] = [
|
|
180
|
+
f"No safety backup was taken: nothing was found under {target}. If it "
|
|
181
|
+
"was renamed since this backup, the restore overwrites its current state "
|
|
182
|
+
"without one."
|
|
183
|
+
]
|
|
@@ -75,9 +75,21 @@ from .backup_diff import (
|
|
|
75
75
|
_compute_json_patch,
|
|
76
76
|
_summarize_patch_counts,
|
|
77
77
|
)
|
|
78
|
-
from .backup_entity_ids import
|
|
78
|
+
from .backup_entity_ids import (
|
|
79
|
+
_restore_entity_ids,
|
|
80
|
+
update_with_registry_icon,
|
|
81
|
+
with_registry_icon,
|
|
82
|
+
)
|
|
83
|
+
from .backup_helper_target import fetch_helper as _fetch_helper
|
|
84
|
+
from .backup_helper_target import note_no_safety_backup as _note_no_safety_backup
|
|
85
|
+
from .backup_helper_target import (
|
|
86
|
+
raise_with_restore_outcome as _raise_with_restore_outcome,
|
|
87
|
+
)
|
|
88
|
+
from .backup_helper_target import require_holds as _require_holds
|
|
89
|
+
from .backup_helper_target import safety_target as _safety_target
|
|
79
90
|
from .backup_integrations import fetch_integration, restore_integration
|
|
80
91
|
from .backup_tags import restore_tag, tag_snapshot
|
|
92
|
+
from .backup_zones import fetch_zone, restore_zone
|
|
81
93
|
from .client.rest_client import (
|
|
82
94
|
HomeAssistantCommandError,
|
|
83
95
|
HomeAssistantConnectionError,
|
|
@@ -738,6 +750,7 @@ class BackupManager:
|
|
|
738
750
|
force: bool = False,
|
|
739
751
|
mandatory: bool = False,
|
|
740
752
|
skip_reasons: list[str] | None = None,
|
|
753
|
+
holds: Any = None,
|
|
741
754
|
) -> Path | None:
|
|
742
755
|
"""Capture a snapshot for ``domain:entity_id`` if throttle elapsed.
|
|
743
756
|
|
|
@@ -765,6 +778,9 @@ class BackupManager:
|
|
|
765
778
|
|
|
766
779
|
``skip_reasons`` (best-effort mode) collects why a capture that was
|
|
767
780
|
due did not happen, so the caller can tell its own caller.
|
|
781
|
+
|
|
782
|
+
``holds`` is the id the captured item must have; another item raises
|
|
783
|
+
``BackupRestoreError`` before anything is written.
|
|
768
784
|
"""
|
|
769
785
|
if not force:
|
|
770
786
|
await self.ensure_directory_ready()
|
|
@@ -809,6 +825,8 @@ class BackupManager:
|
|
|
809
825
|
)
|
|
810
826
|
if config is _SNAPSHOT_SKIP:
|
|
811
827
|
return None
|
|
828
|
+
if holds is not None:
|
|
829
|
+
_require_holds(config, holds, entity_id)
|
|
812
830
|
return await self._write_and_rotate(
|
|
813
831
|
domain, entity_id, key, config, tool_name, now, mandatory=mandatory
|
|
814
832
|
)
|
|
@@ -1502,7 +1520,9 @@ class BackupManager:
|
|
|
1502
1520
|
flow_driven = is_flow or domain == "helper_config_subentry"
|
|
1503
1521
|
if needs_safety and (flow_driven or take_safety_backup):
|
|
1504
1522
|
step = "safety_backup"
|
|
1505
|
-
safety_path = await self._capture_restore_safety(
|
|
1523
|
+
safety_path = await self._capture_restore_safety(
|
|
1524
|
+
domain, entity_id, outcome, config
|
|
1525
|
+
)
|
|
1506
1526
|
if safety_path is not None:
|
|
1507
1527
|
self._protect_snapshot(safety_path.name)
|
|
1508
1528
|
await _await_backup_io(_require_restore_safety, safety_path)
|
|
@@ -1541,7 +1561,9 @@ class BackupManager:
|
|
|
1541
1561
|
reason=_flow_failure_reason(step, err),
|
|
1542
1562
|
**outcome,
|
|
1543
1563
|
) from err
|
|
1544
|
-
|
|
1564
|
+
# The error keeps its own type and code; the safety backup to revert
|
|
1565
|
+
# with and any warnings ride along for the caller.
|
|
1566
|
+
_raise_with_restore_outcome(err, {**outcome, "apply_status": apply_status})
|
|
1545
1567
|
finally:
|
|
1546
1568
|
if safety_path is not None:
|
|
1547
1569
|
self._unprotect_snapshot(safety_path.name)
|
|
@@ -1559,21 +1581,41 @@ class BackupManager:
|
|
|
1559
1581
|
# existing one is checked against the snapshot by its options flow.
|
|
1560
1582
|
return await handler.fetch(self._client, entity_id) is not None
|
|
1561
1583
|
|
|
1562
|
-
async def _capture_restore_safety(
|
|
1584
|
+
async def _capture_restore_safety(
|
|
1585
|
+
self,
|
|
1586
|
+
domain: str,
|
|
1587
|
+
entity_id: str,
|
|
1588
|
+
outcome: dict[str, Any] | None = None,
|
|
1589
|
+
config: Any = None,
|
|
1590
|
+
) -> Path | None:
|
|
1563
1591
|
"""Take a restore's recovery point; a failed capture raises and blocks it."""
|
|
1564
1592
|
is_flow = _is_flow_helper_domain(domain)
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1593
|
+
flow_driven = is_flow or domain == "helper_config_subentry"
|
|
1594
|
+
if not flow_driven and not getattr(self._settings, "enable_auto_backup", False):
|
|
1595
|
+
return None # auto-backup off: no safety backup is promised
|
|
1596
|
+
# The restore overwrites the current state, so the throttle that a
|
|
1597
|
+
# recent snapshot of an older state set does not apply.
|
|
1598
|
+
target = await _safety_target(self._client, domain, entity_id, config)
|
|
1599
|
+
checked = not flow_driven and outcome is not None
|
|
1600
|
+
path = None
|
|
1601
|
+
if target is not None: # None: the item the restore writes is gone
|
|
1602
|
+
path = await self.maybe_snapshot(
|
|
1603
|
+
domain,
|
|
1604
|
+
target,
|
|
1605
|
+
tool_name="ha_manage_backup.restore.safety",
|
|
1606
|
+
force=True,
|
|
1607
|
+
mandatory=True,
|
|
1608
|
+
holds=config.get("id")
|
|
1609
|
+
if checked and isinstance(config, dict)
|
|
1610
|
+
else None,
|
|
1611
|
+
)
|
|
1572
1612
|
if path is None and is_flow:
|
|
1573
1613
|
raise MandatoryBackupError(
|
|
1574
1614
|
f"{_flow_label(_flow_type(domain))} helper no longer exists; "
|
|
1575
1615
|
"restore was not attempted"
|
|
1576
1616
|
)
|
|
1617
|
+
if checked and path is None:
|
|
1618
|
+
_note_no_safety_backup(outcome, domain, target, config)
|
|
1577
1619
|
return path
|
|
1578
1620
|
|
|
1579
1621
|
# ----- diff ----------------------------------------------------------
|
|
@@ -1592,6 +1634,14 @@ class BackupManager:
|
|
|
1592
1634
|
if handler is None:
|
|
1593
1635
|
raise LookupError(f"No diff handler registered for domain {domain!r}")
|
|
1594
1636
|
current = await handler.fetch(self._client, data["entity_id"])
|
|
1637
|
+
if (
|
|
1638
|
+
isinstance(current, dict)
|
|
1639
|
+
and isinstance(data["config"], dict)
|
|
1640
|
+
and "registry_icon" not in data["config"]
|
|
1641
|
+
):
|
|
1642
|
+
# A snapshot from before registry icons were recorded: its restore
|
|
1643
|
+
# leaves the registry alone, so the icon is no difference.
|
|
1644
|
+
current.pop("registry_icon", None)
|
|
1595
1645
|
if _is_flow_helper_domain(domain) and current is not None:
|
|
1596
1646
|
# Both MCP and Settings preview this comparison. Registry metadata
|
|
1597
1647
|
# is recreation-only; an existing-entry restore applies options.
|
|
@@ -2524,25 +2574,6 @@ async def _restore_calendar_event(client: Any, entity_id: str, config: Any) -> A
|
|
|
2524
2574
|
return await _recreate_calendar_event(client, cal, event, start, end)
|
|
2525
2575
|
|
|
2526
2576
|
|
|
2527
|
-
# Zones — zone/{list,update} (no ``config/`` prefix per HA's actual WS API;
|
|
2528
|
-
# matches ``tools_zones.py`` which is the authoritative usage).
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
async def _fetch_zone(client: Any, entity_id: str) -> Any:
|
|
2532
|
-
items = _require_list(await _ws_send(client, {"type": "zone/list"}), "zone/list")
|
|
2533
|
-
for item in items:
|
|
2534
|
-
if item.get("id") == entity_id or item.get("name") == entity_id:
|
|
2535
|
-
return item
|
|
2536
|
-
return None
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
async def _restore_zone(client: Any, entity_id: str, config: Any) -> Any:
|
|
2540
|
-
payload = _strip_readonly(config, "id")
|
|
2541
|
-
payload["type"] = "zone/update"
|
|
2542
|
-
payload["zone_id"] = config.get("id", entity_id)
|
|
2543
|
-
return await _ws_send(client, payload)
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
2577
|
# Areas / floors — config/area_registry/{list,update}, config/floor_registry/{list,update}
|
|
2547
2578
|
|
|
2548
2579
|
|
|
@@ -2717,8 +2748,9 @@ async def _restore_device(client: Any, entity_id: str, config: Any) -> Any:
|
|
|
2717
2748
|
# Integration enable/disable — restore re-applies the disabled flag.
|
|
2718
2749
|
|
|
2719
2750
|
|
|
2720
|
-
# Helpers — one handler family. Entity ID is
|
|
2721
|
-
# helper type lists/restores via its native WS
|
|
2751
|
+
# Helpers — one handler family. Entity ID is the id the tool was given (a bare
|
|
2752
|
+
# id or <type>.<id>); each helper type lists/restores via its native WS
|
|
2753
|
+
# endpoints (fetch: backup_helper_target.py). The decorator
|
|
2722
2754
|
# constructs the domain key as ``helper_<type>`` so files group naturally.
|
|
2723
2755
|
|
|
2724
2756
|
_HELPER_LIST_TYPES = {
|
|
@@ -2737,57 +2769,10 @@ _HELPER_LIST_TYPES = {
|
|
|
2737
2769
|
}
|
|
2738
2770
|
|
|
2739
2771
|
|
|
2740
|
-
async def _fetch_helper(client: Any, entity_id: str, helper_type: str) -> Any:
|
|
2741
|
-
"""Fetch a storage helper's full config from its ``<helper_type>/list``.
|
|
2742
|
-
|
|
2743
|
-
Registered for ``_KNOWN_HELPER_TYPES`` only; flow helpers (config
|
|
2744
|
-
entries) have their own handler family (``_make_flow_helper_handler``).
|
|
2745
|
-
"""
|
|
2746
|
-
listed = await _ws_send(client, {"type": f"{helper_type}/list"})
|
|
2747
|
-
if helper_type == "person" and isinstance(listed, dict):
|
|
2748
|
-
listed = listed.get("storage") # YAML-defined persons are not editable
|
|
2749
|
-
items = _require_list(listed, f"{helper_type}/list")
|
|
2750
|
-
object_id = entity_id.split(".", 1)[-1] if "." in entity_id else entity_id
|
|
2751
|
-
for item in items:
|
|
2752
|
-
if item.get("id") == object_id or item.get("id") == entity_id:
|
|
2753
|
-
return await tag_snapshot(client, item) if helper_type == "tag" else item
|
|
2754
|
-
# Fallback for renamed helpers: after an entity_id rename the object_id
|
|
2755
|
-
# no longer equals the storage collection id (which stays the original
|
|
2756
|
-
# create-time id == the registry unique_id), so the direct match above
|
|
2757
|
-
# misses and the snapshot was silently skipped. Resolve the unique_id
|
|
2758
|
-
# via the entity registry and match on that — the same key the helper
|
|
2759
|
-
# update tool itself resolves to.
|
|
2760
|
-
eid = entity_id if "." in entity_id else f"{helper_type}.{entity_id}"
|
|
2761
|
-
try:
|
|
2762
|
-
entry = await _ws_send(
|
|
2763
|
-
client, {"type": "config/entity_registry/get", "entity_id": eid}
|
|
2764
|
-
)
|
|
2765
|
-
except HomeAssistantError as err:
|
|
2766
|
-
# Only a genuine "entity not found" means there's nothing to back up;
|
|
2767
|
-
# transport/auth/5xx errors must propagate so maybe_snapshot logs a
|
|
2768
|
-
# WARNING rather than silently skipping. Same POLICY as _fetch_automation,
|
|
2769
|
-
# but matched on the message substring because config/entity_registry/get
|
|
2770
|
-
# failures arrive as a WS command error with no status_code to switch on.
|
|
2771
|
-
# Best-effort: if HA's not-found wording ever changes, a real miss
|
|
2772
|
-
# degrades to a WARNING + skip (never a swallowed fatal error).
|
|
2773
|
-
msg = str(err).lower()
|
|
2774
|
-
if "not_found" in msg or "not found" in msg:
|
|
2775
|
-
return None
|
|
2776
|
-
raise
|
|
2777
|
-
unique_id = entry.get("unique_id") if isinstance(entry, dict) else None
|
|
2778
|
-
if unique_id:
|
|
2779
|
-
for item in items:
|
|
2780
|
-
if str(item.get("id")) == str(unique_id):
|
|
2781
|
-
return (
|
|
2782
|
-
await tag_snapshot(client, item) if helper_type == "tag" else item
|
|
2783
|
-
)
|
|
2784
|
-
return None
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
2772
|
async def _restore_helper(
|
|
2788
2773
|
client: Any, entity_id: str, config: Any, helper_type: str
|
|
2789
2774
|
) -> Any:
|
|
2790
|
-
"""Restore a storage
|
|
2775
|
+
"""Restore a storage helper via ``<helper_type>/update`` (tag, zone: restore_*).
|
|
2791
2776
|
|
|
2792
2777
|
Symmetric with ``_fetch_helper``: only list-backed types are
|
|
2793
2778
|
supported. Unsupported types raise ``LookupError`` so the restore
|
|
@@ -2803,9 +2788,19 @@ async def _restore_helper(
|
|
|
2803
2788
|
payload = _strip_readonly(config, "id")
|
|
2804
2789
|
payload["type"] = f"{helper_type}/update"
|
|
2805
2790
|
payload[f"{helper_type}_id"] = config.get("id", entity_id)
|
|
2791
|
+
item_id = payload[f"{helper_type}_id"]
|
|
2806
2792
|
if helper_type == "tag":
|
|
2807
|
-
return await restore_tag(client,
|
|
2808
|
-
|
|
2793
|
+
return await restore_tag(client, item_id, payload)
|
|
2794
|
+
if helper_type == "zone":
|
|
2795
|
+
return await restore_zone(client, item_id, payload)
|
|
2796
|
+
return await update_with_registry_icon(client, helper_type, item_id, payload)
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
async def _registry_snapshot(client: Any, helper_type: str, item: dict) -> Any:
|
|
2800
|
+
"""The stored item plus its registry icon, and for a tag its registry name."""
|
|
2801
|
+
if helper_type == "tag":
|
|
2802
|
+
return await tag_snapshot(client, item)
|
|
2803
|
+
return await with_registry_icon(client, helper_type, item)
|
|
2809
2804
|
|
|
2810
2805
|
|
|
2811
2806
|
# Files & YAML (#1579 PR2) — capture is MCP-side via the ha_mcp_tools
|
|
@@ -3942,7 +3937,8 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
|
|
|
3942
3937
|
mgr.register(
|
|
3943
3938
|
DomainHandler("calendar_event", _fetch_calendar_event, _restore_calendar_event)
|
|
3944
3939
|
)
|
|
3945
|
-
|
|
3940
|
+
restore_zone_item = functools.partial(_restore_helper, helper_type="zone")
|
|
3941
|
+
mgr.register(DomainHandler("zone", fetch_zone, restore_zone_item))
|
|
3946
3942
|
mgr.register(
|
|
3947
3943
|
DomainHandler("area_or_floor", _fetch_area_or_floor, _restore_area_or_floor)
|
|
3948
3944
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""A tag's name in its snapshot and on restore.
|
|
1
|
+
"""A tag's name and icon in its snapshot and on restore.
|
|
2
2
|
|
|
3
3
|
Core keeps a tag's name in the entity registry, not in the tag store:
|
|
4
4
|
``tag/list`` fills ``name`` with ``entity.name or entity.original_name`` (the
|
|
@@ -11,31 +11,29 @@ from __future__ import annotations
|
|
|
11
11
|
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
|
-
from .backup_entity_ids import _manager
|
|
14
|
+
from .backup_entity_ids import _manager, registry_row, restore_registry_icon
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
async def _tag_entity(client: Any, tag_id: str) -> dict[str, Any] | None:
|
|
18
|
-
|
|
19
|
-
return next(
|
|
20
|
-
(
|
|
21
|
-
row
|
|
22
|
-
for row in await bm._entity_registry_rows(client)
|
|
23
|
-
if row.get("platform") == "tag" and row.get("unique_id") == tag_id
|
|
24
|
-
),
|
|
25
|
-
None,
|
|
26
|
-
)
|
|
18
|
+
return await registry_row(client, "tag", tag_id)
|
|
27
19
|
|
|
28
20
|
|
|
29
21
|
async def tag_snapshot(client: Any, item: dict[str, Any]) -> dict[str, Any]:
|
|
30
22
|
"""The listed tag with its registry name instead of the listed fallback."""
|
|
31
23
|
entity = await _tag_entity(client, str(item.get("id")))
|
|
32
|
-
return {
|
|
24
|
+
return {
|
|
25
|
+
**item,
|
|
26
|
+
"name": entity.get("name") if entity else item.get("name"),
|
|
27
|
+
"registry_icon": entity.get("icon") if entity else None,
|
|
28
|
+
}
|
|
33
29
|
|
|
34
30
|
|
|
35
31
|
async def restore_tag(client: Any, tag_id: str, payload: dict[str, Any]) -> Any:
|
|
36
32
|
"""``tag/update`` without a name the tag never had; a name given after the
|
|
37
33
|
snapshot is cleared in the registry, which ``tag/update`` cannot do."""
|
|
38
34
|
bm = _manager()
|
|
35
|
+
recorded = "registry_icon" in payload
|
|
36
|
+
registry_icon = payload.pop("registry_icon", None)
|
|
39
37
|
unnamed = payload.get("name") is None
|
|
40
38
|
if unnamed:
|
|
41
39
|
payload.pop("name", None)
|
|
@@ -51,4 +49,7 @@ async def restore_tag(client: Any, tag_id: str, payload: dict[str, Any]) -> Any:
|
|
|
51
49
|
"name": None,
|
|
52
50
|
},
|
|
53
51
|
)
|
|
54
|
-
|
|
52
|
+
if not recorded:
|
|
53
|
+
return result
|
|
54
|
+
warnings = await restore_registry_icon(client, "tag", tag_id, registry_icon)
|
|
55
|
+
return {**result, "warnings": warnings} if warnings else result
|