ha-mcp-dev 9.1.1.dev3368__tar.gz → 9.1.1.dev3370__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/PKG-INFO +1 -1
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/pyproject.toml +1 -1
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/pyproject.toml.orig +1 -1
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/backup_integrations.py +209 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_manager.py +32 -33
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/client/config_entry_read.py +56 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/rest_client.py +19 -22
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/redaction.py +52 -13
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/backup.py +1 -1
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_config_entries.py +76 -102
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_flow.py +91 -104
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/config_entry_flow_errors.py +434 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_flow_form.py +1 -17
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_flow_introspect.py +94 -27
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/config_entry_flow_progress.py +86 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_flow_walker.py +266 -374
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_identity.py +146 -198
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_reload_watch.py +41 -11
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/describe.py +229 -142
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_subentry_restore.py +8 -2
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/core_contract.py +33 -12
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/flow_translations.py +107 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/helpers.py +4 -2
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/ignored_entries.py +38 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/integration_entry_state.py +16 -3
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/integration_flow_steps.py +650 -0
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/integration_schema.py +322 -0
- ha_mcp_dev-9.1.1.dev3370/src/ha_mcp/tools/integration_ws_commands.py +163 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/base.py +5 -3
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_deep.py +7 -7
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_config_helpers.py +2 -1
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_dev.py +4 -8
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_integrations.py +547 -662
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_service.py +2 -33
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/util_helpers.py +33 -0
- ha_mcp_dev-9.1.1.dev3368/src/ha_mcp/backup_integrations.py +0 -49
- ha_mcp_dev-9.1.1.dev3368/src/ha_mcp/tools/config_entry_reconfigure.py +0 -990
- ha_mcp_dev-9.1.1.dev3368/src/ha_mcp/tools/integration_reconfigure.py +0 -354
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/event_listeners.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/theme_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/ipv6_lan_guard.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/listen_sockets.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/mcp_client_context.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/storage_helper_types.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tool_catalog.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/automation_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/backup_snapshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/bug_report_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_automation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/component_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_file_visibility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/event_call.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/event_listener_fields.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/hacs_backend.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/resource_codec.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/resource_patch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/update_categories.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/config_files.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.1.1.dev3368 → ha_mcp_dev-9.1.1.dev3370}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.1.
|
|
7
|
+
version = "9.1.1.dev3370"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.1.
|
|
7
|
+
version = "9.1.1.dev3370"
|
|
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,209 @@
|
|
|
1
|
+
"""Auto-backup handlers for integration config entries.
|
|
2
|
+
|
|
3
|
+
A snapshot holds the entry's Core row, its enabled state and, read through the
|
|
4
|
+
ha_mcp_tools component, its options. Options are kept only when the component
|
|
5
|
+
could scrub them and they hold no redaction placeholder; otherwise
|
|
6
|
+
``options_unavailable`` says why. ``entry.data`` (credentials) is never read,
|
|
7
|
+
and neither are subentries: ha_set_integration does not edit them, and Core
|
|
8
|
+
has no API to put a subentry's data back under a deleted entry.
|
|
9
|
+
|
|
10
|
+
A restore refuses a deleted entry rather than sending Core a command for an
|
|
11
|
+
entry it no longer has. Otherwise it enables the entry first when the snapshot
|
|
12
|
+
was enabled, so the options flow runs on a loaded entry, puts back options that
|
|
13
|
+
differ through the options flow and reads them back, then applies the enabled
|
|
14
|
+
state. Options it cannot put back (the snapshot has none, or empty ones an
|
|
15
|
+
options flow cannot produce) fail the restore after the enabled state is set.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from functools import partial
|
|
21
|
+
from typing import TYPE_CHECKING, Any
|
|
22
|
+
|
|
23
|
+
from .backup_entity_ids import _manager
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from .backup_manager import BackupRestoreError
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def fetch_integration(client: Any, entity_id: str) -> Any:
|
|
30
|
+
from .redaction import placeholder_option_keys
|
|
31
|
+
from .tools import component_config_entries
|
|
32
|
+
from .tools.component_api import component_supports, get_component_caps
|
|
33
|
+
|
|
34
|
+
bm = _manager()
|
|
35
|
+
read = await component_config_entries.fetch_config_entries(
|
|
36
|
+
client, entry_id=entity_id
|
|
37
|
+
)
|
|
38
|
+
if read is None:
|
|
39
|
+
# An installed component whose command failed is not a missing one.
|
|
40
|
+
caps = await get_component_caps(client)
|
|
41
|
+
why = (
|
|
42
|
+
"component_read_failed"
|
|
43
|
+
if component_supports(caps, "config_entries")
|
|
44
|
+
else "component_unavailable"
|
|
45
|
+
)
|
|
46
|
+
items = bm._require_list(
|
|
47
|
+
await bm._ws_send(client, {"type": "config_entries/get"}),
|
|
48
|
+
"config_entries/get",
|
|
49
|
+
)
|
|
50
|
+
for item in items:
|
|
51
|
+
if item.get("entry_id") == entity_id:
|
|
52
|
+
return {**item, "options_unavailable": why}
|
|
53
|
+
return None
|
|
54
|
+
if not read.rows:
|
|
55
|
+
return None
|
|
56
|
+
row = {key: value for key, value in read.rows[0].items() if key != "subentries"}
|
|
57
|
+
options = row.pop("options", None)
|
|
58
|
+
if not isinstance(options, dict):
|
|
59
|
+
row["options_unavailable"] = "options_missing"
|
|
60
|
+
elif read.secret_scrub_degraded:
|
|
61
|
+
row["options_unavailable"] = "secret_scrub_degraded"
|
|
62
|
+
elif placeholder_option_keys(options):
|
|
63
|
+
row["options_unavailable"] = "redacted_options"
|
|
64
|
+
else:
|
|
65
|
+
row["options"] = options
|
|
66
|
+
return row
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
async def _read_options(client: Any, entry_id: str) -> Any:
|
|
70
|
+
# Options the component can no longer read safely leave the restore
|
|
71
|
+
# unverified rather than failing it as a mismatch.
|
|
72
|
+
from .client.rest_client import HomeAssistantError
|
|
73
|
+
|
|
74
|
+
row = await fetch_integration(client, entry_id)
|
|
75
|
+
if row is not None and "options" not in row:
|
|
76
|
+
raise HomeAssistantError(f"options unreadable: {row['options_unavailable']}")
|
|
77
|
+
return row
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
async def _set_disabled_by(client: Any, entry_id: str, disabled_by: Any) -> Any:
|
|
81
|
+
return await _manager()._ws_send(
|
|
82
|
+
client,
|
|
83
|
+
{
|
|
84
|
+
"type": "config_entries/disable",
|
|
85
|
+
"entry_id": entry_id,
|
|
86
|
+
"disabled_by": disabled_by,
|
|
87
|
+
},
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def restore_integration(client: Any, entity_id: str, config: Any) -> Any:
|
|
92
|
+
bm = _manager()
|
|
93
|
+
current = await fetch_integration(client, entity_id)
|
|
94
|
+
if current is None:
|
|
95
|
+
raise bm.BackupRestoreError(
|
|
96
|
+
f"Config entry {entity_id} ({config.get('domain')}) no longer exists. "
|
|
97
|
+
"An integration snapshot holds only the entry's metadata, options and "
|
|
98
|
+
"enabled state, so it cannot recreate a deleted entry. Nothing was "
|
|
99
|
+
"changed; add the integration again to recover it.",
|
|
100
|
+
reason="entry_deleted",
|
|
101
|
+
suggestions=[
|
|
102
|
+
"Add it again with ha_set_integration, or have the user add it in "
|
|
103
|
+
"the HA UI when it needs their credentials."
|
|
104
|
+
],
|
|
105
|
+
)
|
|
106
|
+
options = config.get("options")
|
|
107
|
+
if "options" in config and not isinstance(options, dict):
|
|
108
|
+
raise bm.BackupRestoreError(
|
|
109
|
+
"The integration snapshot's options are not an object. Nothing was "
|
|
110
|
+
"changed.",
|
|
111
|
+
reason="invalid_snapshot",
|
|
112
|
+
)
|
|
113
|
+
if options is not None and "options" not in current:
|
|
114
|
+
raise bm.BackupRestoreError(
|
|
115
|
+
f"The current options of config entry {entity_id} cannot be read "
|
|
116
|
+
f"({current.get('options_unavailable')}), so the snapshot's options "
|
|
117
|
+
"cannot be checked against them. Nothing was changed.",
|
|
118
|
+
reason="options_unreadable",
|
|
119
|
+
)
|
|
120
|
+
not_restored = _options_not_restored(config, current)
|
|
121
|
+
disabled_by = None if config.get("disabled_by") is None else "user"
|
|
122
|
+
enable_first = disabled_by is None and current.get("disabled_by") is not None
|
|
123
|
+
if enable_first:
|
|
124
|
+
result = await _set_disabled_by(client, entity_id, None)
|
|
125
|
+
if (
|
|
126
|
+
not_restored is None
|
|
127
|
+
and options is not None
|
|
128
|
+
and not bm._snapshot_configs_match(options, current["options"])
|
|
129
|
+
):
|
|
130
|
+
try:
|
|
131
|
+
await _restore_options(client, entity_id, config, current["options"])
|
|
132
|
+
except bm.BackupRestoreError as err:
|
|
133
|
+
if not enable_first:
|
|
134
|
+
raise
|
|
135
|
+
raise _enabled_then_failed(entity_id, err) from err
|
|
136
|
+
if not enable_first:
|
|
137
|
+
result = await _set_disabled_by(client, entity_id, disabled_by)
|
|
138
|
+
if not_restored is not None:
|
|
139
|
+
verification_status, why = not_restored
|
|
140
|
+
raise bm.BackupRestoreError(
|
|
141
|
+
f"The enabled state of config entry {entity_id} was restored, but "
|
|
142
|
+
f"its options were not: {why}.",
|
|
143
|
+
apply_status="applied",
|
|
144
|
+
verification_status=verification_status,
|
|
145
|
+
reason="options_not_restored",
|
|
146
|
+
)
|
|
147
|
+
return result
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _enabled_then_failed(entity_id: str, err: BackupRestoreError) -> BackupRestoreError:
|
|
151
|
+
"""``err`` from the options restore of an entry the restore enabled first."""
|
|
152
|
+
if err.outcome["apply_status"] != "not_applied":
|
|
153
|
+
detail = f"then its options restore failed: {err}"
|
|
154
|
+
elif err.outcome.get("reason"):
|
|
155
|
+
detail = f"but its options were not restored: {err}"
|
|
156
|
+
else:
|
|
157
|
+
detail = "but its options were not restored: the options flow refused them"
|
|
158
|
+
failed: BackupRestoreError = _manager().BackupRestoreError(
|
|
159
|
+
f"Config entry {entity_id} was enabled, {detail}",
|
|
160
|
+
# The enable applied; the options restore keeps its own status.
|
|
161
|
+
**{
|
|
162
|
+
**err.outcome,
|
|
163
|
+
"apply_status": "applied",
|
|
164
|
+
"options_apply_status": err.outcome["apply_status"],
|
|
165
|
+
},
|
|
166
|
+
)
|
|
167
|
+
return failed
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _options_not_restored(
|
|
171
|
+
config: Any, current: dict[str, Any]
|
|
172
|
+
) -> tuple[str, str] | None:
|
|
173
|
+
"""``(verification_status, why)`` for options a restore cannot put back."""
|
|
174
|
+
if "options_unavailable" in config or "options" not in config:
|
|
175
|
+
why = config.get("options_unavailable", "taken before options were captured")
|
|
176
|
+
return ("unavailable", f"the snapshot holds none ({why})")
|
|
177
|
+
if config.get("options") == {} and current["options"]:
|
|
178
|
+
return (
|
|
179
|
+
"mismatched",
|
|
180
|
+
"the snapshot's are empty, which an options flow cannot produce",
|
|
181
|
+
)
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
async def _restore_options(
|
|
186
|
+
client: Any, entity_id: str, config: Any, current_options: dict[str, Any]
|
|
187
|
+
) -> None:
|
|
188
|
+
from .tools.config_entry_flow import update_config_entry_options
|
|
189
|
+
|
|
190
|
+
bm = _manager()
|
|
191
|
+
options = config["options"]
|
|
192
|
+
await bm._apply_and_verify(
|
|
193
|
+
f"{config.get('domain')} integration",
|
|
194
|
+
partial(
|
|
195
|
+
update_config_entry_options,
|
|
196
|
+
client,
|
|
197
|
+
entity_id,
|
|
198
|
+
options,
|
|
199
|
+
expected_domain=config.get("domain"),
|
|
200
|
+
keep_current_values=False,
|
|
201
|
+
fixed_options=current_options,
|
|
202
|
+
),
|
|
203
|
+
partial(
|
|
204
|
+
bm._verify_readback,
|
|
205
|
+
partial(_read_options, client, entity_id),
|
|
206
|
+
{"options": options},
|
|
207
|
+
("options",),
|
|
208
|
+
),
|
|
209
|
+
)
|
|
@@ -54,7 +54,7 @@ import time
|
|
|
54
54
|
import weakref
|
|
55
55
|
from collections import Counter
|
|
56
56
|
from collections.abc import AsyncIterator, Awaitable, Callable
|
|
57
|
-
from contextlib import asynccontextmanager, suppress
|
|
57
|
+
from contextlib import asynccontextmanager, nullcontext, suppress
|
|
58
58
|
from dataclasses import dataclass, field
|
|
59
59
|
from datetime import UTC, datetime
|
|
60
60
|
from functools import cached_property, partial
|
|
@@ -275,6 +275,15 @@ class _FlowHelperBackupSkip(_FlowHelperReadError):
|
|
|
275
275
|
lists. Best-effort capture logs it at INFO."""
|
|
276
276
|
|
|
277
277
|
|
|
278
|
+
def _restore_is_flow_driven(domain: str) -> bool:
|
|
279
|
+
"""A snapshot domain whose restore drives a Core flow, which can apply it
|
|
280
|
+
partly: a flow helper, a config subentry or an integration entry."""
|
|
281
|
+
return _is_flow_helper_domain(domain) or domain in (
|
|
282
|
+
"helper_config_subentry",
|
|
283
|
+
"integration",
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
|
|
278
287
|
def _is_flow_helper_domain(domain: str) -> bool:
|
|
279
288
|
"""A ``helper_<type>`` snapshot domain of a config-entry (flow) helper.
|
|
280
289
|
|
|
@@ -1514,18 +1523,17 @@ class BackupManager:
|
|
|
1514
1523
|
safety_backup=None,
|
|
1515
1524
|
) from err
|
|
1516
1525
|
data["entity_id"] = entity_id
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
)
|
|
1526
|
+
guard: Any = self.config_entry_write_guard(entity_id, exclusive=True)
|
|
1527
|
+
elif data["domain"] == "entity":
|
|
1528
|
+
guard = restore_locks(self._client, data["config"])
|
|
1529
|
+
elif data["domain"] == "integration": # its restore drives an options flow
|
|
1530
|
+
guard = self.config_entry_write_guard(data["entity_id"])
|
|
1531
|
+
else:
|
|
1532
|
+
guard = nullcontext()
|
|
1533
|
+
async with guard:
|
|
1534
|
+
return await self._restore_snapshot_data(
|
|
1535
|
+
name, data, take_safety_backup=take_safety_backup
|
|
1536
|
+
)
|
|
1529
1537
|
finally:
|
|
1530
1538
|
self._unprotect_snapshot(name)
|
|
1531
1539
|
|
|
@@ -1567,11 +1575,10 @@ class BackupManager:
|
|
|
1567
1575
|
step = "safety_preflight"
|
|
1568
1576
|
try:
|
|
1569
1577
|
needs_safety = await self._restore_needs_safety(handler, entity_id, config)
|
|
1570
|
-
# Existing flow helpers
|
|
1571
|
-
# recovery point: their flows can apply a restore
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
if needs_safety and (flow_driven or take_safety_backup):
|
|
1578
|
+
# Existing flow helpers, subentries and integration entries always
|
|
1579
|
+
# require a fresh recovery point: their flows can apply a restore
|
|
1580
|
+
# partly.
|
|
1581
|
+
if needs_safety and (_restore_is_flow_driven(domain) or take_safety_backup):
|
|
1575
1582
|
step = "safety_backup"
|
|
1576
1583
|
safety_path = await self._capture_restore_safety(
|
|
1577
1584
|
domain, entity_id, outcome, config
|
|
@@ -1643,7 +1650,7 @@ class BackupManager:
|
|
|
1643
1650
|
) -> Path | None:
|
|
1644
1651
|
"""Take a restore's recovery point; a failed capture raises and blocks it."""
|
|
1645
1652
|
is_flow = _is_flow_helper_domain(domain)
|
|
1646
|
-
flow_driven =
|
|
1653
|
+
flow_driven = _restore_is_flow_driven(domain)
|
|
1647
1654
|
if not flow_driven and not getattr(self._settings, "enable_auto_backup", False):
|
|
1648
1655
|
return None # auto-backup off: no safety backup is promised
|
|
1649
1656
|
# The restore overwrites the current state, so the throttle that a
|
|
@@ -2780,7 +2787,7 @@ def _flow_label(helper_type: str) -> str:
|
|
|
2780
2787
|
|
|
2781
2788
|
def _flow_options(config: Any, helper_type: str) -> dict[str, Any]:
|
|
2782
2789
|
"""Require persisted flow-helper options that can safely be restored."""
|
|
2783
|
-
from .redaction import
|
|
2790
|
+
from .redaction import placeholder_option_keys
|
|
2784
2791
|
|
|
2785
2792
|
label = _flow_label(helper_type)
|
|
2786
2793
|
if not isinstance(config, dict):
|
|
@@ -2792,9 +2799,9 @@ def _flow_options(config: Any, helper_type: str) -> dict[str, Any]:
|
|
|
2792
2799
|
f"{label} helper has no stored options to back up or restore",
|
|
2793
2800
|
"invalid_options",
|
|
2794
2801
|
)
|
|
2795
|
-
#
|
|
2796
|
-
#
|
|
2797
|
-
if
|
|
2802
|
+
# Neither a server sentinel nor the component's scrub is a usable
|
|
2803
|
+
# recovery value.
|
|
2804
|
+
if placeholder_option_keys(config):
|
|
2798
2805
|
raise _FlowHelperReadError(
|
|
2799
2806
|
f"{label} helper options contain redacted values; capture is incomplete",
|
|
2800
2807
|
"redacted_options",
|
|
@@ -2802,14 +2809,6 @@ def _flow_options(config: Any, helper_type: str) -> dict[str, Any]:
|
|
|
2802
2809
|
return config
|
|
2803
2810
|
|
|
2804
2811
|
|
|
2805
|
-
def _contains_redacted_leaf(value: Any) -> bool:
|
|
2806
|
-
if isinstance(value, dict):
|
|
2807
|
-
return any(_contains_redacted_leaf(item) for item in value.values())
|
|
2808
|
-
if isinstance(value, list):
|
|
2809
|
-
return any(_contains_redacted_leaf(item) for item in value)
|
|
2810
|
-
return isinstance(value, str) and value == "**redacted**"
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
2812
|
async def _fetch_flow_helper(client: Any, entity_id: str, helper_type: str) -> Any:
|
|
2814
2813
|
"""Read a flow helper's options through the component, without starting a flow.
|
|
2815
2814
|
|
|
@@ -3309,13 +3308,13 @@ def _subentry_target(entity_id: str) -> tuple[str, str]:
|
|
|
3309
3308
|
|
|
3310
3309
|
|
|
3311
3310
|
def _subentry_data(data: Any) -> dict[str, Any]:
|
|
3312
|
-
from .redaction import
|
|
3311
|
+
from .redaction import placeholder_option_keys
|
|
3313
3312
|
|
|
3314
3313
|
if not isinstance(data, dict):
|
|
3315
3314
|
raise _FlowHelperReadError(
|
|
3316
3315
|
"Config subentry data must be an object", "invalid_data"
|
|
3317
3316
|
)
|
|
3318
|
-
if
|
|
3317
|
+
if placeholder_option_keys(data):
|
|
3319
3318
|
raise _FlowHelperReadError(
|
|
3320
3319
|
"Config subentry data contains redacted values; capture is incomplete",
|
|
3321
3320
|
"redacted_data",
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""The read behind :meth:`HomeAssistantClient.get_config_entry`.
|
|
2
|
+
|
|
3
|
+
Core's WebSocket ``config_entries/get_single`` answers ``{"config_entry":
|
|
4
|
+
fragment}`` or ``not_found``. Core has no REST read for one entry, so its REST
|
|
5
|
+
list is the fallback when no WebSocket answer comes back, or when the token's
|
|
6
|
+
user is not an admin (``get_single`` is admin-only, the REST list is not).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
from .rest_client import HomeAssistantAPIError, HomeAssistantConnectionError
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from .rest_client import HomeAssistantClient
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def read_config_entry(
|
|
23
|
+
client: HomeAssistantClient, entry_id: str
|
|
24
|
+
) -> dict[str, Any]:
|
|
25
|
+
reply: dict[str, Any] | None = None
|
|
26
|
+
try:
|
|
27
|
+
reply = await client.send_websocket_message(
|
|
28
|
+
{"type": "config_entries/get_single", "entry_id": entry_id},
|
|
29
|
+
expected_error_codes=frozenset({"not_found", "unauthorized"}),
|
|
30
|
+
)
|
|
31
|
+
except HomeAssistantConnectionError as e:
|
|
32
|
+
logger.debug(f"config_entries/get_single unanswered, using REST: {e}")
|
|
33
|
+
found: dict[str, Any] | None = None
|
|
34
|
+
if reply is None or reply.get("error_code") == "unauthorized":
|
|
35
|
+
entries = await client.list_config_entries()
|
|
36
|
+
found = next((e for e in entries if e.get("entry_id") == entry_id), None)
|
|
37
|
+
elif reply.get("success"):
|
|
38
|
+
result = reply.get("result")
|
|
39
|
+
found = result.get("config_entry") if isinstance(result, dict) else None
|
|
40
|
+
if not isinstance(found, dict):
|
|
41
|
+
# Core answered, so this is not a missing entry: no 404, no REST.
|
|
42
|
+
raise HomeAssistantAPIError(
|
|
43
|
+
f"config_entries/get_single answered without a config entry: {result!r}",
|
|
44
|
+
response_data=reply,
|
|
45
|
+
)
|
|
46
|
+
elif reply.get("error_code") != "not_found":
|
|
47
|
+
raise HomeAssistantAPIError(
|
|
48
|
+
f"config_entries/get_single failed: {reply.get('error')}",
|
|
49
|
+
response_data=reply,
|
|
50
|
+
)
|
|
51
|
+
if found is None:
|
|
52
|
+
raise HomeAssistantAPIError(
|
|
53
|
+
f"Config entry not found: {entry_id}",
|
|
54
|
+
status_code=404,
|
|
55
|
+
)
|
|
56
|
+
return found
|
|
@@ -1878,14 +1878,7 @@ class HomeAssistantClient:
|
|
|
1878
1878
|
return await self._list_registry("config/device_registry/list", "device")
|
|
1879
1879
|
|
|
1880
1880
|
async def get_config_entry(self, entry_id: str) -> dict[str, Any]:
|
|
1881
|
-
"""
|
|
1882
|
-
Get config entry details.
|
|
1883
|
-
|
|
1884
|
-
Note: Home Assistant doesn't have a direct REST API endpoint for individual
|
|
1885
|
-
config entries. This method lists all entries and filters by entry_id.
|
|
1886
|
-
|
|
1887
|
-
Args:
|
|
1888
|
-
entry_id: Config entry ID
|
|
1881
|
+
"""Get one config entry; see :mod:`.config_entry_read` for the routes.
|
|
1889
1882
|
|
|
1890
1883
|
Returns:
|
|
1891
1884
|
Home Assistant's config-entry fragment (``ConfigEntry.as_json_fragment``):
|
|
@@ -1893,19 +1886,11 @@ class HomeAssistantClient:
|
|
|
1893
1886
|
entry's connection settings and credentials are not in it.
|
|
1894
1887
|
|
|
1895
1888
|
Raises:
|
|
1896
|
-
HomeAssistantAPIError:
|
|
1889
|
+
HomeAssistantAPIError: 404 if not found; Core's other errors
|
|
1897
1890
|
"""
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
(entry for entry in entries if entry.get("entry_id") == entry_id), None
|
|
1902
|
-
)
|
|
1903
|
-
if found is None:
|
|
1904
|
-
raise HomeAssistantAPIError(
|
|
1905
|
-
f"Config entry not found: {entry_id}",
|
|
1906
|
-
status_code=404,
|
|
1907
|
-
)
|
|
1908
|
-
return found
|
|
1891
|
+
from .config_entry_read import read_config_entry
|
|
1892
|
+
|
|
1893
|
+
return await read_config_entry(self, entry_id)
|
|
1909
1894
|
|
|
1910
1895
|
async def delete_config_entry(self, entry_id: str) -> dict[str, Any]:
|
|
1911
1896
|
"""Delete a config entry via REST API.
|
|
@@ -1927,9 +1912,17 @@ class HomeAssistantClient:
|
|
|
1927
1912
|
logger.debug(f"Deleting config entry: {entry_id}")
|
|
1928
1913
|
return await self._request("DELETE", f"/config/config_entries/entry/{entry_id}")
|
|
1929
1914
|
|
|
1930
|
-
async def send_websocket_message(
|
|
1915
|
+
async def send_websocket_message(
|
|
1916
|
+
self,
|
|
1917
|
+
message: dict[str, Any],
|
|
1918
|
+
*,
|
|
1919
|
+
expected_error_codes: frozenset[str] = frozenset(),
|
|
1920
|
+
) -> dict[str, Any]:
|
|
1931
1921
|
"""Send message via WebSocket and wait for response.
|
|
1932
1922
|
|
|
1923
|
+
A Home Assistant error whose code is in ``expected_error_codes`` is an
|
|
1924
|
+
answer the caller handles, so it is logged at debug, not error.
|
|
1925
|
+
|
|
1933
1926
|
Uses a per-client WebSocket connection keyed to the client's own
|
|
1934
1927
|
credentials (base_url + token). This ensures OAuth mode uses the
|
|
1935
1928
|
real HA credentials from the token claims, not the global sentinel
|
|
@@ -2036,7 +2029,11 @@ class HomeAssistantClient:
|
|
|
2036
2029
|
# Name the command in the log line: a bare "Command failed:
|
|
2037
2030
|
# Unknown command." is undiagnosable from a user's log
|
|
2038
2031
|
# (issue #1889 took a live reproduction to attribute).
|
|
2039
|
-
|
|
2032
|
+
code = getattr(e, "code", None)
|
|
2033
|
+
logger.log(
|
|
2034
|
+
logging.DEBUG if code in expected_error_codes else logging.ERROR,
|
|
2035
|
+
f"WebSocket message failed ({message.get('type')}): {e}",
|
|
2036
|
+
)
|
|
2040
2037
|
# Preserve HA's structured error code (e.g. ``not_found``) so callers
|
|
2041
2038
|
# can distinguish HA's authoritative verdict from a transient failure
|
|
2042
2039
|
# instead of only seeing the stringified message.
|
|
@@ -14,7 +14,10 @@ surfaces stop returning operator secrets verbatim:
|
|
|
14
14
|
2. **Integration options** (``ha_get_integration``): fields the
|
|
15
15
|
options-flow schema marks with a password text selector are replaced the
|
|
16
16
|
same way, on both the harvested options and the ``include_schema=True``
|
|
17
|
-
|
|
17
|
+
fields (whose current value comes from the form's ``suggested_value``).
|
|
18
|
+
Stored option values are checked against the flow's first form only,
|
|
19
|
+
so a password field that only a later form declares is not detected
|
|
20
|
+
in them.
|
|
18
21
|
3. **Every other tool response**: secret values seen while serving 1 and 2
|
|
19
22
|
are remembered in a process-local known-secrets set, and
|
|
20
23
|
:class:`RedactSecretsMiddleware` (registered just outside the
|
|
@@ -24,7 +27,8 @@ surfaces stop returning operator secrets verbatim:
|
|
|
24
27
|
The set/empty sentinel split keeps the genuinely useful diagnostic — "is
|
|
25
28
|
this credential configured at all?" — answerable without disclosing the
|
|
26
29
|
value. ``ha_manage_app`` and the config-entry flow writes reject
|
|
27
|
-
submitted values that are (or contain) a sentinel
|
|
30
|
+
submitted values that are (or contain) a sentinel, and the flow writes also
|
|
31
|
+
reject the component's ``**redacted**`` placeholder — unconditionally, not
|
|
28
32
|
only while the flag is on — so a redacted marker can never be round-tripped
|
|
29
33
|
into a live config (add-on writes still merge from the real, unredacted
|
|
30
34
|
current options server-side).
|
|
@@ -41,7 +45,7 @@ import json
|
|
|
41
45
|
import logging
|
|
42
46
|
import re
|
|
43
47
|
import threading
|
|
44
|
-
from collections.abc import Iterable, Sequence
|
|
48
|
+
from collections.abc import Callable, Iterable, Sequence
|
|
45
49
|
from typing import Any
|
|
46
50
|
|
|
47
51
|
from ha_mcp._vendor.fastmcp.server.middleware.middleware import (
|
|
@@ -397,34 +401,61 @@ def _collect_stored(value: Any, listed: frozenset[str], secret: bool) -> set[str
|
|
|
397
401
|
return known_values_for_option_item(value) if secret else set()
|
|
398
402
|
|
|
399
403
|
|
|
400
|
-
def sentinel_option_keys(options: Any
|
|
404
|
+
def sentinel_option_keys(options: Any) -> list[str]:
|
|
401
405
|
"""Dotted paths of submitted option values that equal a redaction sentinel.
|
|
402
406
|
|
|
403
407
|
Used by ``ha_manage_app`` config mode to reject round-tripping a
|
|
404
408
|
redacted read back into a live add-on config.
|
|
405
409
|
"""
|
|
410
|
+
return _matching_option_keys(options, carries_sentinel)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
#: What the ha_mcp_tools component writes over an option value equal to a
|
|
414
|
+
#: ``secrets.yaml`` entry. Like a sentinel, it is no usable value to write.
|
|
415
|
+
_COMPONENT_REDACTED = "**redacted**"
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
def _is_placeholder(value: Any) -> bool:
|
|
419
|
+
return carries_sentinel(value) or value == _COMPONENT_REDACTED
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
def placeholder_option_keys(options: Any) -> list[str]:
|
|
423
|
+
"""Dotted paths of option values that are a redaction sentinel or the
|
|
424
|
+
component's ``**redacted**`` scrub.
|
|
425
|
+
|
|
426
|
+
For config-entry options, which the component may have served.
|
|
427
|
+
"""
|
|
428
|
+
return _matching_option_keys(options, _is_placeholder)
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def _matching_option_keys(
|
|
432
|
+
options: Any, match: Callable[[Any], bool], prefix: str = ""
|
|
433
|
+
) -> list[str]:
|
|
434
|
+
"""Dotted paths of the values in an options dict that ``match`` accepts."""
|
|
406
435
|
keys: list[str] = []
|
|
407
436
|
if not isinstance(options, dict):
|
|
408
437
|
return keys
|
|
409
438
|
for name, value in options.items():
|
|
410
|
-
path = f"{
|
|
411
|
-
|
|
439
|
+
path = f"{prefix}.{name}" if prefix else str(name)
|
|
440
|
+
_collect_matching_paths(value, path, keys, match)
|
|
412
441
|
return keys
|
|
413
442
|
|
|
414
443
|
|
|
415
|
-
def
|
|
416
|
-
|
|
444
|
+
def _collect_matching_paths(
|
|
445
|
+
value: Any, path: str, keys: list[str], match: Callable[[Any], bool]
|
|
446
|
+
) -> None:
|
|
447
|
+
"""Append ``path`` (or deeper paths) for every value ``match`` accepts.
|
|
417
448
|
|
|
418
|
-
Recurses through dicts AND lists at any nesting depth so a
|
|
449
|
+
Recurses through dicts AND lists at any nesting depth so a marker at
|
|
419
450
|
e.g. ``opt[0][0]`` cannot slip past the write guard.
|
|
420
451
|
"""
|
|
421
|
-
if
|
|
452
|
+
if match(value):
|
|
422
453
|
keys.append(path)
|
|
423
454
|
elif isinstance(value, dict):
|
|
424
|
-
keys.extend(
|
|
455
|
+
keys.extend(_matching_option_keys(value, match, path))
|
|
425
456
|
elif isinstance(value, list):
|
|
426
457
|
for idx, item in enumerate(value):
|
|
427
|
-
|
|
458
|
+
_collect_matching_paths(item, f"{path}[{idx}]", keys, match)
|
|
428
459
|
|
|
429
460
|
|
|
430
461
|
# ---------------------------------------------------------------------------
|
|
@@ -455,7 +486,8 @@ def redact_flow_schema(data_schema: Any) -> Any:
|
|
|
455
486
|
|
|
456
487
|
HA injects the persisted option into each field's
|
|
457
488
|
``description.suggested_value`` (and static defaults into ``default`` /
|
|
458
|
-
``value``), so
|
|
489
|
+
``value``), so a schema handed back to a caller (a describe's fields, a
|
|
490
|
+
form-error response) would carry the live secret.
|
|
459
491
|
Harvests each replaced value into the known-secrets set first.
|
|
460
492
|
"""
|
|
461
493
|
if not isinstance(data_schema, list):
|
|
@@ -631,6 +663,13 @@ def scrub_obj(obj: Any, secrets: Sequence[str]) -> Any:
|
|
|
631
663
|
return obj
|
|
632
664
|
|
|
633
665
|
|
|
666
|
+
def scrub_known_secrets(text: str) -> str:
|
|
667
|
+
"""``text`` with every known secret value replaced, while the flag is on."""
|
|
668
|
+
if not redaction_enabled():
|
|
669
|
+
return text
|
|
670
|
+
return scrub_text(text, with_serialized_variants(known_secret_values()))
|
|
671
|
+
|
|
672
|
+
|
|
634
673
|
class RedactSecretsMiddleware(Middleware):
|
|
635
674
|
"""Scrub known secret values from every tool response and tool error.
|
|
636
675
|
|
|
@@ -89,7 +89,7 @@ def register_backup_tools(
|
|
|
89
89
|
| `edits` | `list` | List per-entity auto-backups (lightweight). Filter by `domain` and/or `entity_id`. |
|
|
90
90
|
| `edits` | `view` | Read one auto-backup file by name; returns YAML and parsed `config`. |
|
|
91
91
|
| `edits` | `diff` | Compare one auto-backup against the entity's current config. RFC 6902 JSON-Patch + add/remove/replace counts; bounded output. Read-only — fetches the live config, makes no changes. |
|
|
92
|
-
| `edits` | `restore` | Re-apply one auto-backup. Existing flow helpers (template, group, utility_meter, …) and config
|
|
92
|
+
| `edits` | `restore` | Re-apply one auto-backup. Existing flow helpers (template, group, utility_meter, …), config subentries and integration config entries require a fresh per-entity backup; other domains follow auto-backup settings and may proceed without one. A deleted flow helper is recreated with a new config-entry ID and its saved entity IDs are restored if unoccupied; a deleted subentry is recreated with a new subentry ID. An integration config entry's snapshot holds its metadata, its enabled state and its options, which are kept only when the ha_mcp_tools component serves the read, its `secrets.yaml` scrub ran, and no value is a redaction placeholder; a restore re-enables the entry first when needed, then puts back differing options through its options flow, and reports options it cannot put back (none kept, or empty ones) as not restored. It holds neither the entry's data nor its subentries, so a deleted integration config entry cannot be recreated. **No HA restart.** |
|
|
93
93
|
| `edits` | `delete` | Delete one auto-backup by `backup_name`, or bulk-delete by filter. |
|
|
94
94
|
|
|
95
95
|
**When to use which scope:**
|