ha-mcp-dev 8.6.0.dev2841__tar.gz → 8.6.0.dev2846__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/PKG-INFO +1 -1
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/pyproject.toml +1 -1
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/pyproject.toml.orig +1 -1
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/config.py +396 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/config_backup.py +258 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/config_overrides.py +502 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/config_registry.py +493 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/config_settings.py +643 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/tools/device_enrichment.py +133 -0
- ha_mcp_dev-8.6.0.dev2846/src/ha_mcp/tools/entity_update_fields.py +68 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/helpers.py +43 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_entities.py +69 -81
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_registry.py +32 -135
- ha_mcp_dev-8.6.0.dev2841/src/ha_mcp/config.py +0 -2157
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.6.0.dev2841 → ha_mcp_dev-8.6.0.dev2846}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.6.0.
|
|
7
|
+
version = "8.6.0.dev2846"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.6.0.
|
|
7
|
+
version = "8.6.0.dev2846"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration management for Home Assistant MCP Server.
|
|
3
|
+
|
|
4
|
+
The ``Settings`` model, the runtime-editable registries and the override
|
|
5
|
+
loaders live in the ``config_*`` modules and are re-exported here. This
|
|
6
|
+
module holds the settings singleton and the embedded-mode connection.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# isort: off
|
|
10
|
+
from ha_mcp.config_backup import (
|
|
11
|
+
_apply_backup_overrides as _apply_backup_overrides,
|
|
12
|
+
get_backup_setting_origin as get_backup_setting_origin,
|
|
13
|
+
)
|
|
14
|
+
from ha_mcp.config_overrides import (
|
|
15
|
+
_BETA_GATE_LOGGED as _BETA_GATE_LOGGED,
|
|
16
|
+
_apply_advanced_overrides as _apply_advanced_overrides,
|
|
17
|
+
_apply_feature_flag_overrides as _apply_feature_flag_overrides,
|
|
18
|
+
_coerce_advanced_override_value as _coerce_advanced_override_value,
|
|
19
|
+
_read_feature_flag_override_file as _read_feature_flag_override_file,
|
|
20
|
+
get_feature_flag_origin as get_feature_flag_origin,
|
|
21
|
+
)
|
|
22
|
+
from ha_mcp.config_registry import (
|
|
23
|
+
_ADVANCED_SETTINGS_BOUNDS as _ADVANCED_SETTINGS_BOUNDS,
|
|
24
|
+
_ADVANCED_SETTINGS_CHOICES as _ADVANCED_SETTINGS_CHOICES,
|
|
25
|
+
_ADVANCED_SETTINGS_SENTINELS as _ADVANCED_SETTINGS_SENTINELS,
|
|
26
|
+
_FEATURE_FLAG_INT_BOUNDS as _FEATURE_FLAG_INT_BOUNDS,
|
|
27
|
+
_FEATURE_FLAG_OVERRIDE_FILENAME as _FEATURE_FLAG_OVERRIDE_FILENAME,
|
|
28
|
+
ADDON_SYNCED_ADVANCED_FIELDS as ADDON_SYNCED_ADVANCED_FIELDS,
|
|
29
|
+
ADVANCED_SETTINGS_FIELDS as ADVANCED_SETTINGS_FIELDS,
|
|
30
|
+
BACKUP_OVERRIDE_FIELDS as BACKUP_OVERRIDE_FIELDS,
|
|
31
|
+
BETA_FEATURE_FIELDS as BETA_FEATURE_FIELDS,
|
|
32
|
+
FEATURE_FLAG_FIELDS as FEATURE_FLAG_FIELDS,
|
|
33
|
+
AdvancedField as AdvancedField,
|
|
34
|
+
BackupOverrideField as BackupOverrideField,
|
|
35
|
+
FeatureFlagField as FeatureFlagField,
|
|
36
|
+
)
|
|
37
|
+
from ha_mcp.config_settings import (
|
|
38
|
+
_PACKAGE_VERSION as _PACKAGE_VERSION,
|
|
39
|
+
OAUTH_MODE_TOKEN as OAUTH_MODE_TOKEN,
|
|
40
|
+
OAUTH_MODE_URL as OAUTH_MODE_URL,
|
|
41
|
+
Settings as Settings,
|
|
42
|
+
get_settings as get_settings,
|
|
43
|
+
)
|
|
44
|
+
# isort: on
|
|
45
|
+
|
|
46
|
+
__all__ = [
|
|
47
|
+
"ADDON_SYNCED_ADVANCED_FIELDS",
|
|
48
|
+
"ADVANCED_SETTINGS_FIELDS",
|
|
49
|
+
"BACKUP_OVERRIDE_FIELDS",
|
|
50
|
+
"BETA_FEATURE_FIELDS",
|
|
51
|
+
"FEATURE_FLAG_FIELDS",
|
|
52
|
+
"OAUTH_MODE_TOKEN",
|
|
53
|
+
"OAUTH_MODE_URL",
|
|
54
|
+
"_ADVANCED_SETTINGS_BOUNDS",
|
|
55
|
+
"_ADVANCED_SETTINGS_CHOICES",
|
|
56
|
+
"_ADVANCED_SETTINGS_SENTINELS",
|
|
57
|
+
"_FEATURE_FLAG_INT_BOUNDS",
|
|
58
|
+
"_FEATURE_FLAG_OVERRIDE_FILENAME",
|
|
59
|
+
"_PACKAGE_VERSION",
|
|
60
|
+
"BackupOverrideField",
|
|
61
|
+
"FeatureFlagField",
|
|
62
|
+
"Settings",
|
|
63
|
+
"_coerce_advanced_override_value",
|
|
64
|
+
"_read_feature_flag_override_file",
|
|
65
|
+
"_reset_global_settings",
|
|
66
|
+
"_settings",
|
|
67
|
+
"get_backup_setting_origin",
|
|
68
|
+
"get_embedded_config_dir",
|
|
69
|
+
"get_feature_flag_origin",
|
|
70
|
+
"get_global_settings",
|
|
71
|
+
"get_settings",
|
|
72
|
+
"parse_extra_yaml_write_keys",
|
|
73
|
+
"reset_global_settings",
|
|
74
|
+
"set_embedded_connection",
|
|
75
|
+
"should_emit_llm_api_metadata",
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def parse_extra_yaml_write_keys(settings: "Settings") -> list[str]:
|
|
80
|
+
"""Parse ``extra_yaml_write_keys`` into a clean key list (#1887).
|
|
81
|
+
|
|
82
|
+
Whitespace and empty entries are dropped and the result is deduplicated
|
|
83
|
+
and sorted, so the service payload is deterministic and unaffected by how
|
|
84
|
+
the operator spaced the setting.
|
|
85
|
+
|
|
86
|
+
The component's ``YAML_KEY_DENYLIST`` is NOT applied here: that floor
|
|
87
|
+
lives component-side, in the layer that authorizes the write. Mirroring it
|
|
88
|
+
would mean a second copy to keep in lockstep for no gain: a denied key sent
|
|
89
|
+
on the wire is dropped there anyway.
|
|
90
|
+
|
|
91
|
+
Lives in this module rather than next to the YAML tool because the backup
|
|
92
|
+
restore path needs it too, and ``backup_manager`` importing a ``tools_*``
|
|
93
|
+
module would add an import edge that binds ``tools_yaml_config``'s
|
|
94
|
+
module-level names at restore time.
|
|
95
|
+
"""
|
|
96
|
+
# Direct attribute access, matching ``_disabled_packages_keys``: a future
|
|
97
|
+
# rename must raise loudly rather than silently return an empty list,
|
|
98
|
+
# which would read as "the operator configured nothing".
|
|
99
|
+
raw = settings.extra_yaml_write_keys or ""
|
|
100
|
+
return sorted({segment.strip() for segment in raw.split(",") if segment.strip()})
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# Global settings instance
|
|
104
|
+
_settings: Settings | None = None
|
|
105
|
+
|
|
106
|
+
# In-process (embedded) HA connection, set only when ha-mcp runs inside Home
|
|
107
|
+
# Assistant core via the ha_mcp_tools custom component's in-process server entry.
|
|
108
|
+
# The component hands the loopback URL + a provisioned admin token to ha-mcp
|
|
109
|
+
# THROUGH THIS DICT — never
|
|
110
|
+
# via os.environ — so the admin token can't be read from the shared HA process
|
|
111
|
+
# environment. Applied onto the Settings singleton in ``get_global_settings``.
|
|
112
|
+
_EMBEDDED_CONNECTION: dict[str, str | bool] = {}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def set_embedded_connection(
|
|
116
|
+
url: str,
|
|
117
|
+
token: str,
|
|
118
|
+
verify_ssl: bool | None = None,
|
|
119
|
+
config_dir: str | None = None,
|
|
120
|
+
llm_api_enabled: bool | None = None,
|
|
121
|
+
) -> None:
|
|
122
|
+
"""Register the in-process HA connection for embedded mode.
|
|
123
|
+
|
|
124
|
+
Embedded-mode only: called by the ha_mcp_tools custom component's in-process
|
|
125
|
+
server entry inside its server worker thread, before the server is
|
|
126
|
+
constructed, so the loopback URL
|
|
127
|
+
and admin token reach ``Settings`` in memory instead of through ``os.environ``.
|
|
128
|
+
The values survive ``_reset_global_settings()``: the settings-UI reset+rebuild
|
|
129
|
+
path re-applies them on the next ``get_global_settings()`` call.
|
|
130
|
+
|
|
131
|
+
Also applies to an ALREADY-BUILT singleton: importing ``ha_mcp`` runs the
|
|
132
|
+
package's eager import chain, and ``tools/smart_search/_config.py`` builds
|
|
133
|
+
the settings singleton at import time (its documented read-once budgets).
|
|
134
|
+
Registration therefore cannot assume it runs before the first build — the
|
|
135
|
+
integration imports this function from the very package whose import
|
|
136
|
+
creates the singleton.
|
|
137
|
+
|
|
138
|
+
``verify_ssl`` lets the component disable certificate verification when it
|
|
139
|
+
derives an ``https://127.0.0.1`` loopback URL from Home Assistant's SSL
|
|
140
|
+
config (issue #1890): HA's certificate is issued for its hostname, never
|
|
141
|
+
for 127.0.0.1, so verification on the loopback connection can only fail.
|
|
142
|
+
``None`` (the default, and what pre-#1890 components pass implicitly)
|
|
143
|
+
leaves ``Settings.verify_ssl`` alone.
|
|
144
|
+
|
|
145
|
+
``config_dir`` is Home Assistant's own configuration directory (#2329).
|
|
146
|
+
Embedded mode is its only writer and it is read back through
|
|
147
|
+
:func:`get_embedded_config_dir` alone — deliberately NOT a ``Settings``
|
|
148
|
+
field, so no env var or override file can point it anywhere. It lets an
|
|
149
|
+
in-process server read a blueprint's on-disk YAML directly instead of
|
|
150
|
+
routing the read through the component, and grants nothing an external
|
|
151
|
+
server could not already reach.
|
|
152
|
+
"""
|
|
153
|
+
_EMBEDDED_CONNECTION["url"] = url
|
|
154
|
+
_EMBEDDED_CONNECTION["token"] = token
|
|
155
|
+
if verify_ssl is None:
|
|
156
|
+
_EMBEDDED_CONNECTION.pop("verify_ssl", None)
|
|
157
|
+
else:
|
|
158
|
+
_EMBEDDED_CONNECTION["verify_ssl"] = verify_ssl
|
|
159
|
+
if config_dir is None:
|
|
160
|
+
_EMBEDDED_CONNECTION.pop("config_dir", None)
|
|
161
|
+
else:
|
|
162
|
+
_EMBEDDED_CONNECTION["config_dir"] = config_dir
|
|
163
|
+
if llm_api_enabled is None:
|
|
164
|
+
_EMBEDDED_CONNECTION.pop("llm_api_enabled", None)
|
|
165
|
+
else:
|
|
166
|
+
_EMBEDDED_CONNECTION["llm_api_enabled"] = llm_api_enabled
|
|
167
|
+
if _settings is not None:
|
|
168
|
+
_apply_embedded_connection(_settings)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def get_embedded_config_dir() -> str | None:
|
|
172
|
+
"""Home Assistant's configuration directory, when running embedded.
|
|
173
|
+
|
|
174
|
+
``None`` outside embedded mode, and on an embedded install whose component
|
|
175
|
+
predates the ``config_dir`` keyword. Consumers must treat it as an optional
|
|
176
|
+
capability and fall back to their component / service path.
|
|
177
|
+
"""
|
|
178
|
+
config_dir = _EMBEDDED_CONNECTION.get("config_dir")
|
|
179
|
+
return config_dir if isinstance(config_dir, str) and config_dir else None
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def should_emit_llm_api_metadata() -> bool:
|
|
183
|
+
"""Return whether ``tools/list`` needs the component's private metadata.
|
|
184
|
+
|
|
185
|
+
Standalone and add-on clients have no consumer for ``_meta.ha_mcp``. An
|
|
186
|
+
embedded server needs it only when the custom component exposes its LLM
|
|
187
|
+
API. A missing flag means an older component, so preserve the historical
|
|
188
|
+
embedded behavior until that component is upgraded.
|
|
189
|
+
"""
|
|
190
|
+
if not _EMBEDDED_CONNECTION:
|
|
191
|
+
return False
|
|
192
|
+
enabled = _EMBEDDED_CONNECTION.get("llm_api_enabled")
|
|
193
|
+
return enabled if isinstance(enabled, bool) else True
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _reset_embedded_connection() -> None:
|
|
197
|
+
"""Drop the registered embedded connection (test seam).
|
|
198
|
+
|
|
199
|
+
Sibling to :func:`_reset_global_settings`; lets suites that exercise the
|
|
200
|
+
in-process token channel isolate state between tests. Not used in production —
|
|
201
|
+
the connection is registered once per worker thread and is meant to persist.
|
|
202
|
+
"""
|
|
203
|
+
_EMBEDDED_CONNECTION.clear()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _apply_embedded_connection(settings: "Settings") -> None:
|
|
207
|
+
"""Apply the in-process embedded HA connection (url/token/verify_ssl) if registered.
|
|
208
|
+
|
|
209
|
+
No-op outside embedded mode. Plain ``setattr`` (``validate_assignment`` is off
|
|
210
|
+
on ``Settings``, mirroring ``_apply_backup_overrides``), so the loopback URL
|
|
211
|
+
and admin token are set in memory without ever passing through ``os.environ``.
|
|
212
|
+
Applied last so it wins over any env/override-file connection values.
|
|
213
|
+
"""
|
|
214
|
+
url = _EMBEDDED_CONNECTION.get("url")
|
|
215
|
+
token = _EMBEDDED_CONNECTION.get("token")
|
|
216
|
+
if isinstance(url, str) and url:
|
|
217
|
+
settings.homeassistant_url = url.rstrip("/")
|
|
218
|
+
if isinstance(token, str) and token:
|
|
219
|
+
settings.homeassistant_token = token
|
|
220
|
+
verify_ssl = _EMBEDDED_CONNECTION.get("verify_ssl")
|
|
221
|
+
if isinstance(verify_ssl, bool):
|
|
222
|
+
settings.verify_ssl = verify_ssl
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def get_global_settings() -> Settings:
|
|
226
|
+
"""Get global settings instance (singleton pattern).
|
|
227
|
+
|
|
228
|
+
Applies override files at first read so web-UI edits take effect
|
|
229
|
+
on the next ``get_global_settings()`` call after
|
|
230
|
+
``_reset_global_settings()`` is called by the POST handler:
|
|
231
|
+
|
|
232
|
+
- Feature flags persisted to ``<data_dir>/feature_flags.json``
|
|
233
|
+
- Auto-backup settings persisted to ``<data_dir>/backup_settings.json``
|
|
234
|
+
|
|
235
|
+
In embedded mode, the in-process HA connection registered via
|
|
236
|
+
``set_embedded_connection`` is applied last (so a settings-UI reset+rebuild
|
|
237
|
+
re-picks it up).
|
|
238
|
+
"""
|
|
239
|
+
global _settings
|
|
240
|
+
if _settings is None:
|
|
241
|
+
_settings = get_settings()
|
|
242
|
+
_apply_feature_flag_overrides(_settings)
|
|
243
|
+
_apply_backup_overrides(_settings)
|
|
244
|
+
_apply_advanced_overrides(_settings)
|
|
245
|
+
_apply_embedded_connection(_settings)
|
|
246
|
+
return _settings
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def reset_global_settings() -> None:
|
|
250
|
+
"""Public seam to drop the cached settings singleton.
|
|
251
|
+
|
|
252
|
+
The in-process (embedded) server calls this at every start: a config-entry
|
|
253
|
+
reload reuses the same Python process, so without an explicit reset the
|
|
254
|
+
singleton built on the FIRST start would keep serving stale feature-flag /
|
|
255
|
+
override values forever (the add-on gets fresh settings for free from its
|
|
256
|
+
process restart).
|
|
257
|
+
"""
|
|
258
|
+
_reset_global_settings()
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def _reset_global_settings() -> None:
|
|
262
|
+
"""Drop the cached settings singleton.
|
|
263
|
+
|
|
264
|
+
Test seam so suites that mutate env vars can force a re-read
|
|
265
|
+
without reaching into module-private state. Also used by the
|
|
266
|
+
feature-flag and auto-backup settings POST handlers to publish a
|
|
267
|
+
freshly edited override file value to runtime consumers
|
|
268
|
+
(``get_global_settings`` is the only documented read path; the
|
|
269
|
+
``@with_auto_backup`` decorator reads it per tool call).
|
|
270
|
+
"""
|
|
271
|
+
global _settings
|
|
272
|
+
_settings = None
|
|
273
|
+
# Drop the gate-log dedup set too — once Settings has been
|
|
274
|
+
# rebuilt, an operator who's re-investigating "why is my beta
|
|
275
|
+
# tool off?" should see the next gate fire logged. This keeps
|
|
276
|
+
# the dedup tight to the lifetime of one cached Settings.
|
|
277
|
+
_BETA_GATE_LOGGED.clear()
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
# Import-time validator for cross-registry invariants.
|
|
281
|
+
#
|
|
282
|
+
# Catches a class of silent runtime bugs at module load:
|
|
283
|
+
# - registry rows referencing fields that don't exist on ``Settings``
|
|
284
|
+
# (rename / removal drift)
|
|
285
|
+
# - registries overlapping by name (same field applied by two
|
|
286
|
+
# ``_apply_*_overrides`` functions with potentially divergent
|
|
287
|
+
# coercion policies)
|
|
288
|
+
# - bounds entries pointing at non-numeric fields (would silently
|
|
289
|
+
# no-op in the apply loop)
|
|
290
|
+
# - choices entries pointing at non-str fields (same)
|
|
291
|
+
# - ``BETA_FEATURE_FIELDS`` referencing names not in
|
|
292
|
+
# ``FEATURE_FLAG_FIELDS`` (master gate would write to phantom
|
|
293
|
+
# Settings attributes)
|
|
294
|
+
def _validate_registry_fields_exist(
|
|
295
|
+
settings_fields: set[str],
|
|
296
|
+
advanced_names: set[str],
|
|
297
|
+
flag_names: set[str],
|
|
298
|
+
backup_names: set[str],
|
|
299
|
+
) -> None:
|
|
300
|
+
"""Every registry row must reference a real Settings field."""
|
|
301
|
+
for registry_name, names in (
|
|
302
|
+
("ADVANCED_SETTINGS_FIELDS", advanced_names),
|
|
303
|
+
("FEATURE_FLAG_FIELDS", flag_names),
|
|
304
|
+
("BACKUP_OVERRIDE_FIELDS", backup_names),
|
|
305
|
+
):
|
|
306
|
+
missing = names - settings_fields
|
|
307
|
+
if missing:
|
|
308
|
+
raise RuntimeError(
|
|
309
|
+
f"{registry_name} references fields not on Settings: {sorted(missing)}"
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _validate_registries_disjoint(
|
|
314
|
+
advanced_names: set[str], flag_names: set[str], backup_names: set[str]
|
|
315
|
+
) -> None:
|
|
316
|
+
"""Registries must be name-disjoint to avoid double-apply with divergent policies."""
|
|
317
|
+
overlaps = {
|
|
318
|
+
("advanced", "flags"): advanced_names & flag_names,
|
|
319
|
+
("advanced", "backup"): advanced_names & backup_names,
|
|
320
|
+
("flags", "backup"): flag_names & backup_names,
|
|
321
|
+
}
|
|
322
|
+
for (a, b), shared in overlaps.items():
|
|
323
|
+
if shared:
|
|
324
|
+
raise RuntimeError(
|
|
325
|
+
f"Registry overlap between {a} and {b}: {sorted(shared)}. "
|
|
326
|
+
"Each field must be applied by exactly one of "
|
|
327
|
+
"_apply_feature_flag_overrides / _apply_advanced_overrides "
|
|
328
|
+
"/ _apply_backup_overrides."
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _validate_advanced_bounds(advanced_by_name: dict[str, AdvancedField]) -> None:
|
|
333
|
+
"""_ADVANCED_SETTINGS_BOUNDS keys must be advanced fields AND numeric."""
|
|
334
|
+
for name in _ADVANCED_SETTINGS_BOUNDS:
|
|
335
|
+
if name not in advanced_by_name:
|
|
336
|
+
raise RuntimeError(
|
|
337
|
+
f"_ADVANCED_SETTINGS_BOUNDS[{name!r}] is not in "
|
|
338
|
+
"ADVANCED_SETTINGS_FIELDS"
|
|
339
|
+
)
|
|
340
|
+
if advanced_by_name[name].ftype not in (int, float):
|
|
341
|
+
raise RuntimeError(
|
|
342
|
+
f"_ADVANCED_SETTINGS_BOUNDS[{name!r}] is on a non-numeric "
|
|
343
|
+
f"field (type={advanced_by_name[name].ftype.__name__})"
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def _validate_advanced_choices(advanced_by_name: dict[str, AdvancedField]) -> None:
|
|
348
|
+
"""_ADVANCED_SETTINGS_CHOICES keys must be advanced fields AND str."""
|
|
349
|
+
for name in _ADVANCED_SETTINGS_CHOICES:
|
|
350
|
+
if name not in advanced_by_name:
|
|
351
|
+
raise RuntimeError(
|
|
352
|
+
f"_ADVANCED_SETTINGS_CHOICES[{name!r}] is not in "
|
|
353
|
+
"ADVANCED_SETTINGS_FIELDS"
|
|
354
|
+
)
|
|
355
|
+
if advanced_by_name[name].ftype is not str:
|
|
356
|
+
raise RuntimeError(
|
|
357
|
+
f"_ADVANCED_SETTINGS_CHOICES[{name!r}] is on a non-str "
|
|
358
|
+
f"field (type={advanced_by_name[name].ftype.__name__})"
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def _validate_beta_subset(flag_names: set[str]) -> None:
|
|
363
|
+
"""BETA_FEATURE_FIELDS must be a subset of FEATURE_FLAG_FIELDS.
|
|
364
|
+
|
|
365
|
+
The master gate writes to them via setattr; phantom names would
|
|
366
|
+
silently land on extras with no effect on the runtime gate.
|
|
367
|
+
"""
|
|
368
|
+
beta_set = set(BETA_FEATURE_FIELDS)
|
|
369
|
+
not_in_flags = beta_set - flag_names
|
|
370
|
+
if not_in_flags:
|
|
371
|
+
raise RuntimeError(
|
|
372
|
+
f"BETA_FEATURE_FIELDS contains names not in FEATURE_FLAG_FIELDS: "
|
|
373
|
+
f"{sorted(not_in_flags)}"
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def _validate_registries() -> None:
|
|
378
|
+
settings_fields = set(Settings.model_fields.keys())
|
|
379
|
+
|
|
380
|
+
advanced_names = {f.field for f in ADVANCED_SETTINGS_FIELDS}
|
|
381
|
+
flag_names = {f.field for f in FEATURE_FLAG_FIELDS}
|
|
382
|
+
backup_names = {f.field for f in BACKUP_OVERRIDE_FIELDS}
|
|
383
|
+
|
|
384
|
+
_validate_registry_fields_exist(
|
|
385
|
+
settings_fields, advanced_names, flag_names, backup_names
|
|
386
|
+
)
|
|
387
|
+
_validate_registries_disjoint(advanced_names, flag_names, backup_names)
|
|
388
|
+
|
|
389
|
+
advanced_by_name = {f.field: f for f in ADVANCED_SETTINGS_FIELDS}
|
|
390
|
+
_validate_advanced_bounds(advanced_by_name)
|
|
391
|
+
_validate_advanced_choices(advanced_by_name)
|
|
392
|
+
|
|
393
|
+
_validate_beta_subset(flag_names)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
_validate_registries()
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""Auto-backup settings overrides read from ``backup_settings.json``."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ha_mcp._version import is_running_in_addon
|
|
8
|
+
from ha_mcp.config_registry import (
|
|
9
|
+
_BACKUP_OVERRIDE_FILENAME,
|
|
10
|
+
BACKUP_OVERRIDE_FIELDS,
|
|
11
|
+
RegistryFieldType,
|
|
12
|
+
)
|
|
13
|
+
from ha_mcp.config_settings import Settings
|
|
14
|
+
|
|
15
|
+
# All config modules log under the ``ha_mcp.config`` logger name.
|
|
16
|
+
logger = logging.getLogger("ha_mcp.config")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_backup_setting_origin(env_name: str) -> str:
|
|
20
|
+
"""Return where the live value for ``env_name`` is sourced from.
|
|
21
|
+
|
|
22
|
+
Used by the web UI to label each auto-backup field with its source
|
|
23
|
+
and decide whether the field is editable from the web UI:
|
|
24
|
+
|
|
25
|
+
- ``"addon"``: running inside the HA add-on. ``start.py`` always
|
|
26
|
+
writes these env vars from ``config.yaml`` on every addon start;
|
|
27
|
+
the override file is ignored. Web UI edits are routed through
|
|
28
|
+
Supervisor ``/addons/self/options`` so ``config.yaml`` stays
|
|
29
|
+
authoritative.
|
|
30
|
+
- ``"env"``: env var explicitly set in the process environment
|
|
31
|
+
(includes values loaded from ``.env`` via ``load_dotenv`` at
|
|
32
|
+
module import — those land in ``os.environ`` and are
|
|
33
|
+
indistinguishable from ``docker -e`` / shell-set values, which is
|
|
34
|
+
intentional per the deployment design). Web UI shows the field
|
|
35
|
+
read-only; user must unset / remove the env var to edit.
|
|
36
|
+
- ``"file"``: standalone deployment with a value persisted in
|
|
37
|
+
``<data_dir>/backup_settings.json``. Web UI edits update the
|
|
38
|
+
file in place.
|
|
39
|
+
- ``"default"``: no env var and no override file entry; the
|
|
40
|
+
pydantic field default applies. Web UI edits create the file.
|
|
41
|
+
"""
|
|
42
|
+
# is_running_in_addon() rather than a raw SUPERVISOR_TOKEN read so the
|
|
43
|
+
# embedded in-process server (SUPERVISOR_TOKEN present on HAOS, but not an
|
|
44
|
+
# add-on) is labeled a standalone deployment and its backup settings persist
|
|
45
|
+
# to the override file instead of a non-existent Supervisor add-on.
|
|
46
|
+
if is_running_in_addon():
|
|
47
|
+
return "addon"
|
|
48
|
+
if os.environ.get(env_name) is not None:
|
|
49
|
+
return "env"
|
|
50
|
+
field_name = next(
|
|
51
|
+
(fname for fname, ename, _ in BACKUP_OVERRIDE_FIELDS if ename == env_name),
|
|
52
|
+
None,
|
|
53
|
+
)
|
|
54
|
+
if field_name is None:
|
|
55
|
+
return "default"
|
|
56
|
+
overrides = _read_backup_override_file()
|
|
57
|
+
if field_name in overrides:
|
|
58
|
+
return "file"
|
|
59
|
+
return "default"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _read_backup_override_file() -> dict[str, object]:
|
|
63
|
+
"""Return the contents of the auto-backup override file, or ``{}``.
|
|
64
|
+
|
|
65
|
+
Best-effort: a corrupt file MUST NOT break Settings loading. The
|
|
66
|
+
failure modes split into two categories that need different
|
|
67
|
+
treatment (mirrors ``_read_feature_flag_override_file``):
|
|
68
|
+
|
|
69
|
+
* **Silent**: file does not exist. The override layer is opt-in;
|
|
70
|
+
a missing file is the normal "user has never edited" state and
|
|
71
|
+
should not log.
|
|
72
|
+
* **Loud (WARNING)**: file exists but is unreadable
|
|
73
|
+
(``PermissionError``, broken filesystem) or unparseable
|
|
74
|
+
(``JSONDecodeError``). The user toggled something, the UI said
|
|
75
|
+
"Saved", and the value is silently being ignored. Without a
|
|
76
|
+
log line they have no diagnostic; with one, the sidecar/server
|
|
77
|
+
log tells them exactly what to fix.
|
|
78
|
+
|
|
79
|
+
Reads are not cached — callers (Settings construction, the GET
|
|
80
|
+
endpoint) hit disk each time, which is fine for a small JSON file
|
|
81
|
+
behind a singleton-cached Settings.
|
|
82
|
+
"""
|
|
83
|
+
import json
|
|
84
|
+
from pathlib import Path
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
from .utils.data_paths import get_data_dir
|
|
88
|
+
|
|
89
|
+
path: Path = get_data_dir() / _BACKUP_OVERRIDE_FILENAME
|
|
90
|
+
except (RuntimeError, OSError):
|
|
91
|
+
# Couldn't resolve the data dir at all — user has no override
|
|
92
|
+
# file by definition. Silent.
|
|
93
|
+
return {}
|
|
94
|
+
try:
|
|
95
|
+
raw = path.read_text()
|
|
96
|
+
except FileNotFoundError:
|
|
97
|
+
return {}
|
|
98
|
+
except OSError:
|
|
99
|
+
logger.warning(
|
|
100
|
+
"Auto-backup override file at %s exists but is unreadable; "
|
|
101
|
+
"falling back to defaults. Check filesystem permissions.",
|
|
102
|
+
path,
|
|
103
|
+
exc_info=True,
|
|
104
|
+
)
|
|
105
|
+
return {}
|
|
106
|
+
try:
|
|
107
|
+
data = json.loads(raw)
|
|
108
|
+
except ValueError:
|
|
109
|
+
logger.warning(
|
|
110
|
+
"Auto-backup override file at %s is not valid JSON; "
|
|
111
|
+
"falling back to defaults. Delete or fix the file to "
|
|
112
|
+
"re-enable persisted toggles.",
|
|
113
|
+
path,
|
|
114
|
+
)
|
|
115
|
+
return {}
|
|
116
|
+
if not isinstance(data, dict):
|
|
117
|
+
logger.warning(
|
|
118
|
+
"Auto-backup override file at %s is not a JSON object "
|
|
119
|
+
"(got %s); falling back to defaults.",
|
|
120
|
+
path,
|
|
121
|
+
type(data).__name__,
|
|
122
|
+
)
|
|
123
|
+
return {}
|
|
124
|
+
return data
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _coerce_backup_int_value(field_name: str, raw: object) -> tuple[bool, Any]:
|
|
128
|
+
"""Coerce + per-field range-check one int-typed BACKUP_OVERRIDE_FIELDS value.
|
|
129
|
+
|
|
130
|
+
Split out of ``_coerce_backup_override_value`` (mccabe complexity):
|
|
131
|
+
handles the int-parse plus the three field-specific range checks.
|
|
132
|
+
"""
|
|
133
|
+
if isinstance(raw, bool) or not isinstance(raw, int):
|
|
134
|
+
logger.warning(
|
|
135
|
+
"backup_settings.json: %s expects int, got %s; ignoring",
|
|
136
|
+
field_name,
|
|
137
|
+
type(raw).__name__,
|
|
138
|
+
)
|
|
139
|
+
return False, None
|
|
140
|
+
coerced = int(raw)
|
|
141
|
+
if field_name == "auto_backup_throttle_minutes" and not 0 <= coerced <= 1440:
|
|
142
|
+
logger.warning(
|
|
143
|
+
"backup_settings.json: auto_backup_throttle_minutes=%d out of "
|
|
144
|
+
"range 0..1440; ignoring",
|
|
145
|
+
coerced,
|
|
146
|
+
)
|
|
147
|
+
return False, None
|
|
148
|
+
if field_name == "auto_backup_retain_per_entity" and not 1 <= coerced <= 10_000:
|
|
149
|
+
logger.warning(
|
|
150
|
+
"backup_settings.json: auto_backup_retain_per_entity=%d out of "
|
|
151
|
+
"range 1..10000; ignoring",
|
|
152
|
+
coerced,
|
|
153
|
+
)
|
|
154
|
+
return False, None
|
|
155
|
+
if field_name == "auto_backup_calendar_lookahead_days" and not 1 <= coerced <= 365:
|
|
156
|
+
logger.warning(
|
|
157
|
+
"backup_settings.json: auto_backup_calendar_lookahead_days=%d out of "
|
|
158
|
+
"range 1..365; ignoring",
|
|
159
|
+
coerced,
|
|
160
|
+
)
|
|
161
|
+
return False, None
|
|
162
|
+
if field_name == "snapshot_delete_min_age_days" and not 0 <= coerced <= 365:
|
|
163
|
+
logger.warning(
|
|
164
|
+
"backup_settings.json: snapshot_delete_min_age_days=%d out of "
|
|
165
|
+
"range 0..365; ignoring",
|
|
166
|
+
coerced,
|
|
167
|
+
)
|
|
168
|
+
return False, None
|
|
169
|
+
return True, coerced
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _coerce_backup_override_value(
|
|
173
|
+
field_name: str, ftype: RegistryFieldType, raw: object
|
|
174
|
+
) -> tuple[bool, Any]:
|
|
175
|
+
"""Coerce + range-check one override-file value for BACKUP_OVERRIDE_FIELDS.
|
|
176
|
+
|
|
177
|
+
Returns ``(ok, coerced)``. ``ok=False`` means the value was rejected
|
|
178
|
+
(a warning has already been logged) and the caller should skip
|
|
179
|
+
applying it.
|
|
180
|
+
"""
|
|
181
|
+
if ftype is bool:
|
|
182
|
+
if not isinstance(raw, bool | int):
|
|
183
|
+
logger.warning(
|
|
184
|
+
"backup_settings.json: %s expects bool, got %s; ignoring",
|
|
185
|
+
field_name,
|
|
186
|
+
type(raw).__name__,
|
|
187
|
+
)
|
|
188
|
+
return False, None
|
|
189
|
+
return True, bool(raw)
|
|
190
|
+
elif ftype is int:
|
|
191
|
+
return _coerce_backup_int_value(field_name, raw)
|
|
192
|
+
elif ftype is str:
|
|
193
|
+
if not isinstance(raw, str):
|
|
194
|
+
logger.warning(
|
|
195
|
+
"backup_settings.json: %s expects str, got %s; ignoring",
|
|
196
|
+
field_name,
|
|
197
|
+
type(raw).__name__,
|
|
198
|
+
)
|
|
199
|
+
return False, None
|
|
200
|
+
if "\x00" in raw:
|
|
201
|
+
logger.warning(
|
|
202
|
+
"backup_settings.json: %s contains null byte; ignoring",
|
|
203
|
+
field_name,
|
|
204
|
+
)
|
|
205
|
+
return False, None
|
|
206
|
+
return True, raw
|
|
207
|
+
return False, None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _apply_one_backup_override(
|
|
211
|
+
settings: "Settings",
|
|
212
|
+
field_name: str,
|
|
213
|
+
env_name: str,
|
|
214
|
+
ftype: RegistryFieldType,
|
|
215
|
+
overrides: dict[str, object],
|
|
216
|
+
) -> None:
|
|
217
|
+
"""Apply a single BACKUP_OVERRIDE_FIELDS override-file entry, if eligible."""
|
|
218
|
+
if os.environ.get(env_name) is not None:
|
|
219
|
+
return
|
|
220
|
+
if field_name not in overrides:
|
|
221
|
+
return
|
|
222
|
+
ok, coerced = _coerce_backup_override_value(
|
|
223
|
+
field_name, ftype, overrides[field_name]
|
|
224
|
+
)
|
|
225
|
+
if not ok:
|
|
226
|
+
return
|
|
227
|
+
try:
|
|
228
|
+
setattr(settings, field_name, coerced)
|
|
229
|
+
except (ValueError, TypeError) as err:
|
|
230
|
+
logger.warning(
|
|
231
|
+
"backup_settings.json: setattr(%s, %r) rejected by Settings (%s); ignoring",
|
|
232
|
+
field_name,
|
|
233
|
+
coerced,
|
|
234
|
+
err,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def _apply_backup_overrides(settings: "Settings") -> None:
|
|
239
|
+
"""Patch ``settings`` with values from the override file, in place.
|
|
240
|
+
|
|
241
|
+
Honors the "env var wins" contract: a field whose env var is set in
|
|
242
|
+
the process environment is never overwritten. Addon mode short-
|
|
243
|
+
circuits — ``start.py`` already wrote these env vars from
|
|
244
|
+
``config.yaml`` and the override file is ignored in that mode.
|
|
245
|
+
Range / type clamping mirrors the pydantic Field bounds so a
|
|
246
|
+
corrupt override file can't push values out of range; out-of-range
|
|
247
|
+
or untypable entries are silently skipped.
|
|
248
|
+
"""
|
|
249
|
+
# is_running_in_addon() (embedded-aware) so the in-process server applies
|
|
250
|
+
# its backup override file like a standalone deployment; see the matching
|
|
251
|
+
# rationale in _apply_feature_flag_overrides / get_backup_setting_origin.
|
|
252
|
+
if is_running_in_addon():
|
|
253
|
+
return
|
|
254
|
+
overrides = _read_backup_override_file()
|
|
255
|
+
if not overrides:
|
|
256
|
+
return
|
|
257
|
+
for field_name, env_name, ftype in BACKUP_OVERRIDE_FIELDS:
|
|
258
|
+
_apply_one_backup_override(settings, field_name, env_name, ftype, overrides)
|