ha-mcp-dev 8.6.0.dev2837__tar.gz → 8.6.0.dev2841__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 (705) hide show
  1. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/pyproject.toml +2 -1
  3. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/pyproject.toml.orig +2 -1
  4. ha_mcp_dev-8.6.0.dev2841/src/ha_mcp/policy/server_channels.py +112 -0
  5. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/server.py +7 -101
  6. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/bulk_selector.py +30 -17
  7. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_deep.py +37 -41
  8. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_bug_report.py +29 -30
  9. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/LICENSE +0 -0
  10. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/README.md +0 -0
  11. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/__init__.py +0 -0
  12. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/__main__.py +0 -0
  13. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_pypi_marker +0 -0
  14. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_rich_compat.py +0 -0
  15. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/__init__.py +0 -0
  16. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  17. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  18. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  19. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  20. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  21. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  22. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  23. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  24. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  25. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  26. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  27. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  28. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  29. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  30. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  31. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  32. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  33. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  34. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  35. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  36. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  37. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  38. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  39. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  40. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  41. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  42. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  43. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  44. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  45. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  46. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  47. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  48. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  49. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  50. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  51. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  52. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  53. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  54. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  55. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  56. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  57. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  58. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  59. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  60. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  61. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  62. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  63. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  64. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  65. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  66. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  67. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  68. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  69. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  70. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  71. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  72. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  73. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  74. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  75. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  76. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  77. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  78. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  79. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  80. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  81. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  82. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  83. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  84. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  85. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  86. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  87. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  88. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  89. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  90. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  91. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  92. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  93. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  94. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  95. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  96. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  97. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  98. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  99. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  100. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  101. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  102. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  103. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  104. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  105. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  106. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  107. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  108. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  109. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  110. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  111. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  112. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  113. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  114. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  115. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  116. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  117. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  118. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  119. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  120. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  121. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  122. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  123. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  124. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  125. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  126. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  127. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  128. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  129. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  130. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  131. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  132. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  133. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  134. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  135. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  136. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  137. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  138. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  139. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  140. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  141. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  142. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  143. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  144. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  145. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  146. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  147. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  148. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  149. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  150. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  151. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  152. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  153. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  154. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  155. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  156. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  157. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  158. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  159. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  160. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  161. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  162. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  163. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  164. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  165. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  166. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  167. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  168. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  169. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  170. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  171. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  172. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  173. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  174. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  175. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  176. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  177. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  178. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  179. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  180. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  181. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  182. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  183. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  184. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  185. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  186. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  187. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  188. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  189. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  190. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  191. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  192. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  193. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  194. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  195. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  196. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  197. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  198. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  199. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  200. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  201. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  202. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  203. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  204. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  205. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  206. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  207. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  208. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  209. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  210. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  211. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  212. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  213. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  214. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  215. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  216. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  217. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  218. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  219. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  220. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  221. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  222. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  223. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  224. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  225. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  226. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  227. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  228. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  229. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  230. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  231. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  232. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  233. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  234. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  235. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  236. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  237. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  238. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  239. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  240. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  241. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  242. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  243. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  244. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  245. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  246. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  247. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  248. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  249. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  250. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  251. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  252. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  253. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  254. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  255. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  256. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  257. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  258. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  259. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  260. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  261. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  262. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  263. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  264. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  265. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  266. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  267. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  268. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  269. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  270. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  271. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  272. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  273. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  274. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  275. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  276. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  277. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  278. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  279. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  280. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  281. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  282. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  283. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  284. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  285. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  286. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  287. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  288. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  289. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  290. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  291. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  292. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  293. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  294. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  295. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  296. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  297. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  298. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  299. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  300. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  301. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  302. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  303. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  304. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  305. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  306. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  307. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  308. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  309. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  310. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  311. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  312. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  313. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  314. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  315. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  316. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  317. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  318. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  319. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  320. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  321. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  322. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  323. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  324. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  325. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  326. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  327. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  328. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  329. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  330. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  331. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  332. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  333. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  334. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  335. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  336. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  337. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  338. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  339. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  340. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  341. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  342. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  343. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  344. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  345. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  346. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  347. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  348. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  349. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  350. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  351. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  352. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  353. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  354. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  355. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  356. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  357. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  358. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  359. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  360. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  361. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  362. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  363. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  364. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  365. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  366. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  367. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  368. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  369. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  370. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  371. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  372. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  373. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  374. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  375. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  376. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  377. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  378. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  379. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  380. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  381. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  382. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  383. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  384. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  385. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  386. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  387. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  388. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  389. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  390. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  391. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  392. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  393. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  394. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  395. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  396. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  397. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  398. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  399. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  400. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  401. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  402. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  403. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  404. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  405. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  406. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  407. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  408. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  409. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  410. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  411. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  412. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  413. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  414. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  415. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  416. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  417. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  418. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  419. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  420. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  421. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  422. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  423. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  424. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  425. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  426. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/requirements.txt +0 -0
  427. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  428. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  429. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  430. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  431. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  432. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  433. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  434. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  435. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  436. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  437. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  438. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  439. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  440. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  441. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  442. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  443. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  444. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  445. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  446. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  447. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  448. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  449. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  450. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  451. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  452. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  453. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  454. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  455. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  456. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  457. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  458. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  459. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  460. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  461. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  462. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  463. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  464. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  465. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  466. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  467. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  468. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  469. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  470. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  471. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  472. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  473. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  474. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  475. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  476. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  477. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  478. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  479. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  480. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  481. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  482. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  483. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/_version.py +0 -0
  484. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/auth/__init__.py +0 -0
  485. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/auth/consent_form.py +0 -0
  486. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/auth/oidc_compat.py +0 -0
  487. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/auth/provider.py +0 -0
  488. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/backup_manager.py +0 -0
  489. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/browser_landing.py +0 -0
  490. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/__init__.py +0 -0
  491. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/admin_routes.py +0 -0
  492. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/rest_client.py +0 -0
  493. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/supervisor_client.py +0 -0
  494. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/websocket_client.py +0 -0
  495. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/client/websocket_listener.py +0 -0
  496. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/config.py +0 -0
  497. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  498. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  499. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  500. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  501. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  502. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  503. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/errors.py +0 -0
  504. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/ha_request_queue.py +0 -0
  505. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  506. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/http_transport.py +0 -0
  507. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/llm_exposure.py +0 -0
  508. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/log_filters.py +0 -0
  509. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/__init__.py +0 -0
  510. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/approval_queue.py +0 -0
  511. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/decision_pin.py +0 -0
  512. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/decisions.py +0 -0
  513. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/editing.py +0 -0
  514. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/evaluator.py +0 -0
  515. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/events.py +0 -0
  516. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/handlers.py +0 -0
  517. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/middleware.py +0 -0
  518. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/model.py +0 -0
  519. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/persistence.py +0 -0
  520. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/policy/value_sources.py +0 -0
  521. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/py.typed +0 -0
  522. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/read_only.py +0 -0
  523. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/redaction.py +0 -0
  524. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/renamed_tools.py +0 -0
  525. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  526. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  527. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  528. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  529. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  530. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  531. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  532. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  533. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  534. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  535. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  536. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  537. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  538. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  539. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  540. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  541. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  542. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/server_lifespan.py +0 -0
  543. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/__init__.py +0 -0
  544. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  545. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  546. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  547. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  548. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  549. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  550. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  551. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  552. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  553. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  554. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_theme.py +0 -0
  555. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  556. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  557. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  558. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  559. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  560. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  561. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  562. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  563. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  564. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  565. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  566. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  567. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  568. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  569. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  570. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  571. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  572. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  573. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/settings.css +0 -0
  574. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/settings.html +0 -0
  575. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/settings_ui/settings.js +0 -0
  576. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/smoke_test.py +0 -0
  577. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  578. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/strict_bps.py +0 -0
  579. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tool_dispatch.py +0 -0
  580. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/__init__.py +0 -0
  581. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/auto_backup.py +0 -0
  582. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/backup.py +0 -0
  583. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  584. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/best_practice_result.py +0 -0
  585. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  586. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  587. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  588. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/blueprint_write.py +0 -0
  589. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_api.py +0 -0
  590. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_config_entries.py +0 -0
  591. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_config_reads.py +0 -0
  592. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  593. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_devices.py +0 -0
  594. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_registries.py +0 -0
  595. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  596. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  597. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  598. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  599. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  600. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  601. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  602. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  603. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  604. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  605. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/device_control.py +0 -0
  606. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/entity_registration.py +0 -0
  607. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  608. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/hacs_registration.py +0 -0
  609. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/helpers.py +0 -0
  610. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  611. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/log_common.py +0 -0
  612. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/log_sources.py +0 -0
  613. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  614. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  615. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/__init__.py +0 -0
  616. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/base.py +0 -0
  617. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/matter.py +0 -0
  618. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/thread.py +0 -0
  619. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  620. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/radio/zwave.py +0 -0
  621. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/reference_validator.py +0 -0
  622. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/registry.py +0 -0
  623. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  624. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/scene_discovery.py +0 -0
  625. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  626. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  627. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  628. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  629. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  630. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  631. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  632. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  633. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  634. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  635. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_addons.py +0 -0
  636. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_areas.py +0 -0
  637. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  638. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  639. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_calendar.py +0 -0
  640. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_camera.py +0 -0
  641. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_categories.py +0 -0
  642. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_code.py +0 -0
  643. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  644. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  645. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  646. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  647. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  648. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  649. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_dev.py +0 -0
  650. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_energy.py +0 -0
  651. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_entities.py +0 -0
  652. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  653. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_groups.py +0 -0
  654. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_hacs.py +0 -0
  655. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_history.py +0 -0
  656. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_integrations.py +0 -0
  657. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_labels.py +0 -0
  658. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_logs.py +0 -0
  659. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_radio.py +0 -0
  660. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_registry.py +0 -0
  661. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_resources.py +0 -0
  662. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_search.py +0 -0
  663. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  664. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_service.py +0 -0
  665. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_services.py +0 -0
  666. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_system.py +0 -0
  667. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_themes.py +0 -0
  668. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_todo.py +0 -0
  669. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_traces.py +0 -0
  670. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_updates.py +0 -0
  671. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_utility.py +0 -0
  672. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  673. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  674. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  675. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/tools_zones.py +0 -0
  676. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/util_helpers.py +0 -0
  677. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/tools/validation_middleware.py +0 -0
  678. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transforms/__init__.py +0 -0
  679. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transforms/categorized_search.py +0 -0
  680. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transforms/component_search.py +0 -0
  681. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  682. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  683. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/transport_security.py +0 -0
  684. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/update_check.py +0 -0
  685. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/__init__.py +0 -0
  686. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/config_hash.py +0 -0
  687. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/config_write_lock.py +0 -0
  688. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  689. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/data_paths.py +0 -0
  690. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  691. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/domain_handlers.py +0 -0
  692. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/entity_membership.py +0 -0
  693. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  694. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  695. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  696. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/operation_manager.py +0 -0
  697. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/python_sandbox.py +0 -0
  698. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  699. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/skill_loader.py +0 -0
  700. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/utils/usage_logger.py +0 -0
  701. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/visibility/__init__.py +0 -0
  702. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/visibility/enforcement.py +0 -0
  703. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/visibility/model.py +0 -0
  704. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/src/ha_mcp/visibility/persistence.py +0 -0
  705. {ha_mcp_dev-8.6.0.dev2837 → ha_mcp_dev-8.6.0.dev2841}/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.dev2837
3
+ Version: 8.6.0.dev2841
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.dev2837"
7
+ version = "8.6.0.dev2841"
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"
@@ -160,6 +160,7 @@ select = [
160
160
  "PLC0206",
161
161
  "PLC0207",
162
162
  "PLR0402",
163
+ "PLR0915",
163
164
  "PLR1711",
164
165
  "PLR1714",
165
166
  "PLR1730",
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.6.0.dev2837"
7
+ version = "8.6.0.dev2841"
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
@@ -216,6 +216,7 @@ select = [
216
216
  "PLC0206", # dict-index-missing-items
217
217
  "PLC0207", # missing-maxsplit-arg
218
218
  "PLR0402", # manual-from-import
219
+ "PLR0915", # too-many-statements (default limit 50)
219
220
  "PLR1711", # useless-return
220
221
  "PLR1714", # repeated-equality-comparison
221
222
  "PLR1730", # if-stmt-min-max
@@ -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
 
@@ -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,6 +654,33 @@ async def _load_hidden_entities(
654
654
  return visibility_hidden | registry_hidden, warnings
655
655
 
656
656
 
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
+
657
684
  async def resolve_bulk_selector(
658
685
  client: HomeAssistantClient,
659
686
  selector: Mapping[str, Any],
@@ -825,23 +852,9 @@ async def resolve_bulk_selector(
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)
@@ -100,6 +100,15 @@ def _is_no_stored_config(resp: dict[str, Any]) -> bool:
100
100
  return get_error_message(resp) in _NO_STORED_CONFIG_MESSAGES
101
101
 
102
102
 
103
+ async def _phase_finished(
104
+ ctx: Context | None, phase_done: int, total_phases: int, message: str
105
+ ) -> int:
106
+ """Report one more finished search phase and return the new count."""
107
+ phase_done += 1
108
+ await safe_progress(ctx, progress=phase_done, total=total_phases, message=message)
109
+ return phase_done
110
+
111
+
103
112
  class DeepSearchMixin(SceneSearchMixin):
104
113
  """deep_search orchestration + per-type automation/script/helper/dashboard/flow search."""
105
114
 
@@ -224,9 +233,6 @@ class DeepSearchMixin(SceneSearchMixin):
224
233
  # to key reference-graph scene hits by storage id rather than slug.
225
234
  scene_storage_ids: dict[str, str] = {}
226
235
  graph_buckets = related.buckets if related else {}
227
- graph_automations = graph_buckets.get("automations", set())
228
- graph_scripts = graph_buckets.get("scripts", set())
229
- graph_scenes = graph_buckets.get("scenes", set())
230
236
 
231
237
  # Create semaphore for limiting concurrent API calls
232
238
  semaphore = asyncio.Semaphore(concurrency_limit)
@@ -251,18 +257,13 @@ class DeepSearchMixin(SceneSearchMixin):
251
257
  # ``_skipped`` = budget exhausted before fetch; ``_failed`` =
252
258
  # fetch attempted but raised (caught at ``debug``-level);
253
259
  # ``_timeout`` = fetch exceeded the per-request timeout (#1784).
254
- automation_skipped = 0
255
- automation_failed = 0
256
- automation_yaml_skipped = 0
257
- automation_timeout = 0
260
+ automation_skipped = automation_failed = 0
261
+ automation_yaml_skipped = automation_timeout = 0
258
262
  automation_failed_sample: str | None = None
259
- script_skipped = 0
260
- script_failed = 0
261
- script_yaml_skipped = 0
262
- script_timeout = 0
263
+ script_skipped = script_failed = 0
264
+ script_yaml_skipped = script_timeout = 0
263
265
  script_failed_sample: str | None = None
264
- helper_failed = 0
265
- dashboard_failed = 0
266
+ helper_failed = dashboard_failed = 0
266
267
 
267
268
  if "automation" in search_types:
268
269
  (
@@ -278,14 +279,13 @@ class DeepSearchMixin(SceneSearchMixin):
278
279
  query_lower,
279
280
  exact_match,
280
281
  config_time_budget=config_time_budget,
281
- graph_entity_ids=graph_automations,
282
+ graph_entity_ids=graph_buckets.get("automations", set()),
282
283
  )
283
- phase_done += 1
284
- await safe_progress(
284
+ phase_done = await _phase_finished(
285
285
  ctx,
286
- progress=phase_done,
287
- total=total_phases,
288
- message=f"automations searched ({len(results['automations'])} matches)",
286
+ phase_done,
287
+ total_phases,
288
+ f"automations searched ({len(results['automations'])} matches)",
289
289
  )
290
290
 
291
291
  if "script" in search_types:
@@ -301,14 +301,13 @@ class DeepSearchMixin(SceneSearchMixin):
301
301
  query_lower,
302
302
  exact_match,
303
303
  config_time_budget=config_time_budget,
304
- graph_entity_ids=graph_scripts,
304
+ graph_entity_ids=graph_buckets.get("scripts", set()),
305
305
  )
306
- phase_done += 1
307
- await safe_progress(
306
+ phase_done = await _phase_finished(
308
307
  ctx,
309
- progress=phase_done,
310
- total=total_phases,
311
- message=f"scripts searched ({len(results['scripts'])} matches)",
308
+ phase_done,
309
+ total_phases,
310
+ f"scripts searched ({len(results['scripts'])} matches)",
312
311
  )
313
312
 
314
313
  if "scene" in search_types:
@@ -328,14 +327,13 @@ class DeepSearchMixin(SceneSearchMixin):
328
327
  config_time_budget=config_time_budget,
329
328
  prefetched_registry=prefetched_registry,
330
329
  storage_ids_out=scene_storage_ids,
331
- graph_entity_ids=graph_scenes,
330
+ graph_entity_ids=graph_buckets.get("scenes", set()),
332
331
  )
333
- phase_done += 1
334
- await safe_progress(
332
+ phase_done = await _phase_finished(
335
333
  ctx,
336
- progress=phase_done,
337
- total=total_phases,
338
- message=f"scenes searched ({len(results['scenes'])} matches)",
334
+ phase_done,
335
+ total_phases,
336
+ f"scenes searched ({len(results['scenes'])} matches)",
339
337
  )
340
338
 
341
339
  if "helper" in search_types:
@@ -349,12 +347,11 @@ class DeepSearchMixin(SceneSearchMixin):
349
347
  include_config,
350
348
  prefetched_registry=prefetched_registry,
351
349
  )
352
- phase_done += 1
353
- await safe_progress(
350
+ phase_done = await _phase_finished(
354
351
  ctx,
355
- progress=phase_done,
356
- total=total_phases,
357
- message=f"helpers searched ({len(results['helpers'])} matches)",
352
+ phase_done,
353
+ total_phases,
354
+ f"helpers searched ({len(results['helpers'])} matches)",
358
355
  )
359
356
 
360
357
  if "dashboard" in search_types:
@@ -367,12 +364,11 @@ class DeepSearchMixin(SceneSearchMixin):
367
364
  semaphore,
368
365
  include_config=include_config,
369
366
  )
370
- phase_done += 1
371
- await safe_progress(
367
+ await _phase_finished(
372
368
  ctx,
373
- progress=phase_done,
374
- total=total_phases,
375
- message=f"dashboards searched ({len(results['dashboards'])} matches)",
369
+ phase_done,
370
+ total_phases,
371
+ f"dashboards searched ({len(results['dashboards'])} matches)",
376
372
  )
377
373
 
378
374
  graph_surfaces_skipped = _merge_graph_hits(
@@ -1054,6 +1054,33 @@ class BugReportTools:
1054
1054
  "host_os": str(info.get("operating_system") or "unknown"),
1055
1055
  }
1056
1056
 
1057
+ async def _add_home_assistant_info(self, diagnostic_info: dict[str, Any]) -> None:
1058
+ """Fill in connection status, HA config and entity count; never raises."""
1059
+ try:
1060
+ config = await self._client.get_config()
1061
+ diagnostic_info["connection_status"] = "Connected"
1062
+ diagnostic_info["home_assistant_version"] = config.get("version", "Unknown")
1063
+ diagnostic_info["location_name"] = config.get("location_name", "Unknown")
1064
+ diagnostic_info["time_zone"] = config.get("time_zone", "Unknown")
1065
+ # Only a supervised install loads the hassio integration. Probing
1066
+ # without it only produces an "Unknown command" error.
1067
+ if "hassio" in config.get("components", []):
1068
+ diagnostic_info["supervisor"] = await self._detect_supervisor_info()
1069
+ else:
1070
+ diagnostic_info["supervisor"] = {"none": "true"}
1071
+ except Exception as e: # noqa: BLE001
1072
+ logger.warning(f"Failed to get Home Assistant config: {e}")
1073
+ diagnostic_info["connection_status"] = (
1074
+ f"Connection Error: {_sanitize_log_text(str(e))}"
1075
+ )
1076
+
1077
+ try:
1078
+ states = await self._client.get_states()
1079
+ if states:
1080
+ diagnostic_info["entity_count"] = len(states)
1081
+ except Exception as e: # noqa: BLE001
1082
+ logger.warning(f"Failed to get entity count: {e}")
1083
+
1057
1084
  @tool(
1058
1085
  name="ha_report_issue",
1059
1086
  tags={"Utilities"},
@@ -1268,32 +1295,7 @@ class BugReportTools:
1268
1295
  "entity_count": 0,
1269
1296
  }
1270
1297
 
1271
- # Try to get Home Assistant config and connection status
1272
- try:
1273
- config = await self._client.get_config()
1274
- diagnostic_info["connection_status"] = "Connected"
1275
- diagnostic_info["home_assistant_version"] = config.get("version", "Unknown")
1276
- diagnostic_info["location_name"] = config.get("location_name", "Unknown")
1277
- diagnostic_info["time_zone"] = config.get("time_zone", "Unknown")
1278
- # Only a supervised install loads the hassio integration. Probing
1279
- # without it only produces an "Unknown command" error.
1280
- if "hassio" in config.get("components", []):
1281
- diagnostic_info["supervisor"] = await self._detect_supervisor_info()
1282
- else:
1283
- diagnostic_info["supervisor"] = {"none": "true"}
1284
- except Exception as e: # noqa: BLE001
1285
- logger.warning(f"Failed to get Home Assistant config: {e}")
1286
- diagnostic_info["connection_status"] = (
1287
- f"Connection Error: {_sanitize_log_text(str(e))}"
1288
- )
1289
-
1290
- # Try to get entity count
1291
- try:
1292
- states = await self._client.get_states()
1293
- if states:
1294
- diagnostic_info["entity_count"] = len(states)
1295
- except Exception as e: # noqa: BLE001
1296
- logger.warning(f"Failed to get entity count: {e}")
1298
+ await self._add_home_assistant_info(diagnostic_info)
1297
1299
 
1298
1300
  # Calculate how many log entries to retrieve
1299
1301
  # Formula: AVG_LOG_ENTRIES_PER_TOOL * 4 * tool_call_count (doubled from 2x to 4x)
@@ -1365,9 +1367,6 @@ class BugReportTools:
1365
1367
  issue_title, lambda cap: build_body(include_logs=False, text_cap=cap)
1366
1368
  )
1367
1369
 
1368
- # Anonymization instructions
1369
- anonymization_guide = _generate_anonymization_guide()
1370
-
1371
1370
  # Generate search keywords and URLs for duplicate check
1372
1371
  search_keywords = _generate_search_keywords(diagnostic_info, recent_logs)
1373
1372
  duplicate_check_urls = [
@@ -1400,7 +1399,7 @@ class BugReportTools:
1400
1399
  "issue_title": issue_title,
1401
1400
  "issue_body": issue_body,
1402
1401
  "issue_url": issue_url,
1403
- "anonymization_guide": anonymization_guide,
1402
+ "anonymization_guide": _generate_anonymization_guide(),
1404
1403
  "duplicate_check_urls": duplicate_check_urls,
1405
1404
  "missing_tool_hint": MISSING_TOOL_HINT,
1406
1405
  "known_client_issues_hint": KNOWN_CLIENT_ISSUES_HINT,