ha-mcp-dev 9.0.0.dev3174__tar.gz → 9.0.0.dev3182__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/PKG-INFO +1 -1
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/pyproject.toml +1 -1
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/pyproject.toml.orig +1 -1
- ha_mcp_dev-9.0.0.dev3182/src/ha_mcp/client/error_log_journald.py +241 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/models.py +8 -2
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/rest_client.py +62 -154
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config.py +10 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/log_filters.py +37 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/error_log_parsing.py +274 -51
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/log_common.py +1 -7
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/log_sources.py +284 -64
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_logs.py +101 -29
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.0.0.dev3174 → ha_mcp_dev-9.0.0.dev3182}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.0.0.
|
|
7
|
+
version = "9.0.0.dev3182"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.0.0.
|
|
7
|
+
version = "9.0.0.dev3182"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""Journald window paging for the raw error log (Supervisor-backed installs).
|
|
2
|
+
|
|
3
|
+
Supervisor answers ``?lines=N`` with the N newest journald entries, and an
|
|
4
|
+
``offset`` counts back from the newest one. That anchor moves whenever Home
|
|
5
|
+
Assistant logs another line, so a caller paging on the number can re-read or
|
|
6
|
+
skip entries between two calls. Supervisor also returns ``X-First-Cursor``,
|
|
7
|
+
which identifies the first (oldest) entry of the block it served, and accepts
|
|
8
|
+
``Range: entries=<cursor>:<skip>:<count>``; HA's own log viewer pages on that
|
|
9
|
+
cursor for exactly this reason.
|
|
10
|
+
|
|
11
|
+
This module turns that into an opaque token carrying both the cursor and the
|
|
12
|
+
number of entries a page consumed from it: ``cursor:<X-First-Cursor>:<skip>``.
|
|
13
|
+
A page requested with a token is fetched entirely behind that resume point, so
|
|
14
|
+
lines logged in between cannot shift it and a page that returned only part of
|
|
15
|
+
its fetched window still resumes exactly. ``journald_page`` never computes
|
|
16
|
+
the skip itself -- only the tool layer knows which records a page returned --
|
|
17
|
+
so the token is built there and this module only applies it.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
from collections.abc import Awaitable, Callable
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
|
|
26
|
+
from .models import ErrorLogPage
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
CURSOR_TOKEN_PREFIX = "cursor:"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class JournaldPage:
|
|
35
|
+
"""One journald block plus the cursor of its oldest entry."""
|
|
36
|
+
|
|
37
|
+
text: str
|
|
38
|
+
first_cursor: str | None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
JournaldFetch = Callable[[str], Awaitable[JournaldPage]]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def is_cursor_token(value: object) -> bool:
|
|
45
|
+
"""True when ``value`` is a paging token produced by this module."""
|
|
46
|
+
return (
|
|
47
|
+
isinstance(value, str)
|
|
48
|
+
and value.startswith(CURSOR_TOKEN_PREFIX)
|
|
49
|
+
and bool(value[len(CURSOR_TOKEN_PREFIX) :])
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def cursor_token(cursor: str, skip: int) -> str:
|
|
54
|
+
"""Build the opaque ``next_offset`` value resuming ``skip`` entries in.
|
|
55
|
+
|
|
56
|
+
``skip`` is the offset of the resume point from ``cursor`` (the oldest entry
|
|
57
|
+
of the page's fetched window); the next block ends one entry before it.
|
|
58
|
+
After a page that returned records, entry ``skip`` is the oldest entry the
|
|
59
|
+
page returned, so the next block starts with the entries fetched behind it.
|
|
60
|
+
A held-back tail sets it one past the tail's last line. Zero resumes
|
|
61
|
+
strictly behind ``cursor``, which is what a page that used its whole window
|
|
62
|
+
needs.
|
|
63
|
+
"""
|
|
64
|
+
if skip < 0:
|
|
65
|
+
raise ValueError(f"skip must not be negative, got {skip}")
|
|
66
|
+
return f"{CURSOR_TOKEN_PREFIX}{cursor}:{skip}"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def parse_cursor_token(token: str) -> tuple[str, int]:
|
|
70
|
+
"""Split ``token`` into its cursor and skip; raises ``ValueError`` if malformed.
|
|
71
|
+
|
|
72
|
+
The cursor itself never contains ``:`` (systemd cursors separate their
|
|
73
|
+
fields with ``;``), but the skip is still split off from the right so a
|
|
74
|
+
future cursor format cannot be mistaken for it.
|
|
75
|
+
"""
|
|
76
|
+
if not token.startswith(CURSOR_TOKEN_PREFIX):
|
|
77
|
+
raise ValueError("not a cursor token")
|
|
78
|
+
cursor, separator, skip = token[len(CURSOR_TOKEN_PREFIX) :].rpartition(":")
|
|
79
|
+
if not separator or not cursor or not skip.isdigit():
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"cursor token must read 'cursor:<cursor>:<entries>' as returned in "
|
|
82
|
+
"'next_offset'"
|
|
83
|
+
)
|
|
84
|
+
return cursor, int(skip)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def token_cursor(token: str) -> str:
|
|
88
|
+
"""The cursor carried by ``token``; raises ``ValueError`` when malformed."""
|
|
89
|
+
return parse_cursor_token(token)[0]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def token_skip(token: str) -> int:
|
|
93
|
+
"""The skip carried by ``token``; raises ``ValueError`` when malformed."""
|
|
94
|
+
return parse_cursor_token(token)[1]
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def range_header(lines: int, offset: int = 0) -> str:
|
|
98
|
+
"""The ``Range`` expression for the ``offset``-th window back from newest."""
|
|
99
|
+
return f"entries=:{-(offset + lines - 1)}:{lines}"
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def cursor_range_header(cursor: str, skip: int, lines: int) -> str:
|
|
103
|
+
"""The expression returning ``lines`` entries strictly behind ``cursor:skip``.
|
|
104
|
+
|
|
105
|
+
Gatewayd reads ``entries=<cursor>:<num_skip>:<num_entries>`` forward from
|
|
106
|
+
``cursor + num_skip``, so ending the block just behind the resume point
|
|
107
|
+
(``cursor + skip``) means starting ``lines`` entries earlier. That makes a
|
|
108
|
+
cursor page the exact unfetched remainder: nothing the caller already saw
|
|
109
|
+
is repeated and nothing between pages is dropped.
|
|
110
|
+
"""
|
|
111
|
+
return f"entries={cursor}:{skip - lines}:{lines}"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def container_page(text: str, lines: int, offset: int) -> ErrorLogPage:
|
|
115
|
+
"""Window the whole-file ``/api/error_log`` body client-side.
|
|
116
|
+
|
|
117
|
+
Paging is exact here: the whole file is in hand, so ``has_more`` is simply
|
|
118
|
+
whether anything precedes the window.
|
|
119
|
+
"""
|
|
120
|
+
all_lines = text.splitlines()
|
|
121
|
+
end = len(all_lines) - offset
|
|
122
|
+
if end <= 0:
|
|
123
|
+
return ErrorLogPage(text="", has_more=False)
|
|
124
|
+
start = max(end - lines, 0)
|
|
125
|
+
return ErrorLogPage(
|
|
126
|
+
text="\n".join(all_lines[start:end]),
|
|
127
|
+
has_more=start > 0,
|
|
128
|
+
first_cursor=None,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def first_cursor(response: object) -> str | None:
|
|
133
|
+
"""Supervisor's ``X-First-Cursor`` from ``response``, when it carries one."""
|
|
134
|
+
headers = getattr(response, "headers", None)
|
|
135
|
+
if not headers:
|
|
136
|
+
return None
|
|
137
|
+
value = headers.get("X-First-Cursor")
|
|
138
|
+
return value or None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
async def journald_page(
|
|
142
|
+
lines: int,
|
|
143
|
+
offset: int | str,
|
|
144
|
+
fetch: JournaldFetch,
|
|
145
|
+
) -> ErrorLogPage:
|
|
146
|
+
"""One journald window, anchored on the newest entry or on a cursor token."""
|
|
147
|
+
if is_cursor_token(offset):
|
|
148
|
+
if not isinstance(offset, str): # pragma: no cover - narrows the type
|
|
149
|
+
raise ValueError("cursor token must be a string")
|
|
150
|
+
cursor, skip = parse_cursor_token(offset)
|
|
151
|
+
return await _cursor_page(lines, cursor, skip, fetch)
|
|
152
|
+
if isinstance(offset, str):
|
|
153
|
+
raise ValueError("offset must be a non-negative integer or a cursor token")
|
|
154
|
+
return await _newest_page(lines, offset, fetch)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
async def _newest_page(lines: int, offset: int, fetch: JournaldFetch) -> ErrorLogPage:
|
|
158
|
+
page = await fetch(range_header(lines, offset))
|
|
159
|
+
text_lines = page.text.splitlines()
|
|
160
|
+
if len(text_lines) < lines:
|
|
161
|
+
# Nothing clamps a window smaller than asked for, so a short window is
|
|
162
|
+
# the end of the journal.
|
|
163
|
+
return ErrorLogPage(text=page.text, has_more=False)
|
|
164
|
+
has_more = await _has_older_than(page.first_cursor, fetch)
|
|
165
|
+
return ErrorLogPage(
|
|
166
|
+
text=page.text,
|
|
167
|
+
has_more=has_more,
|
|
168
|
+
first_cursor=page.first_cursor,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
async def _cursor_page(
|
|
173
|
+
lines: int, cursor: str, skip: int, fetch: JournaldFetch
|
|
174
|
+
) -> ErrorLogPage:
|
|
175
|
+
page = await fetch(cursor_range_header(cursor, skip, lines))
|
|
176
|
+
entries = page.text.splitlines()
|
|
177
|
+
has_more = await _has_older_than(page.first_cursor, fetch)
|
|
178
|
+
if entries and not has_more and page.first_cursor:
|
|
179
|
+
# The block starts at the journal's head, so gatewayd clamped its start
|
|
180
|
+
# and kept reading forward: it may run past the resume point and repeat
|
|
181
|
+
# entries the previous page already returned. Keep only what precedes
|
|
182
|
+
# the resume point.
|
|
183
|
+
entries = entries[
|
|
184
|
+
: await _entries_before_resume(
|
|
185
|
+
cursor, skip, len(entries), page.first_cursor, fetch
|
|
186
|
+
)
|
|
187
|
+
]
|
|
188
|
+
return ErrorLogPage(
|
|
189
|
+
text="\n".join(entries),
|
|
190
|
+
has_more=has_more,
|
|
191
|
+
first_cursor=page.first_cursor,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
async def _entries_before_resume(
|
|
196
|
+
cursor: str,
|
|
197
|
+
skip: int,
|
|
198
|
+
count: int,
|
|
199
|
+
head: str,
|
|
200
|
+
fetch: JournaldFetch,
|
|
201
|
+
) -> int:
|
|
202
|
+
"""How many entries of a head-clamped block precede the resume point.
|
|
203
|
+
|
|
204
|
+
Gatewayd anchors ``entries=<cursor>:<skip>:<count>`` at ``cursor + skip``
|
|
205
|
+
and reads ``count`` entries forward. A skip that runs past the journal's
|
|
206
|
+
start is clamped to the head rather than rejected, so the block it returns
|
|
207
|
+
can contain entries at or after the resume point. Those entries duplicate
|
|
208
|
+
the previous page and, without trimming, hide the oldest ones behind them.
|
|
209
|
+
|
|
210
|
+
The resume point is ``skip`` entries after ``cursor``. Asking for the single
|
|
211
|
+
entry ``k`` entries before it returns the head exactly when ``k`` reaches it
|
|
212
|
+
(at or past the head the start clamps there), which binary-searches its
|
|
213
|
+
position without needing per-entry cursors — Supervisor rejects a JSON
|
|
214
|
+
Accept, so cursors are the only per-entry identity it will not serve.
|
|
215
|
+
"""
|
|
216
|
+
low, high = 0, count
|
|
217
|
+
while low < high:
|
|
218
|
+
middle = (low + high) // 2
|
|
219
|
+
probe = await fetch(f"entries={cursor}:{skip - middle}:1")
|
|
220
|
+
if probe.first_cursor == head:
|
|
221
|
+
high = middle
|
|
222
|
+
else:
|
|
223
|
+
low = middle + 1
|
|
224
|
+
return low
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
async def _has_older_than(cursor: str | None, fetch: JournaldFetch) -> bool:
|
|
228
|
+
"""True when an entry precedes ``cursor``.
|
|
229
|
+
|
|
230
|
+
Gatewayd clamps a skip that runs past the journal's start to its head
|
|
231
|
+
block instead of answering with an empty one, so the block's length says
|
|
232
|
+
nothing here. Its first cursor does: only a clamped probe starts on the
|
|
233
|
+
anchor entry itself. (The HA frontend uses the same signal to detect the
|
|
234
|
+
end of history.)
|
|
235
|
+
"""
|
|
236
|
+
if not cursor:
|
|
237
|
+
return False
|
|
238
|
+
probe = await fetch(cursor_range_header(cursor, 0, 2))
|
|
239
|
+
if not probe.text.splitlines():
|
|
240
|
+
return False
|
|
241
|
+
return probe.first_cursor != cursor
|
|
@@ -10,9 +10,15 @@ class ErrorLogPage:
|
|
|
10
10
|
"""One bounded window of the error log, plus whether older history exists.
|
|
11
11
|
|
|
12
12
|
``has_more`` cannot be derived by the caller from ``text``: a journald
|
|
13
|
-
window that comes back full may or may not have anything behind it
|
|
14
|
-
|
|
13
|
+
window that comes back full may or may not have anything behind it, and
|
|
14
|
+
only the fetching route knows which.
|
|
15
|
+
|
|
16
|
+
``first_cursor`` is Supervisor's ``X-First-Cursor`` for the block -- the
|
|
17
|
+
oldest entry this window served -- and is ``None`` on installs that read a
|
|
18
|
+
whole log file. The tool layer turns it into the ``next_offset`` token, so
|
|
19
|
+
the cursor travels as data instead of being re-derived from the text.
|
|
15
20
|
"""
|
|
16
21
|
|
|
17
22
|
text: str
|
|
18
23
|
has_more: bool
|
|
24
|
+
first_cursor: str | None = None
|
|
@@ -8,7 +8,6 @@ import logging
|
|
|
8
8
|
import os
|
|
9
9
|
import ssl
|
|
10
10
|
import time
|
|
11
|
-
from collections.abc import Awaitable, Callable
|
|
12
11
|
from dataclasses import dataclass
|
|
13
12
|
from typing import Any, NoReturn
|
|
14
13
|
|
|
@@ -18,6 +17,13 @@ from .._vendor.websockets.exceptions import WebSocketException
|
|
|
18
17
|
from .._version import get_supervisor_base_url, is_running_in_addon
|
|
19
18
|
from ..config import get_global_settings
|
|
20
19
|
from .admin_routes import is_admin_only_route
|
|
20
|
+
from .error_log_journald import (
|
|
21
|
+
JournaldPage,
|
|
22
|
+
container_page,
|
|
23
|
+
first_cursor,
|
|
24
|
+
journald_page,
|
|
25
|
+
range_header,
|
|
26
|
+
)
|
|
21
27
|
from .models import ErrorLogPage
|
|
22
28
|
from .supervisor_client import make_supervisor_httpx_client
|
|
23
29
|
|
|
@@ -62,16 +68,6 @@ _MAX_REQUEST_ATTEMPTS = 3
|
|
|
62
68
|
# client mirrors that on every route, so all install types serve the same slice.
|
|
63
69
|
# Shared with the tool layer, which sizes its fetch window against it.
|
|
64
70
|
MIN_LOG_WINDOW_LINES = 2
|
|
65
|
-
# Entries the has_more probe reads from just behind a full window. A one-entry
|
|
66
|
-
# probe compared one rendered line, which a boundary duplicate (the same
|
|
67
|
-
# timestamp-less traceback line logged twice) could false-match into "end of
|
|
68
|
-
# history". Comparing a block this deep requires that many CONSECUTIVE
|
|
69
|
-
# identical lines to straddle the boundary — and then the history a false stop
|
|
70
|
-
# skips is more of the same duplicates. Timestamps cannot close the gap
|
|
71
|
-
# instead: the colliding lines are exactly the ones without them, and
|
|
72
|
-
# journald's cursor/timestamp metadata exists only in the journal export
|
|
73
|
-
# format, which the hassio-proxy route cannot request.
|
|
74
|
-
_PROBE_ENTRIES = 8
|
|
75
71
|
NON_ADMIN_TOKEN_WARNING = (
|
|
76
72
|
"ha-mcp does not officially support non-admin Home Assistant tokens. They "
|
|
77
73
|
"still work, but admin-only operations fail. Use a long-lived access token "
|
|
@@ -898,126 +894,26 @@ class HomeAssistantClient:
|
|
|
898
894
|
logger.debug("Checking configuration")
|
|
899
895
|
return await self._request("POST", "/config/core/check_config")
|
|
900
896
|
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
(
|
|
909
|
-
further back, so the returned slice ends ``offset`` entries before the
|
|
910
|
-
newest one.
|
|
911
|
-
|
|
912
|
-
A ``lines=1`` window is only expressible with a non-zero ``offset``: at
|
|
913
|
-
``offset=0`` the header degenerates to ``entries=:0:1``, whose
|
|
914
|
-
non-negative skip reads from the OLDEST entry instead of the newest.
|
|
915
|
-
Callers anchoring at the newest entry pass ``lines`` already floored at
|
|
916
|
-
``MIN_LOG_WINDOW_LINES``; the one-entry probe always carries an offset.
|
|
917
|
-
"""
|
|
918
|
-
# Negate the computed skip rather than prefixing "-" so the degenerate
|
|
919
|
-
# skip of 0 renders as ":0:" (non-negative, reads from the oldest
|
|
920
|
-
# entry) instead of the ill-formed ":-0:".
|
|
921
|
-
return f"entries=:{-(offset + lines - 1)}:{lines}"
|
|
897
|
+
async def _supervisor_core_logs(self, range_header: str) -> JournaldPage:
|
|
898
|
+
"""Fetch one journald window straight from Supervisor, with its cursor."""
|
|
899
|
+
response = await self._supervisor_logs_response(
|
|
900
|
+
"core",
|
|
901
|
+
headers={"Accept": "text/plain", "Range": range_header},
|
|
902
|
+
params={"no_colors": "true"},
|
|
903
|
+
)
|
|
904
|
+
return JournaldPage(response.text, first_cursor(response))
|
|
922
905
|
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
"""Window the whole-file ``/api/error_log`` body client-side.
|
|
926
|
-
|
|
927
|
-
Same tail semantics as the journald Range the Supervisor-backed
|
|
928
|
-
branches request, so ``get_error_log`` answers with the same slice of
|
|
929
|
-
history on every install type. Paging is exact here — the whole file is
|
|
930
|
-
in hand, so ``has_more`` is simply whether anything precedes the window.
|
|
931
|
-
An ``offset`` past the start of the file yields an empty final page.
|
|
932
|
-
"""
|
|
933
|
-
all_lines = text.splitlines()
|
|
934
|
-
end = len(all_lines) - offset
|
|
935
|
-
if end <= 0:
|
|
936
|
-
return ErrorLogPage(text="", has_more=False)
|
|
937
|
-
start = max(end - lines, 0)
|
|
938
|
-
return ErrorLogPage(text="\n".join(all_lines[start:end]), has_more=start > 0)
|
|
939
|
-
|
|
940
|
-
async def _supervisor_core_logs(self, lines: int, offset: int) -> str:
|
|
941
|
-
"""Fetch a journald window of HA Core's log straight from Supervisor."""
|
|
942
|
-
return await self._supervisor_logs_get("core", lines=lines, offset=offset)
|
|
943
|
-
|
|
944
|
-
async def _proxied_core_logs(self, lines: int, offset: int) -> str:
|
|
945
|
-
"""Fetch the same window through HA Core's hassio proxy with the LLA."""
|
|
906
|
+
async def _proxied_core_logs(self, range_header: str) -> JournaldPage:
|
|
907
|
+
"""The same window through HA Core's hassio proxy."""
|
|
946
908
|
response = await self._raw_request(
|
|
947
909
|
"GET",
|
|
948
910
|
"/hassio/core/logs",
|
|
949
|
-
headers={
|
|
950
|
-
"Accept": "text/plain",
|
|
951
|
-
"Range": self._journald_range_header(lines, offset),
|
|
952
|
-
},
|
|
911
|
+
headers={"Accept": "text/plain", "Range": range_header},
|
|
953
912
|
params={"no_colors": "true"},
|
|
954
913
|
)
|
|
955
|
-
return response.text
|
|
956
|
-
|
|
957
|
-
async def _journald_error_log_page(
|
|
958
|
-
self,
|
|
959
|
-
lines: int,
|
|
960
|
-
offset: int,
|
|
961
|
-
fetch: Callable[[int, int], Awaitable[str]],
|
|
962
|
-
) -> ErrorLogPage:
|
|
963
|
-
"""Read one journald window and settle ``has_more`` with a 1-entry probe.
|
|
964
|
-
|
|
965
|
-
systemd's journal-gatewayd does not guard the negative-skip branch the
|
|
966
|
-
way it guards the positive one (``sd_journal_previous_skip(-n_skip + 1)``
|
|
967
|
-
returns no END_OF_STREAM): an offset past the start of the journal
|
|
968
|
-
CLAMPS to the oldest entry and still answers with a full window. So a
|
|
969
|
-
saturated window proves nothing about what lies behind it, and a
|
|
970
|
-
count-based ``has_more`` would stay true forever — an agent following
|
|
971
|
-
the pagination hint would loop on identical pages.
|
|
972
|
-
|
|
973
|
-
Hence: a short or empty window means the journal really is exhausted
|
|
974
|
-
(nothing clamps a window smaller), and a saturated one is settled by
|
|
975
|
-
asking for the ``_PROBE_ENTRIES`` entries that should sit just behind
|
|
976
|
-
it. If the journal has nothing there, the clamp starts the probe at
|
|
977
|
-
the same oldest entry the window starts with, so the probe block
|
|
978
|
-
equals the window's opening lines — identity means end of history. A
|
|
979
|
-
differing block proves deeper history (an under-full span behind the
|
|
980
|
-
window also clamps and misaligns, which correctly reads as "more").
|
|
981
|
-
The identity check also terminates the degraded case where an
|
|
982
|
-
intermediary strips the ``Range`` header (RFC 7233 permits it): both
|
|
983
|
-
requests then return Supervisor's default window and compare equal.
|
|
984
|
-
|
|
985
|
-
The saturation test counts lines only to decide whether to probe, never
|
|
986
|
-
to answer: one journald entry can be a multi-line traceback, so the line
|
|
987
|
-
count over-estimates entries and can only over-trigger the probe, which
|
|
988
|
-
then gives the real answer. In practice the two rarely diverge here:
|
|
989
|
-
docker's journald log driver — how HAOS captures Core's output —
|
|
990
|
-
ingests stdout line by line, one journal entry per rendered line, so
|
|
991
|
-
multi-line entries reach this endpoint only from native journal-API
|
|
992
|
-
writers.
|
|
993
|
-
|
|
994
|
-
Known imprecision, accepted: the identity check can still stop one
|
|
995
|
-
page early when the compared block — ``_PROBE_ENTRIES`` lines, or the
|
|
996
|
-
window's own length when that is smaller — is byte-identical across
|
|
997
|
-
the boundary (see the constant's comment for why timestamps cannot
|
|
998
|
-
disambiguate instead). The failure
|
|
999
|
-
direction is a missed page of exactly those duplicates — bounded,
|
|
1000
|
-
unlike the infinite loop a count-based ``has_more`` produces on the
|
|
1001
|
-
clamp.
|
|
1002
|
-
"""
|
|
1003
|
-
text = await fetch(lines, offset)
|
|
1004
|
-
if not text or len(text.splitlines()) < lines:
|
|
1005
|
-
return ErrorLogPage(text=text, has_more=False)
|
|
1006
|
-
probe = await fetch(_PROBE_ENTRIES, offset + lines)
|
|
1007
|
-
probe_lines = probe.splitlines()
|
|
1008
|
-
window_lines = text.splitlines()
|
|
1009
|
-
# Compare the shared-length prefix: with a window smaller than the
|
|
1010
|
-
# probe (lines < _PROBE_ENTRIES), an end-of-history clamp returns a
|
|
1011
|
-
# probe LONGER than the window, and a full-length compare would read
|
|
1012
|
-
# that as "more history" forever — the small-limit loop this method
|
|
1013
|
-
# exists to prevent.
|
|
1014
|
-
shared = min(len(probe_lines), len(window_lines))
|
|
1015
|
-
return ErrorLogPage(
|
|
1016
|
-
text=text,
|
|
1017
|
-
has_more=shared > 0 and probe_lines[:shared] != window_lines[:shared],
|
|
1018
|
-
)
|
|
914
|
+
return JournaldPage(response.text, first_cursor(response))
|
|
1019
915
|
|
|
1020
|
-
async def get_error_log(self, lines: int, offset: int = 0) -> ErrorLogPage:
|
|
916
|
+
async def get_error_log(self, lines: int, offset: int | str = 0) -> ErrorLogPage:
|
|
1021
917
|
"""Get a bounded window of the Home Assistant error log.
|
|
1022
918
|
|
|
1023
919
|
``lines`` is the number of log lines to fetch and ``offset`` how many
|
|
@@ -1054,15 +950,14 @@ class HomeAssistantClient:
|
|
|
1054
950
|
keep the historical ``/api/error_log`` proxy path.
|
|
1055
951
|
|
|
1056
952
|
The two Supervisor-backed branches express the window as a journald
|
|
1057
|
-
``Range`` header
|
|
1058
|
-
``
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
same window client-side, where paging is exact.
|
|
953
|
+
``Range`` header, either anchored on the newest entry (integer
|
|
954
|
+
``offset``) or on an opaque cursor token from an earlier page; see
|
|
955
|
+
:mod:`ha_mcp.client.error_log_journald`. Working from Supervisor's
|
|
956
|
+
``X-First-Cursor`` keeps a page stable while Home Assistant logs more
|
|
957
|
+
lines between two calls. ``/api/error_log`` is a whole-file plain-text
|
|
958
|
+
endpoint with no window support, so the container branch reads the file
|
|
959
|
+
and applies the same window client-side, where paging is exact and
|
|
960
|
+
integer offsets stay the contract.
|
|
1066
961
|
|
|
1067
962
|
The middle branch was discovered by the HAOS E2E tier (#1326): the
|
|
1068
963
|
test harness runs ha-mcp externally against a booted HAOS, hits
|
|
@@ -1085,7 +980,7 @@ class HomeAssistantClient:
|
|
|
1085
980
|
logger.debug(
|
|
1086
981
|
"Fetching error log via Supervisor direct (core service)"
|
|
1087
982
|
)
|
|
1088
|
-
return await
|
|
983
|
+
return await journald_page(
|
|
1089
984
|
window, offset, self._supervisor_core_logs
|
|
1090
985
|
)
|
|
1091
986
|
|
|
@@ -1094,15 +989,18 @@ class HomeAssistantClient:
|
|
|
1094
989
|
"Fetching error log via HA Core /hassio/core/logs proxy "
|
|
1095
990
|
"(supervised)"
|
|
1096
991
|
)
|
|
1097
|
-
return await self.
|
|
1098
|
-
window, offset, self._proxied_core_logs
|
|
1099
|
-
)
|
|
992
|
+
return await journald_page(window, offset, self._proxied_core_logs)
|
|
1100
993
|
|
|
994
|
+
if isinstance(offset, str):
|
|
995
|
+
raise HomeAssistantAPIError(
|
|
996
|
+
"Cursor-token paging needs a Supervisor-backed install; "
|
|
997
|
+
"the container /api/error_log endpoint has no cursor"
|
|
998
|
+
)
|
|
1101
999
|
logger.debug("Fetching error log via HA Core proxy (Container/pip)")
|
|
1102
1000
|
raw_response = await self._raw_request(
|
|
1103
1001
|
"GET", "/error_log", headers={"Accept": "text/plain"}
|
|
1104
1002
|
)
|
|
1105
|
-
return
|
|
1003
|
+
return container_page(raw_response.text, window, offset)
|
|
1106
1004
|
except TimeoutError as e:
|
|
1107
1005
|
raise HomeAssistantConnectionError(
|
|
1108
1006
|
f"Timeout fetching the error log after {self.timeout}s: "
|
|
@@ -1309,18 +1207,6 @@ class HomeAssistantClient:
|
|
|
1309
1207
|
HomeAssistantConnectionError: Timeout or transport error, with
|
|
1310
1208
|
distinct messages so callers can tell them apart.
|
|
1311
1209
|
"""
|
|
1312
|
-
token = os.environ.get("SUPERVISOR_TOKEN", "")
|
|
1313
|
-
if not token:
|
|
1314
|
-
# The is_running_in_addon() gate already keys off SUPERVISOR_TOKEN
|
|
1315
|
-
# being truthy, so a direct caller landing here without one is a
|
|
1316
|
-
# detection/config mismatch — fail-fast with a distinct message
|
|
1317
|
-
# so operators don't read it as "token rejected".
|
|
1318
|
-
raise HomeAssistantAuthError(
|
|
1319
|
-
f"Supervisor token absent at call time for /{path}/logs "
|
|
1320
|
-
"(addon-mode gate fired but SUPERVISOR_TOKEN env var not set)"
|
|
1321
|
-
)
|
|
1322
|
-
|
|
1323
|
-
relative_path = f"/{path}/logs"
|
|
1324
1210
|
headers = {"Accept": "text/plain"}
|
|
1325
1211
|
# Presence-triggered flag: journald output carries ANSI escapes otherwise.
|
|
1326
1212
|
params: dict[str, Any] = {"no_colors": "true"}
|
|
@@ -1330,14 +1216,36 @@ class HomeAssistantClient:
|
|
|
1330
1216
|
# An offset window with no size asked for falls back to the
|
|
1331
1217
|
# smallest one the Range syntax can express.
|
|
1332
1218
|
size = lines if lines is not None else MIN_LOG_WINDOW_LINES
|
|
1333
|
-
headers["Range"] =
|
|
1219
|
+
headers["Range"] = range_header(size, offset)
|
|
1334
1220
|
params.pop("lines", None)
|
|
1335
1221
|
logger.debug(
|
|
1336
|
-
"Fetching %s
|
|
1222
|
+
"Fetching %s/%s/logs via Supervisor direct (%s)",
|
|
1337
1223
|
get_supervisor_base_url(),
|
|
1338
|
-
|
|
1224
|
+
path,
|
|
1339
1225
|
f"range={headers['Range']}" if offset is not None else f"lines={lines}",
|
|
1340
1226
|
)
|
|
1227
|
+
response = await self._supervisor_logs_response(path, headers, params)
|
|
1228
|
+
return response.text
|
|
1229
|
+
|
|
1230
|
+
async def _supervisor_logs_response(
|
|
1231
|
+
self, path: str, headers: dict[str, str], params: dict[str, Any]
|
|
1232
|
+
) -> httpx.Response:
|
|
1233
|
+
"""Send one Supervisor ``/logs`` request and map its failures.
|
|
1234
|
+
|
|
1235
|
+
Split from ``_supervisor_logs_get`` so the error-log route can read
|
|
1236
|
+
Supervisor's ``X-First-Cursor`` while plain-text callers keep the body.
|
|
1237
|
+
"""
|
|
1238
|
+
token = os.environ.get("SUPERVISOR_TOKEN", "")
|
|
1239
|
+
if not token:
|
|
1240
|
+
# The is_running_in_addon() gate already keys off SUPERVISOR_TOKEN
|
|
1241
|
+
# being truthy, so a direct caller landing here without one is a
|
|
1242
|
+
# detection/config mismatch — fail-fast with a distinct message
|
|
1243
|
+
# so operators don't read it as "token rejected".
|
|
1244
|
+
raise HomeAssistantAuthError(
|
|
1245
|
+
f"Supervisor token absent at call time for /{path}/logs "
|
|
1246
|
+
"(addon-mode gate fired but SUPERVISOR_TOKEN env var not set)"
|
|
1247
|
+
)
|
|
1248
|
+
relative_path = f"/{path}/logs"
|
|
1341
1249
|
|
|
1342
1250
|
try:
|
|
1343
1251
|
async with asyncio.timeout(self.timeout):
|
|
@@ -1393,7 +1301,7 @@ class HomeAssistantClient:
|
|
|
1393
1301
|
status_code=response.status_code,
|
|
1394
1302
|
response_data={"message": text_body, "path": path},
|
|
1395
1303
|
)
|
|
1396
|
-
return response
|
|
1304
|
+
return response
|
|
1397
1305
|
|
|
1398
1306
|
async def _get_addon_logs_via_supervisor(
|
|
1399
1307
|
self, slug: str, lines: int | None = None
|
|
@@ -167,6 +167,16 @@ def set_embedded_connection(
|
|
|
167
167
|
_apply_embedded_connection(_settings)
|
|
168
168
|
|
|
169
169
|
|
|
170
|
+
def is_embedded_mode() -> bool:
|
|
171
|
+
"""True when ha-mcp runs in-process inside Home Assistant.
|
|
172
|
+
|
|
173
|
+
Set by the custom component's in-process server entry via
|
|
174
|
+
``set_embedded_connection``; false for the CLI, the HTTP launchers and the
|
|
175
|
+
app (add-on) build.
|
|
176
|
+
"""
|
|
177
|
+
return bool(_EMBEDDED_CONNECTION)
|
|
178
|
+
|
|
179
|
+
|
|
170
180
|
def get_embedded_config_dir() -> str | None:
|
|
171
181
|
"""Home Assistant's configuration directory, when running embedded.
|
|
172
182
|
|
|
@@ -159,6 +159,36 @@ def _add_filter_once(logger_name: str, filter_cls: type[logging.Filter]) -> None
|
|
|
159
159
|
logger.addFilter(filter_cls())
|
|
160
160
|
|
|
161
161
|
|
|
162
|
+
def route_fastmcp_logs_to_root() -> None:
|
|
163
|
+
"""Hand FastMCP's own log records to the embedding application.
|
|
164
|
+
|
|
165
|
+
The vendored FastMCP configures the ``fastmcp`` logger at import time with
|
|
166
|
+
``propagate = False`` and a RichHandler of its own. In the in-process
|
|
167
|
+
embedded server that means its records bypass Home Assistant's logging:
|
|
168
|
+
they reach Core's stream without HA's header, never reach ``system_log``,
|
|
169
|
+
and error-log record grouping reads them as continuation lines of whatever
|
|
170
|
+
record preceded them. Clearing the handlers and letting the logger
|
|
171
|
+
propagate gives HA's handler the record, so it is formatted, level-gated
|
|
172
|
+
and grouped like any other Core record.
|
|
173
|
+
|
|
174
|
+
The import-time INFO level is dropped too (``NOTSET``), so ``fastmcp``
|
|
175
|
+
follows Home Assistant's default level and honours ``logger.set_level``
|
|
176
|
+
(or a ``logger:`` entry) for it like any integration's logger. Leaving it
|
|
177
|
+
at INFO would let FastMCP records through at a level HA was told to hide;
|
|
178
|
+
a threshold filter on Core's handlers would instead override the user's
|
|
179
|
+
own level for ``fastmcp`` and would stay attached to Core's handlers after
|
|
180
|
+
the embedded entry unloads.
|
|
181
|
+
|
|
182
|
+
Only the embedded server calls this. The CLI and the app launchers own
|
|
183
|
+
their stdout/stderr and must keep FastMCP's own handler.
|
|
184
|
+
"""
|
|
185
|
+
logger = logging.getLogger("fastmcp")
|
|
186
|
+
for handler in list(logger.handlers):
|
|
187
|
+
logger.removeHandler(handler)
|
|
188
|
+
logger.propagate = True
|
|
189
|
+
logger.setLevel(logging.NOTSET)
|
|
190
|
+
|
|
191
|
+
|
|
162
192
|
def install_sdk_log_filters() -> None:
|
|
163
193
|
"""Attach the suppression/demotion filters above to their MCP SDK loggers.
|
|
164
194
|
|
|
@@ -170,3 +200,10 @@ def install_sdk_log_filters() -> None:
|
|
|
170
200
|
"""
|
|
171
201
|
_add_filter_once("mcp.server.streamable_http", StatelessSessionLogFilter)
|
|
172
202
|
_add_filter_once("mcp.server.streamable_http_manager", SessionDisconnectLogFilter)
|
|
203
|
+
# Embedded-only: give FastMCP's own records to Home Assistant's logging so
|
|
204
|
+
# they carry HA's header, respect HA's levels and reach system_log. The CLI
|
|
205
|
+
# and app launchers own their output and keep FastMCP's handler.
|
|
206
|
+
from .config import is_embedded_mode
|
|
207
|
+
|
|
208
|
+
if is_embedded_mode():
|
|
209
|
+
route_fastmcp_logs_to_root()
|