ha-mcp-dev 9.1.0.dev3302__tar.gz → 9.1.0.dev3307__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/PKG-INFO +1 -1
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/pyproject.toml +1 -1
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_dashboards.py +29 -11
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_manager.py +7 -7
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/capture.py +6 -0
- ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/dashboard_screenshot/theme_check.py +78 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/auto_backup.py +17 -5
- ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/tools/resource_codec.py +356 -0
- ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/tools/resource_patch.py +286 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_dashboards.py +7 -7
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_resources.py +219 -412
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/ipv6_lan_guard.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/listen_sockets.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/mcp_client_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/storage_helper_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/automation_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_snapshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_automation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_file_visibility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/hacs_backend.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/update_categories.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/config_files.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/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.1.0.
|
|
7
|
+
version = "9.1.0.dev3307"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.0.
|
|
7
|
+
version = "9.1.0.dev3307"
|
|
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
|
|
@@ -21,8 +21,10 @@ from typing import Any
|
|
|
21
21
|
from .backup_entity_ids import _manager
|
|
22
22
|
from .client.rest_client import HomeAssistantCommandError, HomeAssistantError
|
|
23
23
|
|
|
24
|
-
# Core's
|
|
25
|
-
|
|
24
|
+
# Keys of Core's stored dashboard item that lovelace/dashboards/update does not
|
|
25
|
+
# take. Without the component, which reads Core's update schema, a restore sends
|
|
26
|
+
# back the rest of the item.
|
|
27
|
+
_ROW_ONLY_FIELDS = ("id", "url_path", "mode")
|
|
26
28
|
_DASHBOARD_KIND = "dashboard_settings"
|
|
27
29
|
|
|
28
30
|
|
|
@@ -169,16 +171,17 @@ async def restore_dashboard(client: Any, entity_id: str, config: Any) -> Any:
|
|
|
169
171
|
async def _recreate(client: Any, row: dict[str, Any], body: Any) -> Any:
|
|
170
172
|
bm = _manager()
|
|
171
173
|
url_path = row["url_path"]
|
|
172
|
-
#
|
|
173
|
-
# create schema rejects; an omitted field takes Core's
|
|
174
|
+
# Rows captured by an older component carry ``icon: None`` for an unset
|
|
175
|
+
# icon, which Core's create schema rejects; an omitted field takes Core's
|
|
176
|
+
# default.
|
|
174
177
|
fields = bm._strip_readonly(row, "id", "mode")
|
|
175
178
|
create = {
|
|
176
179
|
"type": "lovelace/dashboards/create",
|
|
177
180
|
**{key: value for key, value in fields.items() if value is not None},
|
|
181
|
+
# The row is one Core already accepted, so its path needs no hyphen
|
|
182
|
+
# check (Core's own single-word dashboards: ``lovelace``, ``map``).
|
|
183
|
+
"allow_single_word": True,
|
|
178
184
|
}
|
|
179
|
-
if "-" not in url_path:
|
|
180
|
-
# Core's own single-word dashboards (``lovelace``, ``map``) need this.
|
|
181
|
-
create["allow_single_word"] = True
|
|
182
185
|
try:
|
|
183
186
|
await bm._ws_send(client, create)
|
|
184
187
|
except HomeAssistantCommandError as err:
|
|
@@ -197,21 +200,36 @@ async def _restore_settings(
|
|
|
197
200
|
) -> None:
|
|
198
201
|
"""Put back the row's settings after its config; ``icon: None`` clears it."""
|
|
199
202
|
bm = _manager()
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
+
update_fields = await _update_fields(client)
|
|
204
|
+
if update_fields:
|
|
205
|
+
fields = {k: v for k, v in row.items() if k in update_fields}
|
|
206
|
+
else:
|
|
207
|
+
fields = {k: v for k, v in row.items() if k not in _ROW_ONLY_FIELDS}
|
|
208
|
+
if not update_fields or "icon" in update_fields:
|
|
209
|
+
# Core's list omits ``icon`` when none is stored; None clears a live one.
|
|
210
|
+
fields.setdefault("icon", None)
|
|
203
211
|
update = {"type": "lovelace/dashboards/update", "dashboard_id": dashboard_id}
|
|
204
212
|
try:
|
|
205
213
|
await bm._ws_send(client, {**update, **fields})
|
|
206
214
|
except bm._CAPTURE_TRANSIENT_ERRORS as err:
|
|
207
215
|
raise bm.BackupRestoreError(
|
|
208
216
|
f"The config of dashboard {row['url_path']} was restored, but its "
|
|
209
|
-
"settings
|
|
217
|
+
"settings may not have been.",
|
|
210
218
|
apply_status="unknown",
|
|
211
219
|
reason="settings_not_restored",
|
|
212
220
|
) from err
|
|
213
221
|
|
|
214
222
|
|
|
223
|
+
async def _update_fields(client: Any) -> list[str] | None:
|
|
224
|
+
"""The keys Core's ``lovelace/dashboards/update`` schema accepts, from the
|
|
225
|
+
component; ``None`` without a component that reports them."""
|
|
226
|
+
from .tools.tools_config_dashboards import _dashboards_via_component
|
|
227
|
+
|
|
228
|
+
result = await _dashboards_via_component(client, "list")
|
|
229
|
+
fields = result.get("update_fields") if result else None
|
|
230
|
+
return fields if isinstance(fields, list) else None
|
|
231
|
+
|
|
232
|
+
|
|
215
233
|
async def _restore_default_store(client: Any, body: Any) -> dict[str, Any]:
|
|
216
234
|
"""Put the body in Core's default store, which the built-in panel reads."""
|
|
217
235
|
if body is None:
|
|
@@ -2179,16 +2179,16 @@ async def _dashboard_resource_like(client: Any, config: dict[str, Any]) -> Any:
|
|
|
2179
2179
|
|
|
2180
2180
|
|
|
2181
2181
|
async def _restore_dashboard_resource(client: Any, entity_id: str, config: Any) -> Any:
|
|
2182
|
-
# Core imported old ``resources:`` entries without a type (RESOURCE_FIELDS).
|
|
2183
2182
|
payload = _strip_readonly(config, "id", "type")
|
|
2184
|
-
if "type" in config:
|
|
2183
|
+
if "type" in config: # Core imported old ``resources:`` entries without one
|
|
2185
2184
|
payload["res_type"] = config["type"]
|
|
2186
2185
|
update = {"type": "lovelace/resources/update", "resource_id": entity_id}
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2186
|
+
async with registry_update_lock("dashboard_resource", entity_id): # the tool's lock
|
|
2187
|
+
try:
|
|
2188
|
+
return await _ws_send(client, {**update, **payload})
|
|
2189
|
+
except HomeAssistantCommandError as err:
|
|
2190
|
+
if err.code != "not_found": # not_found: deleted since the snapshot
|
|
2191
|
+
raise
|
|
2192
2192
|
live = await _dashboard_resource_like(client, config)
|
|
2193
2193
|
if live is not None: # an earlier restore re-created it
|
|
2194
2194
|
return live
|
{ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
@@ -26,6 +26,7 @@ from ..errors import ErrorCode, create_error_response
|
|
|
26
26
|
from ..tools.helpers import raise_tool_error
|
|
27
27
|
from .engine_compat import is_legacy_puppet
|
|
28
28
|
from .provision import TOKEN_HINT, EngineKind, resolve_engine
|
|
29
|
+
from .theme_check import check_requested_theme
|
|
29
30
|
from .theme_guard import ThemeGuard
|
|
30
31
|
|
|
31
32
|
logger = logging.getLogger(__name__)
|
|
@@ -886,6 +887,11 @@ async def capture_dashboard_images(
|
|
|
886
887
|
render_timeout_seconds=render_timeout_seconds,
|
|
887
888
|
)
|
|
888
889
|
viewports = _capture_viewports(options)
|
|
890
|
+
theme_warnings = await check_requested_theme(
|
|
891
|
+
client, options.theme, options.dark_mode
|
|
892
|
+
)
|
|
893
|
+
if capture_warnings is not None:
|
|
894
|
+
capture_warnings.extend(theme_warnings)
|
|
889
895
|
|
|
890
896
|
engine_target = await resolve_engine()
|
|
891
897
|
engine_url = engine_target.url
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Check a screenshot's requested theme against Home Assistant's own themes.
|
|
2
|
+
|
|
3
|
+
The engine renders an unknown theme name as the default theme and reports no
|
|
4
|
+
error, so the name is checked against Core's ``frontend/get_themes`` first.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from ..errors import ErrorCode, create_error_response
|
|
13
|
+
from ..tools.helpers import raise_tool_error
|
|
14
|
+
from ..tools.util_helpers import websocket_error_message
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
# The frontend's built-in theme; Core's theme list holds only installed ones.
|
|
19
|
+
_BUILT_IN_THEME = "default"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _unchecked(theme: str, reason: str) -> list[str]:
|
|
23
|
+
return [
|
|
24
|
+
f"Home Assistant's theme list could not be read ({reason}), so theme "
|
|
25
|
+
f"{theme!r} was not checked; an unknown name renders the default theme."
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def check_requested_theme(
|
|
30
|
+
client: Any, theme: str | None, dark_mode: bool
|
|
31
|
+
) -> list[str]:
|
|
32
|
+
"""Refuse a theme Home Assistant does not have.
|
|
33
|
+
|
|
34
|
+
Returns warnings for a theme list that could not be read and for a
|
|
35
|
+
``dark_mode`` naming a mode the theme's data does not define.
|
|
36
|
+
"""
|
|
37
|
+
if theme is None or client is None or theme == _BUILT_IN_THEME:
|
|
38
|
+
return []
|
|
39
|
+
try:
|
|
40
|
+
result = await client.send_websocket_message({"type": "frontend/get_themes"})
|
|
41
|
+
except Exception as exc: # an optional pre-check must not fail the render
|
|
42
|
+
logger.warning(
|
|
43
|
+
"frontend/get_themes failed; theme %r not checked: %s",
|
|
44
|
+
theme,
|
|
45
|
+
exc,
|
|
46
|
+
exc_info=True,
|
|
47
|
+
)
|
|
48
|
+
return _unchecked(theme, str(exc))
|
|
49
|
+
if isinstance(result, dict) and result.get("success") is False:
|
|
50
|
+
return _unchecked(theme, websocket_error_message(result.get("error")))
|
|
51
|
+
listing = result.get("result") if isinstance(result, dict) else None
|
|
52
|
+
themes = listing.get("themes") if isinstance(listing, dict) else None
|
|
53
|
+
if not isinstance(themes, dict):
|
|
54
|
+
return _unchecked(theme, "unexpected response")
|
|
55
|
+
if theme not in themes:
|
|
56
|
+
raise_tool_error(
|
|
57
|
+
create_error_response(
|
|
58
|
+
ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
59
|
+
f"Home Assistant has no theme named {theme!r}",
|
|
60
|
+
context={"installed_themes": [_BUILT_IN_THEME, *themes]},
|
|
61
|
+
suggestions=["Use one of installed_themes, or omit theme"],
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
entry = themes[theme]
|
|
65
|
+
modes = entry.get("modes") if isinstance(entry, dict) else None
|
|
66
|
+
if not isinstance(modes, dict):
|
|
67
|
+
modes = {}
|
|
68
|
+
if dark_mode and "dark" not in modes:
|
|
69
|
+
return [
|
|
70
|
+
f"Theme {theme!r} defines no dark mode in Home Assistant's theme "
|
|
71
|
+
"list, so dark_mode=true has no dark variant to use."
|
|
72
|
+
]
|
|
73
|
+
if not dark_mode and modes and "light" not in modes:
|
|
74
|
+
return [
|
|
75
|
+
f"Theme {theme!r} defines only a dark mode in Home Assistant's theme "
|
|
76
|
+
"list, so dark_mode=false has no light variant to use."
|
|
77
|
+
]
|
|
78
|
+
return []
|
|
@@ -44,6 +44,7 @@ from ..backup_manager import (
|
|
|
44
44
|
from ..config import get_global_settings
|
|
45
45
|
from ..errors import TOOL_ERROR_LOG_LEVEL, ErrorCode, create_error_response
|
|
46
46
|
from .helpers import raise_tool_error
|
|
47
|
+
from .resource_patch import resource_write_lock
|
|
47
48
|
|
|
48
49
|
logger = logging.getLogger(__name__)
|
|
49
50
|
|
|
@@ -398,11 +399,19 @@ def with_auto_backup(
|
|
|
398
399
|
async def _template_write_context(
|
|
399
400
|
client: Any, settings: Any, domain: str, entity_id: str
|
|
400
401
|
) -> AsyncIterator[None]:
|
|
401
|
-
"""Keep a
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
their current
|
|
402
|
+
"""Keep a write's capture and mutation in one critical section.
|
|
403
|
+
|
|
404
|
+
Flow helpers and integrations share the restore critical section. The lock
|
|
405
|
+
is needed even when ordinary auto-backup is disabled: restores of existing
|
|
406
|
+
flow helpers require a safety snapshot before replacing their current
|
|
407
|
+
options.
|
|
408
|
+
|
|
409
|
+
Dashboard resources take their per-resource write lock here, so the
|
|
410
|
+
snapshot, the tool's own read (an ``edits=`` patch) and its write cannot
|
|
411
|
+
interleave with another write through this server. Writes from the Home
|
|
412
|
+
Assistant UI or other processes are not serialized, so the snapshot can
|
|
413
|
+
predate an edit made there that the write then replaces. The resource
|
|
414
|
+
tools must not take the lock again: ``asyncio.Lock`` is not reentrant.
|
|
406
415
|
"""
|
|
407
416
|
# Both options-update tools take stable config-entry IDs. Alias-based helper
|
|
408
417
|
# removal and dotted subentry targets have separate resolution paths.
|
|
@@ -413,6 +422,9 @@ async def _template_write_context(
|
|
|
413
422
|
manager = get_backup_manager(client, settings)
|
|
414
423
|
async with manager.config_entry_write_guard(entity_id):
|
|
415
424
|
yield
|
|
425
|
+
elif domain == "dashboard_resource" and entity_id:
|
|
426
|
+
async with resource_write_lock(entity_id):
|
|
427
|
+
yield
|
|
416
428
|
else:
|
|
417
429
|
yield
|
|
418
430
|
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"""Inline dashboard-resource codec: ``data:`` URI encoding/decoding and list rendering.
|
|
2
|
+
|
|
3
|
+
Pure functions shared by the resource tools. Kept apart from
|
|
4
|
+
``tools_resources`` so the tool module holds only the MCP surface.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import base64
|
|
8
|
+
import hashlib
|
|
9
|
+
import re
|
|
10
|
+
from typing import Any
|
|
11
|
+
from urllib.parse import urlsplit
|
|
12
|
+
|
|
13
|
+
from ..errors import ErrorCode, create_error_response
|
|
14
|
+
from .helpers import raise_tool_error
|
|
15
|
+
|
|
16
|
+
# Legacy Cloudflare Worker URL. Only used to recognize and locally decode
|
|
17
|
+
# inline resources created before the data: URI switch (#2060) — this server
|
|
18
|
+
# never fetches it. The worker deployment stays up so pre-existing dashboards
|
|
19
|
+
# keep loading until their resources are converted.
|
|
20
|
+
LEGACY_WORKER_BASE_URL = "https://ha-mcp-resources.rapid-math-bbad.workers.dev"
|
|
21
|
+
|
|
22
|
+
# data: URI media types per inline resource_type ('js'/'html' are url-mode
|
|
23
|
+
# only). CSS carries an explicit charset because stylesheets, unlike module
|
|
24
|
+
# scripts, have no spec-mandated UTF-8 fallback.
|
|
25
|
+
_DATA_URI_MIME: dict[str, str] = {
|
|
26
|
+
"module": "text/javascript",
|
|
27
|
+
"css": "text/css;charset=utf-8",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# URL prefixes recognized as ha-mcp inline resources — DERIVED from the media
|
|
31
|
+
# types above rather than restated, so the read side cannot drift from the
|
|
32
|
+
# write side (a desync would make the server fail to recognize its own
|
|
33
|
+
# output, leaking raw base64 URLs into list responses). Each media type is
|
|
34
|
+
# accepted with and without the charset parameter so resources written
|
|
35
|
+
# before and after a charset change both still decode. Foreign data: URLs
|
|
36
|
+
# match nothing here and pass through untouched instead of being claimed.
|
|
37
|
+
_ALLOWED_DATA_URI_PREFIXES = tuple(
|
|
38
|
+
f"data:{base}{charset};base64,"
|
|
39
|
+
# dict.fromkeys dedupes while keeping a deterministic order.
|
|
40
|
+
for base in dict.fromkeys(mime.split(";", 1)[0] for mime in _DATA_URI_MIME.values())
|
|
41
|
+
for charset in ("", ";charset=utf-8")
|
|
42
|
+
)
|
|
43
|
+
# Scheme and media type are case-insensitive (RFC 3986/2397); prefixes are
|
|
44
|
+
# lowercase, so matching lowercases the URL head. Longest prefix is 42 chars.
|
|
45
|
+
_DATA_URI_HEAD = max(len(p) for p in _ALLOWED_DATA_URI_PREFIXES)
|
|
46
|
+
|
|
47
|
+
_B64_URLSAFE_RE = re.compile(r"[A-Za-z0-9_-]*={0,2}")
|
|
48
|
+
|
|
49
|
+
# Longest data: URL echoed verbatim for a resource we cannot decode.
|
|
50
|
+
# Beyond this the value is truncated: a corrupt or foreign payload can be
|
|
51
|
+
# ~171KB of base64, and echoing it whole would flood the response.
|
|
52
|
+
_MAX_ECHOED_URL = 300
|
|
53
|
+
|
|
54
|
+
# Characters of decoded content shown in list previews.
|
|
55
|
+
_PREVIEW_LENGTH = 150
|
|
56
|
+
|
|
57
|
+
# Total decoded content emitted per include_content=True response. A page
|
|
58
|
+
# of max-size resources would otherwise return limit x MAX_CONTENT_SIZE
|
|
59
|
+
# (up to ~64MB). Rows past the budget are FLAGGED, never shortened —
|
|
60
|
+
# handing back a silently-truncated payload is how a resource gets
|
|
61
|
+
# destroyed on write-back.
|
|
62
|
+
_MAX_CONTENT_BUDGET = 512_000
|
|
63
|
+
|
|
64
|
+
# Maximum inline content size, in UTF-8 bytes. The old 24KB bound was the
|
|
65
|
+
# content budget derived from the worker's ~32KB encoded URL-path limit;
|
|
66
|
+
# data: URIs impose no comparable limit, so the cap is now sized to fit
|
|
67
|
+
# established single-file card bundles without truncation while bounding
|
|
68
|
+
# what every dashboard load ships (the registered URL rides the Lovelace
|
|
69
|
+
# bootstrap to every browser) and what auto-backup snapshots per edit.
|
|
70
|
+
MAX_CONTENT_SIZE = 128_000
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def content_sha256(content: str) -> str:
|
|
74
|
+
"""SHA-256 hex digest over the UTF-8 bytes of decoded resource content."""
|
|
75
|
+
return hashlib.sha256(content.encode("utf-8")).hexdigest()
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _data_uri_for(content: str, resource_type: str) -> str:
|
|
79
|
+
"""Encode content as a base64 ``data:`` URI for the given resource type.
|
|
80
|
+
|
|
81
|
+
Standard base64 (not URL-safe): browsers decode data: URIs with the
|
|
82
|
+
standard alphabet. Deterministic — same content, same URI.
|
|
83
|
+
"""
|
|
84
|
+
mime = _DATA_URI_MIME.get(resource_type)
|
|
85
|
+
if mime is None:
|
|
86
|
+
raise_tool_error(
|
|
87
|
+
create_error_response(
|
|
88
|
+
code=ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
89
|
+
message=f"Inline content does not support resource_type={resource_type!r}",
|
|
90
|
+
suggestions=["Use resource_type='module' or 'css' for inline content"],
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
encoded = base64.b64encode(content.encode("utf-8")).decode("ascii")
|
|
94
|
+
return f"data:{mime};base64,{encoded}"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _match_data_uri_prefix(url: str) -> str | None:
|
|
98
|
+
"""Return the matched ha-mcp inline data: prefix of ``url``, else None.
|
|
99
|
+
|
|
100
|
+
Prefix matching is case-insensitive (scheme and media type are
|
|
101
|
+
case-insensitive per RFC 3986/2397); the payload's case is preserved.
|
|
102
|
+
"""
|
|
103
|
+
head = url[:_DATA_URI_HEAD].lower()
|
|
104
|
+
for prefix in _ALLOWED_DATA_URI_PREFIXES:
|
|
105
|
+
if head.startswith(prefix):
|
|
106
|
+
return prefix
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _decode_data_uri(url: str) -> str | None:
|
|
111
|
+
"""Decode one of our base64 ``data:`` URIs back to content.
|
|
112
|
+
|
|
113
|
+
None for foreign data: URLs (other media types, percent-encoded form) —
|
|
114
|
+
those are passed through untouched, not claimed as inline resources —
|
|
115
|
+
and for corrupt payloads (``validate=True``: a payload the browser's
|
|
116
|
+
forgiving-base64 would reject must not be reported as valid content).
|
|
117
|
+
"""
|
|
118
|
+
prefix = _match_data_uri_prefix(url)
|
|
119
|
+
if prefix is None:
|
|
120
|
+
return None
|
|
121
|
+
try:
|
|
122
|
+
return base64.b64decode(url[len(prefix) :], validate=True).decode("utf-8")
|
|
123
|
+
except Exception: # noqa: BLE001
|
|
124
|
+
return None
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _is_data_url(url: str) -> bool:
|
|
128
|
+
"""True when ``url`` parses as the ``data:`` scheme in a browser.
|
|
129
|
+
|
|
130
|
+
``urlsplit`` applies WHATWG's leading C0-control-or-space strip and
|
|
131
|
+
ASCII tab/newline/CR removal before reading the scheme (the
|
|
132
|
+
CVE-2023-24329 hardening; this package requires Python >=3.13), and
|
|
133
|
+
lowercases it. A raw ``url[:5]`` check would miss ``" data:..."`` and
|
|
134
|
+
``"da\\tta:..."``, which browsers still load.
|
|
135
|
+
"""
|
|
136
|
+
return urlsplit(url).scheme == "data"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _pad_b64(encoded: str) -> str:
|
|
140
|
+
"""Reject non-alphabet characters, then restore any stripped ``=`` padding.
|
|
141
|
+
|
|
142
|
+
``urlsafe_b64decode`` has no ``validate=`` parameter, so strictness has
|
|
143
|
+
to be enforced here; the padding fix-up keeps genuine worker URLs (which
|
|
144
|
+
always carried padding) working either way.
|
|
145
|
+
"""
|
|
146
|
+
if not _B64_URLSAFE_RE.fullmatch(encoded):
|
|
147
|
+
raise ValueError("non-base64 characters in payload")
|
|
148
|
+
return encoded + "=" * (-len(encoded) % 4)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _has_inline_url_shape(url: str) -> bool:
|
|
152
|
+
"""True when ``url`` LOOKS like one of ours, regardless of decodability.
|
|
153
|
+
|
|
154
|
+
Only used to flag a recognized-but-corrupt payload; the decode result
|
|
155
|
+
itself (never this) decides what counts as an inline resource.
|
|
156
|
+
"""
|
|
157
|
+
if _match_data_uri_prefix(url) is not None:
|
|
158
|
+
return True
|
|
159
|
+
prefix = f"{LEGACY_WORKER_BASE_URL}/"
|
|
160
|
+
return url[: len(prefix)].lower() == prefix.lower()
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _looks_like_preview(content: str) -> bool:
|
|
164
|
+
"""Cheap pre-filter: could ``content`` be a list-tool ``_preview``?
|
|
165
|
+
|
|
166
|
+
Previews are ``_PREVIEW_LENGTH`` characters plus a trailing ``"..."``.
|
|
167
|
+
Two shapes qualify: that signature itself (tolerating surrounding
|
|
168
|
+
whitespace), and exactly ``_PREVIEW_LENGTH`` characters, which is what
|
|
169
|
+
an agent produces by stripping the ellipsis.
|
|
170
|
+
|
|
171
|
+
Deliberately narrow. Everything matching pays a WS round-trip and, if
|
|
172
|
+
that round-trip fails, is refused — so matching ordinary short content
|
|
173
|
+
(a legitimate 20-character CSS tweak) would make routine updates
|
|
174
|
+
fragile for no safety gain, since such content cannot be a preview of
|
|
175
|
+
anything.
|
|
176
|
+
"""
|
|
177
|
+
stripped = content.strip()
|
|
178
|
+
if stripped.endswith("...") and len(stripped) <= _PREVIEW_LENGTH + 3:
|
|
179
|
+
return True
|
|
180
|
+
return len(stripped) == _PREVIEW_LENGTH
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _is_preview_of(content: str, stored: str) -> bool:
|
|
184
|
+
"""True when ``content`` is the truncated preview of ``stored``.
|
|
185
|
+
|
|
186
|
+
Tolerates the ellipsis being stripped and surrounding whitespace, so a
|
|
187
|
+
lightly-mangled preview writeback is still caught.
|
|
188
|
+
"""
|
|
189
|
+
if len(stored) <= _PREVIEW_LENGTH:
|
|
190
|
+
# Short resources have no truncated preview to confuse with.
|
|
191
|
+
return False
|
|
192
|
+
candidate = content.strip().removesuffix("...")
|
|
193
|
+
return bool(candidate) and stored.startswith(candidate)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _decode_inline_content(url: str) -> tuple[str, bool] | None:
|
|
197
|
+
"""Decode an inline resource URL to ``(content, is_legacy_worker)``.
|
|
198
|
+
|
|
199
|
+
``None`` when the URL is not one of ours, or is one of ours but holds
|
|
200
|
+
an empty/corrupt payload. This is the single source of truth for "is
|
|
201
|
+
this an inline resource we can show", so the list summary counts and
|
|
202
|
+
the per-resource markers can never disagree. Returning one ``None``
|
|
203
|
+
rather than a ``(None, bool)`` pair keeps the meaningless
|
|
204
|
+
"not-ours-but-legacy" combination unrepresentable and forces callers
|
|
205
|
+
through one check instead of indexing the tuple.
|
|
206
|
+
"""
|
|
207
|
+
content = _decode_data_uri(url)
|
|
208
|
+
if content:
|
|
209
|
+
return content, False
|
|
210
|
+
legacy = _decode_legacy_worker_url(url)
|
|
211
|
+
if legacy:
|
|
212
|
+
return legacy, True
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _decode_legacy_worker_url(url: str) -> str | None:
|
|
217
|
+
"""Decode a legacy worker inline URL back to content (pure local base64).
|
|
218
|
+
|
|
219
|
+
The worker embedded URL-safe base64 in its path; decoding needs no
|
|
220
|
+
network. Anchored to the worker origin — lookalike hosts that merely
|
|
221
|
+
contain the worker host string are not decoded. Returns None if the URL
|
|
222
|
+
is not a legacy worker URL.
|
|
223
|
+
"""
|
|
224
|
+
prefix = f"{LEGACY_WORKER_BASE_URL}/"
|
|
225
|
+
# Scheme and host are case-insensitive; the base64 payload is not.
|
|
226
|
+
if url[: len(prefix)].lower() != prefix.lower():
|
|
227
|
+
return None
|
|
228
|
+
try:
|
|
229
|
+
# Extract base64 part: https://worker.dev/{base64}?type=module
|
|
230
|
+
encoded = url[len(prefix) :].split("?", maxsplit=1)[0]
|
|
231
|
+
# validate=True mirrors _decode_data_uri: urlsafe_b64decode otherwise
|
|
232
|
+
# silently DISCARDS non-alphabet characters, so a junk path could
|
|
233
|
+
# decode to plausible text and be masked as inline content.
|
|
234
|
+
return base64.urlsafe_b64decode(_pad_b64(encoded)).decode("utf-8")
|
|
235
|
+
except Exception: # noqa: BLE001
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def _summarize_resources(
|
|
240
|
+
resources: list[Any],
|
|
241
|
+
keep_start: int,
|
|
242
|
+
keep_stop: int,
|
|
243
|
+
) -> tuple[dict[str, int], int, dict[int, tuple[str, bool]]]:
|
|
244
|
+
"""Count resources by type, and decode every inline one exactly once.
|
|
245
|
+
|
|
246
|
+
Returns ``(by_type_counts, inline_count, {index: (content, is_legacy)})``.
|
|
247
|
+
|
|
248
|
+
Decoding is deliberately WHOLE-SET: ``inline_count`` reports the full
|
|
249
|
+
registry and must agree with the per-resource ``_inline`` markers, and
|
|
250
|
+
only a real decode can tell a genuine inline resource from a corrupt
|
|
251
|
+
payload that merely looks like one.
|
|
252
|
+
|
|
253
|
+
RETENTION, by contrast, is page-scoped: only indices in
|
|
254
|
+
``[keep_start, keep_stop)`` are kept in the returned map. Holding every
|
|
255
|
+
decoded payload would mean a ``limit=1`` call sat on the whole
|
|
256
|
+
registry's content — up to ``MAX_CONTENT_SIZE`` per resource — for a
|
|
257
|
+
one-row response. Because the page's entries are retained, nothing is
|
|
258
|
+
decoded twice.
|
|
259
|
+
"""
|
|
260
|
+
by_type_counts: dict[str, int] = {}
|
|
261
|
+
inline_count = 0
|
|
262
|
+
decoded_by_index: dict[int, tuple[str, bool]] = {}
|
|
263
|
+
for index, resource in enumerate(resources):
|
|
264
|
+
res = resource if isinstance(resource, dict) else {}
|
|
265
|
+
res_type = res.get("type")
|
|
266
|
+
if isinstance(res_type, str):
|
|
267
|
+
by_type_counts[res_type] = by_type_counts.get(res_type, 0) + 1
|
|
268
|
+
url = res.get("url", "")
|
|
269
|
+
if isinstance(url, str):
|
|
270
|
+
decoded = _decode_inline_content(url)
|
|
271
|
+
if decoded:
|
|
272
|
+
inline_count += 1
|
|
273
|
+
if keep_start <= index < keep_stop:
|
|
274
|
+
decoded_by_index[index] = decoded
|
|
275
|
+
return by_type_counts, inline_count, decoded_by_index
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _process_resource_list(
|
|
279
|
+
resources: list[Any],
|
|
280
|
+
decoded_page: list[tuple[str, bool] | None],
|
|
281
|
+
include_content: bool,
|
|
282
|
+
*,
|
|
283
|
+
include_hash: bool = False,
|
|
284
|
+
) -> tuple[list[dict[str, Any]], int]:
|
|
285
|
+
"""Render one page of resources. Returns ``(rows, truncated_count)``.
|
|
286
|
+
|
|
287
|
+
``decoded_page`` carries the already-decoded ``(content, is_legacy)`` for
|
|
288
|
+
each row (``None`` when the resource is not a decodable inline one), so
|
|
289
|
+
this never re-decodes and can never classify a resource differently than
|
|
290
|
+
the caller's summary did.
|
|
291
|
+
|
|
292
|
+
With ``include_content``, content is emitted until the per-response byte
|
|
293
|
+
budget is spent; rows past it are marked ``_content_truncated`` rather
|
|
294
|
+
than silently shortened, because a truncated value written back would
|
|
295
|
+
destroy the resource.
|
|
296
|
+
"""
|
|
297
|
+
processed: list[dict[str, Any]] = []
|
|
298
|
+
truncated_count = 0
|
|
299
|
+
content_budget = _MAX_CONTENT_BUDGET
|
|
300
|
+
|
|
301
|
+
for resource, decoded in zip(resources, decoded_page, strict=True):
|
|
302
|
+
res = dict(resource) if isinstance(resource, dict) else {"url": resource}
|
|
303
|
+
url = res.get("url", "")
|
|
304
|
+
content, is_legacy = decoded if decoded else (None, False)
|
|
305
|
+
|
|
306
|
+
if content:
|
|
307
|
+
content_bytes = len(content.encode("utf-8"))
|
|
308
|
+
res["_inline"] = True
|
|
309
|
+
res["_size"] = content_bytes
|
|
310
|
+
if include_hash:
|
|
311
|
+
res["_config_hash"] = content_sha256(content)
|
|
312
|
+
if is_legacy:
|
|
313
|
+
# The full remediation text lives once at response level;
|
|
314
|
+
# repeating it per resource wasted ~330 chars each.
|
|
315
|
+
res["_legacy_worker"] = True
|
|
316
|
+
|
|
317
|
+
if include_content:
|
|
318
|
+
cost = content_bytes
|
|
319
|
+
if cost <= content_budget:
|
|
320
|
+
res["_content"] = content
|
|
321
|
+
content_budget -= cost
|
|
322
|
+
else:
|
|
323
|
+
res["_content_truncated"] = True
|
|
324
|
+
truncated_count += 1
|
|
325
|
+
else:
|
|
326
|
+
preview = content[:_PREVIEW_LENGTH]
|
|
327
|
+
if len(content) > _PREVIEW_LENGTH:
|
|
328
|
+
preview += "..."
|
|
329
|
+
res["_preview"] = preview
|
|
330
|
+
|
|
331
|
+
res["url"] = "[inline]"
|
|
332
|
+
elif isinstance(url, str) and _has_inline_url_shape(url):
|
|
333
|
+
# Recognized as one of ours but the payload does not decode
|
|
334
|
+
# (empty, corrupt, or not UTF-8). Say so explicitly: without a
|
|
335
|
+
# marker this reads as "an external resource, not my problem",
|
|
336
|
+
# which is the wrong conclusion for someone debugging a card
|
|
337
|
+
# that stopped rendering. The real URL stays visible (truncated
|
|
338
|
+
# if huge) because that is what diagnosis needs.
|
|
339
|
+
res["_decode_error"] = True
|
|
340
|
+
if len(url) > _MAX_ECHOED_URL:
|
|
341
|
+
res["_url_length"] = len(url)
|
|
342
|
+
res["url"] = url[:_MAX_ECHOED_URL] + "…[truncated]"
|
|
343
|
+
|
|
344
|
+
processed.append(res)
|
|
345
|
+
return processed, truncated_count
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def _check_ws_error(result: Any) -> str | None:
|
|
349
|
+
"""Check a WebSocket result for errors. Returns error message or None."""
|
|
350
|
+
if isinstance(result, dict) and not result.get("success", True):
|
|
351
|
+
error = result.get("error", {})
|
|
352
|
+
if isinstance(error, dict):
|
|
353
|
+
msg: str = error.get("message", str(error)) or "Unknown error"
|
|
354
|
+
return msg
|
|
355
|
+
return str(error) or "Unknown error"
|
|
356
|
+
return None
|