ha-mcp-dev 9.1.1.dev3370__tar.gz → 9.1.1.dev3378__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-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/PKG-INFO +2 -2
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/README.md +1 -1
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/pyproject.toml +1 -1
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/__main__.py +3 -3
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/websocket_client.py +36 -243
- ha_mcp_dev-9.1.1.dev3378/src/ha_mcp/client/websocket_state.py +231 -0
- ha_mcp_dev-9.1.1.dev3378/src/ha_mcp/tools/automation_registry_details.py +105 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_api.py +132 -43
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/hacs_backend.py +45 -5
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/response_helpers.py +7 -6
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_config_automations.py +12 -62
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_hacs.py +63 -7
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/config_entry_read.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/event_listeners.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/theme_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/ipv6_lan_guard.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/listen_sockets.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/mcp_client_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/storage_helper_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tool_catalog.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/automation_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/backup_snapshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/bug_report_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_automation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/component_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_progress.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_file_visibility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/event_call.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/event_listener_fields.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/flow_translations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/ignored_entries.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/integration_flow_steps.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/integration_schema.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/integration_ws_commands.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/resource_codec.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/resource_patch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/update_categories.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/config_files.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3370 → ha_mcp_dev-9.1.1.dev3378}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 9.1.1.
|
|
3
|
+
Version: 9.1.1.dev3378
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Keywords: mcp,home-assistant,ai,automation,smart-home
|
|
6
6
|
Author: Julien
|
|
@@ -442,7 +442,7 @@ A `ha_manage_*` tool combines several operations, so it is reachable from more t
|
|
|
442
442
|
|
|
443
443
|
Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, Claude Code); the full catalog has no idle cost there, direct calls skip the search step, and the client's built-in tool search is the better choice — there is no benefit to running ha-mcp's on top of it. Whether tools are deferred depends on the client and model combination: the same model can behave differently per client — GitHub Copilot CLI running Claude Sonnet/Opus inlines the full catalog and still benefits from tool search here. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily.
|
|
444
444
|
|
|
445
|
-
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the app or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g.
|
|
445
|
+
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the app or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. in ChatGPT open **Settings**, then the plugin settings, select the connector and click **Refresh tools**; or close and reopen Claude Desktop). If you skip this, newly enabled tools won't appear in the client at all, and tools the server no longer exposes still show as available but fail when called (`Unknown tool`, or the Read Only Mode error for a write tool that mode hides). ChatGPT sometimes keeps serving the stale list even after the connector is removed and re-added under the same name — if tools are still missing after a refresh, delete the connector and create a new one with a **different name**. The [FAQ](https://homeassistant-ai.github.io/ha-mcp/faq/#chatgpt-stale-tools) has the full steps.
|
|
446
446
|
|
|
447
447
|
For the HA app, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-app settings UI for fine-grained tool enable/disable/pin.
|
|
448
448
|
|
|
@@ -381,7 +381,7 @@ A `ha_manage_*` tool combines several operations, so it is reachable from more t
|
|
|
381
381
|
|
|
382
382
|
Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, Claude Code); the full catalog has no idle cost there, direct calls skip the search step, and the client's built-in tool search is the better choice — there is no benefit to running ha-mcp's on top of it. Whether tools are deferred depends on the client and model combination: the same model can behave differently per client — GitHub Copilot CLI running Claude Sonnet/Opus inlines the full catalog and still benefits from tool search here. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily.
|
|
383
383
|
|
|
384
|
-
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the app or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g.
|
|
384
|
+
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the app or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. in ChatGPT open **Settings**, then the plugin settings, select the connector and click **Refresh tools**; or close and reopen Claude Desktop). If you skip this, newly enabled tools won't appear in the client at all, and tools the server no longer exposes still show as available but fail when called (`Unknown tool`, or the Read Only Mode error for a write tool that mode hides). ChatGPT sometimes keeps serving the stale list even after the connector is removed and re-added under the same name — if tools are still missing after a refresh, delete the connector and create a new one with a **different name**. The [FAQ](https://homeassistant-ai.github.io/ha-mcp/faq/#chatgpt-stale-tools) has the full steps.
|
|
385
385
|
|
|
386
386
|
For the HA app, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-app settings UI for fine-grained tool enable/disable/pin.
|
|
387
387
|
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.1.
|
|
7
|
+
version = "9.1.1.dev3378"
|
|
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 = "9.1.1.
|
|
7
|
+
version = "9.1.1.dev3378"
|
|
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
|
|
@@ -65,8 +65,8 @@ class OAuthProxyClient:
|
|
|
65
65
|
self._oauth_clients: dict[str, HomeAssistantClient] = {}
|
|
66
66
|
self._lock = threading.Lock()
|
|
67
67
|
|
|
68
|
-
def
|
|
69
|
-
"""
|
|
68
|
+
def current_client(self) -> "HomeAssistantClient":
|
|
69
|
+
"""The requesting user's client; per-user caches key on it, not the proxy."""
|
|
70
70
|
from ha_mcp._vendor.fastmcp.server.dependencies import get_access_token
|
|
71
71
|
from ha_mcp.client.rest_client import (
|
|
72
72
|
HomeAssistantAuthError,
|
|
@@ -116,7 +116,7 @@ class OAuthProxyClient:
|
|
|
116
116
|
|
|
117
117
|
def __getattr__(self, name: str) -> Any:
|
|
118
118
|
"""Forward all attribute access to the OAuth client."""
|
|
119
|
-
client = self.
|
|
119
|
+
client = self.current_client()
|
|
120
120
|
return getattr(client, name)
|
|
121
121
|
|
|
122
122
|
|
|
@@ -14,7 +14,6 @@ import json
|
|
|
14
14
|
import logging
|
|
15
15
|
import ssl
|
|
16
16
|
import time
|
|
17
|
-
from collections import defaultdict
|
|
18
17
|
from collections.abc import Awaitable, Callable, Coroutine
|
|
19
18
|
from typing import Any
|
|
20
19
|
from urllib.parse import urlparse
|
|
@@ -37,6 +36,7 @@ from .rest_client import (
|
|
|
37
36
|
HomeAssistantConnectionError,
|
|
38
37
|
_is_ssl_error,
|
|
39
38
|
)
|
|
39
|
+
from .websocket_state import WebSocketConnectionState
|
|
40
40
|
|
|
41
41
|
logger = logging.getLogger(__name__)
|
|
42
42
|
|
|
@@ -136,229 +136,6 @@ def _extract_ws_error(error: Any) -> tuple[str, str | None]:
|
|
|
136
136
|
return str(error), None
|
|
137
137
|
|
|
138
138
|
|
|
139
|
-
class WebSocketConnectionState:
|
|
140
|
-
"""Encapsulates mutable state used by the WebSocket client."""
|
|
141
|
-
|
|
142
|
-
def __init__(self) -> None:
|
|
143
|
-
self.connected = False
|
|
144
|
-
self.authenticated = False
|
|
145
|
-
self._message_id = 0
|
|
146
|
-
self._pending_requests: dict[int, asyncio.Future[dict[str, Any]]] = {}
|
|
147
|
-
self._auth_messages: dict[str, dict[str, Any]] = {}
|
|
148
|
-
self._event_responses: dict[int, asyncio.Future[dict[str, Any]]] = {}
|
|
149
|
-
self._event_handlers: dict[
|
|
150
|
-
str, set[Callable[[dict[str, Any]], Awaitable[None]]]
|
|
151
|
-
] = defaultdict(set)
|
|
152
|
-
# Continuous-subscription queues keyed by the subscribe command's
|
|
153
|
-
# message_id. Long-lived subscriptions (e.g. HACS' ``hacs/subscribe``)
|
|
154
|
-
# deliver many events sharing one id; the one-shot
|
|
155
|
-
# ``_event_responses`` future can't handle that. When a queue is
|
|
156
|
-
# registered for a given id, every event with that id is pushed
|
|
157
|
-
# into it instead of going to ``event_type``-keyed handlers.
|
|
158
|
-
self._subscription_queues: dict[int, asyncio.Queue[dict[str, Any]]] = {}
|
|
159
|
-
# Ids of subscribe commands whose caller gave up before Home Assistant
|
|
160
|
-
# acknowledged them. See ``take_abandoned_subscription``.
|
|
161
|
-
self._abandoned_subscriptions: set[int] = set()
|
|
162
|
-
|
|
163
|
-
def next_message_id(self) -> int:
|
|
164
|
-
"""Reserve the next available WebSocket message identifier."""
|
|
165
|
-
self._message_id += 1
|
|
166
|
-
return self._message_id
|
|
167
|
-
|
|
168
|
-
def register_pending_request(
|
|
169
|
-
self, message_id: int
|
|
170
|
-
) -> asyncio.Future[dict[str, Any]]:
|
|
171
|
-
"""Create and register a future for a pending command response."""
|
|
172
|
-
future: asyncio.Future[dict[str, Any]] = (
|
|
173
|
-
asyncio.get_running_loop().create_future()
|
|
174
|
-
)
|
|
175
|
-
self._pending_requests[message_id] = future
|
|
176
|
-
return future
|
|
177
|
-
|
|
178
|
-
def resolve_pending_request(
|
|
179
|
-
self, message_id: int
|
|
180
|
-
) -> asyncio.Future[dict[str, Any]] | None:
|
|
181
|
-
"""Resolve and remove a pending request future."""
|
|
182
|
-
return self._pending_requests.pop(message_id, None)
|
|
183
|
-
|
|
184
|
-
def cancel_pending_request(self, message_id: int) -> None:
|
|
185
|
-
"""Remove a pending request future, cancelling it or draining its exception."""
|
|
186
|
-
future = self._pending_requests.pop(message_id, None)
|
|
187
|
-
if future and not future.done():
|
|
188
|
-
future.cancel()
|
|
189
|
-
elif future and not future.cancelled():
|
|
190
|
-
# A done future may hold the exception reset_connection set on it;
|
|
191
|
-
# retrieve it here so dropping the last reference doesn't log an
|
|
192
|
-
# ERROR-level "Future exception was never retrieved" at GC.
|
|
193
|
-
future.exception()
|
|
194
|
-
|
|
195
|
-
def register_event_response(
|
|
196
|
-
self, message_id: int
|
|
197
|
-
) -> asyncio.Future[dict[str, Any]]:
|
|
198
|
-
"""Create and register a future for a follow-up event."""
|
|
199
|
-
future: asyncio.Future[dict[str, Any]] = (
|
|
200
|
-
asyncio.get_running_loop().create_future()
|
|
201
|
-
)
|
|
202
|
-
self._event_responses[message_id] = future
|
|
203
|
-
return future
|
|
204
|
-
|
|
205
|
-
def resolve_event_response(
|
|
206
|
-
self, message_id: int
|
|
207
|
-
) -> asyncio.Future[dict[str, Any]] | None:
|
|
208
|
-
"""Resolve a stored event future."""
|
|
209
|
-
return self._event_responses.pop(message_id, None)
|
|
210
|
-
|
|
211
|
-
def cancel_event_response(self, message_id: int) -> None:
|
|
212
|
-
"""Remove a pending event future, cancelling it or draining its exception."""
|
|
213
|
-
future = self._event_responses.pop(message_id, None)
|
|
214
|
-
if future and not future.done():
|
|
215
|
-
future.cancel()
|
|
216
|
-
elif future and not future.cancelled():
|
|
217
|
-
# Same GC guard as cancel_pending_request above.
|
|
218
|
-
future.exception()
|
|
219
|
-
|
|
220
|
-
def mark_abandoned_subscription(self, message_id: int) -> None:
|
|
221
|
-
"""Record a subscribe command whose acknowledgement nobody awaits."""
|
|
222
|
-
self._abandoned_subscriptions.add(message_id)
|
|
223
|
-
|
|
224
|
-
def take_abandoned_subscription(self, message_id: int) -> bool:
|
|
225
|
-
"""Forget an abandoned subscribe command; True if it was one.
|
|
226
|
-
|
|
227
|
-
Home Assistant may register a subscription only after the caller has
|
|
228
|
-
given up and the immediate release answered ``not_found`` — a
|
|
229
|
-
``render_template`` setup waits out the template's own timeout first.
|
|
230
|
-
Its late acknowledgement then arrives with no pending request, and
|
|
231
|
-
this is how the dispatch recognises that it still has to release it.
|
|
232
|
-
"""
|
|
233
|
-
if message_id in self._abandoned_subscriptions:
|
|
234
|
-
self._abandoned_subscriptions.discard(message_id)
|
|
235
|
-
return True
|
|
236
|
-
return False
|
|
237
|
-
|
|
238
|
-
def store_auth_message(self, message_type: str, data: dict[str, Any]) -> None:
|
|
239
|
-
"""Store an authentication handshake message."""
|
|
240
|
-
self._auth_messages[message_type] = data
|
|
241
|
-
|
|
242
|
-
def consume_auth_message(self, message_type: str) -> dict[str, Any] | None:
|
|
243
|
-
"""Retrieve and remove an authentication message if present."""
|
|
244
|
-
return self._auth_messages.pop(message_type, None)
|
|
245
|
-
|
|
246
|
-
def reset_connection(self, close_reason: str | None = None) -> None:
|
|
247
|
-
"""Reset connection-specific state while preserving handlers.
|
|
248
|
-
|
|
249
|
-
Args:
|
|
250
|
-
close_reason: Human-readable description of why the connection
|
|
251
|
-
went away (e.g. a close code/reason pair), included in the
|
|
252
|
-
error surfaced to any request still awaiting a response.
|
|
253
|
-
"""
|
|
254
|
-
self.connected = False
|
|
255
|
-
self.authenticated = False
|
|
256
|
-
self._message_id = 0
|
|
257
|
-
|
|
258
|
-
# ``future.cancel()`` makes awaiters see ``asyncio.CancelledError``,
|
|
259
|
-
# a BaseException that skips every ``except Exception`` handler in
|
|
260
|
-
# the tool layer and reaches the MCP SDK, which treats it as a
|
|
261
|
-
# client-initiated cancellation, suppresses the response entirely,
|
|
262
|
-
# and leaves the MCP client hanging until its own timeout (#1721).
|
|
263
|
-
# ``set_exception`` with a normal exception propagates through
|
|
264
|
-
# ``except Exception`` as expected instead.
|
|
265
|
-
message = (
|
|
266
|
-
"WebSocket connection to Home Assistant closed while waiting for a response"
|
|
267
|
-
)
|
|
268
|
-
if close_reason:
|
|
269
|
-
message = f"{message} ({close_reason})"
|
|
270
|
-
|
|
271
|
-
for future in self._pending_requests.values():
|
|
272
|
-
if not future.done():
|
|
273
|
-
# A fresh instance per future: sharing one exception object
|
|
274
|
-
# across multiple ``set_exception`` calls means the second
|
|
275
|
-
# raise attaches a traceback to an exception already
|
|
276
|
-
# associated with another future's stack.
|
|
277
|
-
future.set_exception(HomeAssistantConnectionError(message))
|
|
278
|
-
self._pending_requests.clear()
|
|
279
|
-
|
|
280
|
-
for future in self._event_responses.values():
|
|
281
|
-
if not future.done():
|
|
282
|
-
future.set_exception(HomeAssistantConnectionError(message))
|
|
283
|
-
self._event_responses.clear()
|
|
284
|
-
|
|
285
|
-
# Drop any subscription queues. ``shutdown`` rather than just clearing
|
|
286
|
-
# the dict, so blocked ``queue.get()`` awaiters unblock instead of
|
|
287
|
-
# hanging; not ``immediate``, so a reader still gets the events that
|
|
288
|
-
# arrived before the close, then ``QueueShutDown`` (3.13).
|
|
289
|
-
for queue in self._subscription_queues.values():
|
|
290
|
-
queue.shutdown()
|
|
291
|
-
self._subscription_queues.clear()
|
|
292
|
-
# Subscriptions die with the socket, and ids restart on the next one.
|
|
293
|
-
self._abandoned_subscriptions.clear()
|
|
294
|
-
|
|
295
|
-
self._auth_messages.clear()
|
|
296
|
-
|
|
297
|
-
def mark_connected(self) -> None:
|
|
298
|
-
"""Mark the socket as connected but not yet authenticated."""
|
|
299
|
-
self.connected = True
|
|
300
|
-
self.authenticated = False
|
|
301
|
-
|
|
302
|
-
def mark_authenticated(self) -> None:
|
|
303
|
-
"""Mark the socket as authenticated and ready for commands."""
|
|
304
|
-
self.authenticated = True
|
|
305
|
-
|
|
306
|
-
def mark_disconnected(self, close_reason: str | None = None) -> None:
|
|
307
|
-
"""Reset connection state when the socket is closed."""
|
|
308
|
-
self.reset_connection(close_reason)
|
|
309
|
-
|
|
310
|
-
@property
|
|
311
|
-
def is_ready(self) -> bool:
|
|
312
|
-
"""Whether the connection is active and authenticated."""
|
|
313
|
-
return self.connected and self.authenticated
|
|
314
|
-
|
|
315
|
-
def add_event_handler(
|
|
316
|
-
self, event_type: str, handler: Callable[[dict[str, Any]], Awaitable[None]]
|
|
317
|
-
) -> None:
|
|
318
|
-
"""Register an async handler for a Home Assistant event type."""
|
|
319
|
-
self._event_handlers[event_type].add(handler)
|
|
320
|
-
|
|
321
|
-
def remove_event_handler(
|
|
322
|
-
self, event_type: str, handler: Callable[[dict[str, Any]], Awaitable[None]]
|
|
323
|
-
) -> None:
|
|
324
|
-
"""Remove an event handler and prune empty handler sets."""
|
|
325
|
-
if event_type in self._event_handlers:
|
|
326
|
-
self._event_handlers[event_type].discard(handler)
|
|
327
|
-
if not self._event_handlers[event_type]:
|
|
328
|
-
self._event_handlers.pop(event_type, None)
|
|
329
|
-
|
|
330
|
-
def get_event_handlers(
|
|
331
|
-
self, event_type: str
|
|
332
|
-
) -> tuple[Callable[[dict[str, Any]], Awaitable[None]], ...]:
|
|
333
|
-
"""Return registered handlers for a given event type."""
|
|
334
|
-
if event_type not in self._event_handlers:
|
|
335
|
-
return ()
|
|
336
|
-
return tuple(self._event_handlers[event_type])
|
|
337
|
-
|
|
338
|
-
def register_subscription_queue(
|
|
339
|
-
self, message_id: int
|
|
340
|
-
) -> asyncio.Queue[dict[str, Any]]:
|
|
341
|
-
"""Register a queue for continuous-subscription event delivery."""
|
|
342
|
-
queue: asyncio.Queue[dict[str, Any]] = asyncio.Queue()
|
|
343
|
-
self._subscription_queues[message_id] = queue
|
|
344
|
-
return queue
|
|
345
|
-
|
|
346
|
-
def get_subscription_queue(
|
|
347
|
-
self, message_id: int
|
|
348
|
-
) -> asyncio.Queue[dict[str, Any]] | None:
|
|
349
|
-
"""Return the queue for a subscription id, or None."""
|
|
350
|
-
return self._subscription_queues.get(message_id)
|
|
351
|
-
|
|
352
|
-
def unregister_subscription_queue(self, message_id: int) -> None:
|
|
353
|
-
"""Drop a subscription queue and wake any blocked readers."""
|
|
354
|
-
queue = self._subscription_queues.pop(message_id, None)
|
|
355
|
-
if queue is not None:
|
|
356
|
-
# ``shutdown(immediate=True)`` raises ``QueueShutDown`` in any
|
|
357
|
-
# pending ``get()`` so a waiter doesn't deadlock when the
|
|
358
|
-
# caller decides to stop listening.
|
|
359
|
-
queue.shutdown(immediate=True)
|
|
360
|
-
|
|
361
|
-
|
|
362
139
|
class HomeAssistantWebSocketClient:
|
|
363
140
|
"""WebSocket client for Home Assistant real-time communication."""
|
|
364
141
|
|
|
@@ -1541,6 +1318,40 @@ class WebSocketManager:
|
|
|
1541
1318
|
"""Create a cache key from credentials."""
|
|
1542
1319
|
return hashlib.sha256(f"{url.rstrip('/')}:{token}".encode()).hexdigest()
|
|
1543
1320
|
|
|
1321
|
+
def _pool_key(
|
|
1322
|
+
self, url: str | None, token: str | None, verify_ssl: bool | None
|
|
1323
|
+
) -> tuple[str, str, str]:
|
|
1324
|
+
"""The credentials a caller connects with, and their pool key."""
|
|
1325
|
+
if url and token:
|
|
1326
|
+
ws_url, ws_token = url, token
|
|
1327
|
+
else:
|
|
1328
|
+
settings = get_global_settings()
|
|
1329
|
+
ws_url = settings.homeassistant_url
|
|
1330
|
+
ws_token = settings.homeassistant_token
|
|
1331
|
+
# Key on the EFFECTIVE verification mode: a caller passing the
|
|
1332
|
+
# resolved settings default (send_websocket_message) must share
|
|
1333
|
+
# the pooled connection with callers that omit the argument
|
|
1334
|
+
# (listener, HACS, installer) — only a genuine override such as
|
|
1335
|
+
# verify_ssl=False gets its own isolated connection.
|
|
1336
|
+
key = (
|
|
1337
|
+
f"{self._client_key(ws_url, ws_token)}"
|
|
1338
|
+
f"|verify_ssl={self._effective_verify_ssl(verify_ssl)}"
|
|
1339
|
+
)
|
|
1340
|
+
return ws_url, ws_token, key
|
|
1341
|
+
|
|
1342
|
+
def pooled_client(
|
|
1343
|
+
self,
|
|
1344
|
+
url: str | None = None,
|
|
1345
|
+
token: str | None = None,
|
|
1346
|
+
verify_ssl: bool | None = None,
|
|
1347
|
+
) -> HomeAssistantWebSocketClient | None:
|
|
1348
|
+
"""The pool's client for these credentials, without connecting.
|
|
1349
|
+
|
|
1350
|
+
It may be disconnected: ``get_client`` replaces such a client only on
|
|
1351
|
+
its next call. None when the pool holds none for them.
|
|
1352
|
+
"""
|
|
1353
|
+
return self._clients.get(self._pool_key(url, token, verify_ssl)[2])
|
|
1354
|
+
|
|
1544
1355
|
@staticmethod
|
|
1545
1356
|
def _effective_verify_ssl(verify_ssl: bool | None) -> bool:
|
|
1546
1357
|
"""Resolve the effective TLS-verification mode for the pool key."""
|
|
@@ -1653,25 +1464,7 @@ class WebSocketManager:
|
|
|
1653
1464
|
self._current_loop = current_loop
|
|
1654
1465
|
self._release_stale_clients(stale_clients, previous_loop)
|
|
1655
1466
|
|
|
1656
|
-
|
|
1657
|
-
if url and token:
|
|
1658
|
-
ws_url = url
|
|
1659
|
-
ws_token = token
|
|
1660
|
-
else:
|
|
1661
|
-
settings = get_global_settings()
|
|
1662
|
-
ws_url = settings.homeassistant_url
|
|
1663
|
-
ws_token = settings.homeassistant_token
|
|
1664
|
-
|
|
1665
|
-
# Key on the EFFECTIVE verification mode: a caller passing the
|
|
1666
|
-
# resolved settings default (send_websocket_message) must share
|
|
1667
|
-
# the pooled connection with callers that omit the argument
|
|
1668
|
-
# (listener, HACS, installer) — only a genuine override such as
|
|
1669
|
-
# verify_ssl=False gets its own isolated connection.
|
|
1670
|
-
effective_verify_ssl = self._effective_verify_ssl(verify_ssl)
|
|
1671
|
-
key = (
|
|
1672
|
-
f"{self._client_key(ws_url, ws_token)}"
|
|
1673
|
-
f"|verify_ssl={effective_verify_ssl}"
|
|
1674
|
-
)
|
|
1467
|
+
ws_url, ws_token, key = self._pool_key(url, token, verify_ssl)
|
|
1675
1468
|
|
|
1676
1469
|
# Return existing connected client for these credentials
|
|
1677
1470
|
existing = self._clients.get(key)
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""Request, event and subscription bookkeeping for one WebSocket connection."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from collections import defaultdict
|
|
5
|
+
from collections.abc import Awaitable, Callable
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from .rest_client import HomeAssistantConnectionError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WebSocketConnectionState:
|
|
12
|
+
"""Encapsulates mutable state used by the WebSocket client."""
|
|
13
|
+
|
|
14
|
+
def __init__(self) -> None:
|
|
15
|
+
self.connected = False
|
|
16
|
+
self.authenticated = False
|
|
17
|
+
self._message_id = 0
|
|
18
|
+
self._pending_requests: dict[int, asyncio.Future[dict[str, Any]]] = {}
|
|
19
|
+
self._auth_messages: dict[str, dict[str, Any]] = {}
|
|
20
|
+
self._event_responses: dict[int, asyncio.Future[dict[str, Any]]] = {}
|
|
21
|
+
self._event_handlers: dict[
|
|
22
|
+
str, set[Callable[[dict[str, Any]], Awaitable[None]]]
|
|
23
|
+
] = defaultdict(set)
|
|
24
|
+
# Continuous-subscription queues keyed by the subscribe command's
|
|
25
|
+
# message_id. Long-lived subscriptions (e.g. HACS' ``hacs/subscribe``)
|
|
26
|
+
# deliver many events sharing one id; the one-shot
|
|
27
|
+
# ``_event_responses`` future can't handle that. When a queue is
|
|
28
|
+
# registered for a given id, every event with that id is pushed
|
|
29
|
+
# into it instead of going to ``event_type``-keyed handlers.
|
|
30
|
+
self._subscription_queues: dict[int, asyncio.Queue[dict[str, Any]]] = {}
|
|
31
|
+
# Ids of subscribe commands whose caller gave up before Home Assistant
|
|
32
|
+
# acknowledged them. See ``take_abandoned_subscription``.
|
|
33
|
+
self._abandoned_subscriptions: set[int] = set()
|
|
34
|
+
|
|
35
|
+
def next_message_id(self) -> int:
|
|
36
|
+
"""Reserve the next available WebSocket message identifier."""
|
|
37
|
+
self._message_id += 1
|
|
38
|
+
return self._message_id
|
|
39
|
+
|
|
40
|
+
def register_pending_request(
|
|
41
|
+
self, message_id: int
|
|
42
|
+
) -> asyncio.Future[dict[str, Any]]:
|
|
43
|
+
"""Create and register a future for a pending command response."""
|
|
44
|
+
future: asyncio.Future[dict[str, Any]] = (
|
|
45
|
+
asyncio.get_running_loop().create_future()
|
|
46
|
+
)
|
|
47
|
+
self._pending_requests[message_id] = future
|
|
48
|
+
return future
|
|
49
|
+
|
|
50
|
+
def resolve_pending_request(
|
|
51
|
+
self, message_id: int
|
|
52
|
+
) -> asyncio.Future[dict[str, Any]] | None:
|
|
53
|
+
"""Resolve and remove a pending request future."""
|
|
54
|
+
return self._pending_requests.pop(message_id, None)
|
|
55
|
+
|
|
56
|
+
def cancel_pending_request(self, message_id: int) -> None:
|
|
57
|
+
"""Remove a pending request future, cancelling it or draining its exception."""
|
|
58
|
+
future = self._pending_requests.pop(message_id, None)
|
|
59
|
+
if future and not future.done():
|
|
60
|
+
future.cancel()
|
|
61
|
+
elif future and not future.cancelled():
|
|
62
|
+
# A done future may hold the exception reset_connection set on it;
|
|
63
|
+
# retrieve it here so dropping the last reference doesn't log an
|
|
64
|
+
# ERROR-level "Future exception was never retrieved" at GC.
|
|
65
|
+
future.exception()
|
|
66
|
+
|
|
67
|
+
def register_event_response(
|
|
68
|
+
self, message_id: int
|
|
69
|
+
) -> asyncio.Future[dict[str, Any]]:
|
|
70
|
+
"""Create and register a future for a follow-up event."""
|
|
71
|
+
future: asyncio.Future[dict[str, Any]] = (
|
|
72
|
+
asyncio.get_running_loop().create_future()
|
|
73
|
+
)
|
|
74
|
+
self._event_responses[message_id] = future
|
|
75
|
+
return future
|
|
76
|
+
|
|
77
|
+
def resolve_event_response(
|
|
78
|
+
self, message_id: int
|
|
79
|
+
) -> asyncio.Future[dict[str, Any]] | None:
|
|
80
|
+
"""Resolve a stored event future."""
|
|
81
|
+
return self._event_responses.pop(message_id, None)
|
|
82
|
+
|
|
83
|
+
def cancel_event_response(self, message_id: int) -> None:
|
|
84
|
+
"""Remove a pending event future, cancelling it or draining its exception."""
|
|
85
|
+
future = self._event_responses.pop(message_id, None)
|
|
86
|
+
if future and not future.done():
|
|
87
|
+
future.cancel()
|
|
88
|
+
elif future and not future.cancelled():
|
|
89
|
+
# Same GC guard as cancel_pending_request above.
|
|
90
|
+
future.exception()
|
|
91
|
+
|
|
92
|
+
def mark_abandoned_subscription(self, message_id: int) -> None:
|
|
93
|
+
"""Record a subscribe command whose acknowledgement nobody awaits."""
|
|
94
|
+
self._abandoned_subscriptions.add(message_id)
|
|
95
|
+
|
|
96
|
+
def take_abandoned_subscription(self, message_id: int) -> bool:
|
|
97
|
+
"""Forget an abandoned subscribe command; True if it was one.
|
|
98
|
+
|
|
99
|
+
Home Assistant may register a subscription only after the caller has
|
|
100
|
+
given up and the immediate release answered ``not_found`` — a
|
|
101
|
+
``render_template`` setup waits out the template's own timeout first.
|
|
102
|
+
Its late acknowledgement then arrives with no pending request, and
|
|
103
|
+
this is how the dispatch recognises that it still has to release it.
|
|
104
|
+
"""
|
|
105
|
+
if message_id in self._abandoned_subscriptions:
|
|
106
|
+
self._abandoned_subscriptions.discard(message_id)
|
|
107
|
+
return True
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
def store_auth_message(self, message_type: str, data: dict[str, Any]) -> None:
|
|
111
|
+
"""Store an authentication handshake message."""
|
|
112
|
+
self._auth_messages[message_type] = data
|
|
113
|
+
|
|
114
|
+
def consume_auth_message(self, message_type: str) -> dict[str, Any] | None:
|
|
115
|
+
"""Retrieve and remove an authentication message if present."""
|
|
116
|
+
return self._auth_messages.pop(message_type, None)
|
|
117
|
+
|
|
118
|
+
def reset_connection(self, close_reason: str | None = None) -> None:
|
|
119
|
+
"""Reset connection-specific state while preserving handlers.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
close_reason: Human-readable description of why the connection
|
|
123
|
+
went away (e.g. a close code/reason pair), included in the
|
|
124
|
+
error surfaced to any request still awaiting a response.
|
|
125
|
+
"""
|
|
126
|
+
self.connected = False
|
|
127
|
+
self.authenticated = False
|
|
128
|
+
self._message_id = 0
|
|
129
|
+
|
|
130
|
+
# ``future.cancel()`` makes awaiters see ``asyncio.CancelledError``,
|
|
131
|
+
# a BaseException that skips every ``except Exception`` handler in
|
|
132
|
+
# the tool layer and reaches the MCP SDK, which treats it as a
|
|
133
|
+
# client-initiated cancellation, suppresses the response entirely,
|
|
134
|
+
# and leaves the MCP client hanging until its own timeout (#1721).
|
|
135
|
+
# ``set_exception`` with a normal exception propagates through
|
|
136
|
+
# ``except Exception`` as expected instead.
|
|
137
|
+
message = (
|
|
138
|
+
"WebSocket connection to Home Assistant closed while waiting for a response"
|
|
139
|
+
)
|
|
140
|
+
if close_reason:
|
|
141
|
+
message = f"{message} ({close_reason})"
|
|
142
|
+
|
|
143
|
+
for future in self._pending_requests.values():
|
|
144
|
+
if not future.done():
|
|
145
|
+
# A fresh instance per future: sharing one exception object
|
|
146
|
+
# across multiple ``set_exception`` calls means the second
|
|
147
|
+
# raise attaches a traceback to an exception already
|
|
148
|
+
# associated with another future's stack.
|
|
149
|
+
future.set_exception(HomeAssistantConnectionError(message))
|
|
150
|
+
self._pending_requests.clear()
|
|
151
|
+
|
|
152
|
+
for future in self._event_responses.values():
|
|
153
|
+
if not future.done():
|
|
154
|
+
future.set_exception(HomeAssistantConnectionError(message))
|
|
155
|
+
self._event_responses.clear()
|
|
156
|
+
|
|
157
|
+
# Drop any subscription queues. ``shutdown`` rather than just clearing
|
|
158
|
+
# the dict, so blocked ``queue.get()`` awaiters unblock instead of
|
|
159
|
+
# hanging; not ``immediate``, so a reader still gets the events that
|
|
160
|
+
# arrived before the close, then ``QueueShutDown`` (3.13).
|
|
161
|
+
for queue in self._subscription_queues.values():
|
|
162
|
+
queue.shutdown()
|
|
163
|
+
self._subscription_queues.clear()
|
|
164
|
+
# Subscriptions die with the socket, and ids restart on the next one.
|
|
165
|
+
self._abandoned_subscriptions.clear()
|
|
166
|
+
|
|
167
|
+
self._auth_messages.clear()
|
|
168
|
+
|
|
169
|
+
def mark_connected(self) -> None:
|
|
170
|
+
"""Mark the socket as connected but not yet authenticated."""
|
|
171
|
+
self.connected = True
|
|
172
|
+
self.authenticated = False
|
|
173
|
+
|
|
174
|
+
def mark_authenticated(self) -> None:
|
|
175
|
+
"""Mark the socket as authenticated and ready for commands."""
|
|
176
|
+
self.authenticated = True
|
|
177
|
+
|
|
178
|
+
def mark_disconnected(self, close_reason: str | None = None) -> None:
|
|
179
|
+
"""Reset connection state when the socket is closed."""
|
|
180
|
+
self.reset_connection(close_reason)
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def is_ready(self) -> bool:
|
|
184
|
+
"""Whether the connection is active and authenticated."""
|
|
185
|
+
return self.connected and self.authenticated
|
|
186
|
+
|
|
187
|
+
def add_event_handler(
|
|
188
|
+
self, event_type: str, handler: Callable[[dict[str, Any]], Awaitable[None]]
|
|
189
|
+
) -> None:
|
|
190
|
+
"""Register an async handler for a Home Assistant event type."""
|
|
191
|
+
self._event_handlers[event_type].add(handler)
|
|
192
|
+
|
|
193
|
+
def remove_event_handler(
|
|
194
|
+
self, event_type: str, handler: Callable[[dict[str, Any]], Awaitable[None]]
|
|
195
|
+
) -> None:
|
|
196
|
+
"""Remove an event handler and prune empty handler sets."""
|
|
197
|
+
if event_type in self._event_handlers:
|
|
198
|
+
self._event_handlers[event_type].discard(handler)
|
|
199
|
+
if not self._event_handlers[event_type]:
|
|
200
|
+
self._event_handlers.pop(event_type, None)
|
|
201
|
+
|
|
202
|
+
def get_event_handlers(
|
|
203
|
+
self, event_type: str
|
|
204
|
+
) -> tuple[Callable[[dict[str, Any]], Awaitable[None]], ...]:
|
|
205
|
+
"""Return registered handlers for a given event type."""
|
|
206
|
+
if event_type not in self._event_handlers:
|
|
207
|
+
return ()
|
|
208
|
+
return tuple(self._event_handlers[event_type])
|
|
209
|
+
|
|
210
|
+
def register_subscription_queue(
|
|
211
|
+
self, message_id: int
|
|
212
|
+
) -> asyncio.Queue[dict[str, Any]]:
|
|
213
|
+
"""Register a queue for continuous-subscription event delivery."""
|
|
214
|
+
queue: asyncio.Queue[dict[str, Any]] = asyncio.Queue()
|
|
215
|
+
self._subscription_queues[message_id] = queue
|
|
216
|
+
return queue
|
|
217
|
+
|
|
218
|
+
def get_subscription_queue(
|
|
219
|
+
self, message_id: int
|
|
220
|
+
) -> asyncio.Queue[dict[str, Any]] | None:
|
|
221
|
+
"""Return the queue for a subscription id, or None."""
|
|
222
|
+
return self._subscription_queues.get(message_id)
|
|
223
|
+
|
|
224
|
+
def unregister_subscription_queue(self, message_id: int) -> None:
|
|
225
|
+
"""Drop a subscription queue and wake any blocked readers."""
|
|
226
|
+
queue = self._subscription_queues.pop(message_id, None)
|
|
227
|
+
if queue is not None:
|
|
228
|
+
# ``shutdown(immediate=True)`` raises ``QueueShutDown`` in any
|
|
229
|
+
# pending ``get()`` so a waiter doesn't deadlock when the
|
|
230
|
+
# caller decides to stop listening.
|
|
231
|
+
queue.shutdown(immediate=True)
|