ha-mcp-dev 9.0.0.dev3198__tar.gz → 9.0.0.dev3202__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/PKG-INFO +1 -1
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/pyproject.toml +1 -1
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/en.json +1 -1
- ha_mcp_dev-9.0.0.dev3202/src/ha_mcp/tools/config_file_visibility.py +53 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_automations.py +2 -28
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_scripts.py +4 -31
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_filesystem.py +5 -5
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_yaml_read.py +4 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/util_helpers.py +37 -0
- ha_mcp_dev-9.0.0.dev3202/src/ha_mcp/visibility/config_files.py +103 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/visibility/enforcement.py +99 -25
- ha_mcp_dev-9.0.0.dev3202/src/ha_mcp/visibility/identifier_aliases.py +207 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.0.0.
|
|
7
|
+
version = "9.0.0.dev3202"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.0.0.
|
|
7
|
+
version = "9.0.0.dev3202"
|
|
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
|
{ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/settings_ui/locales/en.json
RENAMED
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"visibility.boundary": "Without enforce mode (below), this is noise reduction, not access control: a hidden entity is still returned by a direct read of its entity_id and still appears in automation, dashboard, and template content. Do not rely on the filter alone as a security boundary.",
|
|
104
104
|
"visibility.enabled": "Enable entity visibility filter",
|
|
105
105
|
"visibility.enforce.title": "Enforce mode",
|
|
106
|
-
"visibility.enforce.help": "Extends the filter from decluttering search and overview to every tool read except ha_report_issue by default. A direct read of a hidden entity returns “not found”, and a content read that would surface one is refused. The report-tool exception is controlled below. Best-effort concealment against incidental exposure, not a hardened security boundary.",
|
|
106
|
+
"visibility.enforce.help": "Extends the filter from decluttering search and overview to every tool read except ha_report_issue by default. A direct read of a hidden entity returns “not found”, and a content read that would surface one is refused. The report-tool exception is controlled below. Best-effort concealment against incidental exposure, not a hardened security boundary. It can also refuse more than needed: a read that only shares a hidden script, scene or automation’s key or ID may be refused too.",
|
|
107
107
|
"visibility.enforce.only_enforced": "Make hidden entities unreadable across tool reads (except issue reports by default)",
|
|
108
108
|
"visibility.enforce.report_issue_help": "While this is off, ha_report_issue and all of its diagnostic output—including logs—stay outside enforce mode on every call, even when visibility data is healthy or unavailable. Turn it on to scan and refuse that tool like other reads.",
|
|
109
109
|
"visibility.enforce.restrict_report_issue": "Apply enforce mode to ha_report_issue",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Enforce-mode guard for config-file reads (``ha_read_file``, ``ha_config_get_yaml``).
|
|
2
|
+
|
|
3
|
+
The component's ``read_file`` service applies ``tail_lines`` and ``yaml_path``
|
|
4
|
+
itself, and a slice can start anywhere inside a hidden block, so the decision is
|
|
5
|
+
made on the whole file: while enforce mode hides a script, scene or automation,
|
|
6
|
+
each YAML target is read in full first and the call is refused when that file
|
|
7
|
+
defines a hidden item. That costs one extra read per file, only in enforce mode.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
from collections.abc import Iterable
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from ..visibility.config_files import defines_hidden_item, is_yaml_path
|
|
17
|
+
from .tools_filesystem import call_mcp_tools_service
|
|
18
|
+
from .util_helpers import unwrap_service_response
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def refuse_reading_hidden_definitions(
|
|
22
|
+
client: Any, tool_name: str, paths: Iterable[str]
|
|
23
|
+
) -> None:
|
|
24
|
+
"""Refuse the call when any YAML file in ``paths`` defines a hidden item.
|
|
25
|
+
|
|
26
|
+
A file the full read cannot return is left to the real read, which reports
|
|
27
|
+
the same failure. A transport error propagates rather than letting the
|
|
28
|
+
sliced read run unchecked.
|
|
29
|
+
"""
|
|
30
|
+
from ..visibility.enforcement import (
|
|
31
|
+
active_identifier_aliases,
|
|
32
|
+
refuse_hidden_config_file,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
aliases = await active_identifier_aliases(client)
|
|
36
|
+
if aliases is None or not (aliases.script_services or aliases.storage_keys):
|
|
37
|
+
return
|
|
38
|
+
targets = [path for path in paths if is_yaml_path(path)]
|
|
39
|
+
responses = await asyncio.gather(
|
|
40
|
+
*(
|
|
41
|
+
call_mcp_tools_service(client, "read_file", {"path": path})
|
|
42
|
+
for path in targets
|
|
43
|
+
)
|
|
44
|
+
)
|
|
45
|
+
for path, response in zip(targets, responses, strict=True):
|
|
46
|
+
body = unwrap_service_response(response) if isinstance(response, dict) else {}
|
|
47
|
+
content = body.get("content")
|
|
48
|
+
# Off the event loop: the embedded server shares Home Assistant's loop,
|
|
49
|
+
# and a large file's pure-Python parse would stall it.
|
|
50
|
+
if isinstance(content, str) and await asyncio.to_thread(
|
|
51
|
+
defines_hidden_item, path, content, aliases
|
|
52
|
+
):
|
|
53
|
+
refuse_hidden_config_file(tool_name)
|
{ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
@@ -70,6 +70,7 @@ from .helpers import (
|
|
|
70
70
|
)
|
|
71
71
|
from .reference_validator import validate_config_references
|
|
72
72
|
from .tool_hints import read_only_hints, write_hints
|
|
73
|
+
from .util_helpers import list_visible_registry_ids
|
|
73
74
|
from .ws_waiters import (
|
|
74
75
|
verify_entity_removed,
|
|
75
76
|
wait_for_automation_entity_by_unique_id,
|
|
@@ -1596,33 +1597,6 @@ class AutomationConfigTools:
|
|
|
1596
1597
|
)
|
|
1597
1598
|
return response
|
|
1598
1599
|
|
|
1599
|
-
async def _list_automation_entity_ids(self) -> list[str]:
|
|
1600
|
-
"""Best-effort list of automation entity_ids (up to 10) from the entity registry.
|
|
1601
|
-
|
|
1602
|
-
Used to populate ``available_automation_ids`` in RESOURCE_NOT_FOUND
|
|
1603
|
-
error context. Returns an empty list on any failure — caller treats
|
|
1604
|
-
absence as "no IDs to report" rather than failing the structured
|
|
1605
|
-
error raise. The 10-entry cap lives here (not at the callers) so a
|
|
1606
|
-
new call site can't accidentally bloat the error payload.
|
|
1607
|
-
"""
|
|
1608
|
-
try:
|
|
1609
|
-
result = await self._client.send_websocket_message(
|
|
1610
|
-
{"type": "config/entity_registry/list"}
|
|
1611
|
-
)
|
|
1612
|
-
except Exception as e: # noqa: BLE001
|
|
1613
|
-
logger.debug("Failed to list automation entity_ids from registry: %s", e)
|
|
1614
|
-
return []
|
|
1615
|
-
entries = result.get("result", []) if isinstance(result, dict) else result
|
|
1616
|
-
if not isinstance(entries, list):
|
|
1617
|
-
return []
|
|
1618
|
-
return [
|
|
1619
|
-
entry["entity_id"]
|
|
1620
|
-
for entry in entries
|
|
1621
|
-
if isinstance(entry, dict)
|
|
1622
|
-
and isinstance(entry.get("entity_id"), str)
|
|
1623
|
-
and entry["entity_id"].startswith("automation.")
|
|
1624
|
-
][:10]
|
|
1625
|
-
|
|
1626
1600
|
async def _guard_alias_replacement(
|
|
1627
1601
|
self, identifier: str, config: dict[str, Any]
|
|
1628
1602
|
) -> str | None:
|
|
@@ -1670,7 +1644,7 @@ class AutomationConfigTools:
|
|
|
1670
1644
|
``ha_config_remove_automation``). Populates
|
|
1671
1645
|
``available_automation_ids`` (up to 10) from the entity registry.
|
|
1672
1646
|
"""
|
|
1673
|
-
available_ids = await self.
|
|
1647
|
+
available_ids = await list_visible_registry_ids(self._client, "automation")
|
|
1674
1648
|
raise_tool_error(
|
|
1675
1649
|
create_error_response(
|
|
1676
1650
|
ErrorCode.RESOURCE_NOT_FOUND,
|
{ha_mcp_dev-9.0.0.dev3198 → ha_mcp_dev-9.0.0.dev3202}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
@@ -60,6 +60,7 @@ from .helpers import (
|
|
|
60
60
|
)
|
|
61
61
|
from .reference_validator import validate_config_references
|
|
62
62
|
from .tool_hints import read_only_hints, write_hints
|
|
63
|
+
from .util_helpers import list_visible_registry_ids
|
|
63
64
|
from .ws_waiters import verify_entity_removed, wait_for_entity_registered
|
|
64
65
|
|
|
65
66
|
logger = logging.getLogger(__name__)
|
|
@@ -254,36 +255,6 @@ class ConfigScriptTools:
|
|
|
254
255
|
response.setdefault("warnings", []).extend(cat_warnings)
|
|
255
256
|
return response
|
|
256
257
|
|
|
257
|
-
async def _list_script_entity_ids(self) -> list[str]:
|
|
258
|
-
"""Best-effort list of bare script IDs (up to 10) from the entity registry.
|
|
259
|
-
|
|
260
|
-
Returns the bare storage keys (e.g. ``morning_routine``), stripping
|
|
261
|
-
the ``script.`` entity_id prefix — ``ha_config_get_script`` /
|
|
262
|
-
``ha_config_set_script`` / ``ha_config_remove_script`` all take the
|
|
263
|
-
bare form, so the entity_id prefix would force callers to strip it
|
|
264
|
-
before retry. Returns an empty list on any failure — caller treats
|
|
265
|
-
absence as "no IDs to report" rather than failing the structured
|
|
266
|
-
error raise. The 10-entry cap lives here (not at the callers) so a
|
|
267
|
-
new call site can't accidentally bloat the error payload.
|
|
268
|
-
"""
|
|
269
|
-
try:
|
|
270
|
-
result = await self._client.send_websocket_message(
|
|
271
|
-
{"type": "config/entity_registry/list"}
|
|
272
|
-
)
|
|
273
|
-
except Exception as e: # noqa: BLE001
|
|
274
|
-
logger.debug("Failed to list script entity_ids from registry: %s", e)
|
|
275
|
-
return []
|
|
276
|
-
entries = result.get("result", []) if isinstance(result, dict) else result
|
|
277
|
-
if not isinstance(entries, list):
|
|
278
|
-
return []
|
|
279
|
-
return [
|
|
280
|
-
entry["entity_id"][len("script.") :]
|
|
281
|
-
for entry in entries
|
|
282
|
-
if isinstance(entry, dict)
|
|
283
|
-
and isinstance(entry.get("entity_id"), str)
|
|
284
|
-
and entry["entity_id"].startswith("script.")
|
|
285
|
-
][:10]
|
|
286
|
-
|
|
287
258
|
async def _raise_script_not_found(self, script_id: str) -> None:
|
|
288
259
|
"""Raise a structured RESOURCE_NOT_FOUND ToolError for a missing script.
|
|
289
260
|
|
|
@@ -293,7 +264,9 @@ class ConfigScriptTools:
|
|
|
293
264
|
``ha_config_remove_script``). Populates ``available_script_ids``
|
|
294
265
|
(up to 10 bare IDs) from the entity registry.
|
|
295
266
|
"""
|
|
296
|
-
available_ids = await
|
|
267
|
+
available_ids = await list_visible_registry_ids(
|
|
268
|
+
self._client, "script", bare=True
|
|
269
|
+
)
|
|
297
270
|
raise_tool_error(
|
|
298
271
|
create_error_response(
|
|
299
272
|
ErrorCode.RESOURCE_NOT_FOUND,
|
|
@@ -702,17 +702,17 @@ class FilesystemTools:
|
|
|
702
702
|
EXAMPLE: ha_read_file(path="packages/alert2.yaml", yaml_path="alert2")
|
|
703
703
|
"""
|
|
704
704
|
try:
|
|
705
|
-
|
|
706
|
-
await _assert_mcp_tools_available(self._client)
|
|
705
|
+
from .config_file_visibility import refuse_reading_hidden_definitions
|
|
707
706
|
|
|
708
|
-
|
|
707
|
+
await _assert_mcp_tools_available(self._client)
|
|
708
|
+
await refuse_reading_hidden_definitions(
|
|
709
|
+
self._client, "ha_read_file", [path]
|
|
710
|
+
)
|
|
709
711
|
service_data: dict[str, Any] = {"path": path}
|
|
710
712
|
if tail_lines is not None:
|
|
711
713
|
service_data["tail_lines"] = tail_lines
|
|
712
714
|
if yaml_path is not None:
|
|
713
715
|
service_data["yaml_path"] = yaml_path
|
|
714
|
-
|
|
715
|
-
# Call the custom component service
|
|
716
716
|
result = await call_mcp_tools_service(
|
|
717
717
|
self._client,
|
|
718
718
|
"read_file",
|
|
@@ -27,6 +27,7 @@ from ha_mcp._vendor.fastmcp.exceptions import ToolError
|
|
|
27
27
|
from ha_mcp._vendor.fastmcp.tools import tool
|
|
28
28
|
|
|
29
29
|
from ..errors import ErrorCode, create_error_response
|
|
30
|
+
from .config_file_visibility import refuse_reading_hidden_definitions
|
|
30
31
|
from .helpers import (
|
|
31
32
|
exception_to_structured_error,
|
|
32
33
|
log_tool_usage,
|
|
@@ -441,6 +442,9 @@ class YamlReadTools:
|
|
|
441
442
|
# Strictness is a property of each target, not of the request, so
|
|
442
443
|
# the resolver reports which targets were named rather than expanded.
|
|
443
444
|
targets, resolve_warnings = await _resolve_target_files(self._client, file)
|
|
445
|
+
await refuse_reading_hidden_definitions(
|
|
446
|
+
self._client, "ha_config_get_yaml", [target for target, _ in targets]
|
|
447
|
+
)
|
|
444
448
|
|
|
445
449
|
extra: dict[str, Any] = {"include_parsed": True} if include_parsed else {}
|
|
446
450
|
# The reads are independent, so fan them out rather than paying N
|
|
@@ -335,3 +335,40 @@ def is_connection_error_message(error_msg: Any) -> bool:
|
|
|
335
335
|
"""
|
|
336
336
|
lowered = str(error_msg).lower()
|
|
337
337
|
return any(sig in lowered for sig in WS_CONNECTION_SIGNATURES)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
async def list_visible_registry_ids(
|
|
341
|
+
client: Any, domain: str, *, bare: bool = False
|
|
342
|
+
) -> list[str]:
|
|
343
|
+
"""Best-effort list of up to 10 visible ``domain`` entity IDs from the registry.
|
|
344
|
+
|
|
345
|
+
Populates the ``available_*_ids`` hint of a RESOURCE_NOT_FOUND error. With
|
|
346
|
+
``bare`` the ``<domain>.`` prefix is stripped, for tools that take the bare
|
|
347
|
+
storage-key form. Entities hidden by enforce mode are dropped so the hint
|
|
348
|
+
neither leaks a hidden ID nor trips the outbound scan. Returns an empty list
|
|
349
|
+
on any failure: the caller treats absence as "no IDs to report" rather than
|
|
350
|
+
failing the structured error raise. The cap lives here so a new call site
|
|
351
|
+
can't bloat the error payload.
|
|
352
|
+
"""
|
|
353
|
+
from ..visibility.enforcement import active_hidden_entity_ids
|
|
354
|
+
|
|
355
|
+
try:
|
|
356
|
+
result = await client.send_websocket_message(
|
|
357
|
+
{"type": "config/entity_registry/list"}
|
|
358
|
+
)
|
|
359
|
+
except Exception as e: # noqa: BLE001
|
|
360
|
+
logger.debug("Failed to list %s entity_ids from registry: %s", domain, e)
|
|
361
|
+
return []
|
|
362
|
+
entries = result.get("result", []) if isinstance(result, dict) else result
|
|
363
|
+
if not isinstance(entries, list):
|
|
364
|
+
return []
|
|
365
|
+
hidden = await active_hidden_entity_ids(client)
|
|
366
|
+
prefix = f"{domain}."
|
|
367
|
+
return [
|
|
368
|
+
entity_id.removeprefix(prefix) if bare else entity_id
|
|
369
|
+
for entry in entries
|
|
370
|
+
if isinstance(entry, dict)
|
|
371
|
+
and isinstance(entity_id := entry.get("entity_id"), str)
|
|
372
|
+
and entity_id.startswith(prefix)
|
|
373
|
+
and entity_id not in hidden
|
|
374
|
+
][:10]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Hidden script, scene and automation definitions in Home Assistant config files.
|
|
2
|
+
|
|
3
|
+
``scripts.yaml`` is keyed by storage key and ``scenes.yaml`` / ``automations.yaml``
|
|
4
|
+
list items by config ``id`` (Core's ``SCRIPT_CONFIG_PATH`` / ``SCENE_CONFIG_PATH``
|
|
5
|
+
/ ``AUTOMATION_CONFIG_PATH``), and a package or ``configuration.yaml`` defines
|
|
6
|
+
them under a ``script:`` / ``scene:`` / ``automation:`` section. A hidden body in
|
|
7
|
+
such a file never spells out its entity_id, so the entity scan cannot see it.
|
|
8
|
+
|
|
9
|
+
Only those definition positions count: a helper or dashboard key that merely
|
|
10
|
+
shares a hidden script's key is not a definition and stays readable.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import posixpath
|
|
16
|
+
import re
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
import yaml # type: ignore[import-untyped]
|
|
20
|
+
|
|
21
|
+
from .identifier_aliases import IdentifierAliases
|
|
22
|
+
|
|
23
|
+
_ROOT_FILE_DOMAINS = {
|
|
24
|
+
"scripts.yaml": "script",
|
|
25
|
+
"scenes.yaml": "scene",
|
|
26
|
+
"automations.yaml": "automation",
|
|
27
|
+
}
|
|
28
|
+
# Home Assistant also reads ``<domain> <label>:`` sections (``automation old:``).
|
|
29
|
+
_SECTION_KEY = re.compile(r"^(script|scene|automation)(?: .+)?$")
|
|
30
|
+
_YAML_SUFFIXES = (".yaml", ".yml")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class _TagTolerantLoader(yaml.SafeLoader):
|
|
34
|
+
"""SafeLoader that neutralizes HA tags (``!include``, ``!secret``) to None."""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
_TagTolerantLoader.add_multi_constructor("!", lambda _loader, _suffix, _node: None)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def is_yaml_path(path: str) -> bool:
|
|
41
|
+
return path.casefold().endswith(_YAML_SUFFIXES)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def defines_hidden_item(path: str, content: str, aliases: IdentifierAliases) -> bool:
|
|
45
|
+
"""Whether a config file's full ``content`` defines a hidden item.
|
|
46
|
+
|
|
47
|
+
An unparseable file is judged by whether its text contains a hidden key at
|
|
48
|
+
all, failing closed rather than letting a broken file through unchecked.
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
document = yaml.load(content, Loader=_TagTolerantLoader)
|
|
52
|
+
except yaml.YAMLError:
|
|
53
|
+
return _mentions_hidden_key(content, aliases)
|
|
54
|
+
# The component normalizes the path the same way before reading it, so
|
|
55
|
+
# ``.//scripts.yaml`` and ``www/../scripts.yaml`` are ``scripts.yaml``.
|
|
56
|
+
root_domain = _ROOT_FILE_DOMAINS.get(posixpath.normpath(path.strip()))
|
|
57
|
+
if root_domain is not None and _section_defines_hidden(
|
|
58
|
+
root_domain, document, aliases
|
|
59
|
+
):
|
|
60
|
+
return True
|
|
61
|
+
return _any_section_defines_hidden(document, aliases)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _any_section_defines_hidden(value: Any, aliases: IdentifierAliases) -> bool:
|
|
65
|
+
if isinstance(value, dict):
|
|
66
|
+
for key, item in value.items():
|
|
67
|
+
match = _SECTION_KEY.match(key) if isinstance(key, str) else None
|
|
68
|
+
if match and _section_defines_hidden(match.group(1), item, aliases):
|
|
69
|
+
return True
|
|
70
|
+
if _any_section_defines_hidden(item, aliases):
|
|
71
|
+
return True
|
|
72
|
+
elif isinstance(value, list):
|
|
73
|
+
return any(_any_section_defines_hidden(item, aliases) for item in value)
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _section_defines_hidden(
|
|
78
|
+
domain: str, section: Any, aliases: IdentifierAliases
|
|
79
|
+
) -> bool:
|
|
80
|
+
if domain == "script":
|
|
81
|
+
return isinstance(section, dict) and any(
|
|
82
|
+
isinstance(key, str) and key.casefold() in aliases.script_services
|
|
83
|
+
for key in section
|
|
84
|
+
)
|
|
85
|
+
items = section if isinstance(section, list) else [section]
|
|
86
|
+
config_ids = aliases.storage_keys.get(domain, frozenset())
|
|
87
|
+
return any(
|
|
88
|
+
isinstance(item, dict)
|
|
89
|
+
and isinstance(item.get("id"), str | int)
|
|
90
|
+
and str(item["id"]) in config_ids
|
|
91
|
+
for item in items
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _mentions_hidden_key(content: str, aliases: IdentifierAliases) -> bool:
|
|
96
|
+
keys = set(aliases.script_services)
|
|
97
|
+
keys |= aliases.storage_keys.get("scene", frozenset())
|
|
98
|
+
keys |= aliases.storage_keys.get("automation", frozenset())
|
|
99
|
+
folded = content.casefold()
|
|
100
|
+
return any(
|
|
101
|
+
re.search(rf"(?<![\w-]){re.escape(key.casefold())}(?![\w-])", folded)
|
|
102
|
+
for key in keys
|
|
103
|
+
)
|
|
@@ -55,7 +55,7 @@ import re
|
|
|
55
55
|
import time
|
|
56
56
|
from collections.abc import Callable
|
|
57
57
|
from contextvars import ContextVar
|
|
58
|
-
from dataclasses import dataclass
|
|
58
|
+
from dataclasses import dataclass, field
|
|
59
59
|
from typing import TYPE_CHECKING, Any, NamedTuple, NoReturn
|
|
60
60
|
|
|
61
61
|
from ha_mcp._vendor.fastmcp.exceptions import ToolError
|
|
@@ -70,6 +70,12 @@ from ..renamed_tools import current_tool_name
|
|
|
70
70
|
from ..tool_dispatch import CALL_PROXY_META_TOOLS
|
|
71
71
|
from ..tools.helpers import raise_tool_error
|
|
72
72
|
from . import resolver
|
|
73
|
+
from .identifier_aliases import (
|
|
74
|
+
IdentifierAliases,
|
|
75
|
+
build_identifier_aliases,
|
|
76
|
+
hidden_identifier_argument,
|
|
77
|
+
result_reveals_hidden,
|
|
78
|
+
)
|
|
73
79
|
from .model import VisibilityConfig
|
|
74
80
|
from .resolver import (
|
|
75
81
|
VisibilityDataUnavailable,
|
|
@@ -140,6 +146,10 @@ def _state_content_warning(paths: list[str]) -> str:
|
|
|
140
146
|
)
|
|
141
147
|
|
|
142
148
|
|
|
149
|
+
_CONFIG_FILE_REASON = (
|
|
150
|
+
"The file defines a script, scene or automation restricted by the entity "
|
|
151
|
+
"visibility filter."
|
|
152
|
+
)
|
|
143
153
|
_CONFIG_LOAD_FAILED_REASON = (
|
|
144
154
|
"The entity visibility config (entity_visibility.json) could not be loaded and "
|
|
145
155
|
"no previously loaded config is available, so the server cannot determine "
|
|
@@ -248,18 +258,25 @@ def _build_hidden_regex(hidden: set[str]) -> re.Pattern[str] | None:
|
|
|
248
258
|
|
|
249
259
|
@dataclass(frozen=True)
|
|
250
260
|
class _HiddenMatcher:
|
|
251
|
-
"""The enforced hidden set
|
|
261
|
+
"""The enforced hidden set, its identifier aliases and the boundary regex.
|
|
252
262
|
|
|
253
|
-
|
|
254
|
-
|
|
263
|
+
``identifier_aliases`` holds the bare keys that address a hidden script,
|
|
264
|
+
scene or automation (see ``identifier_aliases``). The regex matches the
|
|
265
|
+
hidden entity_ids plus the alias terms that run a hidden script without
|
|
266
|
+
naming it. Built only through :meth:`from_hidden`, so ``regex`` is ``None``
|
|
267
|
+
exactly when ``hidden`` is empty and every scan sees one consistent view.
|
|
255
268
|
"""
|
|
256
269
|
|
|
257
270
|
hidden: frozenset[str]
|
|
258
271
|
regex: re.Pattern[str] | None
|
|
272
|
+
identifier_aliases: IdentifierAliases = field(hash=False)
|
|
259
273
|
|
|
260
274
|
@classmethod
|
|
261
|
-
def from_hidden(
|
|
262
|
-
|
|
275
|
+
def from_hidden(
|
|
276
|
+
cls, hidden: set[str], aliases: IdentifierAliases
|
|
277
|
+
) -> _HiddenMatcher:
|
|
278
|
+
terms = hidden | aliases.embedded_terms()
|
|
279
|
+
return cls(frozenset(hidden), _build_hidden_regex(terms), aliases)
|
|
263
280
|
|
|
264
281
|
def exact(self, text: str) -> bool:
|
|
265
282
|
"""Whether ``text`` is a hidden entity_id."""
|
|
@@ -286,6 +303,22 @@ def _serialize_result(result: ToolResult) -> str:
|
|
|
286
303
|
return "\n".join(parts)
|
|
287
304
|
|
|
288
305
|
|
|
306
|
+
def _result_payloads(result: ToolResult) -> list[Any]:
|
|
307
|
+
"""A tool result's structured content and text blocks, JSON-parsed if possible."""
|
|
308
|
+
payloads: list[Any] = []
|
|
309
|
+
structured = getattr(result, "structured_content", None)
|
|
310
|
+
if structured is not None:
|
|
311
|
+
payloads.append(structured)
|
|
312
|
+
for block in getattr(result, "content", None) or []:
|
|
313
|
+
text = getattr(block, "text", None)
|
|
314
|
+
if isinstance(text, str):
|
|
315
|
+
try:
|
|
316
|
+
payloads.append(json.loads(text))
|
|
317
|
+
except json.JSONDecodeError:
|
|
318
|
+
payloads.append(text)
|
|
319
|
+
return payloads
|
|
320
|
+
|
|
321
|
+
|
|
289
322
|
# Sentinel returned for a hidden-naming string value or a mapping whose
|
|
290
323
|
# ``entity_id`` is hidden; its enclosing mapping/sequence omits that value. At the
|
|
291
324
|
# top level it reaches ``_scrub_state_representation``, which treats the
|
|
@@ -640,7 +673,7 @@ class _VisibilityEnforcementBase(Middleware):
|
|
|
640
673
|
return config
|
|
641
674
|
|
|
642
675
|
async def _hidden_matcher(self, config: VisibilityConfig) -> _HiddenMatcher:
|
|
643
|
-
"""Resolve the hidden set
|
|
676
|
+
"""Resolve the hidden set, aliases and regex through the module-shared cache."""
|
|
644
677
|
return await _hidden_cache.get(config, self._get_client())
|
|
645
678
|
|
|
646
679
|
|
|
@@ -687,6 +720,16 @@ class VisibilityInboundEnforcement(_VisibilityEnforcementBase):
|
|
|
687
720
|
except VisibilityDataUnavailable:
|
|
688
721
|
_raise_enforced(effective_name, _FAIL_CLOSED_REASON)
|
|
689
722
|
|
|
723
|
+
bare = hidden_identifier_argument(
|
|
724
|
+
effective_name, effective_args, matcher.identifier_aliases
|
|
725
|
+
)
|
|
726
|
+
if bare is not None:
|
|
727
|
+
logger.info(
|
|
728
|
+
"visibility enforce: concealed hidden entity addressed by bare "
|
|
729
|
+
"identifier in %s call",
|
|
730
|
+
effective_name,
|
|
731
|
+
)
|
|
732
|
+
_conceal_as_not_found(bare)
|
|
690
733
|
self._scan_inbound(effective_name, name, args, matcher)
|
|
691
734
|
return await call_next(context)
|
|
692
735
|
|
|
@@ -766,7 +809,9 @@ class VisibilityOutboundEnforcement(_VisibilityEnforcementBase):
|
|
|
766
809
|
scrub_tally.unwarnable_representations,
|
|
767
810
|
)
|
|
768
811
|
_raise_enforced(name, _outbound_reason(name))
|
|
769
|
-
if matcher.embeds(_serialize_result(result))
|
|
812
|
+
if matcher.embeds(_serialize_result(result)) or result_reveals_hidden(
|
|
813
|
+
_result_payloads(result), matcher.identifier_aliases
|
|
814
|
+
):
|
|
770
815
|
logger.info("visibility enforce: refused result from %s", name)
|
|
771
816
|
_raise_enforced(name, _outbound_reason(name))
|
|
772
817
|
if scrub_tally.mutated_representations:
|
|
@@ -779,7 +824,7 @@ class VisibilityOutboundEnforcement(_VisibilityEnforcementBase):
|
|
|
779
824
|
return result
|
|
780
825
|
|
|
781
826
|
|
|
782
|
-
async def _refresh_hidden_set(config: VisibilityConfig, client: Any) ->
|
|
827
|
+
async def _refresh_hidden_set(config: VisibilityConfig, client: Any) -> _HiddenMatcher:
|
|
783
828
|
"""Fetch registry/states (+device registry when needed) and resolve strictly.
|
|
784
829
|
|
|
785
830
|
Mirrors the search seam's fetches. Any fetch error, or a strict resolver
|
|
@@ -820,7 +865,9 @@ async def _refresh_hidden_set(config: VisibilityConfig, client: Any) -> set[str]
|
|
|
820
865
|
hidden, _warnings = await load_hidden_set(
|
|
821
866
|
fetched[1], fetched[0], client, device_result, strict=True
|
|
822
867
|
)
|
|
823
|
-
return
|
|
868
|
+
return _HiddenMatcher.from_hidden(
|
|
869
|
+
hidden, build_identifier_aliases(hidden, fetched[1])
|
|
870
|
+
)
|
|
824
871
|
|
|
825
872
|
|
|
826
873
|
class _HiddenSetCache:
|
|
@@ -851,7 +898,7 @@ class _HiddenSetCache:
|
|
|
851
898
|
if self._matcher is not None and self._key == key and now < self._expiry:
|
|
852
899
|
return self._matcher
|
|
853
900
|
try:
|
|
854
|
-
|
|
901
|
+
matcher = await _refresh_hidden_set(config, client)
|
|
855
902
|
except Exception:
|
|
856
903
|
if self._matcher is not None and self._key == key:
|
|
857
904
|
logger.warning(
|
|
@@ -866,7 +913,6 @@ class _HiddenSetCache:
|
|
|
866
913
|
exc_info=True,
|
|
867
914
|
)
|
|
868
915
|
raise VisibilityDataUnavailable("hidden set unavailable") from None
|
|
869
|
-
matcher = _HiddenMatcher.from_hidden(hidden)
|
|
870
916
|
self._matcher = matcher
|
|
871
917
|
self._key = key
|
|
872
918
|
self._expiry = now + _CACHE_TTL_SECONDS
|
|
@@ -876,18 +922,11 @@ class _HiddenSetCache:
|
|
|
876
922
|
_hidden_cache = _HiddenSetCache()
|
|
877
923
|
|
|
878
924
|
|
|
879
|
-
async def
|
|
880
|
-
"""
|
|
925
|
+
async def _active_matcher(client: Any) -> _HiddenMatcher | None:
|
|
926
|
+
"""The shared matcher while enforce mode is active; ``None`` otherwise or on error.
|
|
881
927
|
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
response reaches the middleware's outbound scan — which would otherwise
|
|
885
|
-
refuse the whole call on contact, turning the issue-#2015 "collection reads
|
|
886
|
-
omit" contract into a wholesale refusal. ``client`` is the CALLER's live
|
|
887
|
-
client, used only if the shared cache needs a refresh (the middleware's
|
|
888
|
-
inbound gate for the request in flight normally primed it already).
|
|
889
|
-
Fail-soft to ``None`` on any load/data error: the fail-closed policy is
|
|
890
|
-
owned by the middleware's call gates, not by this best-effort scrub seam.
|
|
928
|
+
Fail-soft: the fail-closed policy is owned by the middleware's call gates,
|
|
929
|
+
not by the best-effort tool-side scrubs that call this.
|
|
891
930
|
"""
|
|
892
931
|
try:
|
|
893
932
|
config = await asyncio.to_thread(
|
|
@@ -899,10 +938,45 @@ async def active_hidden_regex(client: Any) -> re.Pattern[str] | None:
|
|
|
899
938
|
and config_has_active_hide_dimensions(config)
|
|
900
939
|
):
|
|
901
940
|
return None
|
|
902
|
-
|
|
941
|
+
return await _hidden_cache.get(config, client)
|
|
903
942
|
except Exception: # noqa: BLE001
|
|
904
943
|
return None
|
|
905
|
-
|
|
944
|
+
|
|
945
|
+
|
|
946
|
+
async def active_hidden_entity_ids(client: Any) -> frozenset[str]:
|
|
947
|
+
"""The enforced hidden entity_ids, empty while enforce mode is inactive.
|
|
948
|
+
|
|
949
|
+
Tools that list entity IDs in a genuine error (``available_script_ids``)
|
|
950
|
+
drop these so the list neither leaks a hidden ID nor trips the outbound scan.
|
|
951
|
+
"""
|
|
952
|
+
matcher = await _active_matcher(client)
|
|
953
|
+
return matcher.hidden if matcher is not None else frozenset()
|
|
954
|
+
|
|
955
|
+
|
|
956
|
+
async def active_identifier_aliases(client: Any) -> IdentifierAliases | None:
|
|
957
|
+
"""The hidden items' identifier aliases while enforce mode is active."""
|
|
958
|
+
matcher = await _active_matcher(client)
|
|
959
|
+
return matcher.identifier_aliases if matcher is not None else None
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
def refuse_hidden_config_file(tool_name: str) -> NoReturn:
|
|
963
|
+
"""Refuse a config-file read whose file defines a hidden item."""
|
|
964
|
+
_raise_enforced(tool_name, _CONFIG_FILE_REASON)
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
async def active_hidden_regex(client: Any) -> re.Pattern[str] | None:
|
|
968
|
+
"""Return the hidden-set regex while enforce mode is active, else ``None``.
|
|
969
|
+
|
|
970
|
+
Collection-read surfaces (the ha_search config-body branches, legacy and
|
|
971
|
+
component) call this to OMIT records referencing a hidden entity before the
|
|
972
|
+
response reaches the middleware's outbound scan — which would otherwise
|
|
973
|
+
refuse the whole call on contact, turning the issue-#2015 "collection reads
|
|
974
|
+
omit" contract into a wholesale refusal. ``client`` is the CALLER's live
|
|
975
|
+
client, used only if the shared cache needs a refresh (the middleware's
|
|
976
|
+
inbound gate for the request in flight normally primed it already).
|
|
977
|
+
"""
|
|
978
|
+
matcher = await _active_matcher(client)
|
|
979
|
+
return matcher.regex if matcher is not None else None
|
|
906
980
|
|
|
907
981
|
|
|
908
982
|
def scrub_records(
|