ha-mcp-dev 9.1.2.dev3402__tar.gz → 9.2.0.dev3410__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.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/PKG-INFO +1 -1
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/pyproject.toml +1 -1
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/pyproject.toml.orig +1 -1
- ha_mcp_dev-9.2.0.dev3410/src/ha_mcp/backup_files.py +88 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_manager.py +6 -59
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/auto_backup.py +10 -0
- ha_mcp_dev-9.2.0.dev3410/src/ha_mcp/tools/file_edit_refusal.py +55 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/hacs_backend.py +67 -3
- ha_mcp_dev-9.2.0.dev3410/src/ha_mcp/tools/hacs_own_repository.py +162 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/resource_patch.py +1 -1
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_filesystem.py +145 -164
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_hacs.py +15 -1
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_yaml_config.py +3 -4
- ha_mcp_dev-9.2.0.dev3410/src/ha_mcp/tools/yaml_extra_keys.py +152 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_calendar.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_entities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_todo.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/config_entry_read.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/event_listeners.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/client/websocket_state.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/theme_check.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/ipv6_lan_guard.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/listen_sockets.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/mcp_client_context.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/storage_helper_types.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tool_catalog.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/automation_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/automation_registry_details.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/backup_snapshot.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/bug_report_sources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_automation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/component_todo.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_progress.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_file_visibility.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/event_call.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/event_listener_fields.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/flow_translations.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/ignored_entries.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/integration_flow_steps.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/integration_schema.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/integration_ws_commands.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/resource_codec.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_flow_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/update_categories.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/config_files.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.1.2.dev3402 → ha_mcp_dev-9.2.0.dev3410}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.
|
|
7
|
+
version = "9.2.0.dev3410"
|
|
8
8
|
description = "Configure and automate Home Assistant with Claude, ChatGPT, and other AI assistants."
|
|
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.
|
|
7
|
+
version = "9.2.0.dev3410"
|
|
8
8
|
description = "Configure and automate Home Assistant with Claude, ChatGPT, and other AI assistants."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""Auto-backup fetch and restore for whole files (``file`` / ``yaml_file``).
|
|
2
|
+
|
|
3
|
+
Kept out of ``backup_manager.py``, which is at its module-size baseline.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from .client.rest_client import HomeAssistantError
|
|
11
|
+
|
|
12
|
+
# The component flag that gates read_file's ``keep_line_endings`` field.
|
|
13
|
+
LINE_ENDINGS_CAPABILITY = "read_file_line_endings"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def _fetch_file(
|
|
17
|
+
client: Any, entity_id: str, *, keep_line_endings: bool = False
|
|
18
|
+
) -> Any:
|
|
19
|
+
"""Read a file's current content via the read_file service.
|
|
20
|
+
|
|
21
|
+
``entity_id`` is the file path. Returns the content string, or None
|
|
22
|
+
when the file does not exist — a brand-new write has no prior content
|
|
23
|
+
to snapshot, so capture skips (same as creating a new entity). A
|
|
24
|
+
binary file also returns None: snapshots store text only, so capture
|
|
25
|
+
skips it instead of blocking the write or delete. Other read failures
|
|
26
|
+
raise so the capture pipeline logs them at WARNING.
|
|
27
|
+
"""
|
|
28
|
+
from .tools.auto_backup import PathNotAllowedError
|
|
29
|
+
from .tools.tools_filesystem import call_mcp_tools_service
|
|
30
|
+
from .tools.util_helpers import unwrap_service_response
|
|
31
|
+
|
|
32
|
+
service_data: dict[str, Any] = {"path": entity_id}
|
|
33
|
+
if keep_line_endings:
|
|
34
|
+
service_data["keep_line_endings"] = True
|
|
35
|
+
result = await call_mcp_tools_service(client, "read_file", service_data)
|
|
36
|
+
if not isinstance(result, dict):
|
|
37
|
+
return None
|
|
38
|
+
result = unwrap_service_response(result)
|
|
39
|
+
if result.get("success", False):
|
|
40
|
+
content = result.get("content")
|
|
41
|
+
return content if isinstance(content, str) else None
|
|
42
|
+
error = str(result.get("error", ""))
|
|
43
|
+
skips = ("does not exist", "not a file", "Cannot read binary file")
|
|
44
|
+
if any(marker in error for marker in skips):
|
|
45
|
+
return None
|
|
46
|
+
if error.startswith("Path not allowed"):
|
|
47
|
+
raise PathNotAllowedError(entity_id, error)
|
|
48
|
+
raise HomeAssistantError(f"read_file failed for {entity_id!r}: {error}")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def _restore_file(client: Any, entity_id: str, config: Any) -> Any:
|
|
52
|
+
"""Re-write a file's captured content via the write_file service."""
|
|
53
|
+
from .tools.tools_filesystem import call_mcp_tools_service
|
|
54
|
+
from .tools.util_helpers import unwrap_service_response
|
|
55
|
+
|
|
56
|
+
result = await call_mcp_tools_service(
|
|
57
|
+
client,
|
|
58
|
+
"write_file",
|
|
59
|
+
{
|
|
60
|
+
"path": entity_id,
|
|
61
|
+
"content": str(config),
|
|
62
|
+
"overwrite": True,
|
|
63
|
+
"create_dirs": True,
|
|
64
|
+
},
|
|
65
|
+
)
|
|
66
|
+
if isinstance(result, dict):
|
|
67
|
+
result = unwrap_service_response(result)
|
|
68
|
+
if not result.get("success", False):
|
|
69
|
+
raise HomeAssistantError(
|
|
70
|
+
f"write_file restore failed for {entity_id!r}: {result.get('error')}"
|
|
71
|
+
)
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
async def _fetch_file_as_stored(client: Any, entity_id: str) -> Any:
|
|
76
|
+
"""``_fetch_file`` for a snapshot: CRLF stays CRLF, so a restore is exact.
|
|
77
|
+
|
|
78
|
+
A component without the ``read_file_line_endings`` flag would refuse the
|
|
79
|
+
field, so it gets the LF read it always served.
|
|
80
|
+
"""
|
|
81
|
+
from .tools.component_api import component_supports, get_component_caps
|
|
82
|
+
|
|
83
|
+
caps = await get_component_caps(client)
|
|
84
|
+
return await _fetch_file(
|
|
85
|
+
client,
|
|
86
|
+
entity_id,
|
|
87
|
+
keep_line_endings=component_supports(caps, LINE_ENDINGS_CAPABILITY),
|
|
88
|
+
)
|
|
@@ -95,6 +95,7 @@ from .backup_entity_ids import (
|
|
|
95
95
|
update_with_registry_icon,
|
|
96
96
|
with_registry_icon,
|
|
97
97
|
)
|
|
98
|
+
from .backup_files import _fetch_file, _fetch_file_as_stored, _restore_file
|
|
98
99
|
from .backup_helper_target import fetch_helper as _fetch_helper
|
|
99
100
|
from .backup_helper_target import note_no_safety_backup as _note_no_safety_backup
|
|
100
101
|
from .backup_helper_target import (
|
|
@@ -2475,60 +2476,6 @@ async def _registry_snapshot(client: Any, helper_type: str, item: dict) -> Any:
|
|
|
2475
2476
|
# ``edit_yaml_config``. Both store the content as ``kind: "text"``.
|
|
2476
2477
|
|
|
2477
2478
|
|
|
2478
|
-
async def _fetch_file(client: Any, entity_id: str) -> Any:
|
|
2479
|
-
"""Read a file's current content via the read_file service.
|
|
2480
|
-
|
|
2481
|
-
``entity_id`` is the file path. Returns the content string, or None
|
|
2482
|
-
when the file does not exist — a brand-new write has no prior content
|
|
2483
|
-
to snapshot, so capture skips (same as creating a new entity). A
|
|
2484
|
-
binary file also returns None: snapshots store text only, so capture
|
|
2485
|
-
skips it instead of blocking the write or delete. Other read failures
|
|
2486
|
-
raise so the capture pipeline logs them at WARNING.
|
|
2487
|
-
"""
|
|
2488
|
-
from .tools.auto_backup import PathNotAllowedError
|
|
2489
|
-
from .tools.tools_filesystem import call_mcp_tools_service
|
|
2490
|
-
from .tools.util_helpers import unwrap_service_response
|
|
2491
|
-
|
|
2492
|
-
result = await call_mcp_tools_service(client, "read_file", {"path": entity_id})
|
|
2493
|
-
if not isinstance(result, dict):
|
|
2494
|
-
return None
|
|
2495
|
-
result = unwrap_service_response(result)
|
|
2496
|
-
if result.get("success", False):
|
|
2497
|
-
content = result.get("content")
|
|
2498
|
-
return content if isinstance(content, str) else None
|
|
2499
|
-
error = str(result.get("error", ""))
|
|
2500
|
-
skips = ("does not exist", "not a file", "Cannot read binary file")
|
|
2501
|
-
if any(marker in error for marker in skips):
|
|
2502
|
-
return None
|
|
2503
|
-
if error.startswith("Path not allowed"):
|
|
2504
|
-
raise PathNotAllowedError(entity_id, error)
|
|
2505
|
-
raise HomeAssistantError(f"read_file failed for {entity_id!r}: {error}")
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
async def _restore_file(client: Any, entity_id: str, config: Any) -> Any:
|
|
2509
|
-
"""Re-write a file's captured content via the write_file service."""
|
|
2510
|
-
from .tools.tools_filesystem import call_mcp_tools_service
|
|
2511
|
-
from .tools.util_helpers import unwrap_service_response
|
|
2512
|
-
|
|
2513
|
-
result = await call_mcp_tools_service(
|
|
2514
|
-
client,
|
|
2515
|
-
"write_file",
|
|
2516
|
-
{
|
|
2517
|
-
"path": entity_id,
|
|
2518
|
-
"content": str(config),
|
|
2519
|
-
"overwrite": True,
|
|
2520
|
-
"create_dirs": True,
|
|
2521
|
-
},
|
|
2522
|
-
)
|
|
2523
|
-
if isinstance(result, dict):
|
|
2524
|
-
result = unwrap_service_response(result)
|
|
2525
|
-
if not result.get("success", False):
|
|
2526
|
-
raise HomeAssistantError(
|
|
2527
|
-
f"write_file restore failed for {entity_id!r}: {result.get('error')}"
|
|
2528
|
-
)
|
|
2529
|
-
return result
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
2479
|
async def _fetch_yaml(client: Any, entity_id: str) -> Any:
|
|
2533
2480
|
"""Read the current YAML subtree for a ``{file}::{yaml_path}`` target.
|
|
2534
2481
|
|
|
@@ -2586,12 +2533,12 @@ async def _restore_yaml(client: Any, entity_id: str, config: Any) -> Any:
|
|
|
2586
2533
|
and can therefore be left off.
|
|
2587
2534
|
"""
|
|
2588
2535
|
from .config import get_global_settings
|
|
2589
|
-
from .tools.tools_filesystem import
|
|
2536
|
+
from .tools.tools_filesystem import call_mcp_tools_service
|
|
2537
|
+
from .tools.util_helpers import unwrap_service_response
|
|
2538
|
+
from .tools.yaml_extra_keys import (
|
|
2590
2539
|
assert_extra_yaml_keys_supported,
|
|
2591
|
-
call_mcp_tools_service,
|
|
2592
2540
|
effective_extra_yaml_write_keys,
|
|
2593
2541
|
)
|
|
2594
|
-
from .tools.util_helpers import unwrap_service_response
|
|
2595
2542
|
|
|
2596
2543
|
# Split on the LAST "::" (see _fetch_yaml) so an exotic file path
|
|
2597
2544
|
# containing "::" still restores to the right file and key.
|
|
@@ -3601,12 +3548,12 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
|
|
|
3601
3548
|
mgr.register(DomainHandler("entity", fetch_entity, restore_entity))
|
|
3602
3549
|
mgr.register(DomainHandler("device", _fetch_device, _restore_device))
|
|
3603
3550
|
mgr.register(DomainHandler("integration", fetch_integration, restore_integration))
|
|
3604
|
-
mgr.register(DomainHandler("file",
|
|
3551
|
+
mgr.register(DomainHandler("file", _fetch_file_as_stored, _restore_file))
|
|
3605
3552
|
mgr.register(DomainHandler("yaml", _fetch_yaml, _restore_yaml))
|
|
3606
3553
|
# Whole-file YAML config: same fetch as "file" (read_file), but restored via
|
|
3607
3554
|
# edit_yaml_config(replace_file) since write_file rejects config files.
|
|
3608
3555
|
# Backs the legacy-restore write path and its pre-restore safety snapshot.
|
|
3609
|
-
mgr.register(DomainHandler("yaml_file",
|
|
3556
|
+
mgr.register(DomainHandler("yaml_file", _fetch_file_as_stored, _restore_yaml_file))
|
|
3610
3557
|
# Blueprint files (#2329): the pre-write snapshot for
|
|
3611
3558
|
# ha_manage_blueprints(action="delete" / "save").
|
|
3612
3559
|
for blueprint_domain in ("automation", "script"):
|
|
@@ -43,6 +43,7 @@ from ..backup_manager import (
|
|
|
43
43
|
)
|
|
44
44
|
from ..config import get_global_settings
|
|
45
45
|
from ..errors import TOOL_ERROR_LOG_LEVEL, ErrorCode, create_error_response
|
|
46
|
+
from ..utils.registry_update_lock import registry_update_lock
|
|
46
47
|
from .helpers import raise_tool_error
|
|
47
48
|
from .resource_patch import resource_write_lock
|
|
48
49
|
|
|
@@ -412,6 +413,11 @@ async def _template_write_context(
|
|
|
412
413
|
Assistant UI or other processes are not serialized, so the snapshot can
|
|
413
414
|
predate an edit made there that the write then replaces. The resource
|
|
414
415
|
tools must not take the lock again: ``asyncio.Lock`` is not reentrant.
|
|
416
|
+
|
|
417
|
+
File tools share one lock rather than one per path, because a link and its
|
|
418
|
+
target are the same file under two names. YAML edits take it as well: a
|
|
419
|
+
theme file is written by both, and two snapshots taken before either write
|
|
420
|
+
would let a restore of the later one remove the earlier change.
|
|
415
421
|
"""
|
|
416
422
|
# Both options-update tools take stable config-entry IDs. Alias-based helper
|
|
417
423
|
# removal and dotted subentry targets have separate resolution paths.
|
|
@@ -425,6 +431,10 @@ async def _template_write_context(
|
|
|
425
431
|
elif domain == "dashboard_resource" and entity_id:
|
|
426
432
|
async with resource_write_lock(entity_id):
|
|
427
433
|
yield
|
|
434
|
+
elif domain in ("file", "yaml") and entity_id:
|
|
435
|
+
# YAML edits too: ha_config_set_yaml and ha_write_file both write themes/.
|
|
436
|
+
async with registry_update_lock("file", "all_files"):
|
|
437
|
+
yield
|
|
428
438
|
else:
|
|
429
439
|
yield
|
|
430
440
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Turn an edit_file refusal into the structured error the edit tools share.
|
|
2
|
+
|
|
3
|
+
``ha_config_set_dashboard_resource(edits=...)`` raises its refusals through
|
|
4
|
+
``create_error_response`` with ``reason`` in the context; ``ha_write_file``
|
|
5
|
+
edits do the same, so both edit surfaces answer in one shape.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, NoReturn
|
|
9
|
+
|
|
10
|
+
from ..errors import ErrorCode, create_error_response
|
|
11
|
+
from .helpers import raise_tool_error
|
|
12
|
+
|
|
13
|
+
# Refusals of the edits themselves; any other reason is about the file or call.
|
|
14
|
+
_EDIT_REASONS = frozenset(
|
|
15
|
+
{"invalid_edit", "old_not_found", "old_not_unique", "line_endings_only"}
|
|
16
|
+
)
|
|
17
|
+
_CONTEXT_KEYS = (
|
|
18
|
+
"reason",
|
|
19
|
+
"edit_index",
|
|
20
|
+
"invalid_edit_indexes",
|
|
21
|
+
"matches",
|
|
22
|
+
"line_endings",
|
|
23
|
+
"parent",
|
|
24
|
+
)
|
|
25
|
+
_SUGGESTIONS = {
|
|
26
|
+
"invalid_edit": ["Every edit needs a non-empty 'old' that differs from its 'new'"],
|
|
27
|
+
"old_not_found": [
|
|
28
|
+
"Match the stored text exactly, including whitespace",
|
|
29
|
+
"Earlier edits apply first; account for text they changed",
|
|
30
|
+
"Read the current text with ha_read_file",
|
|
31
|
+
],
|
|
32
|
+
"old_not_unique": ["Add surrounding context to 'old' so it matches once"],
|
|
33
|
+
"line_endings_only": ["Send the whole file with content= to change line endings"],
|
|
34
|
+
"not_found": ["Create the file with content= instead of edits"],
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def raise_edit_file_refusal(result: dict[str, Any], path: str) -> NoReturn:
|
|
39
|
+
"""Raise the component's ``success: false`` edit_file reply as a ToolError."""
|
|
40
|
+
reason = result.get("reason")
|
|
41
|
+
code = (
|
|
42
|
+
ErrorCode.VALIDATION_INVALID_PARAMETER
|
|
43
|
+
if reason in _EDIT_REASONS
|
|
44
|
+
else ErrorCode.SERVICE_CALL_FAILED
|
|
45
|
+
)
|
|
46
|
+
context: dict[str, Any] = {"path": path}
|
|
47
|
+
context.update({key: result[key] for key in _CONTEXT_KEYS if key in result})
|
|
48
|
+
raise_tool_error(
|
|
49
|
+
create_error_response(
|
|
50
|
+
code,
|
|
51
|
+
str(result.get("error") or "edit_file failed"),
|
|
52
|
+
suggestions=_SUGGESTIONS.get(str(reason)),
|
|
53
|
+
context=context,
|
|
54
|
+
)
|
|
55
|
+
)
|
|
@@ -5,6 +5,7 @@ integration and removes the ``hacs/*`` WebSocket commands. The HACS tools
|
|
|
5
5
|
talk to whichever API the instance serves, Marketplace first.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import re
|
|
8
9
|
from dataclasses import dataclass, field
|
|
9
10
|
from typing import Any, NoReturn
|
|
10
11
|
|
|
@@ -76,6 +77,47 @@ _GATE_SUGGESTIONS = {
|
|
|
76
77
|
],
|
|
77
78
|
}
|
|
78
79
|
|
|
80
|
+
# Two store records claiming custom_components/ha_mcp_tools (#2993): the
|
|
81
|
+
# Marketplace refuses to update either, and refuses to uninstall a record while
|
|
82
|
+
# any HA-MCP config entry exists, disabled ones included. Both ways out were
|
|
83
|
+
# checked on a live instance; neither can be driven through this server.
|
|
84
|
+
DUPLICATE_RECORD_SUGGESTIONS = [
|
|
85
|
+
"A current HA-MCP integration files a repair for this under Settings > "
|
|
86
|
+
+ "System > Repairs; its fix keeps homeassistant-ai/ha-mcp and marks the "
|
|
87
|
+
+ "other record as not installed, with no change to entries or files. Ask "
|
|
88
|
+
+ "the user to run it.",
|
|
89
|
+
"Without that repair: the store refuses to uninstall a record while any "
|
|
90
|
+
+ "HA-MCP entry exists, disabled ones included, and this server cannot "
|
|
91
|
+
+ "drive either route below. Ask the user before suggesting them.",
|
|
92
|
+
"Route 1 (no terminal): delete every HA-MCP entry under Settings > Devices "
|
|
93
|
+
+ "& services, uninstall the duplicate record in the store, update the kept "
|
|
94
|
+
+ "record, add the entries back and restart. An embedded server entry gets "
|
|
95
|
+
+ "a new connect URL, so MCP clients reconnect.",
|
|
96
|
+
"Route 2 (keeps the entries): with Home Assistant Core stopped, set "
|
|
97
|
+
+ '"installed": false on the duplicate record in '
|
|
98
|
+
+ ".storage/marketplace.repositories (.storage/hacs.repositories on HACS), "
|
|
99
|
+
+ "start Core, then update the kept record.",
|
|
100
|
+
]
|
|
101
|
+
# Core's ``integration_owned`` message: "The {domain} directory belongs to
|
|
102
|
+
# {owner}." The store sends no error code for it, so the whole sentence is
|
|
103
|
+
# matched, owner as ``owner/repo``, never a fragment of some other message.
|
|
104
|
+
_OWNED_DIRECTORY = re.compile(
|
|
105
|
+
r"^(?:Command failed: )?The \S+ directory belongs to ([\w.-]+/[\w-][\w.-]*?)\.?$"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _owned_directory_suggestions(owner: str) -> list[str]:
|
|
110
|
+
"""The store refused an install because another installed record owns the
|
|
111
|
+
integration's directory: the owner is the record to install or update."""
|
|
112
|
+
return [
|
|
113
|
+
f"{owner} already provides this integration. Update or reinstall it "
|
|
114
|
+
f'there: ha_manage_hacs(action="download", repository_id="{owner}").',
|
|
115
|
+
"To switch repositories instead, uninstall the owner first; the store "
|
|
116
|
+
"refuses that while any of the integration's config entries exist, so "
|
|
117
|
+
"ask the user before deleting entries under Settings > Devices & "
|
|
118
|
+
"services.",
|
|
119
|
+
]
|
|
120
|
+
|
|
79
121
|
|
|
80
122
|
@dataclass(frozen=True)
|
|
81
123
|
class StoreApi:
|
|
@@ -187,15 +229,37 @@ async def detect_store_api(ws_client: Any) -> StoreApi:
|
|
|
187
229
|
return HACS_API # unreachable: raise_tool_error always raises
|
|
188
230
|
|
|
189
231
|
|
|
232
|
+
def is_owned_directory_refusal(err: HomeAssistantCommandError) -> bool:
|
|
233
|
+
"""Whether the store refused because another installed record owns the
|
|
234
|
+
integration's directory."""
|
|
235
|
+
return _OWNED_DIRECTORY.match(str(err).strip()) is not None
|
|
236
|
+
|
|
237
|
+
|
|
190
238
|
def raise_store_error(
|
|
191
|
-
err: HomeAssistantCommandError,
|
|
239
|
+
err: HomeAssistantCommandError,
|
|
240
|
+
context: dict[str, Any],
|
|
241
|
+
*,
|
|
242
|
+
installed_records: list[str] | None = None,
|
|
192
243
|
) -> NoReturn:
|
|
193
244
|
"""Raise a store command failure; a Marketplace gate names the UI step.
|
|
194
245
|
|
|
195
246
|
The gates are told apart by Core's error code: their messages ("Connect a
|
|
196
|
-
GitHub account ...") would otherwise read as a connection failure.
|
|
247
|
+
GitHub account ...") would otherwise read as a connection failure. An
|
|
248
|
+
ownership refusal names the owner to update, unless the owner is one of
|
|
249
|
+
ha-mcp's own records and ``installed_records`` shows two of them
|
|
250
|
+
installed: then neither can be updated and the suggestions are the way
|
|
251
|
+
out of that. A refusal naming some other integration's owner keeps the
|
|
252
|
+
owner hint whatever ha-mcp's own records look like.
|
|
197
253
|
"""
|
|
198
|
-
|
|
254
|
+
suggestions = _GATE_SUGGESTIONS.get(err.code or "")
|
|
255
|
+
if match := _OWNED_DIRECTORY.match(str(err).strip()):
|
|
256
|
+
owners = {r.lower() for r in installed_records or []}
|
|
257
|
+
if len(owners) > 1 and match[1].lower() in owners:
|
|
258
|
+
suggestions = DUPLICATE_RECORD_SUGGESTIONS
|
|
259
|
+
context = {**context, "installed": installed_records}
|
|
260
|
+
else:
|
|
261
|
+
suggestions = _owned_directory_suggestions(match[1])
|
|
262
|
+
if suggestions:
|
|
199
263
|
raise_tool_error(
|
|
200
264
|
create_error_response(
|
|
201
265
|
ErrorCode.SERVICE_CALL_FAILED,
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Keep ha-mcp's own integration on the one store repository that owns it.
|
|
2
|
+
|
|
3
|
+
Two repositories carry the ``ha_mcp_tools`` component: the main repository,
|
|
4
|
+
which the default catalog lists, and the legacy distribution mirror earlier
|
|
5
|
+
installs came from. Both extract to ``custom_components/ha_mcp_tools``. The
|
|
6
|
+
Marketplace (Home Assistant 2026.11+) refuses to install a repository whose
|
|
7
|
+
integration another installed repository owns. HACS never checked, so a
|
|
8
|
+
download of the second repository on Home Assistant 2026.10 or older left both
|
|
9
|
+
records claiming the directory, and after the 2026.11 upgrade the Marketplace
|
|
10
|
+
refuses to update either (#2993). The server's own install guidance names the
|
|
11
|
+
main repository, so a download of either repository goes to the one that is
|
|
12
|
+
installed.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import re
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from ..client.rest_client import HomeAssistantCommandError, HomeAssistantCommandTimeout
|
|
21
|
+
from ..errors import ErrorCode, create_error_response
|
|
22
|
+
from ..hacs_auto_refresh import CANDIDATE_REPO_FULL_NAMES
|
|
23
|
+
from .hacs_backend import StoreApi, is_owned_directory_refusal
|
|
24
|
+
from .helpers import raise_tool_error
|
|
25
|
+
|
|
26
|
+
MAIN_REPOSITORY = "homeassistant-ai/ha-mcp"
|
|
27
|
+
MIRROR_REPOSITORY = "homeassistant-ai/ha-mcp-integration"
|
|
28
|
+
# The stores use the GitHub repository id, fixed for a repository's lifetime.
|
|
29
|
+
OWN_REPOSITORY_IDS = {"1056618941": MAIN_REPOSITORY, "1289599380": MIRROR_REPOSITORY}
|
|
30
|
+
|
|
31
|
+
# The two repositories tag releases alike, but not development builds:
|
|
32
|
+
# publish-dev.yml tags the main repository ``v<next>.dev<N>`` while
|
|
33
|
+
# sync-integration-mirror.yml tags the mirror ``v<next>-dev.<N>``.
|
|
34
|
+
_MAIN_DEV_REF = re.compile(r"^(v?\d+\.\d+\.\d+)\.dev(\d+)$")
|
|
35
|
+
_MIRROR_DEV_REF = re.compile(r"^(v?\d+\.\d+\.\d+)-dev\.(\d+)$")
|
|
36
|
+
_RELEASE_REF = re.compile(r"^v?(\d+)\.(\d+)\.(\d+)")
|
|
37
|
+
# From 9.0 both repositories tag a release with the server version; before
|
|
38
|
+
# that the mirror carried the component's own numbers (v2.2.1 for 8.6.0).
|
|
39
|
+
_SHARED_TAGS_SINCE = (9, 0, 0)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _tagged_alike(version: str) -> bool:
|
|
43
|
+
match = _RELEASE_REF.match(version)
|
|
44
|
+
if match is None:
|
|
45
|
+
return False
|
|
46
|
+
return tuple(int(p) for p in match.groups()) >= _SHARED_TAGS_SINCE
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def translate_version(version: str | None, target: str) -> str | None:
|
|
50
|
+
"""The same release named the way ``target`` tags it."""
|
|
51
|
+
if not version:
|
|
52
|
+
return version
|
|
53
|
+
if target.lower() == MIRROR_REPOSITORY and (match := _MAIN_DEV_REF.match(version)):
|
|
54
|
+
return f"{match[1]}-dev.{match[2]}"
|
|
55
|
+
if target.lower() == MAIN_REPOSITORY and (match := _MIRROR_DEV_REF.match(version)):
|
|
56
|
+
return f"{match[1]}.dev{match[2]}"
|
|
57
|
+
return version
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _own_name(repo: dict[str, Any]) -> str | None:
|
|
61
|
+
full_name = (repo.get("full_name") or "").lower()
|
|
62
|
+
if full_name in {n.lower() for n in CANDIDATE_REPO_FULL_NAMES}:
|
|
63
|
+
return full_name
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def installed_own_records(
|
|
68
|
+
ws_client: Any, api: StoreApi
|
|
69
|
+
) -> list[dict[str, Any]] | None:
|
|
70
|
+
"""The store's records for ha-mcp's own repositories that are installed,
|
|
71
|
+
or None when the store could not be asked."""
|
|
72
|
+
try:
|
|
73
|
+
response = await ws_client.send_command(api.command("list"))
|
|
74
|
+
except (HomeAssistantCommandError, HomeAssistantCommandTimeout):
|
|
75
|
+
return None
|
|
76
|
+
listed = response.get("result") if isinstance(response, dict) else None
|
|
77
|
+
repos = [dict(r) for r in (listed or []) if isinstance(r, dict)]
|
|
78
|
+
return [r for r in repos if _own_name(r) and r.get("installed")]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def ownership_refusal_records(
|
|
82
|
+
ws_client: Any, api: StoreApi, err: HomeAssistantCommandError
|
|
83
|
+
) -> list[str] | None:
|
|
84
|
+
"""For a store refusal, the installed own records' names, so the refusal
|
|
85
|
+
can be explained; None for any other error, with no store call."""
|
|
86
|
+
if not is_owned_directory_refusal(err):
|
|
87
|
+
return None
|
|
88
|
+
records = await installed_own_records(ws_client, api)
|
|
89
|
+
return [str(r.get("full_name")) for r in records or []]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
async def route_own_repository_download(
|
|
93
|
+
ws_client: Any, api: StoreApi, repository_id: str, version: str | None
|
|
94
|
+
) -> tuple[str, str | None, str | None]:
|
|
95
|
+
"""Return the repository and version to download, and a note when rerouted.
|
|
96
|
+
|
|
97
|
+
A repository that is not ha-mcp's own, by name or by id, passes through
|
|
98
|
+
with no store call, so a download stays one store command. For ha-mcp's
|
|
99
|
+
own, the installed one wins: a request for the other repository is
|
|
100
|
+
rerouted to it, so the mirror keeps updating from the mirror and the main
|
|
101
|
+
repository from the catalog, and a development ref is renamed the way the
|
|
102
|
+
target tags it. With two installed records the store decides: the
|
|
103
|
+
Marketplace refuses the download itself and that refusal is explained
|
|
104
|
+
where it is raised; HACS still downloads, with a warning.
|
|
105
|
+
"""
|
|
106
|
+
wanted = repository_id.strip().lower()
|
|
107
|
+
wanted = OWN_REPOSITORY_IDS.get(wanted, wanted)
|
|
108
|
+
if wanted not in {n.lower() for n in CANDIDATE_REPO_FULL_NAMES}:
|
|
109
|
+
return repository_id, version, None
|
|
110
|
+
|
|
111
|
+
installed = await installed_own_records(ws_client, api)
|
|
112
|
+
if installed is None:
|
|
113
|
+
# The download itself reports the store's trouble, with its own context
|
|
114
|
+
return repository_id, version, None
|
|
115
|
+
if len(installed) > 1:
|
|
116
|
+
if api.is_marketplace:
|
|
117
|
+
# The Marketplace refuses this download itself; raise_store_error
|
|
118
|
+
# explains the refusal with the way out.
|
|
119
|
+
return repository_id, version, None
|
|
120
|
+
names = " and ".join(str(r.get("full_name")) for r in installed)
|
|
121
|
+
# HACS never checked ownership, so the download still works there and
|
|
122
|
+
# is the way to bring in the release whose repair keeps one listing.
|
|
123
|
+
note = (
|
|
124
|
+
f"{names} are both installed and both claim "
|
|
125
|
+
"custom_components/ha_mcp_tools. HACS still updates either, but the "
|
|
126
|
+
"Marketplace in Home Assistant 2026.11 will refuse to. After this "
|
|
127
|
+
"download restart Home Assistant and run the repair under Settings > "
|
|
128
|
+
f"System > Repairs, which keeps {MAIN_REPOSITORY}. If no repair "
|
|
129
|
+
"appears, the installed release predates it: update to a current "
|
|
130
|
+
"release or follow the manual route in the FAQ."
|
|
131
|
+
)
|
|
132
|
+
return repository_id, version, note
|
|
133
|
+
if not installed or _own_name(installed[0]) == wanted:
|
|
134
|
+
return repository_id, version, None
|
|
135
|
+
owner = str(installed[0].get("full_name"))
|
|
136
|
+
if version and not _tagged_alike(version):
|
|
137
|
+
raise_tool_error(
|
|
138
|
+
create_error_response(
|
|
139
|
+
ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
140
|
+
f"{owner} owns custom_components/ha_mcp_tools, and releases "
|
|
141
|
+
f"before {'.'.join(map(str, _SHARED_TAGS_SINCE))} are tagged "
|
|
142
|
+
f"differently there, so {version} cannot be mapped to it.",
|
|
143
|
+
suggestions=[
|
|
144
|
+
"Pick a version from the installed repository: "
|
|
145
|
+
'ha_get_hacs_info(action="info", '
|
|
146
|
+
f'repository_id="{owner}", include_releases=True), then '
|
|
147
|
+
f'ha_manage_hacs(action="download", repository_id="{owner}", '
|
|
148
|
+
'version="<one of its tags>").',
|
|
149
|
+
"Or omit version to install its latest release.",
|
|
150
|
+
],
|
|
151
|
+
context={"repository_id": repository_id, "version": version},
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
target_version = translate_version(version, owner)
|
|
155
|
+
note = (
|
|
156
|
+
f"{repository_id} was rerouted to {owner}, which already owns "
|
|
157
|
+
"custom_components/ha_mcp_tools; HA-MCP stays on the one listing it "
|
|
158
|
+
"was installed from."
|
|
159
|
+
)
|
|
160
|
+
if target_version != version:
|
|
161
|
+
note += f" The version was renamed from {version} to {target_version}."
|
|
162
|
+
return owner, target_version, note
|