ha-mcp-dev 8.6.0.dev3006__tar.gz → 8.6.0.dev3007__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.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/PKG-INFO +1 -1
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/pyproject.toml +1 -1
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/pyproject.toml.orig +1 -1
- ha_mcp_dev-8.6.0.dev3007/src/ha_mcp/backup_integrations.py +49 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/backup_manager.py +94 -94
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/rest_client.py +14 -14
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/websocket_client.py +13 -13
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/server_tool_text.py +1 -1
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_backups.py +4 -2
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/backup.py +16 -17
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/backup_on_demand.py +6 -2
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_backup.py +36 -5
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_flow.py +3 -50
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/describe.py +4 -3
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/listing.py +65 -9
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/registry.py +2 -2
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/schemas.py +20 -19
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/flow_helper_lookup.py +18 -33
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/hacs_registration.py +8 -0
- ha_mcp_dev-8.6.0.dev3007/src/ha_mcp/tools/helper_flows.py +112 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/helpers.py +30 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/log_common.py +5 -4
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/component.py +10 -4
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_deep.py +41 -43
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_config_automations.py +11 -17
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_config_helpers.py +43 -81
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_config_scenes.py +2 -11
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_config_scripts.py +6 -14
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_groups.py +2 -11
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_integrations.py +60 -121
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/ws_waiters.py +31 -1
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/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.6.0.
|
|
7
|
+
version = "8.6.0.dev3007"
|
|
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.6.0.
|
|
7
|
+
version = "8.6.0.dev3007"
|
|
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
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Auto-backup handlers for integration config entries.
|
|
2
|
+
|
|
3
|
+
An integration snapshot holds only the entry's metadata and its enabled state, so
|
|
4
|
+
a restore re-applies that state to an entry that still exists and refuses a
|
|
5
|
+
deleted one rather than sending Core a command for an entry it no longer has.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from .backup_entity_ids import _manager
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def fetch_integration(client: Any, entity_id: str) -> Any:
|
|
16
|
+
bm = _manager()
|
|
17
|
+
items = bm._require_list(
|
|
18
|
+
await bm._ws_send(client, {"type": "config_entries/get"}),
|
|
19
|
+
"config_entries/get",
|
|
20
|
+
)
|
|
21
|
+
for item in items:
|
|
22
|
+
if item.get("entry_id") == entity_id:
|
|
23
|
+
return item
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def restore_integration(client: Any, entity_id: str, config: Any) -> Any:
|
|
28
|
+
bm = _manager()
|
|
29
|
+
if await fetch_integration(client, entity_id) is None:
|
|
30
|
+
raise bm.BackupRestoreError(
|
|
31
|
+
f"Config entry {entity_id} ({config.get('domain')}) no longer exists. "
|
|
32
|
+
"An integration snapshot holds only the entry's metadata and enabled "
|
|
33
|
+
"state, so it cannot recreate a deleted entry. Nothing was changed; add "
|
|
34
|
+
"the integration again to recover it.",
|
|
35
|
+
reason="entry_deleted",
|
|
36
|
+
suggestions=[
|
|
37
|
+
"Add it again with ha_set_integration, or have the user add it in "
|
|
38
|
+
"the HA UI when it needs their credentials."
|
|
39
|
+
],
|
|
40
|
+
)
|
|
41
|
+
disabled = config.get("disabled_by") is not None
|
|
42
|
+
return await bm._ws_send(
|
|
43
|
+
client,
|
|
44
|
+
{
|
|
45
|
+
"type": "config_entries/disable",
|
|
46
|
+
"entry_id": entity_id,
|
|
47
|
+
"disabled_by": "user" if disabled else None,
|
|
48
|
+
},
|
|
49
|
+
)
|
|
@@ -35,9 +35,9 @@ Domain handlers
|
|
|
35
35
|
- ``fetch(client, entity_id) -> config dict`` — read pre-write state
|
|
36
36
|
- ``restore(client, entity_id, config) -> result`` — re-apply the saved state
|
|
37
37
|
|
|
38
|
-
One handler per backed-up domain.
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
One handler per backed-up domain. Storage helper types each register one keyed
|
|
39
|
+
``helper_<type>``; a flow helper gets one built on each lookup
|
|
40
|
+
(``BackupManager.handler_for``).
|
|
41
41
|
"""
|
|
42
42
|
|
|
43
43
|
from __future__ import annotations
|
|
@@ -64,6 +64,7 @@ from typing import Any, Literal, NotRequired, TypedDict
|
|
|
64
64
|
import yaml # type: ignore[import-untyped]
|
|
65
65
|
|
|
66
66
|
from ha_mcp._vendor.fastmcp.exceptions import ToolError
|
|
67
|
+
from ha_mcp._vendor.websockets.exceptions import ConnectionClosed
|
|
67
68
|
|
|
68
69
|
from .backup_diff import (
|
|
69
70
|
_TEXT_KIND,
|
|
@@ -75,6 +76,7 @@ from .backup_diff import (
|
|
|
75
76
|
_summarize_patch_counts,
|
|
76
77
|
)
|
|
77
78
|
from .backup_entity_ids import _restore_entity_ids
|
|
79
|
+
from .backup_integrations import fetch_integration, restore_integration
|
|
78
80
|
from .backup_tags import restore_tag, tag_snapshot
|
|
79
81
|
from .client.rest_client import (
|
|
80
82
|
HomeAssistantCommandError,
|
|
@@ -108,6 +110,7 @@ _CAPTURE_TRANSIENT_ERRORS: tuple[type[BaseException], ...] = (
|
|
|
108
110
|
TimeoutError,
|
|
109
111
|
asyncio.TimeoutError,
|
|
110
112
|
ConnectionError,
|
|
113
|
+
ConnectionClosed,
|
|
111
114
|
yaml.YAMLError,
|
|
112
115
|
ToolError,
|
|
113
116
|
)
|
|
@@ -140,6 +143,11 @@ class MandatoryBackupError(Exception):
|
|
|
140
143
|
# can include configuration values even when wrapped by this class.
|
|
141
144
|
self.safe_detail = safe_detail
|
|
142
145
|
|
|
146
|
+
@property
|
|
147
|
+
def safe_cause(self) -> str:
|
|
148
|
+
"""The safe detail, else only the failing exception's class name."""
|
|
149
|
+
return self.safe_detail or type(self.__cause__ or self).__name__
|
|
150
|
+
|
|
143
151
|
|
|
144
152
|
class BackupRestoreError(HomeAssistantError):
|
|
145
153
|
"""A restore outcome whose apply knowledge must survive caller mapping."""
|
|
@@ -205,16 +213,22 @@ class _FlowHelperReadError(HomeAssistantError):
|
|
|
205
213
|
self.reason = reason
|
|
206
214
|
|
|
207
215
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
return FLOW_HELPER_TYPES
|
|
216
|
+
class _FlowHelperBackupSkip(_FlowHelperReadError):
|
|
217
|
+
"""Nothing to back up: no stored or disclosed options, or no helper flow Core
|
|
218
|
+
lists. Best-effort capture logs it at INFO."""
|
|
213
219
|
|
|
214
220
|
|
|
215
221
|
def _is_flow_helper_domain(domain: str) -> bool:
|
|
216
|
-
"""A ``helper_<type>`` snapshot of a config-entry (flow) helper.
|
|
217
|
-
|
|
222
|
+
"""A ``helper_<type>`` snapshot domain of a config-entry (flow) helper.
|
|
223
|
+
|
|
224
|
+
Any type that is neither a storage helper nor a config subentry counts; the
|
|
225
|
+
type itself is not checked here. The tools check it against Core's helper
|
|
226
|
+
flow list (``helper_flows.require_helper_type``; ha_config_set_helper only
|
|
227
|
+
after its auto-backup capture, which checks an uncovered type itself), as
|
|
228
|
+
does ``resolve_config_entry_backup_domain`` for an arbitrary config entry.
|
|
229
|
+
"""
|
|
230
|
+
helper_type = domain[7:] if domain.startswith("helper_") else ""
|
|
231
|
+
return helper_type not in ("", *_HELPER_LIST_TYPES, "config_subentry")
|
|
218
232
|
|
|
219
233
|
|
|
220
234
|
def _flow_failure_reason(step: str, error: BaseException) -> str:
|
|
@@ -506,7 +520,8 @@ def _require_restore_safety(path: Path) -> None:
|
|
|
506
520
|
"""Check the recovery file after its restore pin closes the deletion race."""
|
|
507
521
|
if not path.is_file():
|
|
508
522
|
raise MandatoryBackupError(
|
|
509
|
-
"The safety snapshot disappeared before restore; no changes were applied"
|
|
523
|
+
"The safety snapshot disappeared before restore; no changes were applied",
|
|
524
|
+
safe_detail="safety snapshot disappeared",
|
|
510
525
|
)
|
|
511
526
|
|
|
512
527
|
|
|
@@ -625,17 +640,22 @@ class BackupManager:
|
|
|
625
640
|
self._handlers[handler.domain] = handler
|
|
626
641
|
|
|
627
642
|
def handler_for(self, domain: str) -> DomainHandler | None:
|
|
628
|
-
|
|
643
|
+
handler = self._handlers.get(domain)
|
|
644
|
+
if handler is None and _is_flow_helper_domain(domain):
|
|
645
|
+
# Built per call, never registered: a typo stays out of supported_domains().
|
|
646
|
+
handler = _make_flow_helper_handler(domain[7:])
|
|
647
|
+
return handler
|
|
629
648
|
|
|
630
649
|
def supported_domains(self) -> list[str]:
|
|
631
|
-
"""Return the sorted
|
|
650
|
+
"""Return the sorted registered backup-domain keys, plus a placeholder
|
|
651
|
+
for the flow helpers, whose handlers are built on use.
|
|
632
652
|
|
|
633
653
|
Public accessor for callers that need to surface "what domains
|
|
634
654
|
are supported?" in user-facing error messages (e.g., the
|
|
635
655
|
``ha_manage_backup(scope='edits', action='create')`` handler
|
|
636
656
|
when ``domain`` is unknown). Sorted for stable output.
|
|
637
657
|
"""
|
|
638
|
-
return sorted(self._handlers.keys())
|
|
658
|
+
return [*sorted(self._handlers.keys()), "helper_<flow helper type>"]
|
|
639
659
|
|
|
640
660
|
# ----- capture -------------------------------------------------------
|
|
641
661
|
|
|
@@ -722,8 +742,8 @@ class BackupManager:
|
|
|
722
742
|
"""Capture a snapshot for ``domain:entity_id`` if throttle elapsed.
|
|
723
743
|
|
|
724
744
|
Returns the Path written or None if skipped. In the default
|
|
725
|
-
(best-effort) mode it never raises —
|
|
726
|
-
and swallowed so the wrapped write can proceed regardless.
|
|
745
|
+
(best-effort) mode it never raises — errors are logged at WARNING (INFO for
|
|
746
|
+
a by-design skip) and swallowed so the wrapped write can proceed regardless.
|
|
727
747
|
|
|
728
748
|
``mandatory=True`` makes the snapshot a precondition (file/YAML writes,
|
|
729
749
|
#1579): a *genuine* capture failure — an unusable backup dir, a failed
|
|
@@ -823,12 +843,11 @@ class BackupManager:
|
|
|
823
843
|
if not entity_id:
|
|
824
844
|
# Create-mode call with no ID yet — nothing to back up.
|
|
825
845
|
return None
|
|
826
|
-
handler = self.
|
|
846
|
+
handler = self.handler_for(domain)
|
|
827
847
|
if handler is None:
|
|
828
848
|
if mandatory:
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
)
|
|
849
|
+
message = f"no auto-backup handler is registered for domain {domain!r}"
|
|
850
|
+
raise MandatoryBackupError(message, safe_detail=message)
|
|
832
851
|
logger.warning(
|
|
833
852
|
"Auto-backup: no handler registered for domain %r — skipping",
|
|
834
853
|
domain,
|
|
@@ -847,34 +866,33 @@ class BackupManager:
|
|
|
847
866
|
) -> Any:
|
|
848
867
|
"""Fetch the pre-write config; return ``_SNAPSHOT_SKIP`` to skip capture.
|
|
849
868
|
|
|
850
|
-
A handled transient fetch failure logs a WARNING
|
|
851
|
-
sentinel (or
|
|
852
|
-
fetch that returns None because the entity did not exist
|
|
853
|
-
and returns the sentinel. Any other value is the config
|
|
869
|
+
A handled transient fetch failure logs a WARNING, a ``_FlowHelperBackupSkip``
|
|
870
|
+
an INFO; both return the sentinel (or raise ``MandatoryBackupError`` under
|
|
871
|
+
``mandatory``). A fetch that returns None because the entity did not exist
|
|
872
|
+
logs a DEBUG and returns the sentinel. Any other value is the config.
|
|
854
873
|
"""
|
|
855
874
|
try:
|
|
856
875
|
config = await handler.fetch(self._client, entity_id)
|
|
857
876
|
except _CAPTURE_TRANSIENT_ERRORS as err:
|
|
858
|
-
# Degraded fetches (a non-list WS envelope from an
|
|
859
|
-
#
|
|
860
|
-
#
|
|
861
|
-
# the
|
|
862
|
-
#
|
|
863
|
-
# restore propagates to the tool layer as a structured
|
|
864
|
-
# error. The warning level (vs the debug log below) is what
|
|
865
|
-
# distinguishes "fetch broke" from "entity didn't exist".
|
|
877
|
+
# Degraded fetches (a non-list WS envelope from an auth-scope change
|
|
878
|
+
# or API drift) raise rather than return None (``_require_list``).
|
|
879
|
+
# Auto-backup skips the snapshot instead of crashing the pipeline;
|
|
880
|
+
# in a diff/restore the error reaches the tool layer. WARNING marks
|
|
881
|
+
# "fetch broke", INFO a by-design skip, DEBUG "entity didn't exist".
|
|
866
882
|
if mandatory:
|
|
867
883
|
raise MandatoryBackupError(
|
|
868
|
-
f"could not
|
|
869
|
-
f"it up: {type(err).__name__}: {err}",
|
|
884
|
+
f"could not back up {key}: {type(err).__name__}: {err}",
|
|
870
885
|
safe_detail=_flow_safe_failure_detail("capture", err),
|
|
871
886
|
) from err
|
|
872
|
-
|
|
873
|
-
"Auto-backup:
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
887
|
+
if isinstance(err, _FlowHelperBackupSkip):
|
|
888
|
+
logger.info("Auto-backup: not backing up %s — %s", key, err)
|
|
889
|
+
else:
|
|
890
|
+
logger.warning(
|
|
891
|
+
"Auto-backup: fetch failed for %s — %s: %s",
|
|
892
|
+
key,
|
|
893
|
+
type(err).__name__,
|
|
894
|
+
err,
|
|
895
|
+
)
|
|
878
896
|
if skip_reasons is not None:
|
|
879
897
|
# Only locally authored detail: a remote error may carry values.
|
|
880
898
|
detail = _flow_safe_failure_detail("capture", err)
|
|
@@ -958,7 +976,7 @@ class BackupManager:
|
|
|
958
976
|
f"The new snapshot for {key} disappeared before capture completed"
|
|
959
977
|
)
|
|
960
978
|
if mandatory:
|
|
961
|
-
raise MandatoryBackupError(message)
|
|
979
|
+
raise MandatoryBackupError(message, safe_detail=message)
|
|
962
980
|
logger.warning("Auto-backup: %s", message)
|
|
963
981
|
return None
|
|
964
982
|
self._last_snapshot[key] = now
|
|
@@ -1456,7 +1474,7 @@ class BackupManager:
|
|
|
1456
1474
|
domain = data["domain"]
|
|
1457
1475
|
entity_id = data["entity_id"]
|
|
1458
1476
|
config = data["config"]
|
|
1459
|
-
handler = self.
|
|
1477
|
+
handler = self.handler_for(domain)
|
|
1460
1478
|
if handler is None:
|
|
1461
1479
|
raise BackupRestoreError(
|
|
1462
1480
|
f"No restore handler registered for domain {domain!r}",
|
|
@@ -1494,7 +1512,9 @@ class BackupManager:
|
|
|
1494
1512
|
# Commit to the absent-target branch: if an entry reappeared since
|
|
1495
1513
|
# preflight, recreation refuses instead of editing it without safety.
|
|
1496
1514
|
restore = (
|
|
1497
|
-
|
|
1515
|
+
functools.partial(_restore_config_subentry, recreate_only=True)
|
|
1516
|
+
if domain == "helper_config_subentry" and safety_path is None
|
|
1517
|
+
else handler.restore
|
|
1498
1518
|
if needs_safety
|
|
1499
1519
|
else functools.partial(
|
|
1500
1520
|
_recreate_flow_helper, helper_type=_flow_type(domain)
|
|
@@ -1540,29 +1560,16 @@ class BackupManager:
|
|
|
1540
1560
|
return await handler.fetch(self._client, entity_id) is not None
|
|
1541
1561
|
|
|
1542
1562
|
async def _capture_restore_safety(self, domain: str, entity_id: str) -> Path | None:
|
|
1543
|
-
"""
|
|
1544
|
-
|
|
1545
|
-
# A reconfigure flow can apply partly, so the capture is forced and
|
|
1546
|
-
# mandatory; a deleted subentry has nothing to capture (None).
|
|
1547
|
-
return await self.maybe_snapshot(
|
|
1548
|
-
domain,
|
|
1549
|
-
entity_id,
|
|
1550
|
-
tool_name="ha_manage_backup.restore.safety",
|
|
1551
|
-
force=True,
|
|
1552
|
-
mandatory=True,
|
|
1553
|
-
)
|
|
1554
|
-
if not _is_flow_helper_domain(domain):
|
|
1555
|
-
return await self.maybe_snapshot(
|
|
1556
|
-
domain, entity_id, tool_name="ha_manage_backup.restore.safety"
|
|
1557
|
-
)
|
|
1563
|
+
"""Take a restore's recovery point; a failed capture raises and blocks it."""
|
|
1564
|
+
is_flow = _is_flow_helper_domain(domain)
|
|
1558
1565
|
path = await self.maybe_snapshot(
|
|
1559
1566
|
domain,
|
|
1560
1567
|
entity_id,
|
|
1561
1568
|
tool_name="ha_manage_backup.restore.safety",
|
|
1562
|
-
force=
|
|
1569
|
+
force=is_flow or domain == "helper_config_subentry",
|
|
1563
1570
|
mandatory=True,
|
|
1564
1571
|
)
|
|
1565
|
-
if path is None:
|
|
1572
|
+
if path is None and is_flow:
|
|
1566
1573
|
raise MandatoryBackupError(
|
|
1567
1574
|
f"{_flow_label(_flow_type(domain))} helper no longer exists; "
|
|
1568
1575
|
"restore was not attempted"
|
|
@@ -1581,7 +1588,7 @@ class BackupManager:
|
|
|
1581
1588
|
data["entity_id"], data["config"], _flow_type(domain)
|
|
1582
1589
|
)
|
|
1583
1590
|
data["entity_id"] = snapshot["entry_id"]
|
|
1584
|
-
handler = self.
|
|
1591
|
+
handler = self.handler_for(domain)
|
|
1585
1592
|
if handler is None:
|
|
1586
1593
|
raise LookupError(f"No diff handler registered for domain {domain!r}")
|
|
1587
1594
|
current = await handler.fetch(self._client, data["entity_id"])
|
|
@@ -2710,28 +2717,6 @@ async def _restore_device(client: Any, entity_id: str, config: Any) -> Any:
|
|
|
2710
2717
|
# Integration enable/disable — restore re-applies the disabled flag.
|
|
2711
2718
|
|
|
2712
2719
|
|
|
2713
|
-
async def _fetch_integration(client: Any, entity_id: str) -> Any:
|
|
2714
|
-
items = _require_list(
|
|
2715
|
-
await _ws_send(client, {"type": "config_entries/get"}), "config_entries/get"
|
|
2716
|
-
)
|
|
2717
|
-
for item in items:
|
|
2718
|
-
if item.get("entry_id") == entity_id:
|
|
2719
|
-
return item
|
|
2720
|
-
return None
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
async def _restore_integration(client: Any, entity_id: str, config: Any) -> Any:
|
|
2724
|
-
disabled = config.get("disabled_by") is not None
|
|
2725
|
-
return await _ws_send(
|
|
2726
|
-
client,
|
|
2727
|
-
{
|
|
2728
|
-
"type": "config_entries/disable",
|
|
2729
|
-
"entry_id": entity_id,
|
|
2730
|
-
"disabled_by": "user" if disabled else None,
|
|
2731
|
-
},
|
|
2732
|
-
)
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
2720
|
# Helpers — one handler family. Entity ID is "<helper_type>:<id>" so each
|
|
2736
2721
|
# helper type lists/restores via its native WS endpoints. The decorator
|
|
2737
2722
|
# constructs the domain key as ``helper_<type>`` so files group naturally.
|
|
@@ -3147,9 +3132,14 @@ def _flow_options(config: Any, helper_type: str) -> dict[str, Any]:
|
|
|
3147
3132
|
from .redaction import sentinel_option_keys
|
|
3148
3133
|
|
|
3149
3134
|
label = _flow_label(helper_type)
|
|
3150
|
-
if not isinstance(config, dict)
|
|
3135
|
+
if not isinstance(config, dict):
|
|
3151
3136
|
raise _FlowHelperReadError(
|
|
3152
|
-
f"{label} helper options must be
|
|
3137
|
+
f"{label} helper options must be an object", "invalid_options"
|
|
3138
|
+
)
|
|
3139
|
+
if not config:
|
|
3140
|
+
raise _FlowHelperBackupSkip( # e.g. otp: all of it is in entry.data
|
|
3141
|
+
f"{label} helper has no stored options to back up or restore",
|
|
3142
|
+
"invalid_options",
|
|
3153
3143
|
)
|
|
3154
3144
|
# The component's resolved-!secret scrub predates the server sentinels.
|
|
3155
3145
|
# Neither kind of placeholder is a usable recovery value.
|
|
@@ -3195,10 +3185,9 @@ async def _fetch_flow_helper(client: Any, entity_id: str, helper_type: str) -> A
|
|
|
3195
3185
|
)
|
|
3196
3186
|
covered = _require_list(result.get("covered_types"), "helpers_list.covered_types")
|
|
3197
3187
|
if helper_type not in covered:
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
)
|
|
3188
|
+
from .tools.config_entry_backup import uncovered_flow_helper_error
|
|
3189
|
+
|
|
3190
|
+
raise await uncovered_flow_helper_error(client, helper_type)
|
|
3202
3191
|
records = _require_list(result.get("helpers"), "ha_mcp_tools/helpers_list.helpers")
|
|
3203
3192
|
entries: dict[str, dict[str, Any]] = {}
|
|
3204
3193
|
for raw_record in records:
|
|
@@ -3224,6 +3213,12 @@ async def _fetch_flow_helper(client: Any, entity_id: str, helper_type: str) -> A
|
|
|
3224
3213
|
if matches:
|
|
3225
3214
|
record = matches[0]
|
|
3226
3215
|
entry_id = record["entry_id"]
|
|
3216
|
+
if record.get("options_withheld"):
|
|
3217
|
+
raise _FlowHelperBackupSkip(
|
|
3218
|
+
f"{_flow_label(helper_type)} helper belongs to a custom integration "
|
|
3219
|
+
"whose options the component withholds: none to back up or restore",
|
|
3220
|
+
"options_withheld",
|
|
3221
|
+
)
|
|
3227
3222
|
registry = await _entity_registry_rows(client)
|
|
3228
3223
|
return {
|
|
3229
3224
|
"entry_id": entry_id,
|
|
@@ -3753,7 +3748,9 @@ async def _fetch_config_subentry(client: Any, entity_id: str) -> Any:
|
|
|
3753
3748
|
return _subentry_row(subentries, entry_id, subentry_id)
|
|
3754
3749
|
|
|
3755
3750
|
|
|
3756
|
-
async def _restore_config_subentry(
|
|
3751
|
+
async def _restore_config_subentry(
|
|
3752
|
+
client: Any, entity_id: str, config: Any, *, recreate_only: bool = False
|
|
3753
|
+
) -> Any:
|
|
3757
3754
|
"""Restore a subentry's data through its reconfigure flow.
|
|
3758
3755
|
|
|
3759
3756
|
A snapshot field none of the reconfigure forms offers must still match the
|
|
@@ -3795,6 +3792,11 @@ async def _restore_config_subentry(client: Any, entity_id: str, config: Any) ->
|
|
|
3795
3792
|
return await _recreate_config_subentry(
|
|
3796
3793
|
client, entity_id, snapshot, data, subentries
|
|
3797
3794
|
)
|
|
3795
|
+
if recreate_only: # absent at the safety capture: nothing may be edited
|
|
3796
|
+
raise BackupRestoreError(
|
|
3797
|
+
"Config subentry reappeared after its safety capture; not restored",
|
|
3798
|
+
reason="entry_still_exists",
|
|
3799
|
+
)
|
|
3798
3800
|
expected, keys = _subentry_expectation(snapshot, data)
|
|
3799
3801
|
return await _apply_and_verify(
|
|
3800
3802
|
"Config subentry",
|
|
@@ -3920,7 +3922,7 @@ def _make_helper_handler(helper_type: str) -> DomainHandler:
|
|
|
3920
3922
|
|
|
3921
3923
|
# The storage-collection helper types, snapshotted as ``helper_<type>`` through
|
|
3922
3924
|
# ``<type>/list`` and restored through ``<type>/update``. Flow helpers (config
|
|
3923
|
-
# entries)
|
|
3925
|
+
# entries) get a handler built on each lookup (``BackupManager.handler_for``).
|
|
3924
3926
|
_KNOWN_HELPER_TYPES = sorted(_HELPER_LIST_TYPES)
|
|
3925
3927
|
|
|
3926
3928
|
|
|
@@ -3947,7 +3949,7 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
|
|
|
3947
3949
|
mgr.register(DomainHandler("todo_item", _fetch_todo_item, _restore_todo_item))
|
|
3948
3950
|
mgr.register(DomainHandler("entity", _fetch_entity_state, _restore_entity_state))
|
|
3949
3951
|
mgr.register(DomainHandler("device", _fetch_device, _restore_device))
|
|
3950
|
-
mgr.register(DomainHandler("integration",
|
|
3952
|
+
mgr.register(DomainHandler("integration", fetch_integration, restore_integration))
|
|
3951
3953
|
mgr.register(DomainHandler("file", _fetch_file, _restore_file))
|
|
3952
3954
|
mgr.register(DomainHandler("yaml", _fetch_yaml, _restore_yaml))
|
|
3953
3955
|
# Whole-file YAML config: same fetch as "file" (read_file), but restored via
|
|
@@ -3960,8 +3962,6 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
|
|
|
3960
3962
|
mgr.register(_make_blueprint_handler(blueprint_domain))
|
|
3961
3963
|
for helper_type in _KNOWN_HELPER_TYPES:
|
|
3962
3964
|
mgr.register(_make_helper_handler(helper_type))
|
|
3963
|
-
for helper_type in sorted(_flow_helper_types()):
|
|
3964
|
-
mgr.register(_make_flow_helper_handler(helper_type))
|
|
3965
3965
|
mgr.register(
|
|
3966
3966
|
DomainHandler(
|
|
3967
3967
|
"helper_config_subentry", _fetch_config_subentry, _restore_config_subentry
|
|
@@ -628,8 +628,7 @@ class HomeAssistantClient:
|
|
|
628
628
|
async def _request(
|
|
629
629
|
self, method: str, endpoint: str, **kwargs: Any
|
|
630
630
|
) -> dict[str, Any]:
|
|
631
|
-
"""
|
|
632
|
-
Make authenticated request to Home Assistant API and parse JSON body.
|
|
631
|
+
"""Make authenticated request to Home Assistant API and parse JSON body.
|
|
633
632
|
|
|
634
633
|
Args:
|
|
635
634
|
method: HTTP method (GET, POST, etc.)
|
|
@@ -642,15 +641,17 @@ class HomeAssistantClient:
|
|
|
642
641
|
Raises:
|
|
643
642
|
HomeAssistantConnectionError: Connection failed
|
|
644
643
|
HomeAssistantAuthError: Authentication failed
|
|
645
|
-
HomeAssistantAPIError: API error
|
|
644
|
+
HomeAssistantAPIError: API error, or a GET reply that is not JSON
|
|
646
645
|
"""
|
|
647
646
|
response = await self._raw_request(method, endpoint, **kwargs)
|
|
648
647
|
try:
|
|
649
648
|
result: dict[str, Any] = response.json()
|
|
650
649
|
return result
|
|
651
|
-
except
|
|
652
|
-
|
|
653
|
-
|
|
650
|
+
except ValueError as e: # not JSON, or not UTF-8
|
|
651
|
+
if method != "GET" or not response.content.strip():
|
|
652
|
+
return {} # empty body, or a write's reply: accepted, body unknown
|
|
653
|
+
# A read's {} would pass as the entity's config (e.g. in a backup).
|
|
654
|
+
raise HomeAssistantAPIError("GET reply is not JSON") from e
|
|
654
655
|
|
|
655
656
|
async def get_config(self) -> dict[str, Any]:
|
|
656
657
|
"""Get Home Assistant configuration."""
|
|
@@ -662,7 +663,7 @@ class HomeAssistantClient:
|
|
|
662
663
|
|
|
663
664
|
Raises ``HomeAssistantConnectionError`` when the response isn't the
|
|
664
665
|
JSON array ``/states`` always returns on success -- including
|
|
665
|
-
``_request``'s own empty-dict fallback for an
|
|
666
|
+
``_request``'s own empty-dict fallback for an empty body.
|
|
666
667
|
Silently returning ``[]`` here would let a genuine fetch failure
|
|
667
668
|
masquerade as "this instance has zero entities", which no real,
|
|
668
669
|
running Home Assistant instance produces; callers that need to
|
|
@@ -1469,8 +1470,7 @@ class HomeAssistantClient:
|
|
|
1469
1470
|
# Automation Configuration Management
|
|
1470
1471
|
|
|
1471
1472
|
async def _resolve_automation_id(self, identifier: str) -> str:
|
|
1472
|
-
"""
|
|
1473
|
-
Convert entity_id to unique_id if needed, or return unique_id as-is.
|
|
1473
|
+
"""Convert entity_id to unique_id if needed, or return unique_id as-is.
|
|
1474
1474
|
|
|
1475
1475
|
Args:
|
|
1476
1476
|
identifier: Either entity_id (automation.xxx) or unique_id
|
|
@@ -1479,9 +1479,8 @@ class HomeAssistantClient:
|
|
|
1479
1479
|
The unique_id for configuration API
|
|
1480
1480
|
|
|
1481
1481
|
Raises:
|
|
1482
|
-
HomeAssistantAPIError:
|
|
1482
|
+
HomeAssistantAPIError: 404 if not found; other read failures propagate
|
|
1483
1483
|
"""
|
|
1484
|
-
# If it looks like an entity_id, convert to unique_id
|
|
1485
1484
|
if identifier.startswith("automation."):
|
|
1486
1485
|
try:
|
|
1487
1486
|
state = await self.get_entity_state(identifier)
|
|
@@ -1495,7 +1494,9 @@ class HomeAssistantClient:
|
|
|
1495
1494
|
f"Converted entity_id {identifier} to unique_id {unique_id}"
|
|
1496
1495
|
)
|
|
1497
1496
|
return str(unique_id)
|
|
1498
|
-
except
|
|
1497
|
+
except HomeAssistantAPIError as e:
|
|
1498
|
+
if e.status_code != 404: # a failed read is not a missing one
|
|
1499
|
+
raise
|
|
1499
1500
|
raise HomeAssistantAPIError(
|
|
1500
1501
|
f"Failed to resolve automation {identifier}: {str(e)}",
|
|
1501
1502
|
status_code=404,
|
|
@@ -1505,8 +1506,7 @@ class HomeAssistantClient:
|
|
|
1505
1506
|
return identifier
|
|
1506
1507
|
|
|
1507
1508
|
async def get_automation_config(self, identifier: str) -> dict[str, Any]:
|
|
1508
|
-
"""
|
|
1509
|
-
Get automation configuration by unique_id or entity_id.
|
|
1509
|
+
"""Get automation configuration by unique_id or entity_id.
|
|
1510
1510
|
|
|
1511
1511
|
Args:
|
|
1512
1512
|
identifier: Either automation entity_id (automation.xxx) or unique_id
|
|
@@ -27,6 +27,7 @@ import anyio
|
|
|
27
27
|
# it in place (#2135/#2146). The private copy is immune, and CI tests
|
|
28
28
|
# exactly the version production runs.
|
|
29
29
|
from .._vendor import websockets
|
|
30
|
+
from .._vendor.websockets.exceptions import ConnectionClosed
|
|
30
31
|
from ..config import get_global_settings
|
|
31
32
|
from .rest_client import (
|
|
32
33
|
HomeAssistantAuthError,
|
|
@@ -580,7 +581,7 @@ class HomeAssistantWebSocketClient:
|
|
|
580
581
|
logger.error(f"Invalid JSON received: {e}")
|
|
581
582
|
except Exception as e: # noqa: BLE001
|
|
582
583
|
logger.error(f"Error processing message: {e}")
|
|
583
|
-
except
|
|
584
|
+
except ConnectionClosed as e:
|
|
584
585
|
# Prefer the frame we received (the peer closed on us); fall
|
|
585
586
|
# back to the frame we sent (we failed the connection
|
|
586
587
|
# ourselves, e.g. an over-max_size frame produces a sent
|
|
@@ -1025,16 +1026,15 @@ class HomeAssistantWebSocketClient:
|
|
|
1025
1026
|
|
|
1026
1027
|
Exception policy (narrow, distinct log levels — Gemini #1382):
|
|
1027
1028
|
|
|
1028
|
-
- Transport-level loss (``OSError``
|
|
1029
|
-
|
|
1030
|
-
|
|
1029
|
+
- Transport-level loss (``OSError``, ``ConnectionClosed``,
|
|
1030
|
+
``HomeAssistantConnectionError``): the socket closed during the send
|
|
1031
|
+
or before the answer, and the subscription went with it. Logged at
|
|
1032
|
+
``debug`` so HA-mid-restart cleanup doesn't spam warnings.
|
|
1031
1033
|
- HA-side rejection (``HomeAssistantCommandError``, e.g. "Subscription
|
|
1032
|
-
not found" after a server-side reset):
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
programming bug (TypeError, AttributeError) fails loudly instead
|
|
1037
|
-
of being buried under a broad ``except``.
|
|
1034
|
+
not found" after a server-side reset): logged at ``warning`` so a
|
|
1035
|
+
real subscription leak is discoverable.
|
|
1036
|
+
- Everything else, a timeout or a programming bug (TypeError),
|
|
1037
|
+
propagates to the caller's ``finally`` instead of a broad ``except``.
|
|
1038
1038
|
"""
|
|
1039
1039
|
if not self._state.is_ready:
|
|
1040
1040
|
logger.debug(
|
|
@@ -1044,7 +1044,7 @@ class HomeAssistantWebSocketClient:
|
|
|
1044
1044
|
return
|
|
1045
1045
|
try:
|
|
1046
1046
|
await self.send_command("unsubscribe_events", subscription=subscription_id)
|
|
1047
|
-
except OSError as e:
|
|
1047
|
+
except (OSError, ConnectionClosed, HomeAssistantConnectionError) as e:
|
|
1048
1048
|
logger.debug(
|
|
1049
1049
|
"unsubscribe_events(%s): transport lost during cleanup: %s",
|
|
1050
1050
|
subscription_id,
|
|
@@ -1308,7 +1308,7 @@ class HomeAssistantWebSocketClient:
|
|
|
1308
1308
|
(
|
|
1309
1309
|
HomeAssistantConnectionError,
|
|
1310
1310
|
HomeAssistantCommandTimeout,
|
|
1311
|
-
|
|
1311
|
+
ConnectionClosed,
|
|
1312
1312
|
),
|
|
1313
1313
|
):
|
|
1314
1314
|
logger.debug("Background subscription release failed: %s", error)
|
|
@@ -1354,7 +1354,7 @@ class HomeAssistantWebSocketClient:
|
|
|
1354
1354
|
return
|
|
1355
1355
|
try:
|
|
1356
1356
|
await self.send_command(unsubscribe_type, subscription=subscription_id)
|
|
1357
|
-
except OSError as e:
|
|
1357
|
+
except (OSError, ConnectionClosed, HomeAssistantConnectionError) as e:
|
|
1358
1358
|
logger.debug(
|
|
1359
1359
|
"unsubscribe_command(%s): transport lost during cleanup: %s",
|
|
1360
1360
|
subscription_id,
|
|
@@ -99,7 +99,7 @@ SEARCH_KEYWORDS: dict[str, str] = {
|
|
|
99
99
|
"conditions actions get show detail"
|
|
100
100
|
),
|
|
101
101
|
# s09: "create helper" → ha_config_set_helper should outrank remove_helper
|
|
102
|
-
# Covers
|
|
102
|
+
# Covers the storage types and Core's common helper flows (unified in #967).
|
|
103
103
|
"ha_config_set_helper": (
|
|
104
104
|
"create update new add helper "
|
|
105
105
|
"input_boolean input_button input_number input_text input_datetime "
|
{ha_mcp_dev-8.6.0.dev3006 → ha_mcp_dev-8.6.0.dev3007}/src/ha_mcp/settings_ui/_handlers_backups.py
RENAMED
|
@@ -208,6 +208,7 @@ async def _restore_backup(
|
|
|
208
208
|
"invalid_snapshot": ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
209
209
|
"unsupported_domain": ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
210
210
|
"backup_capture_failed": ErrorCode.BACKUP_CAPTURE_FAILED,
|
|
211
|
+
"entry_deleted": ErrorCode.RESOURCE_NOT_FOUND,
|
|
211
212
|
}.get(err.outcome.get("reason") or "", ErrorCode.SERVICE_CALL_FAILED)
|
|
212
213
|
return JSONResponse(
|
|
213
214
|
create_error_response(
|
|
@@ -231,11 +232,12 @@ async def _restore_backup(
|
|
|
231
232
|
}.get(code, 409),
|
|
232
233
|
)
|
|
233
234
|
except MandatoryBackupError as err:
|
|
235
|
+
logger.warning("Restore of %s blocked: %s", name, err.safe_cause)
|
|
234
236
|
return JSONResponse(
|
|
235
237
|
create_error_response(
|
|
236
238
|
ErrorCode.BACKUP_CAPTURE_FAILED,
|
|
237
|
-
"Restore blocked: the pre-restore safety snapshot could not "
|
|
238
|
-
"
|
|
239
|
+
"Restore blocked: the pre-restore safety snapshot could not be "
|
|
240
|
+
f"captured ({err.safe_cause}). Nothing was changed.",
|
|
239
241
|
suggestions=err.suggestions,
|
|
240
242
|
context={
|
|
241
243
|
"data": {
|