ha-mcp-dev 8.5.0.dev2674__tar.gz → 8.5.0.dev2678__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 (728) hide show
  1. {ha_mcp_dev-8.5.0.dev2674/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.5.0.dev2678}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/backup_manager.py +53 -38
  4. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_areas.py +234 -24
  5. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_helpers.py +17 -8
  6. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_entities.py +64 -67
  7. ha_mcp_dev-8.5.0.dev2678/src/ha_mcp/tools/tools_labels.py +894 -0
  8. ha_mcp_dev-8.5.0.dev2678/src/ha_mcp/utils/registry_update_lock.py +23 -0
  9. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  10. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  11. ha_mcp_dev-8.5.0.dev2674/src/ha_mcp/tools/tools_labels.py +0 -455
  12. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/LICENSE +0 -0
  13. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/MANIFEST.in +0 -0
  14. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/README.md +0 -0
  15. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/setup.cfg +0 -0
  16. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/__init__.py +0 -0
  17. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/__main__.py +0 -0
  18. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_pypi_marker +0 -0
  19. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_rich_compat.py +0 -0
  20. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/__init__.py +0 -0
  21. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  22. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  23. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  24. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  25. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  26. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  27. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  28. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  29. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  30. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  31. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  32. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  33. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  34. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  35. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  36. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  37. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  38. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  39. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  40. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  41. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  42. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  43. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  44. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  45. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  46. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  47. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  48. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  49. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  50. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  51. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  52. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  53. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  54. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  55. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  56. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  57. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  58. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  59. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  60. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  61. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  62. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  63. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  64. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  65. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  66. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  67. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  68. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  69. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  70. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  71. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  72. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  73. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  74. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  75. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  76. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  77. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  78. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  79. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  80. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  81. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  82. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  83. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  84. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  85. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  86. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  87. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  88. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  89. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  90. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  91. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  92. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  93. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  94. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  95. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  96. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  97. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  98. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  99. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  100. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  101. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  102. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  103. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  104. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  105. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  106. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  107. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  108. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  109. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  110. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  111. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  112. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  113. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  114. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  115. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  116. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  117. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  118. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  119. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  120. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  121. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  122. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  123. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  124. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  125. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  126. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  127. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  128. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  129. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  130. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  131. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  132. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  133. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  134. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  135. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  136. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  137. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  138. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  139. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  140. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  141. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  142. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  143. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  144. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  145. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  146. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  147. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  148. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  149. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  150. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  151. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  152. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  153. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  154. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  155. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  156. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  157. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  158. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  159. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  160. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  161. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  162. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  163. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  164. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  165. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  166. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  167. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  168. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  169. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  170. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  171. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  172. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  173. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  174. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  175. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  176. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  177. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  178. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  179. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  180. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  181. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  182. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  183. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  184. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  185. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  186. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  187. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  188. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  189. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  190. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  191. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  192. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  193. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  194. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  195. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  196. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  197. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  198. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  199. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  200. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  201. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  202. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  203. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  204. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  205. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  206. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  207. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  208. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  209. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  210. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  211. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  212. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  213. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  214. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  215. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  216. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  217. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  218. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  219. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  220. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  221. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  222. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  223. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  224. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  225. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  226. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  227. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  228. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  229. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  230. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  231. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  232. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  233. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  234. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  235. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  236. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  237. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  238. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  239. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  240. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  241. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  242. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  243. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  244. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  245. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  246. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  247. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  248. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  249. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  250. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  251. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  252. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  253. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  254. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  255. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  256. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  257. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  258. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  259. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  260. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  261. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  262. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  263. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  264. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  265. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  266. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  267. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  268. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  269. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  270. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  271. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  272. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  273. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  274. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  275. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  276. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  277. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  278. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  279. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  280. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  281. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  282. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  283. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  284. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  285. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  286. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  287. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  288. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  289. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  290. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  291. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  292. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  293. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  294. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  295. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  296. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  297. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  298. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  299. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  300. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  301. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  302. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  303. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  304. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  305. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  306. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  307. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  308. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  309. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  310. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  311. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  312. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  313. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  314. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  315. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  316. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  317. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  318. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  319. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  320. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  321. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  322. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  323. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  324. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  325. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  326. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  327. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  328. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  329. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  330. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  331. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  332. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  333. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  334. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  335. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  336. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  337. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  338. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  339. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  340. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  341. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  342. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  343. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  344. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  345. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  346. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  347. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  348. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  349. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  350. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  351. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  352. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  353. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  354. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  355. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  356. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  357. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  358. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  359. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  360. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  361. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  362. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  363. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  364. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  365. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  366. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  367. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  368. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  369. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  370. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  371. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  372. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  373. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  374. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  375. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  376. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  377. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  378. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  379. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  380. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  381. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  382. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  383. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  384. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  385. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  386. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  387. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  388. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  389. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  390. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  391. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  392. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  393. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  394. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  395. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  396. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  397. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  398. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  399. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  400. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  401. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  402. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  403. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  404. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  405. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  406. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  407. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  408. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  409. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  410. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  411. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  412. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  413. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  414. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  415. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  416. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  417. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  418. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  419. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  420. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  421. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  422. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  423. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  424. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  425. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  426. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  427. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  428. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  429. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  430. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  431. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/requirements.txt +0 -0
  432. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  433. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  434. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  435. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  436. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  437. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  438. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  439. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  440. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  441. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  442. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  443. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  444. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  445. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  446. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  447. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  448. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  449. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  450. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  451. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  452. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  453. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  454. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  455. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  456. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  457. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  458. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  459. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  460. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  461. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  462. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  463. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  464. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  465. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  466. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  467. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  468. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  469. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  470. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  471. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  472. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  473. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  474. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  475. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  476. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  477. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  478. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  479. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  480. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  481. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  482. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  483. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  484. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  485. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  486. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  487. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  488. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_version.py +0 -0
  489. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/__init__.py +0 -0
  490. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/consent_form.py +0 -0
  491. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/oidc_compat.py +0 -0
  492. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/provider.py +0 -0
  493. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/browser_landing.py +0 -0
  494. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/__init__.py +0 -0
  495. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/rest_client.py +0 -0
  496. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/supervisor_client.py +0 -0
  497. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/websocket_client.py +0 -0
  498. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/websocket_listener.py +0 -0
  499. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/config.py +0 -0
  500. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  501. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  502. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  503. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  504. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  505. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  506. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/errors.py +0 -0
  507. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/ha_request_queue.py +0 -0
  508. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  509. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/http_transport.py +0 -0
  510. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/llm_exposure.py +0 -0
  511. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/log_filters.py +0 -0
  512. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/__init__.py +0 -0
  513. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/approval_queue.py +0 -0
  514. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/editing.py +0 -0
  515. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/evaluator.py +0 -0
  516. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/handlers.py +0 -0
  517. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/middleware.py +0 -0
  518. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/model.py +0 -0
  519. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/persistence.py +0 -0
  520. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/value_sources.py +0 -0
  521. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/py.typed +0 -0
  522. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/read_only.py +0 -0
  523. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/redaction.py +0 -0
  524. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/renamed_tools.py +0 -0
  525. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  526. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  527. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  528. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  529. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  530. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  531. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  532. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  533. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  534. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  535. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  536. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  537. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  538. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  539. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  540. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  541. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  542. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  543. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  544. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  545. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  546. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  547. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  548. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  549. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  550. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  551. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  552. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  553. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  554. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  555. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  556. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  557. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  558. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  559. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  560. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  561. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  562. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  563. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  564. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  565. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  566. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/server.py +0 -0
  567. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/__init__.py +0 -0
  568. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  569. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  570. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  571. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  572. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  573. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  574. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  575. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  576. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  577. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  578. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_theme.py +0 -0
  579. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  580. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  581. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  582. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  583. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  584. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  585. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  586. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  587. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  588. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  589. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  590. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  591. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  592. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  593. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  594. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  595. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  596. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.css +0 -0
  597. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.html +0 -0
  598. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.js +0 -0
  599. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/smoke_test.py +0 -0
  600. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  601. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/strict_bps.py +0 -0
  602. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tool_dispatch.py +0 -0
  603. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/__init__.py +0 -0
  604. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/auto_backup.py +0 -0
  605. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/backup.py +0 -0
  606. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  607. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_result.py +0 -0
  608. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  609. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  610. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  611. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_write.py +0 -0
  612. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/bulk_selector.py +0 -0
  613. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_api.py +0 -0
  614. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_config_entries.py +0 -0
  615. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_config_reads.py +0 -0
  616. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  617. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_devices.py +0 -0
  618. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_registries.py +0 -0
  619. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  620. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  621. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  622. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  623. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  624. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  625. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  626. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  627. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  628. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/device_control.py +0 -0
  629. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/entity_registration.py +0 -0
  630. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  631. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/hacs_registration.py +0 -0
  632. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/helpers.py +0 -0
  633. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  634. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_common.py +0 -0
  635. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources.py +0 -0
  636. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  637. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  638. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/__init__.py +0 -0
  639. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/base.py +0 -0
  640. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/matter.py +0 -0
  641. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/thread.py +0 -0
  642. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  643. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/zwave.py +0 -0
  644. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/reference_validator.py +0 -0
  645. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/registry.py +0 -0
  646. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  647. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  648. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  649. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  650. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  651. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  652. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  653. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  654. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  655. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  656. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  657. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  658. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_addons.py +0 -0
  659. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  660. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  661. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  662. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_calendar.py +0 -0
  663. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_camera.py +0 -0
  664. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_categories.py +0 -0
  665. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_code.py +0 -0
  666. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  667. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  668. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  669. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  670. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  671. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_dev.py +0 -0
  672. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_energy.py +0 -0
  673. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  674. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_groups.py +0 -0
  675. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_hacs.py +0 -0
  676. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_history.py +0 -0
  677. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_integrations.py +0 -0
  678. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_logs.py +0 -0
  679. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_radio.py +0 -0
  680. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_registry.py +0 -0
  681. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_resources.py +0 -0
  682. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_search.py +0 -0
  683. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  684. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_service.py +0 -0
  685. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_services.py +0 -0
  686. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_system.py +0 -0
  687. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_themes.py +0 -0
  688. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_todo.py +0 -0
  689. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_traces.py +0 -0
  690. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_updates.py +0 -0
  691. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_utility.py +0 -0
  692. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  693. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  694. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  695. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_zones.py +0 -0
  696. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/util_helpers.py +0 -0
  697. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/validation_middleware.py +0 -0
  698. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/__init__.py +0 -0
  699. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/categorized_search.py +0 -0
  700. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  701. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transport_security.py +0 -0
  702. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/update_check.py +0 -0
  703. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/__init__.py +0 -0
  704. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/config_hash.py +0 -0
  705. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/config_write_lock.py +0 -0
  706. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  707. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/data_paths.py +0 -0
  708. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  709. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/domain_handlers.py +0 -0
  710. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/entity_membership.py +0 -0
  711. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  712. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  713. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/operation_manager.py +0 -0
  714. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/python_sandbox.py +0 -0
  715. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/skill_loader.py +0 -0
  716. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/usage_logger.py +0 -0
  717. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/__init__.py +0 -0
  718. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/enforcement.py +0 -0
  719. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/model.py +0 -0
  720. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/persistence.py +0 -0
  721. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/resolver.py +0 -0
  722. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  723. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  724. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  725. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  726. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/tests/__init__.py +0 -0
  727. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/tests/test_constants.py +0 -0
  728. {ha_mcp_dev-8.5.0.dev2674 → ha_mcp_dev-8.5.0.dev2678}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.5.0.dev2674
3
+ Version: 8.5.0.dev2678
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.5.0.dev2674"
7
+ version = "8.5.0.dev2678"
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
@@ -54,7 +54,7 @@ import time
54
54
  import weakref
55
55
  from collections import Counter
56
56
  from collections.abc import AsyncIterator, Awaitable, Callable
57
- from contextlib import asynccontextmanager, suppress
57
+ from contextlib import AsyncExitStack, asynccontextmanager, suppress
58
58
  from dataclasses import dataclass, field
59
59
  from datetime import UTC, datetime
60
60
  from functools import cached_property
@@ -67,6 +67,7 @@ from ha_mcp._vendor.fastmcp.exceptions import ToolError
67
67
 
68
68
  from .client.rest_client import HomeAssistantConnectionError, HomeAssistantError
69
69
  from .utils.data_paths import get_data_dir
70
+ from .utils.registry_update_lock import registry_update_lock
70
71
 
71
72
  logger = logging.getLogger(__name__)
72
73
 
@@ -2592,7 +2593,8 @@ async def _restore_area_or_floor(client: Any, entity_id: str, config: Any) -> An
2592
2593
  payload["floor_id"] = real_id
2593
2594
  else:
2594
2595
  raise ValueError(f"Unknown area/floor kind: {kind!r}")
2595
- return await _ws_send(client, payload)
2596
+ async with registry_update_lock(kind, real_id):
2597
+ return await _ws_send(client, payload)
2596
2598
 
2597
2599
 
2598
2600
  # Todo items — entity_id is "<todo.entity>::<item_uid>"
@@ -3538,43 +3540,56 @@ async def _restore_template_entity_id(
3538
3540
  """Restore only the newly created entity's ID/name, guarded by ownership."""
3539
3541
  row = await _created_template_entity(client, entry_id)
3540
3542
  source, target = row["entity_id"], saved["entity_id"]
3541
- if source.split(".")[0] != target.split(".")[0]:
3542
- raise BackupRestoreError(
3543
- "Recreated Template entity has an unexpected domain",
3544
- reason="entity_identity_mismatch",
3545
- verification_status="mismatched",
3546
- )
3547
- await _check_template_entity_collision(client, target, owned_entry_id=entry_id)
3548
- update: dict[str, Any] = {
3549
- "type": "config/entity_registry/update",
3550
- "entity_id": source,
3551
- }
3552
- if source != target:
3553
- update["new_entity_id"] = target
3554
- if row.get("name") != saved.get("name"):
3555
- update["name"] = saved.get("name")
3556
- if len(update) > 2:
3557
- try:
3558
- await _ws_send(client, update)
3559
- except _CAPTURE_TRANSIENT_ERRORS as err:
3560
- _log_template_failure("entity_rename", err)
3543
+ locked_ids = {source, target}
3544
+ async with AsyncExitStack() as locks:
3545
+ # A rename changes the lock key; hold both IDs in a stable order.
3546
+ for entity_id in sorted(locked_ids):
3547
+ await locks.enter_async_context(registry_update_lock("entity", entity_id))
3548
+ row = await _created_template_entity(client, entry_id)
3549
+ source = row["entity_id"]
3550
+ if source not in locked_ids:
3561
3551
  raise BackupRestoreError(
3562
- "The recreated helper's entity rename outcome is unknown",
3563
- reason="entity_rename_outcome_unknown",
3564
- entity_id_mapping={
3565
- "created_entity_id": source,
3566
- "target_entity_id": target,
3567
- },
3568
- verification_status="unavailable",
3569
- ) from err
3570
- actual = await _created_template_entity(client, entry_id)
3571
- if actual["entity_id"] != target or actual.get("name") != saved.get("name"):
3572
- raise BackupRestoreError(
3573
- "Recreated Template entity identity did not match",
3574
- reason="entity_identity_mismatch",
3575
- verification_status="mismatched",
3576
- )
3577
- return {"created_entity_id": source, "restored_entity_id": target}
3552
+ "Recreated Template entity ID changed while waiting to restore it",
3553
+ reason="entity_identity_mismatch",
3554
+ verification_status="mismatched",
3555
+ )
3556
+ if source.split(".")[0] != target.split(".")[0]:
3557
+ raise BackupRestoreError(
3558
+ "Recreated Template entity has an unexpected domain",
3559
+ reason="entity_identity_mismatch",
3560
+ verification_status="mismatched",
3561
+ )
3562
+ await _check_template_entity_collision(client, target, owned_entry_id=entry_id)
3563
+ update: dict[str, Any] = {
3564
+ "type": "config/entity_registry/update",
3565
+ "entity_id": source,
3566
+ }
3567
+ if source != target:
3568
+ update["new_entity_id"] = target
3569
+ if row.get("name") != saved.get("name"):
3570
+ update["name"] = saved.get("name")
3571
+ if len(update) > 2:
3572
+ try:
3573
+ await _ws_send(client, update)
3574
+ except _CAPTURE_TRANSIENT_ERRORS as err:
3575
+ _log_template_failure("entity_rename", err)
3576
+ raise BackupRestoreError(
3577
+ "The recreated helper's entity rename outcome is unknown",
3578
+ reason="entity_rename_outcome_unknown",
3579
+ entity_id_mapping={
3580
+ "created_entity_id": source,
3581
+ "target_entity_id": target,
3582
+ },
3583
+ verification_status="unavailable",
3584
+ ) from err
3585
+ actual = await _created_template_entity(client, entry_id)
3586
+ if actual["entity_id"] != target or actual.get("name") != saved.get("name"):
3587
+ raise BackupRestoreError(
3588
+ "Recreated Template entity identity did not match",
3589
+ reason="entity_identity_mismatch",
3590
+ verification_status="mismatched",
3591
+ )
3592
+ return {"created_entity_id": source, "restored_entity_id": target}
3578
3593
 
3579
3594
 
3580
3595
  async def _recreate_template_helper(
@@ -7,6 +7,7 @@ Home Assistant areas and floors - essential organizational features for smart ho
7
7
 
8
8
  import asyncio
9
9
  import logging
10
+ from contextlib import nullcontext
10
11
  from typing import Annotated, Any, Literal
11
12
 
12
13
  from pydantic import Field
@@ -15,6 +16,7 @@ from ha_mcp._vendor.fastmcp.exceptions import ToolError
15
16
  from ha_mcp._vendor.fastmcp.tools import tool
16
17
 
17
18
  from ..errors import ErrorCode, create_error_response, create_validation_error
19
+ from ..utils.registry_update_lock import registry_update_lock
18
20
  from .auto_backup import with_auto_backup
19
21
  from .component_registries import fetch_registries_via_component
20
22
  from .helpers import (
@@ -36,6 +38,13 @@ from .util_helpers import (
36
38
  logger = logging.getLogger(__name__)
37
39
 
38
40
 
41
+ def _label_id_set(entry: dict[str, Any] | None) -> set[str]:
42
+ """String label IDs stored on an area registry entry."""
43
+ if not isinstance(entry, dict):
44
+ return set()
45
+ return {lbl for lbl in (entry.get("labels") or []) if isinstance(lbl, str)}
46
+
47
+
39
48
  def _parse_projection_params(
40
49
  fields: str | list[str] | None,
41
50
  area_fields: str | list[str] | None,
@@ -119,11 +128,12 @@ def _validate_cross_kind_params(
119
128
  level: int | None,
120
129
  floor_id: str | None,
121
130
  picture: str | None,
131
+ labels: list[str] | None = None,
122
132
  ) -> None:
123
133
  """Reject params that don't belong to *kind* before building a set message."""
124
134
  # Reject cross-kind params loudly so silent intent loss can't happen
125
135
  # (e.g., kind='floor' with picture='...' previously dropped the picture
126
- # without a diagnostic).
136
+ # without a diagnostic). Floors have no labels in HA core.
127
137
  cross_kind_params: list[str] = []
128
138
  if kind == "area" and level is not None:
129
139
  cross_kind_params.append("level")
@@ -132,6 +142,8 @@ def _validate_cross_kind_params(
132
142
  cross_kind_params.append("floor_id")
133
143
  if picture is not None:
134
144
  cross_kind_params.append("picture")
145
+ if labels is not None:
146
+ cross_kind_params.append("labels")
135
147
  if cross_kind_params:
136
148
  raise_tool_error(
137
149
  create_error_response(
@@ -139,7 +151,7 @@ def _validate_cross_kind_params(
139
151
  f"Parameter(s) {cross_kind_params} are not valid for kind={kind!r}",
140
152
  context={"kind": kind, "invalid_parameters": cross_kind_params},
141
153
  suggestions=[
142
- "For kind='area' use: name, id, floor_id, icon, aliases, picture",
154
+ "For kind='area' use: name, id, floor_id, icon, aliases, picture, labels",
143
155
  "For kind='floor' use: name, id, level, icon, aliases",
144
156
  ],
145
157
  )
@@ -160,6 +172,7 @@ class AreaTools:
160
172
  icon: str | None,
161
173
  parsed_aliases: list[str] | None,
162
174
  picture: str | None,
175
+ parsed_labels: list[str] | None,
163
176
  ) -> dict[str, Any]:
164
177
  """Build a WebSocket message for updating an existing area."""
165
178
  message: dict[str, Any] = {
@@ -176,6 +189,8 @@ class AreaTools:
176
189
  message["aliases"] = parsed_aliases
177
190
  if picture is not None:
178
191
  message["picture"] = picture if picture else None
192
+ if parsed_labels is not None:
193
+ message["labels"] = parsed_labels
179
194
  return message
180
195
 
181
196
  @staticmethod
@@ -185,6 +200,7 @@ class AreaTools:
185
200
  icon: str | None,
186
201
  parsed_aliases: list[str] | None,
187
202
  picture: str | None,
203
+ parsed_labels: list[str] | None,
188
204
  ) -> dict[str, Any]:
189
205
  """Build a WebSocket message for creating a new area."""
190
206
  message: dict[str, Any] = {
@@ -199,6 +215,8 @@ class AreaTools:
199
215
  message["aliases"] = parsed_aliases
200
216
  if picture:
201
217
  message["picture"] = picture
218
+ if parsed_labels:
219
+ message["labels"] = parsed_labels
202
220
  return message
203
221
 
204
222
  @staticmethod
@@ -476,6 +494,7 @@ class AreaTools:
476
494
  icon: str | None,
477
495
  parsed_aliases: list[str] | None,
478
496
  picture: str | None,
497
+ parsed_labels: list[str] | None,
479
498
  ) -> tuple[dict[str, Any], str, str, str, str | None]:
480
499
  """Build the WS message plus (result_key, id_key, operation, name) for a set.
481
500
 
@@ -491,6 +510,7 @@ class AreaTools:
491
510
  icon,
492
511
  parsed_aliases,
493
512
  picture,
513
+ parsed_labels,
494
514
  )
495
515
  operation = "update"
496
516
  else:
@@ -509,6 +529,7 @@ class AreaTools:
509
529
  icon,
510
530
  parsed_aliases,
511
531
  picture,
532
+ parsed_labels,
512
533
  )
513
534
  operation = "create"
514
535
  result_key = "area"
@@ -542,6 +563,157 @@ class AreaTools:
542
563
  id_key = "floor_id"
543
564
  return message, result_key, id_key, operation, name
544
565
 
566
+ @staticmethod
567
+ def _label_verify_context(
568
+ *,
569
+ parsed_labels: list[str],
570
+ kind: str,
571
+ returned_id: str | None,
572
+ operation: str,
573
+ name: str | None,
574
+ write_committed: bool = False,
575
+ ) -> dict[str, Any]:
576
+ """Error context shared by both label-verification failure paths."""
577
+ ctx: dict[str, Any] = {
578
+ "operation": operation,
579
+ "kind": kind,
580
+ "area_id": returned_id,
581
+ "expected_labels": parsed_labels,
582
+ }
583
+ if write_committed:
584
+ ctx["write_committed"] = True
585
+ if name:
586
+ ctx["name"] = name
587
+ return ctx
588
+
589
+ async def _verify_area_labels_written(
590
+ self,
591
+ *,
592
+ parsed_labels: list[str] | None,
593
+ kind: str,
594
+ data: dict[str, Any],
595
+ returned_id: str | None,
596
+ operation: str,
597
+ name: str | None,
598
+ ) -> None:
599
+ """Confirm HA stored the requested label set, not just a success ack.
600
+
601
+ Home Assistant answers an area create/update with ``success`` even when
602
+ it dropped label IDs it did not recognise, so the ack alone is not
603
+ evidence the set was applied. The response entry is checked first; the
604
+ registry is re-read only when that entry disagrees, which also covers
605
+ an ack that carries no labels at all.
606
+
607
+ Both failure paths report ``write_committed: True``: the area write
608
+ itself has already landed by the time this runs, so a caller that
609
+ retries a create would end up with a duplicate area. Only the labels
610
+ are still open, and those are fixed with ha_set_area_or_floor.
611
+ """
612
+ if kind != "area" or parsed_labels is None:
613
+ return
614
+ expected = set(parsed_labels)
615
+ if _label_id_set(data) == expected:
616
+ return
617
+ try:
618
+ listed = await self._client.send_websocket_message(
619
+ {"type": "config/area_registry/list"}
620
+ )
621
+ except Exception as exc:
622
+ # Write already succeeded; a transport failure on re-read must
623
+ # not look like a failed create (retry would duplicate the area).
624
+ raise_tool_error(
625
+ create_error_response(
626
+ ErrorCode.SERVICE_CALL_FAILED,
627
+ "Area write succeeded, but label verification failed",
628
+ details=str(exc),
629
+ context=self._label_verify_context(
630
+ parsed_labels=parsed_labels,
631
+ kind=kind,
632
+ returned_id=returned_id,
633
+ operation=operation,
634
+ name=name,
635
+ write_committed=True,
636
+ ),
637
+ suggestions=[
638
+ "The area write already committed; do not retry create.",
639
+ "Re-read with ha_list_floors_areas() before retrying labels.",
640
+ ],
641
+ )
642
+ )
643
+ rows = listed.get("result") if listed.get("success") else None
644
+ found: dict[str, Any] | None = None
645
+ if isinstance(rows, list):
646
+ found = next(
647
+ (
648
+ a
649
+ for a in rows
650
+ if isinstance(a, dict) and a.get("area_id") == returned_id
651
+ ),
652
+ None,
653
+ )
654
+ if found is not None and _label_id_set(found) == expected:
655
+ return
656
+ raise_tool_error(
657
+ create_error_response(
658
+ ErrorCode.SERVICE_CALL_FAILED,
659
+ "Area write succeeded but the returned entry does not contain "
660
+ "the requested labels",
661
+ context=self._label_verify_context(
662
+ parsed_labels=parsed_labels,
663
+ kind=kind,
664
+ returned_id=returned_id,
665
+ operation=operation,
666
+ name=name,
667
+ write_committed=True,
668
+ ),
669
+ suggestions=[
670
+ "The area write already committed; do not retry create.",
671
+ (
672
+ "Apply the labels on their own with ha_set_area_or_floor("
673
+ + f"kind='area', id={returned_id!r}, "
674
+ + f"labels={parsed_labels!r})."
675
+ ),
676
+ (
677
+ "Verify the label IDs exist with ha_config_get_label() "
678
+ + "— Home Assistant drops unknown ones silently."
679
+ ),
680
+ ],
681
+ )
682
+ )
683
+
684
+ async def _area_or_floor_write_success(
685
+ self,
686
+ result: dict[str, Any],
687
+ *,
688
+ result_key: str,
689
+ id_key: str,
690
+ identifier: str | None,
691
+ kind: str,
692
+ operation: str,
693
+ name: str | None,
694
+ parsed_labels: list[str] | None,
695
+ ) -> dict[str, Any]:
696
+ data = result.get("result", {})
697
+ if not isinstance(data, dict):
698
+ data = {}
699
+ returned_id = data.get(id_key, identifier)
700
+ await self._verify_area_labels_written(
701
+ parsed_labels=parsed_labels,
702
+ kind=kind,
703
+ data=data,
704
+ returned_id=returned_id if isinstance(returned_id, str) else identifier,
705
+ operation=operation,
706
+ name=name,
707
+ )
708
+ display_name = name or data.get("name", returned_id)
709
+ return {
710
+ "success": True,
711
+ result_key: data,
712
+ id_key: returned_id,
713
+ "kind": kind,
714
+ "message": f"Successfully {operation}d {kind}: {display_name}",
715
+ }
716
+
545
717
  # ============================================================
546
718
  # COMBINED SET / REMOVE
547
719
  # ============================================================
@@ -623,16 +795,29 @@ class AreaTools:
623
795
  default=None,
624
796
  ),
625
797
  ] = None,
798
+ labels: Annotated[
799
+ str | list[str] | None,
800
+ JSON_STRING_COERCION,
801
+ Field(
802
+ description=(
803
+ "Label IDs when kind='area' (replaces the area's label set; "
804
+ "empty list to clear). Omit to leave labels unchanged. "
805
+ "Only valid when kind='area' — floors have no labels."
806
+ ),
807
+ default=None,
808
+ ),
809
+ ] = None,
626
810
  ) -> dict[str, Any]:
627
811
  """Create or update a Home Assistant area or floor.
628
812
 
629
- Pass kind='area' (with optional floor_id, picture) or kind='floor' (with optional level).
813
+ Pass kind='area' (with optional floor_id, picture, labels) or kind='floor' (with optional level).
630
814
  Provide name only to create a new entry; provide id to update an existing one.
631
- Cross-kind parameters (e.g., picture under kind='floor') are rejected with VALIDATION_INVALID_PARAMETER.
815
+ Cross-kind parameters (e.g., picture or labels under kind='floor') are rejected with VALIDATION_INVALID_PARAMETER.
632
816
 
633
817
  EXAMPLES:
634
818
  ha_set_area_or_floor(kind="area", name="Kitchen")
635
819
  ha_set_area_or_floor(kind="area", id="kitchen", floor_id="ground_floor")
820
+ ha_set_area_or_floor(kind="area", id="kitchen", labels=["site_home"])
636
821
  ha_set_area_or_floor(kind="floor", name="Basement", level=-1)
637
822
  ha_set_area_or_floor(kind="floor", id="ground_floor", level=0)
638
823
  """
@@ -648,7 +833,17 @@ class AreaTools:
648
833
  )
649
834
  )
650
835
 
651
- _validate_cross_kind_params(kind, level, floor_id, picture)
836
+ try:
837
+ parsed_labels = parse_string_list_param(labels, "labels")
838
+ except ValueError as e:
839
+ raise_tool_error(
840
+ create_error_response(
841
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
842
+ f"Invalid labels parameter: {e}",
843
+ )
844
+ )
845
+
846
+ _validate_cross_kind_params(kind, level, floor_id, picture, parsed_labels)
652
847
 
653
848
  # ``None`` stays the documented "create-new" sentinel; explicit
654
849
  # empty/whitespace would silently route to the ``if id:`` create
@@ -674,30 +869,42 @@ class AreaTools:
674
869
  icon,
675
870
  parsed_aliases,
676
871
  picture,
872
+ parsed_labels,
677
873
  )
678
874
  )
679
875
 
680
- # Issue #2159: the area registry stores an unknown floor_id
681
- # verbatim, orphaning the area. ``_validate_cross_kind_params``
682
- # already rejected floor_id for kind='floor', so this only ever
683
- # runs for areas; None and "" (clear) skip the lookup.
684
- await validate_registry_ids(
685
- self._client, None, None, None, floor_id=floor_id, fail_closed=True
686
- )
876
+ async with (
877
+ registry_update_lock(kind, id) if id is not None else nullcontext()
878
+ ):
879
+ # Issue #2159: the area registry stores an unknown floor_id
880
+ # verbatim, and an unknown label_id is dropped on the way in
881
+ # (HA filters the set through the label registry) — both end as a
882
+ # success envelope that does not match what was asked for, so
883
+ # validate before writing. ``_validate_cross_kind_params`` already
884
+ # rejected floor_id/labels for kind='floor', so this only ever
885
+ # runs for areas; None and "" / [] (clear) skip the lookup.
886
+ await validate_registry_ids(
887
+ self._client,
888
+ None,
889
+ parsed_labels,
890
+ None,
891
+ floor_id=floor_id,
892
+ fail_closed=True,
893
+ )
687
894
 
688
- result = await self._client.send_websocket_message(message)
895
+ result = await self._client.send_websocket_message(message)
689
896
 
690
- if result.get("success"):
691
- data = result.get("result", {})
692
- returned_id = data.get(id_key, id)
693
- display_name = name or data.get("name", returned_id)
694
- return {
695
- "success": True,
696
- result_key: data,
697
- id_key: returned_id,
698
- "kind": kind,
699
- "message": f"Successfully {operation}d {kind}: {display_name}",
700
- }
897
+ if result.get("success"):
898
+ return await self._area_or_floor_write_success(
899
+ result,
900
+ result_key=result_key,
901
+ id_key=id_key,
902
+ identifier=id,
903
+ kind=kind,
904
+ operation=operation,
905
+ name=name,
906
+ parsed_labels=parsed_labels,
907
+ )
701
908
 
702
909
  error = result.get("error", {})
703
910
  error_msg = (
@@ -729,6 +936,9 @@ class AreaTools:
729
936
  ]
730
937
  if kind == "area":
731
938
  suggestions.append("If assigning to a floor, verify floor_id exists")
939
+ suggestions.append(
940
+ "If assigning labels, verify label IDs with ha_config_get_label()"
941
+ )
732
942
  exception_to_structured_error(
733
943
  e,
734
944
  context={"operation": operation, "kind": kind, "name": name, "id": id},
@@ -27,6 +27,7 @@ from ..client.websocket_client import get_websocket_client
27
27
  from ..errors import ErrorCode, create_auth_error, create_error_response
28
28
  from ..redaction import redact_flow_schema, redaction_enabled
29
29
  from ..strict_bps import BestPracticeKeyParam
30
+ from ..utils.registry_update_lock import registry_update_lock
30
31
  from .auto_backup import with_auto_backup
31
32
  from .component_api import (
32
33
  component_supports,
@@ -1454,10 +1455,14 @@ async def validate_registry_ids(
1454
1455
  """Validate that registry references point at entries that actually exist.
1455
1456
 
1456
1457
  Bug 16 (issue #1150) / issue #2159: HA's registry-update APIs accept any
1457
- string for a cross-registry reference and store it verbatim, so a typo or a
1458
- since-deleted ID becomes a dangling reference the write tool still reports
1459
- as a success. Validate before sending so the caller gets a clear error with
1460
- the available IDs to choose from.
1458
+ string for a cross-registry reference and answer with a success envelope
1459
+ either way, so without this check a typo or a since-deleted ID passes as a
1460
+ completed write. What happens to the bad value differs per reference:
1461
+ area_id / floor_id / category are stored verbatim and become a dangling
1462
+ reference, while an unknown label_id is dropped (the area registry filters
1463
+ the requested set through the label registry), leaving the caller with a
1464
+ success it cannot distinguish from an applied one. Validate before sending
1465
+ so the caller gets a clear error with the available IDs to choose from.
1461
1466
 
1462
1467
  ``categories`` maps a category SCOPE ("helpers", "automation", "script",
1463
1468
  "scene") to the category_id being assigned in that scope; each distinct
@@ -1822,7 +1827,8 @@ async def _entity_registry_update_coro(
1822
1827
  update_message["labels"] = labels
1823
1828
  if icon is not None:
1824
1829
  update_message["icon"] = icon if icon else None
1825
- return await client.send_websocket_message(update_message)
1830
+ async with registry_update_lock("entity", entity_id):
1831
+ return await client.send_websocket_message(update_message)
1826
1832
 
1827
1833
 
1828
1834
  async def _category_apply_coro(
@@ -2633,7 +2639,8 @@ async def _apply_create_entity_registry(
2633
2639
  update_message["area_id"] = area_id if area_id else None
2634
2640
  if labels is not None:
2635
2641
  update_message["labels"] = labels
2636
- update_result = await client.send_websocket_message(update_message)
2642
+ async with registry_update_lock("entity", entity_id):
2643
+ update_result = await client.send_websocket_message(update_message)
2637
2644
  if update_result.get("success"):
2638
2645
  if icon is not None:
2639
2646
  helper_data["icon"] = icon if icon else None
@@ -3265,7 +3272,8 @@ async def _apply_update_icon_area_labels(
3265
3272
  registry_update["area_id"] = area_id if area_id else None
3266
3273
  if labels is not None:
3267
3274
  registry_update["labels"] = labels
3268
- reg_result = await client.send_websocket_message(registry_update)
3275
+ async with registry_update_lock("entity", entity_id):
3276
+ reg_result = await client.send_websocket_message(registry_update)
3269
3277
  if reg_result.get("success"):
3270
3278
  if icon is not None:
3271
3279
  updated_data["icon"] = icon if icon else None
@@ -3329,7 +3337,8 @@ async def _execute_fallback_registry_update(
3329
3337
  fallback_msg["area_id"] = area_id if area_id else None
3330
3338
  if labels is not None:
3331
3339
  fallback_msg["labels"] = labels
3332
- result = await client.send_websocket_message(fallback_msg)
3340
+ async with registry_update_lock("entity", entity_id):
3341
+ result = await client.send_websocket_message(fallback_msg)
3333
3342
  updated_data: dict[str, Any] = {}
3334
3343
  if result.get("success"):
3335
3344
  updated_data = result.get("result", {}).get("entity_entry", {})