ha-mcp-dev 8.5.0.dev2793__tar.gz → 8.5.0.dev2797__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-8.5.0.dev2793/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.5.0.dev2797}/PKG-INFO +1 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/pyproject.toml +1 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/editing.py +38 -8
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/evaluator.py +163 -41
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/events.py +3 -2
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/handlers.py +32 -14
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/middleware.py +30 -17
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/model.py +67 -13
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/persistence.py +15 -3
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/__init__.py +14 -9
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/az.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/cs.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/de.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/en.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/eo.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/es.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/fr.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/it.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/ko.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/nl.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/pl.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/ru.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/sv.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/zh-Hans.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/zh-Hant.json +15 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.html +22 -5
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.js +142 -31
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_dev.py +56 -33
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_security_policy.py +9 -4
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/setup.cfg +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/test_env_manager.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.5.0.
|
|
7
|
+
version = "8.5.0.dev2797"
|
|
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
|
|
@@ -38,9 +38,9 @@ class PolicyCaller(NamedTuple):
|
|
|
38
38
|
def _clear_remember_cache(server: Any | None) -> None:
|
|
39
39
|
"""Clear the approval remember-cache after a rule change.
|
|
40
40
|
|
|
41
|
-
Called only when the rules actually changed, so a
|
|
42
|
-
worth a WARNING: the
|
|
43
|
-
engine (wherever it runs) is still remembering.
|
|
41
|
+
Called only when the rules or ``rule_effect`` actually changed, so a
|
|
42
|
+
missing queue is worth a WARNING: the gates the operator just wrote are
|
|
43
|
+
not what the engine (wherever it runs) is still remembering.
|
|
44
44
|
"""
|
|
45
45
|
queue = getattr(server, "approval_queue", None)
|
|
46
46
|
if queue is None:
|
|
@@ -101,9 +101,8 @@ async def set_policy(
|
|
|
101
101
|
suggestions=[f"Call {caller.get_call} for the shape"],
|
|
102
102
|
)
|
|
103
103
|
)
|
|
104
|
-
# ``rules`` defaults to [] on the model
|
|
105
|
-
#
|
|
106
|
-
# every approval gate. Demand it explicitly instead.
|
|
104
|
+
# ``rules`` defaults to [] on the model, so an omitted key would validate
|
|
105
|
+
# and silently delete every approval gate. Demand it explicitly instead.
|
|
107
106
|
if "rules" not in policy:
|
|
108
107
|
raise_tool_error(
|
|
109
108
|
create_error_response(
|
|
@@ -176,7 +175,29 @@ def _pre_save_warnings(
|
|
|
176
175
|
'"event_decisions_enabled": true if that was not intended. The '
|
|
177
176
|
"stored PIN is untouched either way."
|
|
178
177
|
)
|
|
179
|
-
if
|
|
178
|
+
if new_policy.rule_effect == "allow":
|
|
179
|
+
# In an allow list an added rule is the loosening direction.
|
|
180
|
+
added = [rule for rule in new_policy.rules if rule not in current.rules]
|
|
181
|
+
if added:
|
|
182
|
+
names = ", ".join(sorted({rule.tool_name for rule in added}))
|
|
183
|
+
warnings.append(
|
|
184
|
+
f"This write added {len(added)} approving rule(s), covering: "
|
|
185
|
+
f"{names}. Calls they match now run without approval."
|
|
186
|
+
)
|
|
187
|
+
if current.rule_effect != new_policy.rule_effect:
|
|
188
|
+
warnings.append(
|
|
189
|
+
f"This write switched rule_effect from '{current.rule_effect}' to "
|
|
190
|
+
f"'{new_policy.rule_effect}': every rule now "
|
|
191
|
+
+ (
|
|
192
|
+
"approves the calls it matches, and every other call requires approval."
|
|
193
|
+
if new_policy.rule_effect == "allow"
|
|
194
|
+
else "requires approval for the calls it matches, and every "
|
|
195
|
+
"other call runs without approval."
|
|
196
|
+
)
|
|
197
|
+
)
|
|
198
|
+
# An empty require-approval list gates nothing, so its enforcement state
|
|
199
|
+
# is moot; an empty allow list gates every call and still needs it.
|
|
200
|
+
if not new_policy.rules and new_policy.rule_effect == "require_approval":
|
|
180
201
|
return warnings
|
|
181
202
|
policies_enabled = get_global_settings().enable_tool_security_policies
|
|
182
203
|
if not policies_enabled:
|
|
@@ -214,6 +235,7 @@ def _commit_policy(
|
|
|
214
235
|
"""
|
|
215
236
|
from ..utils.data_paths import get_data_dir
|
|
216
237
|
from .decision_pin import is_pin_set
|
|
238
|
+
from .model import ALLOW_LIST_OMITTED_MESSAGE, drops_allow_list, gates_differ
|
|
217
239
|
from .persistence import load_policy, save_policy
|
|
218
240
|
|
|
219
241
|
data_dir = get_data_dir()
|
|
@@ -227,6 +249,14 @@ def _commit_policy(
|
|
|
227
249
|
suggestions=["Inspect or delete the file, then retry"],
|
|
228
250
|
)
|
|
229
251
|
)
|
|
252
|
+
if drops_allow_list(new_policy, current):
|
|
253
|
+
raise_tool_error(
|
|
254
|
+
create_error_response(
|
|
255
|
+
ErrorCode.VALIDATION_MISSING_PARAMETER,
|
|
256
|
+
ALLOW_LIST_OMITTED_MESSAGE,
|
|
257
|
+
suggestions=[f"Call {caller.get_call} and resend the edited document"],
|
|
258
|
+
)
|
|
259
|
+
)
|
|
230
260
|
if new_policy.event_decisions_enabled and not is_pin_set(data_dir):
|
|
231
261
|
# No MCP tool takes the PIN as a parameter, returns it, or writes
|
|
232
262
|
# the file it lives in: the component's deny floor blocks that
|
|
@@ -262,7 +292,7 @@ def _commit_policy(
|
|
|
262
292
|
warnings = _pre_save_warnings(new_policy, current, expected, server)
|
|
263
293
|
# Rebase onto the on-disk version so save_policy bumps to current+1.
|
|
264
294
|
save_policy(data_dir, new_policy.model_copy(update={"version": current.version}))
|
|
265
|
-
if
|
|
295
|
+
if gates_differ(current, new_policy):
|
|
266
296
|
# The write has landed. Nothing after this point may turn a committed
|
|
267
297
|
# save into a failure the caller would retry.
|
|
268
298
|
try:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import re
|
|
5
|
-
from collections.abc import Iterator
|
|
5
|
+
from collections.abc import Iterable, Iterator
|
|
6
6
|
from enum import StrEnum
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
@@ -93,7 +93,13 @@ def has_dynamic_selector_targets(name: str, args: dict[str, Any]) -> bool:
|
|
|
93
93
|
return name == "ha_bulk_control" and args.get("selector") is not None
|
|
94
94
|
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
MISSING = object()
|
|
97
|
+
"""What ``iter_path_values(..., report_missing=True)`` yields for a dead end."""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def iter_path_values(
|
|
101
|
+
args: dict[str, Any], path: str, *, report_missing: bool = False
|
|
102
|
+
) -> Iterator[Any]:
|
|
97
103
|
"""Yield every value the dotted path resolves to.
|
|
98
104
|
|
|
99
105
|
The leading ``args`` segment is implicit and stripped. A ``*`` segment
|
|
@@ -101,6 +107,12 @@ def iter_path_values(args: dict[str, Any], path: str) -> Iterator[Any]:
|
|
|
101
107
|
across items for lists — so ``args.*`` yields every top-level
|
|
102
108
|
argument, ``args.config.*`` yields every leaf of the ``config``
|
|
103
109
|
sub-dict, and so on. Empty iterator = no match.
|
|
110
|
+
|
|
111
|
+
A branch that cannot continue (a missing key, a named segment on a value
|
|
112
|
+
that is not a dict, or a ``*`` on a scalar) is skipped, unless
|
|
113
|
+
``report_missing``, which yields ``MISSING`` for it instead and also for a
|
|
114
|
+
``*`` over an empty container. Allow mode needs that: an operation without
|
|
115
|
+
the constrained field is a value the predicate never saw.
|
|
104
116
|
"""
|
|
105
117
|
parts = path.split(".")
|
|
106
118
|
if parts[0] == "args":
|
|
@@ -112,36 +124,56 @@ def iter_path_values(args: dict[str, Any], path: str) -> Iterator[Any]:
|
|
|
112
124
|
return
|
|
113
125
|
head, tail = rest[0], rest[1:]
|
|
114
126
|
if head == "*":
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
127
|
+
children = _children(cur)
|
|
128
|
+
if report_missing and not children:
|
|
129
|
+
# An empty container is a dead end too: the branch holds no
|
|
130
|
+
# value the predicate could examine.
|
|
131
|
+
children = None
|
|
132
|
+
elif isinstance(cur, dict) and head in cur:
|
|
133
|
+
children = [cur[head]]
|
|
134
|
+
else:
|
|
135
|
+
children = None
|
|
136
|
+
if children is None:
|
|
137
|
+
if report_missing:
|
|
138
|
+
yield MISSING
|
|
121
139
|
return
|
|
122
|
-
|
|
123
|
-
yield from walk(
|
|
140
|
+
for child in children:
|
|
141
|
+
yield from walk(child, tail)
|
|
124
142
|
|
|
125
143
|
yield from walk(args, parts)
|
|
126
144
|
|
|
127
145
|
|
|
128
|
-
def
|
|
146
|
+
def _children(node: Any) -> Iterable[Any] | None:
|
|
147
|
+
"""What a ``*`` segment fans out over; None for a scalar."""
|
|
148
|
+
if isinstance(node, dict):
|
|
149
|
+
return node.values()
|
|
150
|
+
if isinstance(node, (list, tuple)):
|
|
151
|
+
return node
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _ci(x: Any, strict: bool = False) -> Any:
|
|
129
156
|
"""Lower-case strings for case-insensitive comparison; pass other
|
|
130
157
|
types through unchanged so type semantics (int != "1") survive.
|
|
131
|
-
Used on both sides of
|
|
132
|
-
whether the caller wrote 'Lock' or 'LOCK' or 'lock'.
|
|
133
|
-
return x.lower() if isinstance(x, str) else x
|
|
158
|
+
Used on both sides of the equality and membership ops — security gates
|
|
159
|
+
should fire whether the caller wrote 'Lock' or 'LOCK' or 'lock'.
|
|
134
160
|
|
|
161
|
+
``strict`` keeps the case; ``match_predicate`` explains why allow mode
|
|
162
|
+
compares both ways."""
|
|
163
|
+
return x.lower() if isinstance(x, str) and not strict else x
|
|
135
164
|
|
|
136
|
-
|
|
165
|
+
|
|
166
|
+
def _contains_matches(val: Any, pv: Any, strict: bool) -> bool:
|
|
137
167
|
if isinstance(val, str) and isinstance(pv, str):
|
|
138
|
-
return pv
|
|
139
|
-
#
|
|
140
|
-
# ``not_in``
|
|
168
|
+
return _ci(pv, strict) in _ci(val, strict)
|
|
169
|
+
# Outside strict mode, mirror the case-insensitive treatment that ``eq``
|
|
170
|
+
# / ``in`` / ``not_in`` apply: a rule listing ``["light.kitchen"]``
|
|
141
171
|
# must match an LLM passing ``"Light.Kitchen"``. Per-element
|
|
142
172
|
# ``_ci`` guards non-string entries so mixed-type collections
|
|
143
173
|
# (e.g. ``[1, "two"]``) keep their natural equality semantics.
|
|
144
|
-
return isinstance(val, (list, tuple, set)) and any(
|
|
174
|
+
return isinstance(val, (list, tuple, set)) and any(
|
|
175
|
+
_ci(pv, strict) == _ci(x, strict) for x in val
|
|
176
|
+
)
|
|
145
177
|
|
|
146
178
|
|
|
147
179
|
def _numeric_matches(val: Any, op: str, pv: Any) -> bool:
|
|
@@ -160,59 +192,118 @@ def _numeric_matches(val: Any, op: str, pv: Any) -> bool:
|
|
|
160
192
|
return False
|
|
161
193
|
|
|
162
194
|
|
|
163
|
-
def _op_matches(val: Any, op: str, pv: Any) -> bool:
|
|
195
|
+
def _op_matches(val: Any, op: str, pv: Any, strict: bool = False) -> bool:
|
|
164
196
|
"""Apply one op to one concrete value. Predicate dispatches over
|
|
165
197
|
the candidate values (which may be many for wildcard paths).
|
|
166
198
|
|
|
167
199
|
String comparisons are case-insensitive (security gates shouldn't
|
|
168
|
-
care whether the LLM lowercased its args)
|
|
169
|
-
preserve their natural comparison semantics.
|
|
200
|
+
care whether the LLM lowercased its args) unless ``strict`` (see
|
|
201
|
+
``_ci``). Non-string types preserve their natural comparison semantics.
|
|
170
202
|
"""
|
|
171
203
|
match op:
|
|
172
204
|
case "eq":
|
|
173
|
-
return bool(_ci(val) == _ci(pv))
|
|
205
|
+
return bool(_ci(val, strict) == _ci(pv, strict))
|
|
174
206
|
case "neq":
|
|
175
|
-
return bool(_ci(val) != _ci(pv))
|
|
207
|
+
return bool(_ci(val, strict) != _ci(pv, strict))
|
|
176
208
|
case "in":
|
|
177
|
-
return _ci(val) in [_ci(x) for x in (pv or [])]
|
|
209
|
+
return _ci(val, strict) in [_ci(x, strict) for x in (pv or [])]
|
|
178
210
|
case "not_in":
|
|
179
|
-
return _ci(val) not in [_ci(x) for x in (pv or [])]
|
|
211
|
+
return _ci(val, strict) not in [_ci(x, strict) for x in (pv or [])]
|
|
180
212
|
case "regex":
|
|
181
213
|
# `regex` is re.search (substring match). Anchor with ^...$
|
|
182
|
-
# for full-match. re.IGNORECASE so '^light\.'
|
|
214
|
+
# for full-match. re.IGNORECASE (unless strict) so '^light\.'
|
|
215
|
+
# matches 'Light.x'.
|
|
183
216
|
return (
|
|
184
217
|
isinstance(val, str)
|
|
185
218
|
and isinstance(pv, str)
|
|
186
|
-
and re.search(pv, val, re.IGNORECASE) is not None
|
|
219
|
+
and re.search(pv, val, 0 if strict else re.IGNORECASE) is not None
|
|
187
220
|
)
|
|
188
221
|
case "contains":
|
|
189
|
-
return _contains_matches(val, pv)
|
|
222
|
+
return _contains_matches(val, pv, strict)
|
|
190
223
|
case "gt" | "lt":
|
|
191
224
|
return _numeric_matches(val, op, pv)
|
|
192
225
|
return False
|
|
193
226
|
|
|
194
227
|
|
|
195
|
-
def match_predicate(
|
|
196
|
-
|
|
228
|
+
def match_predicate(
|
|
229
|
+
predicate: Predicate, args: dict[str, Any], *, strict: bool = False
|
|
230
|
+
) -> bool:
|
|
231
|
+
"""Whether ``predicate`` holds for ``args``.
|
|
232
|
+
|
|
233
|
+
Outside allow mode a wildcard path matches when ANY value at the wildcard
|
|
234
|
+
satisfies the op; for a non-wildcard path there is at most one value.
|
|
235
|
+
|
|
236
|
+
``strict`` is allow mode, where a match APPROVES the call, so every
|
|
237
|
+
ambiguity must resolve towards "no match":
|
|
238
|
+
|
|
239
|
+
- EVERY branch the path reaches must hold the field, ``exists``
|
|
240
|
+
included, so ``args.operations.*.parameters.brightness`` does not
|
|
241
|
+
approve a batch whose unlock operation carries no ``parameters`` (or
|
|
242
|
+
an empty one), and ``args.*.entity_id`` does not approve a ``target``
|
|
243
|
+
object that names only an area. A scalar argument lacks every field,
|
|
244
|
+
so ``args.*.<field>`` approves no call that also has one. The
|
|
245
|
+
remaining rules do not apply to ``exists``.
|
|
246
|
+
- EVERY value must satisfy the op, and a list found at the path counts
|
|
247
|
+
as its items, so an approval naming ``light.a`` covers neither an
|
|
248
|
+
``operations`` list nor an ``entity_id`` list that also names a lock.
|
|
249
|
+
- A string with a comma or surrounding whitespace never matches: Home
|
|
250
|
+
Assistant splits ``"light.a, lock.x"`` into two entity IDs and strips
|
|
251
|
+
each, so the string would stand for values the op never saw.
|
|
252
|
+
- A dict value (an object argument) can only be matched exactly, by
|
|
253
|
+
``eq`` or ``in``; ``neq "lock.x"`` says nothing about what the object
|
|
254
|
+
holds, so it must not approve it.
|
|
255
|
+
- The op must hold both case-sensitively and case-insensitively. A
|
|
256
|
+
positive op (``eq``, ``in``) then needs the exact case, so
|
|
257
|
+
``home/bridge`` does not approve the different MQTT topic
|
|
258
|
+
``Home/Bridge``; a negated op (``neq``, ``not_in``) cannot be
|
|
259
|
+
satisfied by a case variant, because Home Assistant lower-cases
|
|
260
|
+
domains, services and entity IDs and would run ``LOCK`` as ``lock``.
|
|
261
|
+
"""
|
|
262
|
+
values = list(iter_path_values(args, predicate.path, report_missing=strict))
|
|
263
|
+
if not values or any(v is MISSING for v in values):
|
|
264
|
+
return False
|
|
197
265
|
if predicate.op == "exists":
|
|
198
|
-
return
|
|
266
|
+
return True
|
|
267
|
+
if not strict:
|
|
268
|
+
return any(_op_matches(v, predicate.op, predicate.value) for v in values)
|
|
269
|
+
values = list(_flatten_lists(values))
|
|
199
270
|
if not values:
|
|
200
271
|
return False
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
272
|
+
return all(
|
|
273
|
+
not _splits_into_other_values(v)
|
|
274
|
+
and (not isinstance(v, dict) or predicate.op in ("eq", "in"))
|
|
275
|
+
and _op_matches(v, predicate.op, predicate.value, strict=True)
|
|
276
|
+
and _op_matches(v, predicate.op, predicate.value)
|
|
277
|
+
for v in values
|
|
278
|
+
)
|
|
279
|
+
|
|
205
280
|
|
|
281
|
+
def _splits_into_other_values(value: Any) -> bool:
|
|
282
|
+
return isinstance(value, str) and ("," in value or value != value.strip())
|
|
206
283
|
|
|
207
|
-
|
|
284
|
+
|
|
285
|
+
def _flatten_lists(values: Iterable[Any]) -> Iterator[Any]:
|
|
286
|
+
for value in values:
|
|
287
|
+
if isinstance(value, (list, tuple)):
|
|
288
|
+
yield from _flatten_lists(value)
|
|
289
|
+
else:
|
|
290
|
+
yield value
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def match_rule(
|
|
294
|
+
rule: Rule, tool_name: str, args: dict[str, Any], *, strict: bool = False
|
|
295
|
+
) -> bool:
|
|
208
296
|
if rule.tool_name not in ("*", tool_name):
|
|
209
297
|
return False
|
|
210
|
-
return all(match_predicate(p, args) for p in rule.when)
|
|
298
|
+
return all(match_predicate(p, args, strict=strict) for p in rule.when)
|
|
211
299
|
|
|
212
300
|
|
|
213
301
|
def find_matching_rule(
|
|
214
302
|
tool_name: str, args: dict[str, Any], policy: Policy
|
|
215
303
|
) -> Rule | None:
|
|
304
|
+
"""First rule gating this call under a require-approval list, else None."""
|
|
305
|
+
if policy.rule_effect != "require_approval":
|
|
306
|
+
return None
|
|
216
307
|
for rule in policy.rules:
|
|
217
308
|
if match_rule(rule, tool_name, args):
|
|
218
309
|
return rule
|
|
@@ -231,8 +322,8 @@ def _predicate_reaches_operations(path: str) -> bool:
|
|
|
231
322
|
literal segment right after that wildcard (e.g. ``domain`` in
|
|
232
323
|
``args.*.domain``) can only ever match a *dict* value at that level (like
|
|
233
324
|
``selector``) — ``walk()`` requires ``isinstance(cur, dict)`` for a
|
|
234
|
-
literal head, so it
|
|
235
|
-
reach an operation row. Only a SECOND wildcard (``args.*.*...``, as in
|
|
325
|
+
literal head, so it yields no value against a list (only ``MISSING`` under
|
|
326
|
+
``report_missing``) and can never reach an operation row. Only a SECOND wildcard (``args.*.*...``, as in
|
|
236
327
|
``args.*.*.entity_id``) or no further segment at all (bare ``args.*``,
|
|
237
328
|
which yields the raw ``operations`` list value itself) can actually reach
|
|
238
329
|
into the list. Any other concrete first segment (e.g. ``selector``) can
|
|
@@ -266,7 +357,38 @@ def _rule_needs_resolved_operations(rule: Rule) -> bool:
|
|
|
266
357
|
|
|
267
358
|
|
|
268
359
|
def evaluate(tool_name: str, args: dict[str, Any], policy: Policy) -> Verdict:
|
|
269
|
-
"""Decide whether one tool call requires approval under ``policy``.
|
|
360
|
+
"""Decide whether one tool call requires approval under ``policy``."""
|
|
361
|
+
if policy.rule_effect == "require_approval":
|
|
362
|
+
return _evaluate_require_approval_list(tool_name, args, policy)
|
|
363
|
+
return _evaluate_allow_list(tool_name, args, policy)
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def _evaluate_allow_list(
|
|
367
|
+
tool_name: str, args: dict[str, Any], policy: Policy
|
|
368
|
+
) -> Verdict:
|
|
369
|
+
"""Allow mode: a call runs only when some rule approves it.
|
|
370
|
+
|
|
371
|
+
Unmatched calls, a ``ws_command`` call included, already require
|
|
372
|
+
approval here (a bare ``ha_call_service`` or ``*`` rule does approve
|
|
373
|
+
one), so the require-approval list's first fail-safe has
|
|
374
|
+
no counterpart. The selector one does: a rule that inspects
|
|
375
|
+
``args.operations`` cannot see the targets a selector call resolves to
|
|
376
|
+
later, so it must not be what approves that call.
|
|
377
|
+
"""
|
|
378
|
+
dynamic = has_dynamic_selector_targets(tool_name, args)
|
|
379
|
+
for rule in policy.rules:
|
|
380
|
+
if not match_rule(rule, tool_name, args, strict=True):
|
|
381
|
+
continue
|
|
382
|
+
if dynamic and _rule_needs_resolved_operations(rule):
|
|
383
|
+
continue
|
|
384
|
+
return Verdict.ALLOW
|
|
385
|
+
return Verdict.REQUIRE_APPROVAL
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def _evaluate_require_approval_list(
|
|
389
|
+
tool_name: str, args: dict[str, Any], policy: Policy
|
|
390
|
+
) -> Verdict:
|
|
391
|
+
"""Require-approval mode (the default): gate matching calls.
|
|
270
392
|
|
|
271
393
|
A normal rule match (``find_matching_rule``) decides most calls. Two
|
|
272
394
|
fail-safes broaden approval beyond an exact predicate match, each only
|
|
@@ -84,9 +84,10 @@ def build_requested_payload(
|
|
|
84
84
|
at ``ARG_VALUE_LIMIT``. The settings UI's pending list remains the place
|
|
85
85
|
to read an argument in full.
|
|
86
86
|
|
|
87
|
-
``matched_rule`` is present exactly when a rule
|
|
87
|
+
``matched_rule`` is present exactly when a rule gated this call. The
|
|
88
88
|
policy's two fail-safes (``evaluator.evaluate``) gate a call without a
|
|
89
|
-
matching rule, and
|
|
89
|
+
matching rule, and under an allow list a call is gated because no rule
|
|
90
|
+
approved it; then there is none to name.
|
|
90
91
|
"""
|
|
91
92
|
payload: dict[str, Any] = {
|
|
92
93
|
"token": entry.token,
|
|
@@ -15,7 +15,12 @@ from starlette.responses import JSONResponse
|
|
|
15
15
|
from ..utils.config_write_lock import config_write_guard
|
|
16
16
|
from .approval_queue import ApprovalQueue
|
|
17
17
|
from .decision_pin import clear_pin, is_pin_set, pin_status, set_pin, validate_pin
|
|
18
|
-
from .model import
|
|
18
|
+
from .model import (
|
|
19
|
+
ALLOW_LIST_OMITTED_MESSAGE,
|
|
20
|
+
Policy,
|
|
21
|
+
drops_allow_list,
|
|
22
|
+
gates_differ,
|
|
23
|
+
)
|
|
19
24
|
from .persistence import load_policy, save_policy
|
|
20
25
|
from .value_sources import (
|
|
21
26
|
all_value_sources_for,
|
|
@@ -66,17 +71,24 @@ def _extract_arg_paths(parameters: dict[str, Any]) -> list[dict[str, Any]]:
|
|
|
66
71
|
return out
|
|
67
72
|
|
|
68
73
|
|
|
74
|
+
def policy_file_corrupt_response(exc: ValueError) -> JSONResponse:
|
|
75
|
+
"""The response for a corrupt or schema-invalid stored tool_policy.json.
|
|
76
|
+
|
|
77
|
+
Shared by GET and PUT here and in the sidecar: the body names the problem
|
|
78
|
+
and flags it (the page adds its repair hint on load), and the log records
|
|
79
|
+
it for whoever reads the server log rather than the page.
|
|
80
|
+
"""
|
|
81
|
+
logger.warning("tool_policy.json could not be read: %s", exc)
|
|
82
|
+
return JSONResponse(
|
|
83
|
+
{"error": str(exc), "policy_file_corrupt": True}, status_code=500
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
69
87
|
async def _get_config(data_dir: Path) -> JSONResponse:
|
|
70
88
|
try:
|
|
71
89
|
return JSONResponse(load_policy(data_dir).model_dump(mode="json"))
|
|
72
90
|
except ValueError as e:
|
|
73
|
-
|
|
74
|
-
# UI so the user has a visible repair path; without this the
|
|
75
|
-
# tab would just spinner forever on an opaque 500.
|
|
76
|
-
return JSONResponse(
|
|
77
|
-
{"error": str(e), "policy_file_corrupt": True},
|
|
78
|
-
status_code=500,
|
|
79
|
-
)
|
|
91
|
+
return policy_file_corrupt_response(e)
|
|
80
92
|
|
|
81
93
|
|
|
82
94
|
async def _put_config(
|
|
@@ -94,7 +106,13 @@ async def _put_config(
|
|
|
94
106
|
# sidecar runs this same handler in its own process) so a concurrent
|
|
95
107
|
# writer can't slip between the read and the write and lose an update.
|
|
96
108
|
async with config_write_guard():
|
|
97
|
-
|
|
109
|
+
try:
|
|
110
|
+
current = load_policy(data_dir)
|
|
111
|
+
except ValueError as e:
|
|
112
|
+
# No version to compare against, so the write is refused too.
|
|
113
|
+
return policy_file_corrupt_response(e)
|
|
114
|
+
if drops_allow_list(new_policy, current):
|
|
115
|
+
return JSONResponse({"error": ALLOW_LIST_OMITTED_MESSAGE}, status_code=400)
|
|
98
116
|
# Inside the guard: DELETE /api/policy/decision-pin clears the PIN
|
|
99
117
|
# under this same lock, and when the stored policy already has the
|
|
100
118
|
# switch off it does so without bumping the version. Checked before
|
|
@@ -125,12 +143,12 @@ async def _put_config(
|
|
|
125
143
|
status_code=409,
|
|
126
144
|
)
|
|
127
145
|
save_policy(data_dir, new_policy)
|
|
128
|
-
# Drop the remember-cache only when
|
|
146
|
+
# Drop the remember-cache only when the gates actually changed.
|
|
129
147
|
# Editing just wait_seconds / approval_ttl_minutes shouldn't
|
|
130
|
-
# invalidate in-flight remembered approvals; only a rule
|
|
131
|
-
# could make a previously-approved call now want
|
|
132
|
-
# outcome.
|
|
133
|
-
if current
|
|
148
|
+
# invalidate in-flight remembered approvals; only a rule or
|
|
149
|
+
# rule_effect change could make a previously-approved call now want
|
|
150
|
+
# a different outcome.
|
|
151
|
+
if gates_differ(current, new_policy):
|
|
134
152
|
queue.clear_remember_cache()
|
|
135
153
|
return JSONResponse({"saved": True, "version": new_policy.version + 1})
|
|
136
154
|
|
|
@@ -119,8 +119,9 @@ class PolicyMiddleware(Middleware):
|
|
|
119
119
|
# rewrites a retired name before it arrives. Resolving it again costs a
|
|
120
120
|
# dict lookup and removes the ordering dependency, which here is the
|
|
121
121
|
# difference between gated and ungated: rules are keyed on the current
|
|
122
|
-
# name, and ``evaluate`` returns ALLOW
|
|
123
|
-
# reading a stale name lets the call
|
|
122
|
+
# name, and under a require-approval list ``evaluate`` returns ALLOW
|
|
123
|
+
# when nothing matches, so a gate reading a stale name lets the call
|
|
124
|
+
# through (under an allow list it would gate an approved call).
|
|
124
125
|
name = current_tool_name(context.message.name)
|
|
125
126
|
# Normalize stringified JSON containers (a client like Claude Desktop
|
|
126
127
|
# stdio can send a nested parameter, e.g. `selector`, as a JSON
|
|
@@ -171,8 +172,17 @@ class PolicyMiddleware(Middleware):
|
|
|
171
172
|
remember_minutes = (
|
|
172
173
|
0 if dynamic_targets else rule.remember_minutes if rule else 0
|
|
173
174
|
)
|
|
175
|
+
# An allow list has no remember window (find_matching_rule returns no
|
|
176
|
+
# rule for it, so remember_minutes is 0). A remembered entry is then
|
|
177
|
+
# left over from a require-approval list: a call left pending there
|
|
178
|
+
# and approved after the switch, or a switch saved from the sidecar or
|
|
179
|
+
# by a hand edit, neither of which clears this cache. It must not
|
|
180
|
+
# approve a call the allow list gates.
|
|
181
|
+
reads_remembered = (
|
|
182
|
+
not dynamic_targets and policy.rule_effect == "require_approval"
|
|
183
|
+
)
|
|
174
184
|
|
|
175
|
-
if
|
|
185
|
+
if reads_remembered and self._queue.is_remembered(name, args_hash):
|
|
176
186
|
return await call_next(context)
|
|
177
187
|
|
|
178
188
|
# A dynamic selector call must never consume an entry it did not
|
|
@@ -201,6 +211,7 @@ class PolicyMiddleware(Middleware):
|
|
|
201
211
|
name,
|
|
202
212
|
args_hash,
|
|
203
213
|
dynamic_targets=dynamic_targets,
|
|
214
|
+
reads_remembered=reads_remembered,
|
|
204
215
|
remember_minutes=remember_minutes,
|
|
205
216
|
):
|
|
206
217
|
return await call_next(context)
|
|
@@ -222,7 +233,7 @@ class PolicyMiddleware(Middleware):
|
|
|
222
233
|
pending,
|
|
223
234
|
name,
|
|
224
235
|
args_hash,
|
|
225
|
-
|
|
236
|
+
reads_remembered=reads_remembered,
|
|
226
237
|
remember_minutes=remember_minutes,
|
|
227
238
|
):
|
|
228
239
|
return await call_next(context)
|
|
@@ -357,6 +368,7 @@ class PolicyMiddleware(Middleware):
|
|
|
357
368
|
args_hash: str,
|
|
358
369
|
*,
|
|
359
370
|
dynamic_targets: bool,
|
|
371
|
+
reads_remembered: bool,
|
|
360
372
|
remember_minutes: int,
|
|
361
373
|
) -> bool:
|
|
362
374
|
"""Act on an entry this call did not create. True means dispatch now.
|
|
@@ -383,7 +395,7 @@ class PolicyMiddleware(Middleware):
|
|
|
383
395
|
existing,
|
|
384
396
|
name,
|
|
385
397
|
args_hash,
|
|
386
|
-
|
|
398
|
+
reads_remembered=reads_remembered,
|
|
387
399
|
remember_minutes=remember_minutes,
|
|
388
400
|
)
|
|
389
401
|
if existing.decision == "denied":
|
|
@@ -397,7 +409,7 @@ class PolicyMiddleware(Middleware):
|
|
|
397
409
|
name: str,
|
|
398
410
|
args_hash: str,
|
|
399
411
|
*,
|
|
400
|
-
|
|
412
|
+
reads_remembered: bool,
|
|
401
413
|
remember_minutes: int,
|
|
402
414
|
) -> bool:
|
|
403
415
|
"""Consume an approved entry for this invocation.
|
|
@@ -411,22 +423,23 @@ class PolicyMiddleware(Middleware):
|
|
|
411
423
|
earlier in ``on_call_tool`` ran before the approval existed, which
|
|
412
424
|
is why it has to be re-checked here rather than relied upon.
|
|
413
425
|
|
|
414
|
-
A
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
``
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
toward
|
|
426
|
+
A call that skips that gate (``reads_remembered`` is false for a
|
|
427
|
+
dynamic selector call and for every call under an allow list) must
|
|
428
|
+
not consult the cache here either. Under an allow list an entry left
|
|
429
|
+
over from a require-approval list can be live. For a dynamic
|
|
430
|
+
selector call no reachable case arms one today
|
|
431
|
+
(``has_dynamic_selector_targets`` is a pure function of the name and
|
|
432
|
+
args that also produce ``args_hash``, so static and dynamic calls
|
|
433
|
+
cannot collide on one key), but the guard keeps this branch
|
|
434
|
+
degrading the same direction as the defensive claim check in
|
|
435
|
+
``_resolve_already_decided``: toward an extra prompt, never toward a
|
|
436
|
+
dispatch the caller was not entitled to.
|
|
424
437
|
"""
|
|
425
438
|
if self._queue.consume_and_maybe_remember(
|
|
426
439
|
entry, remember_minutes=remember_minutes
|
|
427
440
|
):
|
|
428
441
|
return True
|
|
429
|
-
if
|
|
442
|
+
if not reads_remembered:
|
|
430
443
|
return False
|
|
431
444
|
return self._queue.is_remembered(name, args_hash)
|
|
432
445
|
|