ha-mcp-dev 8.6.0.dev2839__tar.gz → 8.6.0.dev2844__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.
Files changed (707) hide show
  1. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/pyproject.toml.orig +1 -1
  4. ha_mcp_dev-8.6.0.dev2844/src/ha_mcp/policy/server_channels.py +112 -0
  5. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/server.py +8 -102
  6. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/bulk_selector.py +31 -18
  7. ha_mcp_dev-8.6.0.dev2844/src/ha_mcp/tools/device_enrichment.py +133 -0
  8. ha_mcp_dev-8.6.0.dev2844/src/ha_mcp/tools/entity_update_fields.py +68 -0
  9. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/helpers.py +43 -0
  10. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_deep.py +38 -42
  11. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_bug_report.py +30 -31
  12. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_entities.py +69 -81
  13. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_registry.py +32 -135
  14. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/LICENSE +0 -0
  15. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/README.md +0 -0
  16. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/__init__.py +0 -0
  17. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/__main__.py +0 -0
  18. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_pypi_marker +0 -0
  19. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_rich_compat.py +0 -0
  20. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/__init__.py +0 -0
  21. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  22. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  23. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  24. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  25. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  26. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  27. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  28. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  29. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  30. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  31. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  32. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  33. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  34. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  35. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  36. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  37. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  38. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  39. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  40. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  41. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  42. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  43. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  44. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  45. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  46. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  47. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  48. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  49. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  50. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  51. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  52. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  53. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  54. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  55. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  56. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  57. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  58. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  59. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  60. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  61. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  62. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  63. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  64. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  65. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  66. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  67. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  68. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  69. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  70. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  71. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  72. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  73. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  74. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  75. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  76. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  77. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  78. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  79. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  80. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  81. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  82. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  83. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  84. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  85. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  86. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  87. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  88. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  89. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  90. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  91. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  92. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  93. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  94. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  95. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  96. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  97. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  98. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  99. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  100. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  101. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  102. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  103. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  104. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  105. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  106. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  107. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  108. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  109. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  110. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  111. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  112. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  113. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  114. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  115. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  116. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  117. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  118. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  119. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  120. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  121. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  122. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  123. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  124. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  125. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  126. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  127. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  128. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  129. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  130. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  131. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  132. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  133. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  134. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  135. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  136. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  137. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  138. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  139. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  140. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  141. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  142. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  143. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  144. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  145. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  146. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  147. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  148. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  149. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  150. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  151. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  152. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  153. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  154. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  155. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  156. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  157. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  158. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  159. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  160. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  161. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  162. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  163. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  164. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  165. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  166. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  167. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  168. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  169. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  170. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  171. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  172. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  173. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  174. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  175. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  176. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  177. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  178. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  179. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  180. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  181. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  182. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  183. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  184. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  185. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  186. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  187. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  188. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  189. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  190. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  191. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  192. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  193. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  194. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  195. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  196. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  197. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  198. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  199. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  200. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  201. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  202. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  203. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  204. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  205. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  206. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  207. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  208. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  209. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  210. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  211. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  212. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  213. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  214. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  215. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  216. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  217. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  218. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  219. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  220. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  221. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  222. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  223. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  224. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  225. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  226. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  227. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  228. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  229. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  230. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  231. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  232. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  233. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  234. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  235. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  236. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  237. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  238. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  239. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  240. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  241. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  242. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  243. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  244. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  245. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  246. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  247. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  248. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  249. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  250. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  251. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  252. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  253. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  254. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  255. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  256. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  257. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  258. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  259. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  260. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  261. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  262. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  263. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  264. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  265. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  266. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  267. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  268. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  269. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  270. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  271. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  272. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  273. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  274. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  275. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  276. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  277. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  278. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  279. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  280. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  281. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  282. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  283. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  284. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  285. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  286. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  287. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  288. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  289. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  290. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  291. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  292. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  293. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  294. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  295. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  296. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  297. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  298. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  299. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  300. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  301. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  302. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  303. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  304. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  305. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  306. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  307. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  308. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  309. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  310. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  311. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  312. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  313. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  314. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  315. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  316. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  317. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  318. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  319. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  320. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  321. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  322. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  323. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  324. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  325. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  326. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  327. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  328. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  329. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  330. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  331. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  332. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  333. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  334. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  335. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  336. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  337. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  338. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  339. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  340. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  341. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  342. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  343. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  344. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  345. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  346. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  347. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  348. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  349. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  350. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  351. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  352. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  353. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  354. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  355. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  356. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  357. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  358. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  359. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  360. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  361. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  362. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  363. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  364. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  365. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  366. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  367. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  368. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  369. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  370. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  371. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  372. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  373. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  374. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  375. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  376. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  377. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  378. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  379. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  380. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  381. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  382. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  383. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  384. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  385. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  386. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  387. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  388. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  389. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  390. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  391. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  392. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  393. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  394. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  395. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  396. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  397. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  398. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  399. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  400. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  401. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  402. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  403. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  404. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  405. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  406. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  407. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  408. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  409. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  410. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  411. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  412. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  413. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  414. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  415. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  416. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  417. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  418. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  419. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  420. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  421. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  422. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  423. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  424. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  425. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  426. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  427. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  428. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  429. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  430. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  431. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/requirements.txt +0 -0
  432. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  433. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  434. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  435. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  436. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  437. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  438. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  439. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  440. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  441. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  442. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  443. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  444. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  445. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  446. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  447. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  448. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  449. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  450. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  451. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  452. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  453. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  454. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  455. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  456. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  457. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  458. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  459. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  460. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  461. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  462. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  463. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  464. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  465. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  466. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  467. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  468. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  469. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  470. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  471. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  472. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  473. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  474. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  475. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  476. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  477. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  478. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  479. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  480. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  481. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  482. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  483. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  484. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  485. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  486. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  487. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  488. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/_version.py +0 -0
  489. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/auth/__init__.py +0 -0
  490. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/auth/consent_form.py +0 -0
  491. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/auth/oidc_compat.py +0 -0
  492. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/auth/provider.py +0 -0
  493. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/backup_manager.py +0 -0
  494. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/browser_landing.py +0 -0
  495. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/__init__.py +0 -0
  496. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/admin_routes.py +0 -0
  497. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/rest_client.py +0 -0
  498. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/supervisor_client.py +0 -0
  499. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/websocket_client.py +0 -0
  500. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/client/websocket_listener.py +0 -0
  501. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/config.py +0 -0
  502. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  503. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  504. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  505. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  506. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  507. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  508. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/errors.py +0 -0
  509. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/ha_request_queue.py +0 -0
  510. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  511. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/http_transport.py +0 -0
  512. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/llm_exposure.py +0 -0
  513. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/log_filters.py +0 -0
  514. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/__init__.py +0 -0
  515. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/approval_queue.py +0 -0
  516. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/decision_pin.py +0 -0
  517. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/decisions.py +0 -0
  518. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/editing.py +0 -0
  519. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/evaluator.py +0 -0
  520. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/events.py +0 -0
  521. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/handlers.py +0 -0
  522. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/middleware.py +0 -0
  523. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/model.py +0 -0
  524. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/persistence.py +0 -0
  525. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/policy/value_sources.py +0 -0
  526. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/py.typed +0 -0
  527. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/read_only.py +0 -0
  528. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/redaction.py +0 -0
  529. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/renamed_tools.py +0 -0
  530. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  531. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  532. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  533. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  534. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  535. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  536. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  537. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  538. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  539. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  540. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  541. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  542. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  543. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  544. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  545. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  546. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  547. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/server_lifespan.py +0 -0
  548. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/__init__.py +0 -0
  549. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  550. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  551. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  552. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  553. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  554. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  555. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  556. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  557. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  558. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  559. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_theme.py +0 -0
  560. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  561. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  562. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  563. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  564. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  565. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  566. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  567. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  568. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  569. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  570. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  571. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  572. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  573. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  574. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  575. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  576. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  577. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  578. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/settings.css +0 -0
  579. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/settings.html +0 -0
  580. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/settings_ui/settings.js +0 -0
  581. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/smoke_test.py +0 -0
  582. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  583. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/strict_bps.py +0 -0
  584. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tool_dispatch.py +0 -0
  585. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/__init__.py +0 -0
  586. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/auto_backup.py +0 -0
  587. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/backup.py +0 -0
  588. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  589. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/best_practice_result.py +0 -0
  590. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  591. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  592. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  593. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/blueprint_write.py +0 -0
  594. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_api.py +0 -0
  595. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_config_entries.py +0 -0
  596. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_config_reads.py +0 -0
  597. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  598. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_devices.py +0 -0
  599. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_registries.py +0 -0
  600. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  601. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  602. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  603. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  604. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  605. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  606. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  607. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  608. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  609. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  610. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/device_control.py +0 -0
  611. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/entity_registration.py +0 -0
  612. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  613. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/hacs_registration.py +0 -0
  614. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  615. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/log_common.py +0 -0
  616. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/log_sources.py +0 -0
  617. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  618. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  619. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/__init__.py +0 -0
  620. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/base.py +0 -0
  621. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/matter.py +0 -0
  622. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/thread.py +0 -0
  623. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  624. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/radio/zwave.py +0 -0
  625. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/reference_validator.py +0 -0
  626. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/registry.py +0 -0
  627. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  628. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/scene_discovery.py +0 -0
  629. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  630. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  631. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  632. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  633. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  634. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  635. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  636. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  637. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  638. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  639. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_addons.py +0 -0
  640. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_areas.py +0 -0
  641. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  642. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  643. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_calendar.py +0 -0
  644. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_camera.py +0 -0
  645. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_categories.py +0 -0
  646. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_code.py +0 -0
  647. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  648. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  649. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  650. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  651. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  652. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  653. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_dev.py +0 -0
  654. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_energy.py +0 -0
  655. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  656. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_groups.py +0 -0
  657. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_hacs.py +0 -0
  658. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_history.py +0 -0
  659. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_integrations.py +0 -0
  660. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_labels.py +0 -0
  661. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_logs.py +0 -0
  662. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_radio.py +0 -0
  663. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_resources.py +0 -0
  664. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_search.py +0 -0
  665. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  666. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_service.py +0 -0
  667. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_services.py +0 -0
  668. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_system.py +0 -0
  669. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_themes.py +0 -0
  670. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_todo.py +0 -0
  671. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_traces.py +0 -0
  672. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_updates.py +0 -0
  673. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_utility.py +0 -0
  674. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  675. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  676. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  677. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/tools_zones.py +0 -0
  678. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/util_helpers.py +0 -0
  679. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/tools/validation_middleware.py +0 -0
  680. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transforms/__init__.py +0 -0
  681. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transforms/categorized_search.py +0 -0
  682. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transforms/component_search.py +0 -0
  683. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  684. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  685. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/transport_security.py +0 -0
  686. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/update_check.py +0 -0
  687. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/__init__.py +0 -0
  688. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/config_hash.py +0 -0
  689. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/config_write_lock.py +0 -0
  690. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  691. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/data_paths.py +0 -0
  692. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  693. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/domain_handlers.py +0 -0
  694. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/entity_membership.py +0 -0
  695. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  696. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  697. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  698. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/operation_manager.py +0 -0
  699. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/python_sandbox.py +0 -0
  700. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  701. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/skill_loader.py +0 -0
  702. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/utils/usage_logger.py +0 -0
  703. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/visibility/__init__.py +0 -0
  704. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/visibility/enforcement.py +0 -0
  705. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/visibility/model.py +0 -0
  706. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/visibility/persistence.py +0 -0
  707. {ha_mcp_dev-8.6.0.dev2839 → ha_mcp_dev-8.6.0.dev2844}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.6.0.dev2839
3
+ Version: 8.6.0.dev2844
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.6.0.dev2839"
7
+ version = "8.6.0.dev2844"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.6.0.dev2839"
7
+ version = "8.6.0.dev2844"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -0,0 +1,112 @@
1
+ """The approval-response channel's connections, opened as the server's client.
2
+
3
+ ``HomeAssistantSmartMCPServer._apply_tool_security_policies`` binds these to
4
+ the server and hands them to ``ApprovalResponseListener``.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ from typing import Any
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ async def approval_ws_client(server: Any) -> Any:
16
+ """Return a WebSocket client that authenticates as ``server.client``."""
17
+ # Imported at call time: the WebSocket stack is only needed once a
18
+ # gated call is actually announced, which may never happen.
19
+ from ..client.websocket_client import get_websocket_client
20
+
21
+ # Keyed to the credentials the announcement itself goes out
22
+ # with, the way ``HomeAssistantClient.send_websocket_message``
23
+ # does it. In OAuth mode ``server.client`` is a proxy resolving to
24
+ # the current request's client, while the global settings hold
25
+ # only the ``oauth-mode-token`` placeholder -- so an
26
+ # unparameterised call would authenticate the response
27
+ # subscription as nobody, and a request could be announced over
28
+ # REST on a channel that can never carry the answer back.
29
+ # Read once, and catch the miss explicitly: a per-attribute
30
+ # ``getattr`` with a default would swallow an AttributeError
31
+ # raised anywhere INSIDE the OAuth proxy's resolution, hand
32
+ # back None, and silently authenticate as the placeholder the
33
+ # whole change exists to avoid. Three separate reads would also
34
+ # be three separate resolutions, with nothing tying them to one
35
+ # client. A client with no credentials at all is the token
36
+ # deployments' normal case: pooled default connection.
37
+ client = server.client
38
+ url: str | None
39
+ token: str | None
40
+ verify_ssl: bool | None
41
+ try:
42
+ url = client.base_url
43
+ token = client.token
44
+ verify_ssl = client.verify_ssl
45
+ except AttributeError:
46
+ logger.debug(
47
+ "policy decisions: %s exposes no per-request credentials; "
48
+ "opening the approval-response channel on the pooled "
49
+ "default connection",
50
+ type(client).__name__,
51
+ exc_info=True,
52
+ )
53
+ url = token = verify_ssl = None
54
+ return await get_websocket_client(url=url, token=token, verify_ssl=verify_ssl)
55
+
56
+
57
+ async def emit_approval_result_as(
58
+ server: Any,
59
+ token: str,
60
+ decision: str,
61
+ *,
62
+ applied: bool,
63
+ reason: str,
64
+ tool_name: str | None = None,
65
+ ) -> None:
66
+ from ..client.rest_client import HomeAssistantClient
67
+ from .events import emit_approval_result
68
+
69
+ # Credentials read the way ``approval_ws_client`` reads them,
70
+ # and for the same reason: this runs in a bus handler, not in a
71
+ # request, so in OAuth mode ``server.client`` resolves to nobody
72
+ # and the proxy raises rather than handing back a usable client.
73
+ # A fresh REST client over the snapshot keeps the result going
74
+ # out as the same identity the request was announced with.
75
+ client = server.client
76
+ url: str | None
77
+ token_value: str | None
78
+ verify_ssl: bool | None
79
+ known_is_admin: bool | None
80
+ admin_route_refused: bool
81
+ try:
82
+ url = client.base_url
83
+ token_value = client.token
84
+ verify_ssl = client.verify_ssl
85
+ known_is_admin = client.known_is_admin
86
+ admin_route_refused = client.admin_route_refused is True
87
+ except Exception:
88
+ logger.debug(
89
+ "policy decisions: no credentials for the result event; "
90
+ "the decision itself is unaffected",
91
+ exc_info=True,
92
+ )
93
+ return
94
+ # Owned here, so closed here: this client is built per event and
95
+ # carries its own httpx connection pool, which nothing else will
96
+ # ever reclaim. A wrong PIN retried by a chatty automation would
97
+ # otherwise open one per attempt.
98
+ async with HomeAssistantClient(
99
+ url,
100
+ token_value,
101
+ verify_ssl=verify_ssl,
102
+ is_admin=known_is_admin,
103
+ admin_route_refused=admin_route_refused,
104
+ ) as result_client:
105
+ await emit_approval_result(
106
+ result_client,
107
+ token,
108
+ decision,
109
+ applied=applied,
110
+ reason=reason,
111
+ tool_name=tool_name,
112
+ )
@@ -10,6 +10,7 @@ Implements lazy initialization pattern for improved startup time:
10
10
  from __future__ import annotations
11
11
 
12
12
  import logging
13
+ from functools import partial
13
14
  from pathlib import Path
14
15
  from typing import TYPE_CHECKING, Annotated, Any, ClassVar
15
16
 
@@ -1264,7 +1265,7 @@ class HomeAssistantSmartMCPServer:
1264
1265
  except Exception:
1265
1266
  logger.exception("Failed to apply tool search transform")
1266
1267
 
1267
- def _apply_tool_security_policies(self) -> None: # noqa: PLR0915
1268
+ def _apply_tool_security_policies(self) -> None:
1268
1269
  """Register the tool security policies middleware (#966).
1269
1270
 
1270
1271
  Opt-in via ``ENABLE_TOOL_SECURITY_POLICIES``. When enabled, every
@@ -1311,6 +1312,10 @@ class HomeAssistantSmartMCPServer:
1311
1312
  from .policy.middleware import PolicyMiddleware
1312
1313
  from .policy.model import Policy
1313
1314
  from .policy.persistence import load_policy
1315
+ from .policy.server_channels import (
1316
+ approval_ws_client,
1317
+ emit_approval_result_as,
1318
+ )
1314
1319
  from .utils.data_paths import get_data_dir
1315
1320
  except ImportError:
1316
1321
  logger.exception(
@@ -1330,114 +1335,15 @@ class HomeAssistantSmartMCPServer:
1330
1335
  # roundtrip of a gated tool call.
1331
1336
  return load_policy(data_dir)
1332
1337
 
1333
- async def _approval_ws_client() -> Any:
1334
- # Imported at call time, like the rest of this block: the
1335
- # WebSocket stack is only needed once a gated call is actually
1336
- # announced, which may never happen.
1337
- from .client.websocket_client import get_websocket_client
1338
-
1339
- # Keyed to the credentials the announcement itself goes out
1340
- # with, the way ``HomeAssistantClient.send_websocket_message``
1341
- # does it. In OAuth mode ``self.client`` is a proxy resolving to
1342
- # the current request's client, while the global settings hold
1343
- # only the ``oauth-mode-token`` placeholder -- so an
1344
- # unparameterised call would authenticate the response
1345
- # subscription as nobody, and a request could be announced over
1346
- # REST on a channel that can never carry the answer back.
1347
- # Read once, and catch the miss explicitly: a per-attribute
1348
- # ``getattr`` with a default would swallow an AttributeError
1349
- # raised anywhere INSIDE the OAuth proxy's resolution, hand
1350
- # back None, and silently authenticate as the placeholder the
1351
- # whole change exists to avoid. Three separate reads would also
1352
- # be three separate resolutions, with nothing tying them to one
1353
- # client. A client with no credentials at all is the token
1354
- # deployments' normal case: pooled default connection.
1355
- client = self.client
1356
- url: str | None
1357
- token: str | None
1358
- verify_ssl: bool | None
1359
- try:
1360
- url = client.base_url
1361
- token = client.token
1362
- verify_ssl = client.verify_ssl
1363
- except AttributeError:
1364
- logger.debug(
1365
- "policy decisions: %s exposes no per-request credentials; "
1366
- "opening the approval-response channel on the pooled "
1367
- "default connection",
1368
- type(client).__name__,
1369
- exc_info=True,
1370
- )
1371
- url = token = verify_ssl = None
1372
- return await get_websocket_client(
1373
- url=url, token=token, verify_ssl=verify_ssl
1374
- )
1375
-
1376
1338
  # Reads the same policy file as the middleware, so the toggle that
1377
1339
  # opens this channel is the one the user flips in the settings UI,
1378
1340
  # with no restart in between.
1379
- async def _emit_approval_result(
1380
- token: str,
1381
- decision: str,
1382
- *,
1383
- applied: bool,
1384
- reason: str,
1385
- tool_name: str | None = None,
1386
- ) -> None:
1387
- from .client.rest_client import HomeAssistantClient
1388
- from .policy.events import emit_approval_result
1389
-
1390
- # Credentials read the way ``_approval_ws_client`` reads them,
1391
- # and for the same reason: this runs in a bus handler, not in a
1392
- # request, so in OAuth mode ``self.client`` resolves to nobody
1393
- # and the proxy raises rather than handing back a usable client.
1394
- # A fresh REST client over the snapshot keeps the result going
1395
- # out as the same identity the request was announced with.
1396
- client = self.client
1397
- url: str | None
1398
- token_value: str | None
1399
- verify_ssl: bool | None
1400
- known_is_admin: bool | None
1401
- admin_route_refused: bool
1402
- try:
1403
- url = client.base_url
1404
- token_value = client.token
1405
- verify_ssl = client.verify_ssl
1406
- known_is_admin = client.known_is_admin
1407
- admin_route_refused = client.admin_route_refused is True
1408
- except Exception:
1409
- logger.debug(
1410
- "policy decisions: no credentials for the result event; "
1411
- "the decision itself is unaffected",
1412
- exc_info=True,
1413
- )
1414
- return
1415
- # Owned here, so closed here: this client is built per event and
1416
- # carries its own httpx connection pool, which nothing else will
1417
- # ever reclaim. A wrong PIN retried by a chatty automation would
1418
- # otherwise open one per attempt.
1419
- async with HomeAssistantClient(
1420
- url,
1421
- token_value,
1422
- verify_ssl=verify_ssl,
1423
- is_admin=known_is_admin,
1424
- admin_route_refused=admin_route_refused,
1425
- ) as result_client:
1426
- await emit_approval_result(
1427
- result_client,
1428
- token,
1429
- decision,
1430
- applied=applied,
1431
- reason=reason,
1432
- tool_name=tool_name,
1433
- )
1434
-
1435
1341
  self.approval_response_listener = ApprovalResponseListener(
1436
1342
  policy_provider=_policy_provider,
1437
1343
  queue=self.approval_queue,
1438
1344
  data_dir=data_dir,
1439
- get_ws_client=_approval_ws_client,
1440
- emit_result=_emit_approval_result,
1345
+ get_ws_client=partial(approval_ws_client, self),
1346
+ emit_result=partial(emit_approval_result_as, self),
1441
1347
  )
1442
1348
 
1443
1349
  try:
@@ -654,7 +654,34 @@ async def _load_hidden_entities(
654
654
  return visibility_hidden | registry_hidden, warnings
655
655
 
656
656
 
657
- async def resolve_bulk_selector( # noqa: PLR0915
657
+ def _build_operation_common(
658
+ action: str,
659
+ parameters: dict[str, Any] | None,
660
+ timeout_seconds: float | None,
661
+ validate_first: bool,
662
+ ) -> dict[str, Any]:
663
+ """Build the fields every resolved operation row shares."""
664
+ operation_common: dict[str, Any] = {
665
+ "action": action,
666
+ "validate_first": validate_first,
667
+ }
668
+ if parameters is not None:
669
+ # Deep copy, not the caller's own object by reference (and not a
670
+ # shallow `dict(...)`, which stops only top-level rebinding and
671
+ # still shares nested values like an `rgb_color` list): the
672
+ # per-row copy in BulkSelectorResolution.operations protects each
673
+ # DISPATCH row from cross-row mutation, but does nothing about the
674
+ # resolution's own stored copy -- without this, a caller that
675
+ # still holds `parameters` and mutates it (at any depth) after
676
+ # this call returns would silently rewrite the "frozen"
677
+ # resolution's own payload too.
678
+ operation_common["parameters"] = copy.deepcopy(parameters)
679
+ if timeout_seconds is not None:
680
+ operation_common["timeout_seconds"] = timeout_seconds
681
+ return operation_common
682
+
683
+
684
+ async def resolve_bulk_selector(
658
685
  client: HomeAssistantClient,
659
686
  selector: Mapping[str, Any],
660
687
  *,
@@ -825,23 +852,9 @@ async def resolve_bulk_selector( # noqa: PLR0915
825
852
  f"The selector resolved to {len(resolved_entity_ids)} entities; "
826
853
  f"the maximum is {MAX_SELECTOR_ENTITIES}"
827
854
  )
828
- operation_common: dict[str, Any] = {
829
- "action": action,
830
- "validate_first": validate_first,
831
- }
832
- if parameters is not None:
833
- # Deep copy, not the caller's own object by reference (and not a
834
- # shallow `dict(...)`, which stops only top-level rebinding and
835
- # still shares nested values like an `rgb_color` list): the
836
- # per-row copy in BulkSelectorResolution.operations protects each
837
- # DISPATCH row from cross-row mutation, but does nothing about the
838
- # resolution's own stored copy -- without this, a caller that
839
- # still holds `parameters` and mutates it (at any depth) after
840
- # this call returns would silently rewrite the "frozen"
841
- # resolution's own payload too.
842
- operation_common["parameters"] = copy.deepcopy(parameters)
843
- if timeout_seconds is not None:
844
- operation_common["timeout_seconds"] = timeout_seconds
855
+ operation_common = _build_operation_common(
856
+ action, parameters, timeout_seconds, validate_first
857
+ )
845
858
  excluded_and_hidden = effective_excluded & hidden
846
859
  hidden_count = len(directly_hidden | hidden_selected | excluded_and_hidden)
847
860
  warnings: list[str] = list(visibility_warnings)
@@ -0,0 +1,133 @@
1
+ """Best-effort radio enrichment for ha_get_device single-device results."""
2
+
3
+ import logging
4
+ from typing import Any
5
+
6
+ from ..client.rest_client import HomeAssistantAPIError, HomeAssistantConnectionError
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ async def enrich_zha_metrics(
12
+ client: Any, device_info: dict[str, Any], warnings: list[str]
13
+ ) -> None:
14
+ """Fetch ZHA radio metrics (LQI/RSSI) and add to device_info in-place.
15
+
16
+ Enrichment is best-effort, but a skipped fetch is named in ``warnings`` so
17
+ a device answered without ``radio_metrics`` is distinguishable from one
18
+ whose radio genuinely reports none (#1947).
19
+ """
20
+ try:
21
+ zha_result = await client.send_websocket_message({"type": "zha/devices"})
22
+ if zha_result.get("success"):
23
+ zha_by_ieee = {
24
+ d.get("ieee"): d for d in zha_result.get("result", []) if d.get("ieee")
25
+ }
26
+ zha_dev = zha_by_ieee.get(device_info["ieee_address"])
27
+ if zha_dev:
28
+ device_info["radio_metrics"] = {
29
+ "lqi": zha_dev.get("lqi"),
30
+ "rssi": zha_dev.get("rssi"),
31
+ }
32
+ else:
33
+ warnings.append(
34
+ f"ZHA radio metrics unavailable: {zha_result.get('error') or 'request failed'}"
35
+ )
36
+ except (
37
+ HomeAssistantConnectionError,
38
+ HomeAssistantAPIError,
39
+ TimeoutError,
40
+ OSError,
41
+ ) as e:
42
+ logger.warning(
43
+ "Could not fetch ZHA radio metrics for device %s: %s",
44
+ device_info.get("device_id"),
45
+ e,
46
+ )
47
+ warnings.append(f"ZHA radio metrics unavailable: {e}")
48
+
49
+
50
+ async def enrich_zwave_status(
51
+ client: Any, device_id: str, device_info: dict[str, Any], warnings: list[str]
52
+ ) -> None:
53
+ """Fetch Z-Wave node status and add to device_info in-place.
54
+
55
+ Best-effort like the ZHA metrics, and named in ``warnings`` on failure for
56
+ the same reason (#1947).
57
+ """
58
+ try:
59
+ zwave_result = await client.send_websocket_message(
60
+ {"type": "zwave_js/node_status", "device_id": device_id}
61
+ )
62
+ if zwave_result.get("success"):
63
+ node_data = zwave_result.get("result", {})
64
+ device_info["node_status"] = {
65
+ "node_id": node_data.get("node_id"),
66
+ "status": node_data.get("status"),
67
+ "is_routing": node_data.get("is_routing"),
68
+ "is_secure": node_data.get("is_secure"),
69
+ "highest_security_class": node_data.get("highest_security_class"),
70
+ "zwave_plus_version": node_data.get("zwave_plus_version"),
71
+ "is_controller_node": node_data.get("is_controller_node"),
72
+ }
73
+ else:
74
+ warnings.append(
75
+ f"Z-Wave node status unavailable: {zwave_result.get('error') or 'request failed'}"
76
+ )
77
+ except (
78
+ HomeAssistantConnectionError,
79
+ HomeAssistantAPIError,
80
+ TimeoutError,
81
+ OSError,
82
+ ) as e:
83
+ logger.warning(
84
+ "Could not fetch Z-Wave node status for device %s: %s",
85
+ device_info.get("device_id"),
86
+ e,
87
+ )
88
+ warnings.append(f"Z-Wave node status unavailable: {e}")
89
+
90
+
91
+ async def enrich_matter_diagnostics(
92
+ client: Any, device_id: str, device_info: dict[str, Any], warnings: list[str]
93
+ ) -> None:
94
+ """Fetch Matter node diagnostics and add to device_info in-place.
95
+
96
+ Mirrors enrich_zwave_status: surfaces the Matter equivalent of Z-Wave node
97
+ status — network type (wifi/thread), reachability, IPs and joined fabrics,
98
+ and names a skipped fetch in ``warnings`` (#1947).
99
+ """
100
+ try:
101
+ result = await client.send_websocket_message(
102
+ {"type": "matter/node_diagnostics", "device_id": device_id}
103
+ )
104
+ if result.get("success"):
105
+ data = result.get("result", {})
106
+ device_info["node_diagnostics"] = {
107
+ "network_type": data.get("network_type"),
108
+ "node_type": data.get("node_type"),
109
+ "available": data.get("available"),
110
+ "network_name": data.get("network_name"),
111
+ # Upstream NodeDiagnostics misspells the field "ip_adresses"
112
+ # (single d); read that key but surface it correctly.
113
+ "ip_addresses": data.get("ip_adresses"),
114
+ "mac_address": data.get("mac_address"),
115
+ "active_fabrics": data.get("active_fabrics"),
116
+ "active_fabric_index": data.get("active_fabric_index"),
117
+ }
118
+ else:
119
+ warnings.append(
120
+ f"Matter node diagnostics unavailable: {result.get('error') or 'request failed'}"
121
+ )
122
+ except (
123
+ HomeAssistantConnectionError,
124
+ HomeAssistantAPIError,
125
+ TimeoutError,
126
+ OSError,
127
+ ) as e:
128
+ logger.warning(
129
+ "Could not fetch Matter node diagnostics for device %s: %s",
130
+ device_info.get("device_id"),
131
+ e,
132
+ )
133
+ warnings.append(f"Matter node diagnostics unavailable: {e}")
@@ -0,0 +1,68 @@
1
+ """Builders for the config/entity_registry/update message of ha_set_entity."""
2
+
3
+ from typing import Any
4
+
5
+ from .helpers import clearable_value
6
+
7
+
8
+ def build_name_visibility_fields(
9
+ message: dict[str, Any],
10
+ updates_made: list[str],
11
+ area_id: str | None,
12
+ name: str | None,
13
+ icon: str | None,
14
+ device_class: str | None,
15
+ ) -> None:
16
+ """Add basic positioning/appearance fields to the update message."""
17
+ if area_id is not None:
18
+ area_id = clearable_value(area_id, "area_id")
19
+ message["area_id"] = area_id
20
+ updates_made.append(f"area_id='{area_id}'" if area_id else "area cleared")
21
+ if name is not None:
22
+ name = clearable_value(name, "name")
23
+ message["name"] = name
24
+ updates_made.append(f"name='{name}'" if name else "name cleared")
25
+ if icon is not None:
26
+ icon = clearable_value(icon, "icon")
27
+ message["icon"] = icon
28
+ updates_made.append(f"icon='{icon}'" if icon else "icon cleared")
29
+ if device_class is not None:
30
+ device_class = clearable_value(device_class, "device_class")
31
+ message["device_class"] = device_class
32
+ updates_made.append(
33
+ f"device_class='{device_class}'" if device_class else "device_class cleared"
34
+ )
35
+
36
+
37
+ def build_state_tag_fields(
38
+ message: dict[str, Any],
39
+ updates_made: list[str],
40
+ enabled: bool | None,
41
+ hidden: bool | None,
42
+ parsed_aliases: list[str | None] | None,
43
+ parsed_categories: dict[str, str | None] | None,
44
+ final_labels: list[str] | None,
45
+ label_operation: str,
46
+ parsed_labels: list[str] | None,
47
+ ) -> None:
48
+ """Add enabled/hidden/alias/category/label fields to the update message."""
49
+ if enabled is not None:
50
+ message["disabled_by"] = None if enabled else "user"
51
+ updates_made.append("enabled" if enabled else "disabled")
52
+ if hidden is not None:
53
+ message["hidden_by"] = "user" if hidden else None
54
+ updates_made.append("hidden" if hidden else "visible")
55
+ if parsed_aliases is not None:
56
+ message["aliases"] = parsed_aliases
57
+ updates_made.append(f"aliases={parsed_aliases}")
58
+ if parsed_categories is not None:
59
+ message["categories"] = parsed_categories
60
+ updates_made.append(f"categories={parsed_categories}")
61
+ if final_labels is not None:
62
+ message["labels"] = final_labels
63
+ if label_operation == "set":
64
+ updates_made.append(f"labels={final_labels}")
65
+ elif label_operation == "add":
66
+ updates_made.append(f"labels added: {parsed_labels} -> {final_labels}")
67
+ else: # remove
68
+ updates_made.append(f"labels removed: {parsed_labels} -> {final_labels}")
@@ -250,6 +250,49 @@ def validate_identifier_not_empty(
250
250
  )
251
251
 
252
252
 
253
+ WHITESPACE_CLEARS_NOTE = (
254
+ "A whitespace-only value acts like '', for clients that cannot send an "
255
+ "empty string."
256
+ )
257
+ _QUOTE_ONLY = re.compile(r"[\s\"'‘’“”]+")
258
+
259
+
260
+ def clear_hint(param_name: str) -> str:
261
+ return (
262
+ f"To clear {param_name}, pass an empty string '', or a single space ' ' "
263
+ "if your client cannot send an empty string"
264
+ )
265
+
266
+
267
+ def clearable_value(
268
+ value: str | None,
269
+ param_name: str,
270
+ *,
271
+ hint: str | None = None,
272
+ ) -> str | None:
273
+ """Map an empty or whitespace-only value to None, the registry's clear value.
274
+
275
+ Other values are returned stripped. A model whose client cannot send ``''``
276
+ falls back to ``'""'`` (#2585); a value made only of quotes and whitespace
277
+ is never a real value, so reject it.
278
+ """
279
+ if value is None:
280
+ return None
281
+ value = value.strip()
282
+ if not value:
283
+ return None
284
+ if _QUOTE_ONLY.fullmatch(value):
285
+ raise_tool_error(
286
+ create_error_response(
287
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
288
+ f"{param_name} {value!r} contains only quote characters and whitespace",
289
+ suggestions=[hint or clear_hint(param_name)],
290
+ context={"parameter": param_name, "value": value},
291
+ )
292
+ )
293
+ return value
294
+
295
+
253
296
  async def get_connected_ws_client(
254
297
  base_url: str, token: str, verify_ssl: bool | None = None
255
298
  ) -> tuple[HomeAssistantWebSocketClient | None, dict[str, Any] | None]: