ha-mcp-dev 8.5.0.dev2675__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 (727) hide show
  1. {ha_mcp_dev-8.5.0.dev2675/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.5.0.dev2678}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/backup_manager.py +53 -38
  4. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_areas.py +32 -27
  5. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_helpers.py +9 -4
  6. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_entities.py +64 -67
  7. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_labels.py +41 -39
  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.dev2675 → ha_mcp_dev-8.5.0.dev2678/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  10. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  11. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/LICENSE +0 -0
  12. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/MANIFEST.in +0 -0
  13. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/README.md +0 -0
  14. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/setup.cfg +0 -0
  15. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/__init__.py +0 -0
  16. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/__main__.py +0 -0
  17. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_pypi_marker +0 -0
  18. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_rich_compat.py +0 -0
  19. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/__init__.py +0 -0
  20. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  21. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  22. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  23. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  24. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  25. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  26. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  27. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  28. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  29. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  30. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  31. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  32. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  33. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  34. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  35. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  36. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  37. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  38. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  39. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  40. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  41. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  42. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  43. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  44. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  45. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  46. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  47. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  48. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  49. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  50. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  51. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  52. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  53. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  54. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  55. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  56. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  57. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  58. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  59. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  60. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  61. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  62. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  63. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  64. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  65. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  66. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  67. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  68. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  69. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  70. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  71. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  72. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  73. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  74. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  75. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  76. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  77. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  78. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  79. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  80. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  81. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  82. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  83. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  84. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  85. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  86. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  87. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  88. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  89. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  90. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  91. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  92. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  93. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  94. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  95. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  96. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  97. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  98. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  99. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  100. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  101. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  102. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  103. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  104. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  105. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  106. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  107. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  108. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  109. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  110. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  111. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  112. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  113. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  114. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  115. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  116. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  117. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  118. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  119. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  120. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  121. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  122. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  123. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  124. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  125. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  126. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  127. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  128. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  129. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  130. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  131. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  132. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  133. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  134. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  135. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  136. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  137. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  138. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  139. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  140. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  141. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  142. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  143. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  144. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  145. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  146. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  147. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  148. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  149. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  150. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  151. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  152. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  153. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  154. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  155. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  156. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  157. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  158. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  159. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  160. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  161. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  162. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  163. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  164. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  165. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  166. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  167. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  168. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  169. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  170. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  171. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  172. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  173. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  174. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  175. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  176. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  177. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  178. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  179. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  180. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  181. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  182. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  183. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  184. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  185. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  186. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  187. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  188. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  189. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  190. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  191. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  192. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  193. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  194. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  195. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  196. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  197. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  198. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  199. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  200. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  201. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  202. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  203. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  204. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  205. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  206. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  207. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  208. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  209. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  210. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  211. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  212. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  213. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  214. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  215. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  216. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  217. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  218. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  219. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  220. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  221. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  222. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  223. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  224. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  225. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  226. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  227. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  228. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  229. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  230. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  231. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  232. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  233. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  234. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  235. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  236. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  237. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  238. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  239. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  240. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  241. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  242. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  243. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  244. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  245. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  246. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  247. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  248. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  249. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  250. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  251. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  252. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  253. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  254. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  255. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  256. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  257. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  258. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  259. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  260. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  261. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  262. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  263. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  264. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  265. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  266. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  267. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  268. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  269. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  270. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  271. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  272. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  273. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  274. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  275. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  276. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  277. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  278. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  279. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  280. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  281. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  282. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  283. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  284. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  285. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  286. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  287. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  288. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  289. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  290. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  291. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  292. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  293. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  294. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  295. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  296. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  297. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  298. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  299. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  300. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  301. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  302. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  303. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  304. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  305. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  306. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  307. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  308. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  309. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  310. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  311. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  312. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  313. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  314. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  315. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  316. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  317. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  318. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  319. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  320. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  321. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  322. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  323. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  324. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  325. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  326. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  327. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  328. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  329. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  330. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  331. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  332. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  333. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  334. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  335. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  336. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  337. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  338. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  339. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  340. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  341. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  342. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  343. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  344. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  345. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  346. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  347. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  348. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  349. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  350. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  351. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  352. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  353. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  354. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  355. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  356. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  357. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  358. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  359. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  360. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  361. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  362. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  363. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  364. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  365. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  366. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  367. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  368. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  369. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  370. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  371. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  372. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  373. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  374. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  375. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  376. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  377. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  378. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  379. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  380. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  381. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  382. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  383. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  384. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  385. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  386. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  387. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  388. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  389. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  390. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  391. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  392. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  393. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  394. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  395. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  396. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  397. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  398. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  399. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  400. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  401. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  402. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  403. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  404. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  405. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  406. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  407. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  408. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  409. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  410. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  411. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  412. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  413. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  414. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  415. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  416. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  417. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  418. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  419. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  420. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  421. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  422. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  423. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  424. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  425. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  426. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  427. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  428. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  429. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  430. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/requirements.txt +0 -0
  431. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  432. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  433. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  434. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  435. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  436. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  437. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  438. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  439. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  440. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  441. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  442. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  443. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  444. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  445. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  446. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  447. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  448. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  449. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  450. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  451. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  452. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  453. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  454. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  455. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  456. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  457. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  458. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  459. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  460. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  461. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  462. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  463. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  464. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  465. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  466. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  467. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  468. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  469. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  470. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  471. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  472. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  473. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  474. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  475. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  476. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  477. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  478. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  479. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  480. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  481. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  482. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  483. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  484. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  485. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  486. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  487. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/_version.py +0 -0
  488. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/__init__.py +0 -0
  489. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/consent_form.py +0 -0
  490. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/oidc_compat.py +0 -0
  491. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/auth/provider.py +0 -0
  492. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/browser_landing.py +0 -0
  493. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/__init__.py +0 -0
  494. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/rest_client.py +0 -0
  495. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/supervisor_client.py +0 -0
  496. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/websocket_client.py +0 -0
  497. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/client/websocket_listener.py +0 -0
  498. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/config.py +0 -0
  499. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  500. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  501. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  502. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  503. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  504. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  505. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/errors.py +0 -0
  506. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/ha_request_queue.py +0 -0
  507. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  508. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/http_transport.py +0 -0
  509. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/llm_exposure.py +0 -0
  510. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/log_filters.py +0 -0
  511. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/__init__.py +0 -0
  512. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/approval_queue.py +0 -0
  513. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/editing.py +0 -0
  514. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/evaluator.py +0 -0
  515. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/handlers.py +0 -0
  516. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/middleware.py +0 -0
  517. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/model.py +0 -0
  518. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/persistence.py +0 -0
  519. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/policy/value_sources.py +0 -0
  520. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/py.typed +0 -0
  521. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/read_only.py +0 -0
  522. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/redaction.py +0 -0
  523. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/renamed_tools.py +0 -0
  524. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  525. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  526. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  527. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  528. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  529. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  530. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  531. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  532. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  533. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  534. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  535. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  536. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  537. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  538. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  539. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  540. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  541. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  542. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  543. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  544. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  545. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  546. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  547. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  548. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  549. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  550. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  551. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  552. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  553. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  554. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  555. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  556. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  557. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  558. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  559. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  560. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  561. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  562. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  563. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  564. {ha_mcp_dev-8.5.0.dev2675 → 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
  565. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/server.py +0 -0
  566. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/__init__.py +0 -0
  567. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  568. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  569. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  570. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  571. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  572. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  573. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  574. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  575. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  576. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  577. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_theme.py +0 -0
  578. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  579. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  580. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  581. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  582. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  583. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  584. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  585. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  586. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  587. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  588. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  589. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  590. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  591. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  592. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  593. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  594. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  595. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.css +0 -0
  596. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.html +0 -0
  597. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/settings_ui/settings.js +0 -0
  598. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/smoke_test.py +0 -0
  599. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  600. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/strict_bps.py +0 -0
  601. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tool_dispatch.py +0 -0
  602. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/__init__.py +0 -0
  603. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/auto_backup.py +0 -0
  604. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/backup.py +0 -0
  605. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  606. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_result.py +0 -0
  607. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  608. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  609. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  610. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/blueprint_write.py +0 -0
  611. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/bulk_selector.py +0 -0
  612. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_api.py +0 -0
  613. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_config_entries.py +0 -0
  614. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_config_reads.py +0 -0
  615. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  616. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_devices.py +0 -0
  617. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_registries.py +0 -0
  618. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  619. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  620. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  621. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  622. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  623. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  624. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  625. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  626. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  627. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/device_control.py +0 -0
  628. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/entity_registration.py +0 -0
  629. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  630. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/hacs_registration.py +0 -0
  631. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/helpers.py +0 -0
  632. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  633. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_common.py +0 -0
  634. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources.py +0 -0
  635. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  636. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  637. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/__init__.py +0 -0
  638. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/base.py +0 -0
  639. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/matter.py +0 -0
  640. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/thread.py +0 -0
  641. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  642. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/radio/zwave.py +0 -0
  643. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/reference_validator.py +0 -0
  644. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/registry.py +0 -0
  645. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  646. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  647. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  648. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  649. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  650. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  651. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  652. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  653. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  654. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  655. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  656. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  657. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_addons.py +0 -0
  658. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  659. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  660. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  661. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_calendar.py +0 -0
  662. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_camera.py +0 -0
  663. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_categories.py +0 -0
  664. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_code.py +0 -0
  665. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  666. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  667. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  668. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  669. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  670. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_dev.py +0 -0
  671. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_energy.py +0 -0
  672. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  673. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_groups.py +0 -0
  674. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_hacs.py +0 -0
  675. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_history.py +0 -0
  676. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_integrations.py +0 -0
  677. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_logs.py +0 -0
  678. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_radio.py +0 -0
  679. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_registry.py +0 -0
  680. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_resources.py +0 -0
  681. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_search.py +0 -0
  682. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  683. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_service.py +0 -0
  684. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_services.py +0 -0
  685. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_system.py +0 -0
  686. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_themes.py +0 -0
  687. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_todo.py +0 -0
  688. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_traces.py +0 -0
  689. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_updates.py +0 -0
  690. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_utility.py +0 -0
  691. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  692. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  693. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  694. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/tools_zones.py +0 -0
  695. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/util_helpers.py +0 -0
  696. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/tools/validation_middleware.py +0 -0
  697. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/__init__.py +0 -0
  698. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/categorized_search.py +0 -0
  699. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  700. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/transport_security.py +0 -0
  701. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/update_check.py +0 -0
  702. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/__init__.py +0 -0
  703. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/config_hash.py +0 -0
  704. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/config_write_lock.py +0 -0
  705. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  706. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/data_paths.py +0 -0
  707. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  708. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/domain_handlers.py +0 -0
  709. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/entity_membership.py +0 -0
  710. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  711. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  712. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/operation_manager.py +0 -0
  713. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/python_sandbox.py +0 -0
  714. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/skill_loader.py +0 -0
  715. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/utils/usage_logger.py +0 -0
  716. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/__init__.py +0 -0
  717. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/enforcement.py +0 -0
  718. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/model.py +0 -0
  719. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/persistence.py +0 -0
  720. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp/visibility/resolver.py +0 -0
  721. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  722. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  723. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  724. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  725. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/tests/__init__.py +0 -0
  726. {ha_mcp_dev-8.5.0.dev2675 → ha_mcp_dev-8.5.0.dev2678}/tests/test_constants.py +0 -0
  727. {ha_mcp_dev-8.5.0.dev2675 → 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.dev2675
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.dev2675"
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 (
@@ -871,35 +873,38 @@ class AreaTools:
871
873
  )
872
874
  )
873
875
 
874
- # Issue #2159: the area registry stores an unknown floor_id
875
- # verbatim, and an unknown label_id is dropped on the way in
876
- # (HA filters the set through the label registry) — both end as a
877
- # success envelope that does not match what was asked for, so
878
- # validate before writing. ``_validate_cross_kind_params`` already
879
- # rejected floor_id/labels for kind='floor', so this only ever
880
- # runs for areas; None and "" / [] (clear) skip the lookup.
881
- await validate_registry_ids(
882
- self._client,
883
- None,
884
- parsed_labels,
885
- None,
886
- floor_id=floor_id,
887
- fail_closed=True,
888
- )
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
+ )
889
894
 
890
- result = await self._client.send_websocket_message(message)
895
+ result = await self._client.send_websocket_message(message)
891
896
 
892
- if result.get("success"):
893
- return await self._area_or_floor_write_success(
894
- result,
895
- result_key=result_key,
896
- id_key=id_key,
897
- identifier=id,
898
- kind=kind,
899
- operation=operation,
900
- name=name,
901
- parsed_labels=parsed_labels,
902
- )
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
+ )
903
908
 
904
909
  error = result.get("error", {})
905
910
  error_msg = (
@@ -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,
@@ -1826,7 +1827,8 @@ async def _entity_registry_update_coro(
1826
1827
  update_message["labels"] = labels
1827
1828
  if icon is not None:
1828
1829
  update_message["icon"] = icon if icon else None
1829
- 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)
1830
1832
 
1831
1833
 
1832
1834
  async def _category_apply_coro(
@@ -2637,7 +2639,8 @@ async def _apply_create_entity_registry(
2637
2639
  update_message["area_id"] = area_id if area_id else None
2638
2640
  if labels is not None:
2639
2641
  update_message["labels"] = labels
2640
- 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)
2641
2644
  if update_result.get("success"):
2642
2645
  if icon is not None:
2643
2646
  helper_data["icon"] = icon if icon else None
@@ -3269,7 +3272,8 @@ async def _apply_update_icon_area_labels(
3269
3272
  registry_update["area_id"] = area_id if area_id else None
3270
3273
  if labels is not None:
3271
3274
  registry_update["labels"] = labels
3272
- 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)
3273
3277
  if reg_result.get("success"):
3274
3278
  if icon is not None:
3275
3279
  updated_data["icon"] = icon if icon else None
@@ -3333,7 +3337,8 @@ async def _execute_fallback_registry_update(
3333
3337
  fallback_msg["area_id"] = area_id if area_id else None
3334
3338
  if labels is not None:
3335
3339
  fallback_msg["labels"] = labels
3336
- 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)
3337
3342
  updated_data: dict[str, Any] = {}
3338
3343
  if result.get("success"):
3339
3344
  updated_data = result.get("result", {}).get("entity_entry", {})
@@ -21,6 +21,7 @@ from ..client.rest_client import (
21
21
  )
22
22
  from ..client.websocket_client import get_websocket_client
23
23
  from ..errors import ErrorCode, create_error_response
24
+ from ..utils.registry_update_lock import registry_update_lock
24
25
  from .auto_backup import with_auto_backup
25
26
  from .component_api import (
26
27
  DEVICE_REGISTRY_CHILD_SEMANTICS,
@@ -1021,65 +1022,65 @@ class EntityTools:
1021
1022
  new_device_name: str | None = None,
1022
1023
  device_class: str | None = None,
1023
1024
  parsed_options: dict[str, dict[str, Any]] | None = None,
1024
- preflighted: bool = False,
1025
1025
  ) -> dict[str, Any]:
1026
1026
  """Update a single entity. Orchestrates the phase pipeline."""
1027
- # Phase 1: For add/remove label operations, fetch current labels first
1028
- final_labels = await self._resolve_final_labels(
1029
- entity_id, parsed_labels, label_operation
1030
- )
1027
+ async with registry_update_lock("entity", entity_id):
1028
+ # Phase 1: For add/remove label operations, fetch current labels first
1029
+ final_labels = await self._resolve_final_labels(
1030
+ entity_id, parsed_labels, label_operation
1031
+ )
1031
1032
 
1032
- # Phase 2: Build update message for entity registry
1033
- message: dict[str, Any] = {
1034
- "type": "config/entity_registry/update",
1035
- "entity_id": entity_id,
1036
- }
1037
- updates_made: list[str] = []
1038
- _build_name_visibility_fields(
1039
- message, updates_made, area_id, name, icon, device_class
1040
- )
1041
- _build_state_tag_fields(
1042
- message,
1043
- updates_made,
1044
- enabled,
1045
- hidden,
1046
- parsed_aliases,
1047
- parsed_categories,
1048
- final_labels,
1049
- label_operation,
1050
- parsed_labels,
1051
- )
1052
- if new_entity_id is not None:
1053
- self._validate_entity_rename(
1054
- entity_id, new_entity_id, message, updates_made
1033
+ # Phase 2: Build update message for entity registry
1034
+ message: dict[str, Any] = {
1035
+ "type": "config/entity_registry/update",
1036
+ "entity_id": entity_id,
1037
+ }
1038
+ updates_made: list[str] = []
1039
+ _build_name_visibility_fields(
1040
+ message, updates_made, area_id, name, icon, device_class
1055
1041
  )
1056
- # expose_to and device_name are appended to updates_made only after their
1057
- # WS phases run (Phases 5-6), so the Phase-4 error context never claims
1058
- # they were applied before they ran.
1059
- has_deferred_work = parsed_expose_to is not None or new_device_name is not None
1060
- if not updates_made and not parsed_options and not has_deferred_work:
1061
- raise_tool_error(
1062
- create_error_response(
1063
- ErrorCode.VALIDATION_INVALID_PARAMETER,
1064
- "No updates specified",
1065
- suggestions=[
1066
- "Provide at least one of: area_id, name, icon, device_class, enabled, hidden, aliases, categories, labels, options, expose_to, new_entity_id, or new_device_name"
1067
- ],
1042
+ _build_state_tag_fields(
1043
+ message,
1044
+ updates_made,
1045
+ enabled,
1046
+ hidden,
1047
+ parsed_aliases,
1048
+ parsed_categories,
1049
+ final_labels,
1050
+ label_operation,
1051
+ parsed_labels,
1052
+ )
1053
+ if new_entity_id is not None:
1054
+ self._validate_entity_rename(
1055
+ entity_id, new_entity_id, message, updates_made
1068
1056
  )
1057
+ # expose_to and device_name are appended to updates_made only after their
1058
+ # WS phases run (Phases 5-6), so the Phase-4 error context never claims
1059
+ # they were applied before they ran.
1060
+ has_deferred_work = (
1061
+ parsed_expose_to is not None or new_device_name is not None
1069
1062
  )
1063
+ if not updates_made and not parsed_options and not has_deferred_work:
1064
+ raise_tool_error(
1065
+ create_error_response(
1066
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
1067
+ "No updates specified",
1068
+ suggestions=[
1069
+ "Provide at least one of: area_id, name, icon, device_class, enabled, hidden, aliases, categories, labels, options, expose_to, new_entity_id, or new_device_name"
1070
+ ],
1071
+ )
1072
+ )
1073
+
1074
+ # Save original entity_id before potential rename
1075
+ original_entity_id = entity_id
1070
1076
 
1071
- # Save original entity_id before potential rename
1072
- original_entity_id = entity_id
1073
-
1074
- # Issue #2159: validate cross-registry references immediately before
1075
- # the write — the narrowest window against a concurrent registry
1076
- # deletion (#2160 placed the area check here for the same reason).
1077
- # The bulk path preflights its shared labels/categories once at tool
1078
- # entry and passes preflighted=True so N entities don't repeat the
1079
- # lookups. For label add, only the added IDs are checked: the merged
1080
- # set may legitimately carry pre-existing dangling labels, whose
1081
- # cleanup path (label_operation="remove") must stay open.
1082
- if not preflighted:
1077
+ # Issue #2159: validate cross-registry references immediately before
1078
+ # the write — the narrowest window against a concurrent registry
1079
+ # deletion (#2160 placed the area check here for the same reason).
1080
+ # Bulk calls also revalidate here after waiting for the entity lock.
1081
+ # For label add, only the added IDs are checked: the merged
1082
+ # set may legitimately carry pre-existing dangling labels, whose
1083
+ # cleanup path (label_operation="remove") must stay open.
1083
1084
  await validate_registry_ids(
1084
1085
  self._client,
1085
1086
  area_id,
@@ -1088,14 +1089,14 @@ class EntityTools:
1088
1089
  fail_closed=True,
1089
1090
  )
1090
1091
 
1091
- # Phase 3: Send entity registry update (covers all fields except expose_to)
1092
- (
1093
- entity_id,
1094
- entity_entry,
1095
- has_registry_updates,
1096
- ) = await self._execute_registry_update(
1097
- entity_id, message, updates_made, new_entity_id
1098
- )
1092
+ # Phase 3: Send entity registry update (covers all fields except expose_to)
1093
+ (
1094
+ entity_id,
1095
+ entity_entry,
1096
+ has_registry_updates,
1097
+ ) = await self._execute_registry_update(
1098
+ entity_id, message, updates_made, new_entity_id
1099
+ )
1099
1100
 
1100
1101
  # Phase 4: Per-domain options
1101
1102
  entity_entry, options_succeeded = await self._apply_options_updates(
@@ -1221,7 +1222,6 @@ class EntityTools:
1221
1222
  parsed_labels,
1222
1223
  label_operation,
1223
1224
  None, # expose_to batched separately below
1224
- preflighted=True, # labels/categories validated at entry
1225
1225
  )
1226
1226
  for eid in entity_ids
1227
1227
  ],
@@ -1812,12 +1812,9 @@ class EntityTools:
1812
1812
  parsed_options = _parse_options_param(options)
1813
1813
  parsed_expose_to = _parse_expose_to_param(expose_to)
1814
1814
 
1815
- # Issue #2159 bulk preflight: labels/categories are shared across
1816
- # the fan-out, so validate them once here instead of once per
1817
- # entity inside _update_single_entity (area_id was rejected for
1818
- # bulk above). The single-entity path instead validates
1819
- # immediately before its registry write, minimizing the
1820
- # check-to-write window.
1815
+ # Reject invalid shared references before any bulk writes. Each
1816
+ # entity also revalidates under its lock to catch references deleted
1817
+ # while waiting, preserving per-entity partial-progress reporting.
1821
1818
  if is_bulk:
1822
1819
  await validate_registry_ids(
1823
1820
  self._client,
@@ -19,6 +19,7 @@ from ha_mcp._vendor.fastmcp.tools import tool
19
19
  from ..backup_manager import get_backup_manager
20
20
  from ..config import get_global_settings
21
21
  from ..errors import TOOL_ERROR_LOG_LEVEL, ErrorCode, create_error_response
22
+ from ..utils.registry_update_lock import registry_update_lock
22
23
  from .auto_backup import with_auto_backup
23
24
  from .helpers import (
24
25
  exception_to_structured_error,
@@ -375,47 +376,48 @@ class LabelTools:
375
376
  self, label_id: str, area_id: str, assigned: list[str]
376
377
  ) -> None:
377
378
  """Fresh read-modify-write for one area. HA has no atomic label-add."""
378
- areas = await self._list_area_registry(
379
- context={"label_id": label_id, "area_id": area_id}
380
- )
381
- area = self._area_from_registry(areas, area_id)
382
- if area is None:
383
- self._raise_area_label_assign_failure(
384
- label_id=label_id,
385
- area_id=area_id,
386
- message=f"area_id={area_id!r} does not exist in the area registry.",
387
- assigned=assigned,
379
+ async with registry_update_lock("area", area_id):
380
+ areas = await self._list_area_registry(
381
+ context={"label_id": label_id, "area_id": area_id}
388
382
  )
389
- current = _string_labels(area)
390
- if label_id in current:
391
- return
392
- update = await self._client.send_websocket_message(
393
- {
394
- "type": "config/area_registry/update",
395
- "area_id": area_id,
396
- "labels": [*current, label_id],
397
- }
398
- )
399
- if not update.get("success"):
400
- self._raise_area_label_assign_failure(
401
- label_id=label_id,
402
- area_id=area_id,
403
- message=(
404
- f"Failed to assign label {label_id!r} to area {area_id!r}: "
405
- f"{update.get('error', 'Unknown error')}"
406
- ),
407
- assigned=assigned,
408
- )
409
- if not await self._confirm_area_has_label(label_id, area_id, update):
410
- self._raise_area_label_assign_failure(
411
- label_id=label_id,
412
- area_id=area_id,
413
- message=(
414
- f"Area {area_id!r} update succeeded but label "
415
- f"{label_id!r} is not present on the area."
416
- ),
417
- assigned=assigned,
383
+ area = self._area_from_registry(areas, area_id)
384
+ if area is None:
385
+ self._raise_area_label_assign_failure(
386
+ label_id=label_id,
387
+ area_id=area_id,
388
+ message=f"area_id={area_id!r} does not exist in the area registry.",
389
+ assigned=assigned,
390
+ )
391
+ current = _string_labels(area)
392
+ if label_id in current:
393
+ return
394
+ update = await self._client.send_websocket_message(
395
+ {
396
+ "type": "config/area_registry/update",
397
+ "area_id": area_id,
398
+ "labels": [*current, label_id],
399
+ }
418
400
  )
401
+ if not update.get("success"):
402
+ self._raise_area_label_assign_failure(
403
+ label_id=label_id,
404
+ area_id=area_id,
405
+ message=(
406
+ f"Failed to assign label {label_id!r} to area {area_id!r}: "
407
+ f"{update.get('error', 'Unknown error')}"
408
+ ),
409
+ assigned=assigned,
410
+ )
411
+ if not await self._confirm_area_has_label(label_id, area_id, update):
412
+ self._raise_area_label_assign_failure(
413
+ label_id=label_id,
414
+ area_id=area_id,
415
+ message=(
416
+ f"Area {area_id!r} update succeeded but label "
417
+ f"{label_id!r} is not present on the area."
418
+ ),
419
+ assigned=assigned,
420
+ )
419
421
 
420
422
  async def _add_label_to_areas(
421
423
  self, label_id: str, area_ids: list[str]
@@ -0,0 +1,23 @@
1
+ """Coordinate registry read-modify-write operations in one event loop.
2
+
3
+ Hold the resource lock from the fresh read through the write and verification.
4
+ Explicit replacements of the same resource must share it. This cannot serialize
5
+ external HA writers or other processes; see docs/registry-label-concurrency.md.
6
+ """
7
+
8
+ import asyncio
9
+ from weakref import WeakValueDictionary
10
+
11
+ _LOCKS: WeakValueDictionary[
12
+ tuple[asyncio.AbstractEventLoop, str, str], asyncio.Lock
13
+ ] = WeakValueDictionary()
14
+
15
+
16
+ def registry_update_lock(registry: str, resource_id: str) -> asyncio.Lock:
17
+ """Share a lock across tool/client instances, retaining only active locks."""
18
+ key = (asyncio.get_running_loop(), registry, resource_id)
19
+ lock = _LOCKS.get(key)
20
+ if lock is None:
21
+ lock = asyncio.Lock()
22
+ _LOCKS[key] = lock
23
+ return lock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.5.0.dev2675
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
@@ -706,6 +706,7 @@ src/ha_mcp/utils/fuzzy_search.py
706
706
  src/ha_mcp/utils/kill_signal_diagnostics.py
707
707
  src/ha_mcp/utils/operation_manager.py
708
708
  src/ha_mcp/utils/python_sandbox.py
709
+ src/ha_mcp/utils/registry_update_lock.py
709
710
  src/ha_mcp/utils/skill_loader.py
710
711
  src/ha_mcp/utils/usage_logger.py
711
712
  src/ha_mcp/visibility/__init__.py