ha-mcp-dev 9.0.0.dev3223__tar.gz → 9.0.0.dev3224__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 (814) hide show
  1. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/PKG-INFO +1 -1
  2. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/pyproject.toml +1 -1
  3. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/pyproject.toml.orig +1 -1
  4. ha_mcp_dev-9.0.0.dev3224/src/ha_mcp/backup_entities.py +441 -0
  5. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_entity_ids.py +9 -7
  6. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_helper_target.py +6 -1
  7. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_manager.py +22 -22
  8. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_config_helpers.py +1 -1
  9. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_entities.py +46 -46
  10. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/registry_update_lock.py +19 -0
  11. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/LICENSE +0 -0
  12. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/README.md +0 -0
  13. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/__init__.py +0 -0
  14. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/__main__.py +0 -0
  15. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_pypi_marker +0 -0
  16. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_rich_compat.py +0 -0
  17. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/__init__.py +0 -0
  18. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  19. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  20. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  21. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  22. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  23. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  24. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  25. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  26. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  27. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  28. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  29. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  30. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  31. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  32. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  33. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  34. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  35. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  36. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  37. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  38. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  39. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  40. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  41. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  42. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  43. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  44. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  45. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  46. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  47. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  48. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  49. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  50. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  51. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  52. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  53. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  54. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  55. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  56. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  57. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  58. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  59. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  60. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  61. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  62. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  63. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  64. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  65. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  66. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  67. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  68. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  69. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  70. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  71. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  72. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  73. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  74. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  75. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  76. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  77. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  78. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  79. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
  80. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  81. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  82. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  83. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  84. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  85. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  86. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  87. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  88. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  89. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  90. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  91. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  92. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  93. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  94. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  95. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  96. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  97. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  98. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  99. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  100. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  101. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  102. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  103. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  104. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  105. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  106. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  107. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  108. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  109. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  110. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  111. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  112. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  113. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  114. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  115. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  116. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  117. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  118. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  119. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  120. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  121. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  122. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  123. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  124. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  125. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  126. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  127. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  128. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  129. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  130. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  131. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  132. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  133. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  134. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  135. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  136. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  137. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  138. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  139. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  140. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  141. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  142. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  143. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  144. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  145. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  146. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  147. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  148. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  149. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  150. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  151. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  152. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  153. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  154. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  155. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  156. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  157. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  158. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  159. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  160. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  161. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  162. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  163. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  164. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  165. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  166. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  167. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  168. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  169. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  170. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  171. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  172. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  173. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  174. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  175. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  176. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  177. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  178. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  179. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  180. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  181. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  182. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  183. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  184. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  185. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  186. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  187. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  188. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  189. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  190. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  191. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  192. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  193. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  194. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  195. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  196. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  197. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  198. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  199. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  200. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  201. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  202. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  203. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  204. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  205. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  206. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  207. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  208. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  209. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  210. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  211. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  212. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  213. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  214. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  215. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  216. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  217. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  218. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  219. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  220. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  221. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  222. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  223. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  224. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  225. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  226. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  227. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  228. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  229. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  230. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  231. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  232. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  233. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  234. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  235. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  236. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  237. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  238. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  239. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
  240. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
  241. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
  242. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
  243. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
  244. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
  245. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
  246. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
  247. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  248. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  249. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  250. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  251. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  252. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  253. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  254. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  255. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  256. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  257. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  258. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  259. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  260. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  261. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  262. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  263. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  264. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  265. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  266. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  267. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  268. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  269. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  270. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  271. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  272. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  273. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  274. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  275. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  276. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  277. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  278. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  279. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  280. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  281. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  282. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  283. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  284. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  285. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  286. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  287. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  288. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  289. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  290. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  291. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  292. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  293. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  294. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  295. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  296. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  297. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  298. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  299. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  300. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  301. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  302. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  303. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  304. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  305. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  306. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  307. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  308. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  309. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  310. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  311. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  312. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  313. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  314. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  315. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  316. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  317. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  318. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  319. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  320. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  321. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  322. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  323. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  324. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  325. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  326. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  327. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  328. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  329. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  330. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  331. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  332. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  333. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  334. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  335. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  336. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  337. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  338. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  339. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  340. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  341. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  342. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  343. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  344. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  345. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  346. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  347. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  348. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  349. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  350. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  351. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  352. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  353. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  354. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  355. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  356. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  357. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  358. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  359. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  360. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  361. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  362. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  363. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  364. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  365. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  366. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  367. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  368. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  369. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  370. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  371. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  372. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  373. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  374. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  375. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  376. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  377. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  378. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  379. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  380. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  381. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  382. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  383. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  384. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  385. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  386. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  387. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  388. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  389. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  390. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  391. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  392. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  393. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  394. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  395. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  396. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  397. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  398. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  399. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  400. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  401. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  402. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  403. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  404. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  405. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  406. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  407. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  408. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  409. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  410. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  411. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  412. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  413. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  414. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  415. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  416. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  417. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  418. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  419. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  420. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  421. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  422. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  423. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  424. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  425. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  426. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  427. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  428. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  429. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  430. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  431. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  432. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  433. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  434. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  435. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  436. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  437. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  438. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  439. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  440. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  441. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/requirements.txt +0 -0
  442. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  443. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  444. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  445. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  446. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  447. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  448. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  449. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  450. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  451. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  452. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  453. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  454. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  455. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  456. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  457. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  458. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  459. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  460. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  461. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  462. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  463. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  464. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  465. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  466. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  467. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  468. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  469. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  470. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  471. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  472. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  473. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  474. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  475. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  476. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  477. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  478. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  479. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  480. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  481. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  482. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  483. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  484. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  485. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  486. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  487. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  488. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  489. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  490. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  491. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  492. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  493. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  494. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  495. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  496. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  497. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  498. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/_version.py +0 -0
  499. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/app_discovery.py +0 -0
  500. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/auth/__init__.py +0 -0
  501. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/auth/consent_form.py +0 -0
  502. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/auth/iss_stamp.py +0 -0
  503. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/auth/oidc_compat.py +0 -0
  504. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/auth/provider.py +0 -0
  505. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_dashboards.py +0 -0
  506. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_diff.py +0 -0
  507. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_integrations.py +0 -0
  508. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_tags.py +0 -0
  509. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/backup_zones.py +0 -0
  510. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/browser_landing.py +0 -0
  511. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/__init__.py +0 -0
  512. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/admin_routes.py +0 -0
  513. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/error_log_journald.py +0 -0
  514. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/models.py +0 -0
  515. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/rest_client.py +0 -0
  516. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/supervisor_client.py +0 -0
  517. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/websocket_client.py +0 -0
  518. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/client/websocket_listener.py +0 -0
  519. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config.py +0 -0
  520. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config_backup.py +0 -0
  521. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config_meta.py +0 -0
  522. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config_overrides.py +0 -0
  523. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config_registry.py +0 -0
  524. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/config_settings.py +0 -0
  525. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  526. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  527. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  528. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  529. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  530. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  531. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/errors.py +0 -0
  532. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/ha_request_queue.py +0 -0
  533. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  534. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/http_transport.py +0 -0
  535. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/image_info.py +0 -0
  536. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/llm_exposure.py +0 -0
  537. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/log_filters.py +0 -0
  538. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/__init__.py +0 -0
  539. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/approval_queue.py +0 -0
  540. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/decision_pin.py +0 -0
  541. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/decisions.py +0 -0
  542. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/editing.py +0 -0
  543. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/evaluator.py +0 -0
  544. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/events.py +0 -0
  545. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/handlers.py +0 -0
  546. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/middleware.py +0 -0
  547. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/model.py +0 -0
  548. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/mrtr.py +0 -0
  549. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/persistence.py +0 -0
  550. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/server_channels.py +0 -0
  551. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/policy/value_sources.py +0 -0
  552. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/py.typed +0 -0
  553. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/read_only.py +0 -0
  554. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/redaction.py +0 -0
  555. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/renamed_tools.py +0 -0
  556. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  557. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  558. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  559. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  560. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  561. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  562. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  563. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  564. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  565. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  566. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  567. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  568. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  569. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  570. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  571. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  572. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  573. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/server.py +0 -0
  574. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/server_instructions.py +0 -0
  575. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/server_lifespan.py +0 -0
  576. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/server_tool_text.py +0 -0
  577. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/__init__.py +0 -0
  578. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  579. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  580. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  581. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
  582. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  583. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  584. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  585. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  586. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  587. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  588. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  589. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_theme.py +0 -0
  590. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  591. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  592. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  593. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  594. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  595. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  596. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  597. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  598. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  599. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  600. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  601. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  602. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  603. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  604. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  605. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  606. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  607. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  608. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings.css +0 -0
  609. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings.html +0 -0
  610. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  611. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  612. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  613. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  614. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  615. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  616. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  617. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  618. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  619. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
  620. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/smoke_test.py +0 -0
  621. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  622. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/strict_bps.py +0 -0
  623. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tool_dispatch.py +0 -0
  624. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/__init__.py +0 -0
  625. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
  626. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/area_messages.py +0 -0
  627. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/auto_backup.py +0 -0
  628. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/backup.py +0 -0
  629. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/backup_access.py +0 -0
  630. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  631. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/backup_snapshot.py +0 -0
  632. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
  633. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  634. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/best_practice_result.py +0 -0
  635. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  636. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  637. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  638. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/blueprint_write.py +0 -0
  639. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/bug_report_config.py +0 -0
  640. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  641. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/bulk_selector.py +0 -0
  642. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/coercion.py +0 -0
  643. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_api.py +0 -0
  644. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_config_entries.py +0 -0
  645. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_config_reads.py +0 -0
  646. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  647. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_devices.py +0 -0
  648. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  649. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_registries.py +0 -0
  650. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  651. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  652. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  653. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  654. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  655. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  656. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  657. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  658. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  659. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  660. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_file_visibility.py +0 -0
  661. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  662. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  663. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  664. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  665. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  666. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  667. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  668. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  669. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  670. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  671. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  672. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  673. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  674. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_write_errors.py +0 -0
  675. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  676. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/core_contract.py +0 -0
  677. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  678. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  679. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  680. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/dev_backup.py +0 -0
  681. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/device_control.py +0 -0
  682. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/device_enrichment.py +0 -0
  683. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  684. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/energy_preferences.py +0 -0
  685. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  686. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/entity_registration.py +0 -0
  687. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/entity_removal.py +0 -0
  688. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  689. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  690. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  691. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/hacs_registration.py +0 -0
  692. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/helper_flows.py +0 -0
  693. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/helpers.py +0 -0
  694. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/history_response.py +0 -0
  695. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  696. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  697. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/log_common.py +0 -0
  698. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/log_sources.py +0 -0
  699. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  700. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
  701. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  702. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/__init__.py +0 -0
  703. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/base.py +0 -0
  704. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/matter.py +0 -0
  705. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/thread.py +0 -0
  706. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  707. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/zwave.py +0 -0
  708. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  709. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/recorder_errors.py +0 -0
  710. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/reference_validator.py +0 -0
  711. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/registry.py +0 -0
  712. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  713. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/response_helpers.py +0 -0
  714. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/scene_discovery.py +0 -0
  715. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/__init__.py +0 -0
  716. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/base.py +0 -0
  717. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/component.py +0 -0
  718. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/entities.py +0 -0
  719. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/legacy.py +0 -0
  720. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/modes.py +0 -0
  721. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/overview.py +0 -0
  722. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/response.py +0 -0
  723. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/search/state.py +0 -0
  724. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/server_version.py +0 -0
  725. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  726. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  727. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  728. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  729. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  730. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  731. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  732. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  733. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  734. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  735. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/statistics_calendar.py +0 -0
  736. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  737. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/statistics_resets.py +0 -0
  738. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/system_restart.py +0 -0
  739. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tool_hints.py +0 -0
  740. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  741. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_addons.py +0 -0
  742. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_areas.py +0 -0
  743. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  744. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  745. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  746. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_calendar.py +0 -0
  747. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_camera.py +0 -0
  748. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_categories.py +0 -0
  749. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_code.py +0 -0
  750. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  751. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  752. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  753. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  754. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  755. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_dev.py +0 -0
  756. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_energy.py +0 -0
  757. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  758. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_groups.py +0 -0
  759. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_hacs.py +0 -0
  760. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_history.py +0 -0
  761. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_integrations.py +0 -0
  762. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_labels.py +0 -0
  763. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_logs.py +0 -0
  764. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_radio.py +0 -0
  765. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_registry.py +0 -0
  766. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_resources.py +0 -0
  767. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_search.py +0 -0
  768. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  769. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_service.py +0 -0
  770. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_services.py +0 -0
  771. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_system.py +0 -0
  772. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_themes.py +0 -0
  773. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_todo.py +0 -0
  774. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_traces.py +0 -0
  775. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_updates.py +0 -0
  776. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_utility.py +0 -0
  777. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  778. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  779. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  780. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/tools_zones.py +0 -0
  781. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/util_helpers.py +0 -0
  782. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/validation_middleware.py +0 -0
  783. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/tools/ws_waiters.py +0 -0
  784. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/__init__.py +0 -0
  785. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/categorized_search.py +0 -0
  786. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/compact_params.py +0 -0
  787. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/component_helpers.py +0 -0
  788. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/component_search.py +0 -0
  789. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  790. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  791. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/transport_security.py +0 -0
  792. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/update_check.py +0 -0
  793. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/__init__.py +0 -0
  794. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/config_hash.py +0 -0
  795. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/config_write_lock.py +0 -0
  796. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  797. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/data_paths.py +0 -0
  798. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  799. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/domain_handlers.py +0 -0
  800. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/entity_membership.py +0 -0
  801. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  802. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  803. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  804. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/operation_manager.py +0 -0
  805. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/python_sandbox.py +0 -0
  806. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/skill_loader.py +0 -0
  807. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/utils/usage_logger.py +0 -0
  808. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/__init__.py +0 -0
  809. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/config_files.py +0 -0
  810. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/enforcement.py +0 -0
  811. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
  812. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/model.py +0 -0
  813. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/persistence.py +0 -0
  814. {ha_mcp_dev-9.0.0.dev3223 → ha_mcp_dev-9.0.0.dev3224}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 9.0.0.dev3223
3
+ Version: 9.0.0.dev3224
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3223"
7
+ version = "9.0.0.dev3224"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3223"
7
+ version = "9.0.0.dev3224"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -0,0 +1,441 @@
1
+ """Entity backups: the registry settings ``ha_set_entity`` and ``ha_remove_entity`` change.
2
+
3
+ Both tools write the entity registry, so the snapshot is the entity's registry
4
+ entry, cut to the fields a restore writes back, its options (which hold
5
+ voice-assistant exposure) included. The entry's ``id`` stays the same when the
6
+ entity is renamed, so the restore finds a renamed entity and gives it its old
7
+ entity_id back; the safety backup and the diff follow it the same way. A
8
+ removed entity has no entry to update: Core keeps its settings while its config
9
+ entry exists, and for 30 days after that entry, or an entity without one, was
10
+ removed, and gives them back when the integration adds the entity again; this
11
+ backup can then be restored over it.
12
+ The snapshot leaves out the device name, which the device registry holds.
13
+
14
+ With the ha_mcp_tools component (``entity_restore.py`` there) the restore is
15
+ one in-process registry update, so a value Core refuses changes nothing; it can
16
+ write hidden_by and disabled_by values other than ``user``, and it reports what
17
+ Core still keeps of a removed entry. Without it, Core's ``config/entity_registry``
18
+ commands write the fields one update at a time and take only ``user``. An
19
+ enable goes through Core's update command on both paths, so Core's refusal for
20
+ a disabled device and its ``require_restart`` answer apply.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import json
26
+ import logging
27
+ from collections.abc import AsyncIterator
28
+ from contextlib import AbstractAsyncContextManager, asynccontextmanager, nullcontext
29
+ from contextvars import ContextVar
30
+ from typing import Any
31
+
32
+ from ._vendor.fastmcp.exceptions import ToolError
33
+ from .backup_entity_ids import _manager, entity_id_locks
34
+ from .client.rest_client import HomeAssistantCommandError
35
+ from .errors import ErrorCode
36
+ from .tools.component_api import (
37
+ component_supports,
38
+ get_component_caps,
39
+ invalidate_caps,
40
+ is_unknown_command,
41
+ )
42
+ from .tools.config_helpers.registry import validate_registry_ids
43
+
44
+ _SNAPSHOT_FIELDS = (
45
+ "id",
46
+ "entity_id",
47
+ "name",
48
+ "icon",
49
+ "area_id",
50
+ "device_class",
51
+ "aliases",
52
+ "labels",
53
+ "categories",
54
+ "hidden_by",
55
+ "disabled_by",
56
+ "options",
57
+ )
58
+ _RESTORED_FIELDS = ("name", "icon", "area_id", "device_class", "aliases", "labels")
59
+ _NOT_RESTORED = "The device name is not part of an entity backup and was left as it is."
60
+ _ENTRY_COMMAND = "ha_mcp_tools/entity_entry"
61
+ _RESTORE_COMMAND = "ha_mcp_tools/entity_restore"
62
+ # A component reply can be None; only this means the component ran nothing.
63
+ _NOT_SERVED = object()
64
+
65
+ logger = logging.getLogger(__name__)
66
+
67
+
68
+ async def fetch_entity(client: Any, entity_id: str) -> dict[str, Any] | None:
69
+ """The registry fields of ``entity_id``; None when it has no registry entry."""
70
+ try:
71
+ entry = await _manager()._ws_send(
72
+ client, {"type": "config/entity_registry/get", "entity_id": entity_id}
73
+ )
74
+ except HomeAssistantCommandError as err:
75
+ if err.code != "not_found":
76
+ raise
77
+ return None
78
+ entry = _manager()._require_dict(entry, "config/entity_registry/get")
79
+ return {field: entry.get(field) for field in _SNAPSHOT_FIELDS}
80
+
81
+
82
+ def _entry_id(entity_id: str, config: Any) -> str:
83
+ """The snapshot's registry entry ``id``. A backup from before entity
84
+ backups held registry settings has none, and one without a non-empty
85
+ string entity_id names no entity to restore; both are refused before
86
+ anything, a safety backup included, is written."""
87
+ entry_id = config.get("id") if isinstance(config, dict) else None
88
+ if not isinstance(entry_id, str):
89
+ raise _manager().InvalidBackupSnapshotError(
90
+ f"The backup of {entity_id} holds its state from an earlier ha-mcp "
91
+ "version, not its registry settings, so it cannot be restored"
92
+ )
93
+ if not isinstance(config.get("entity_id"), str) or not config["entity_id"]:
94
+ raise _manager().InvalidBackupSnapshotError(
95
+ f"The backup of {entity_id} names no entity_id, so it cannot be restored"
96
+ )
97
+ return entry_id
98
+
99
+
100
+ async def _component_send(client: Any, capability: str, message: dict[str, Any]) -> Any:
101
+ """A component command's reply; ``_NOT_SERVED`` when the component does
102
+ not serve it, so the caller uses Core's commands."""
103
+ if not component_supports(await get_component_caps(client), capability):
104
+ return _NOT_SERVED
105
+ try:
106
+ return await _manager()._ws_send(client, message)
107
+ except HomeAssistantCommandError as err:
108
+ if not is_unknown_command(err):
109
+ raise
110
+ logger.warning(
111
+ "%s unknown to the component; using Core's commands", message["type"]
112
+ )
113
+ invalidate_caps(client)
114
+ return _NOT_SERVED
115
+
116
+
117
+ async def _lookup(client: Any, entry_id: str) -> dict[str, Any]:
118
+ """``{"entry": row or None}``. For a gone entry the component's reply adds
119
+ ``"deleted"``: what Core still keeps of it, or None when it keeps nothing.
120
+ Without the component the key is absent: nobody knows."""
121
+ found = await _component_send(
122
+ client, "entity_entry", {"type": _ENTRY_COMMAND, "entry_id": entry_id}
123
+ )
124
+ if found is not _NOT_SERVED:
125
+ lookup: dict[str, Any] = _manager()._require_dict(found, _ENTRY_COMMAND)
126
+ return lookup
127
+ rows = await _manager()._entity_registry_rows(client)
128
+ return {"entry": next((row for row in rows if row.get("id") == entry_id), None)}
129
+
130
+
131
+ async def current_entity_id(client: Any, entity_id: str, config: Any) -> str | None:
132
+ """The entity_id the snapshot's entity has now, found by its entry ``id``
133
+ since a rename; None when the entry is gone."""
134
+ entry = (await _lookup(client, _entry_id(entity_id, config)))["entry"]
135
+ return entry["entity_id"] if entry else None
136
+
137
+
138
+ def _entry_deleted(entity_id: str, found: dict[str, Any]) -> Exception:
139
+ """The refusal for a gone entry, from what ``_lookup`` knows of it."""
140
+ again = "If this backup is from an earlier edit, restore it once the entity is back"
141
+ if "deleted" not in found:
142
+ suggestions = [
143
+ "Restart Home Assistant: if what provides the entity is still "
144
+ "there, it adds the entity again with the registry settings it "
145
+ "had while its config entry exists, and for 30 days after that "
146
+ "entry, or an entity without one, was removed. A reload does not "
147
+ "bring back a stored helper's entity",
148
+ again,
149
+ ]
150
+ elif (deleted := found["deleted"]) is None:
151
+ suggestions = [
152
+ "Home Assistant no longer keeps this entity's registry settings: "
153
+ "an entity added again gets a new registry entry, which this "
154
+ "backup cannot be restored over. Set the entity with ha_set_entity "
155
+ "instead"
156
+ ]
157
+ else:
158
+ kept = (
159
+ f"until {deleted['kept_until']}"
160
+ if deleted.get("kept_until")
161
+ else "while its config entry exists"
162
+ )
163
+ suggestions = [
164
+ f"Home Assistant keeps the registry settings of {deleted['entity_id']} "
165
+ f"{kept} and gives them back when the entity is added again. If "
166
+ "what provides the entity is still there, restart Home Assistant; "
167
+ "a reload does not bring back a stored helper's entity",
168
+ again,
169
+ ]
170
+ error: Exception = _manager().BackupRestoreError(
171
+ f"{entity_id} is no longer in the entity registry",
172
+ reason="entry_deleted",
173
+ suggestions=suggestions,
174
+ )
175
+ return error
176
+
177
+
178
+ # The entity IDs whose locks ``restore_locks`` holds for the running restore.
179
+ _HELD: ContextVar[frozenset[str] | None] = ContextVar("held_entity_locks", default=None)
180
+
181
+
182
+ @asynccontextmanager
183
+ async def restore_locks(client: Any, config: Any) -> AsyncIterator[None]:
184
+ """Hold the entity locks from before a restore's safety backup through its
185
+ write, as a flow helper's restore holds its config-entry guard. When the
186
+ lookup finds no entry or fails with a transient error, nothing is locked,
187
+ and the restore refuses before it writes."""
188
+ entry_id = config.get("id") if isinstance(config, dict) else None
189
+ saved = config.get("entity_id") if isinstance(config, dict) else None
190
+ try:
191
+ found = await _lookup(client, entry_id) if isinstance(entry_id, str) else {}
192
+ except _manager()._CAPTURE_TRANSIENT_ERRORS:
193
+ found = {} # the restore looks the entry up again and reports a failure
194
+ entry = found.get("entry")
195
+ ids: frozenset[str] = frozenset()
196
+ if entry is not None and isinstance(saved, str):
197
+ ids = frozenset((entry["entity_id"], saved))
198
+ async with entity_id_locks(*ids):
199
+ token = _HELD.set(ids)
200
+ try:
201
+ yield
202
+ finally:
203
+ _HELD.reset(token)
204
+
205
+
206
+ def _entity_locks(
207
+ entity_id: str, source: str, target: str
208
+ ) -> AbstractAsyncContextManager[None]:
209
+ """The restore's entity locks, or none when ``restore_locks`` holds them.
210
+ An entry it could not lock, or one renamed to a third ID since, is not
211
+ under them, and its safety backup was taken without them."""
212
+ held = _HELD.get()
213
+ if held is None:
214
+ return entity_id_locks(source, target)
215
+ if not held:
216
+ raise _manager().BackupRestoreError(
217
+ f"{entity_id} could not be locked before its safety backup was taken; retry",
218
+ reason="entity_identity_mismatch",
219
+ verification_status="mismatched",
220
+ )
221
+ if source not in held:
222
+ raise _changed_while_waiting(entity_id)
223
+ return nullcontext()
224
+
225
+
226
+ def _changed_while_waiting(entity_id: str) -> Exception:
227
+ """The refusal for an entry that moved while the restore waited for it."""
228
+ error: Exception = _manager().BackupRestoreError(
229
+ f"{entity_id} changed while waiting to restore it; retry",
230
+ reason="entity_identity_mismatch",
231
+ verification_status="mismatched",
232
+ )
233
+ return error
234
+
235
+
236
+ async def restore_entity(client: Any, entity_id: str, config: Any) -> Any:
237
+ """Write the snapshot's registry fields back, under the entity ID it saved."""
238
+ bm = _manager()
239
+ entry_id = _entry_id(entity_id, config)
240
+ found = await _lookup(client, entry_id)
241
+ current = found["entry"]
242
+ if current is None:
243
+ raise _entry_deleted(entity_id, found)
244
+ source, target = current["entity_id"], config["entity_id"]
245
+ async with _entity_locks(entity_id, source, target):
246
+ current = await fetch_entity(client, source)
247
+ if current is None or current["id"] != entry_id:
248
+ raise _changed_while_waiting(entity_id)
249
+ if source != target:
250
+ await bm._check_entity_collision(client, target)
251
+ await _check_references(client, config)
252
+ result = await _restore_in_process(
253
+ client, entity_id, entry_id, source, current, config
254
+ )
255
+ if result is None:
256
+ result = await _write_back(client, source, target, current, config)
257
+ return result
258
+
259
+
260
+ async def _check_references(client: Any, config: dict[str, Any]) -> None:
261
+ """Refuse a backup naming an area, label or category deleted since: Core
262
+ would store the area or category ID as sent and drop the label silently.
263
+ The check is the one ha_set_entity runs."""
264
+ try:
265
+ await validate_registry_ids(
266
+ client,
267
+ config.get("area_id"),
268
+ config.get("labels"),
269
+ config.get("categories"),
270
+ fail_closed=True,
271
+ )
272
+ except ToolError as err:
273
+ error = json.loads(str(err)).get("error") or {}
274
+ if error.get("code") != ErrorCode.VALIDATION_INVALID_PARAMETER:
275
+ raise
276
+ raise _manager().BackupRestoreError(
277
+ f"{error.get('message')} Nothing was restored.",
278
+ reason="missing_reference",
279
+ suggestions=[
280
+ "Create the area, label or category again, then restore; or "
281
+ "set the entity with ha_set_entity instead"
282
+ ],
283
+ ) from err
284
+
285
+
286
+ async def _write_back(
287
+ client: Any,
288
+ source: str,
289
+ target: str,
290
+ current: dict[str, Any],
291
+ config: dict[str, Any],
292
+ ) -> dict[str, Any]:
293
+ update: dict[str, Any] = {field: config.get(field) for field in _RESTORED_FIELDS}
294
+ # Core updates only the scopes it is sent: clear the ones added since.
295
+ update["categories"] = {
296
+ **dict.fromkeys(current.get("categories") or {}),
297
+ **(config.get("categories") or {}),
298
+ }
299
+ if source != target:
300
+ update["new_entity_id"] = target
301
+ result = await _update(client, source, update)
302
+ warnings = [_NOT_RESTORED]
303
+ # Each on its own and only when changed. In Core 2026.10 an update
304
+ # carrying disabled_by None asks for a restart when the entity has no
305
+ # config entry or one that cannot unload; Core refuses values only Home
306
+ # Assistant itself sets, and enabling an entity whose device is disabled.
307
+ for field in ("hidden_by", "disabled_by"):
308
+ if config.get(field) != current.get(field):
309
+ result = await _write_hider(
310
+ client, target, field, config, current, result, warnings
311
+ )
312
+ now_options = current.get("options") or {}
313
+ for domain, saved in _changed_options(current, config).items():
314
+ now = now_options.get(domain)
315
+ expose = (saved or {}).get("should_expose")
316
+ if isinstance(expose, bool) and expose != (now or {}).get("should_expose"):
317
+ # Ahead of the options write: Core tells the assistant only when
318
+ # this command is the one that changes the value.
319
+ await _manager()._ws_send(
320
+ client,
321
+ {
322
+ "type": "homeassistant/expose_entity",
323
+ "assistants": [domain],
324
+ "entity_ids": [target],
325
+ "should_expose": expose,
326
+ },
327
+ )
328
+ options = {"options_domain": domain, "options": saved}
329
+ result = {**result, **await _update(client, target, options)}
330
+ return {**result, "warnings": warnings}
331
+
332
+
333
+ async def _restore_in_process(
334
+ client: Any,
335
+ entity_id: str,
336
+ entry_id: str,
337
+ source: str,
338
+ current: dict[str, Any],
339
+ config: dict[str, Any],
340
+ ) -> dict[str, Any] | None:
341
+ """The component's write; None when the component does not serve it.
342
+
343
+ disabled_by None is not sent: the enable goes through Core's update
344
+ command afterwards, for its device check and its restart answer. An error
345
+ once the write was sent reaches the restore as it is, which reports the
346
+ outcome as unknown, and is never followed by a write through Core's
347
+ commands.
348
+ """
349
+ settings: dict[str, Any] = {field: config.get(field) for field in _RESTORED_FIELDS}
350
+ settings.update(
351
+ hidden_by=config.get("hidden_by"), categories=config.get("categories") or {}
352
+ )
353
+ if config.get("disabled_by") is not None:
354
+ settings["disabled_by"] = config["disabled_by"]
355
+ message: dict[str, Any] = {
356
+ "type": _RESTORE_COMMAND,
357
+ "entry_id": entry_id,
358
+ "entity_id": source,
359
+ "settings": settings,
360
+ "options": _changed_options(current, config),
361
+ }
362
+ target = config["entity_id"]
363
+ if source != target:
364
+ message["new_entity_id"] = target
365
+ reply = await _component_send(client, "entity_restore", message)
366
+ if reply is _NOT_SERVED:
367
+ return None
368
+ reply = _manager()._require_dict(reply, _RESTORE_COMMAND)
369
+ if reply.get("success") is not True:
370
+ raise _refusal(entity_id, reply.get("error") or {})
371
+ result: dict[str, Any] = {"entity_entry": reply.get("entity_entry")}
372
+ warnings = [_NOT_RESTORED, *(reply.get("warnings") or [])]
373
+ if config.get("disabled_by") is None and current.get("disabled_by") is not None:
374
+ result = await _write_hider(
375
+ client, target, "disabled_by", config, current, result, warnings
376
+ )
377
+ return {**result, "warnings": warnings}
378
+
379
+
380
+ def _refusal(entity_id: str, error: dict[str, Any]) -> Exception:
381
+ """Why the component did not restore. Its three codes mean it wrote
382
+ nothing; a code this server does not know leaves the outcome unknown."""
383
+ code, message = error.get("code"), error.get("message") or "no reason given"
384
+ if code == "entry_deleted":
385
+ return _entry_deleted(entity_id, {"deleted": error.get("deleted")})
386
+ refusal: Exception
387
+ if code == "entity_identity_mismatch":
388
+ refusal = _changed_while_waiting(entity_id)
389
+ elif code == "invalid":
390
+ refusal = _manager().BackupRestoreError(
391
+ f"Home Assistant refused the restore of {entity_id}: {message}. "
392
+ "Nothing was restored.",
393
+ reason="rejected_by_home_assistant",
394
+ )
395
+ else:
396
+ refusal = _manager().BackupRestoreError(
397
+ f"The restore of {entity_id} failed with {code!r}: {message}",
398
+ apply_status="unknown",
399
+ reason="upstream_error",
400
+ )
401
+ return refusal
402
+
403
+
404
+ def _changed_options(current: dict[str, Any], config: dict[str, Any]) -> dict[str, Any]:
405
+ """The saved options of each domain that differs now; None removes one."""
406
+ saved = config.get("options") or {}
407
+ now = current.get("options") or {}
408
+ return {
409
+ domain: saved.get(domain)
410
+ for domain in sorted({*saved, *now})
411
+ if saved.get(domain) != now.get(domain)
412
+ }
413
+
414
+
415
+ async def _write_hider(
416
+ client: Any,
417
+ target: str,
418
+ field: str,
419
+ config: dict[str, Any],
420
+ current: dict[str, Any],
421
+ result: dict[str, Any],
422
+ warnings: list[str],
423
+ ) -> dict[str, Any]:
424
+ """Send one hidden_by or disabled_by value; keep Core's refusal as a warning."""
425
+ saved, now = config.get(field), current.get(field)
426
+ try:
427
+ return {**result, **await _update(client, target, {field: saved})}
428
+ except HomeAssistantCommandError as err:
429
+ if err.code not in ("invalid_format", "invalid_info"):
430
+ raise
431
+ warnings.append(
432
+ f"{field} stays {now!r}: Home Assistant refused {saved!r}: {err}"
433
+ )
434
+ return result
435
+
436
+
437
+ async def _update(client: Any, entity_id: str, fields: dict[str, Any]) -> Any:
438
+ return await _manager()._ws_send(
439
+ client,
440
+ {"type": "config/entity_registry/update", "entity_id": entity_id, **fields},
441
+ )
@@ -6,10 +6,11 @@ own helpers are reached lazily so its tests can patch them in place.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from contextlib import AsyncExitStack
9
+ from contextlib import AbstractAsyncContextManager
10
10
  from typing import Any
11
11
 
12
12
  from ._vendor.websockets.exceptions import WebSocketException
13
+ from .utils.registry_update_lock import registry_update_locks
13
14
 
14
15
 
15
16
  def _manager() -> Any:
@@ -18,6 +19,12 @@ def _manager() -> Any:
18
19
  return backup_manager
19
20
 
20
21
 
22
+ def entity_id_locks(*entity_ids: str) -> AbstractAsyncContextManager[None]:
23
+ """Hold the registry lock of each entity ID, in a stable order."""
24
+ lock = _manager().registry_update_lock
25
+ return registry_update_locks("entity", *entity_ids, lock=lock)
26
+
27
+
21
28
  async def registry_row(
22
29
  client: Any, platform: str, unique_id: str
23
30
  ) -> dict[str, Any] | None:
@@ -140,12 +147,7 @@ async def _restore_entity_id(
140
147
  row = await bm._created_entity(client, entry_id, unique_id)
141
148
  source, target = row["entity_id"], saved["entity_id"]
142
149
  locked_ids = {source, target}
143
- async with AsyncExitStack() as locks:
144
- # A rename changes the lock key; hold both IDs in a stable order.
145
- for entity_id in sorted(locked_ids):
146
- await locks.enter_async_context(
147
- bm.registry_update_lock("entity", entity_id)
148
- )
150
+ async with entity_id_locks(*locked_ids):
149
151
  row = await bm._created_entity(client, entry_id, unique_id)
150
152
  source = row["entity_id"]
151
153
  if source not in locked_ids:
@@ -16,6 +16,7 @@ import json
16
16
  from typing import Any, NoReturn
17
17
 
18
18
  from ._vendor.fastmcp.exceptions import ToolError
19
+ from .backup_entities import current_entity_id
19
20
  from .backup_entity_ids import _manager
20
21
 
21
22
 
@@ -85,6 +86,8 @@ async def safety_target(
85
86
  fails, and overwrites nothing that needs a backup.
86
87
  """
87
88
  bm = _manager()
89
+ if domain == "entity":
90
+ return await current_entity_id(client, entity_id, config)
88
91
  platform = domain.removeprefix("helper_")
89
92
  stored = config.get("id") if isinstance(config, dict) else None
90
93
  if not stored or platform not in bm._HELPER_LIST_TYPES:
@@ -169,7 +172,9 @@ def note_no_safety_backup(
169
172
  ) -> None:
170
173
  """Say why a restore goes ahead without a safety backup."""
171
174
  if target is None: # safety_target: the stored item no longer exists
172
- stored = config.get("id") if isinstance(config, dict) else None
175
+ # An entity snapshot's "id" is its registry entry id, not a name to show.
176
+ key = "entity_id" if domain == "entity" else "id"
177
+ stored = config.get(key) if isinstance(config, dict) else None
173
178
  outcome["warnings"] = [
174
179
  f"No safety backup was taken: {domain.removeprefix('helper_')} "
175
180
  f"{stored} no longer exists, "
@@ -83,6 +83,12 @@ from .backup_diff import (
83
83
  _compute_json_patch,
84
84
  _summarize_patch_counts,
85
85
  )
86
+ from .backup_entities import (
87
+ current_entity_id,
88
+ fetch_entity,
89
+ restore_entity,
90
+ restore_locks,
91
+ )
86
92
  from .backup_entity_ids import (
87
93
  _restore_entity_ids,
88
94
  update_with_registry_icon,
@@ -1492,6 +1498,11 @@ class BackupManager:
1492
1498
  return await self._restore_snapshot_data(
1493
1499
  name, data, take_safety_backup=take_safety_backup
1494
1500
  )
1501
+ if data["domain"] == "entity":
1502
+ async with restore_locks(self._client, data["config"]):
1503
+ return await self._restore_snapshot_data(
1504
+ name, data, take_safety_backup=take_safety_backup
1505
+ )
1495
1506
  return await self._restore_snapshot_data(
1496
1507
  name, data, take_safety_backup=take_safety_backup
1497
1508
  )
@@ -1636,6 +1647,11 @@ class BackupManager:
1636
1647
  f"{_flow_label(_flow_type(domain))} helper no longer exists; "
1637
1648
  "restore was not attempted"
1638
1649
  )
1650
+ if path is None and target is not None and domain == "entity":
1651
+ # Renamed since the lookup: the restore finds the entity by its
1652
+ # entry id and would overwrite it without a safety backup.
1653
+ message = "the entity was renamed while its safety backup was taken; retry"
1654
+ raise MandatoryBackupError(message, safe_detail=message)
1639
1655
  if checked and path is None:
1640
1656
  _note_no_safety_backup(outcome, domain, target, config)
1641
1657
  return path
@@ -1655,7 +1671,10 @@ class BackupManager:
1655
1671
  handler = self.handler_for(domain)
1656
1672
  if handler is None:
1657
1673
  raise LookupError(f"No diff handler registered for domain {domain!r}")
1658
- current = await handler.fetch(self._client, data["entity_id"])
1674
+ target = data["entity_id"]
1675
+ if domain == "entity":
1676
+ target = await current_entity_id(self._client, target, data["config"])
1677
+ current = await handler.fetch(self._client, target) if target else None
1659
1678
  if domain == "dashboard":
1660
1679
  _stored, legacy = dashboard_snapshot(data)
1661
1680
  current = dashboard_comparison(current, legacy=legacy)
@@ -2656,25 +2675,6 @@ async def _restore_todo_item(client: Any, entity_id: str, config: Any) -> Any:
2656
2675
  )
2657
2676
 
2658
2677
 
2659
- # Generic entity (ha_set_entity) — fetch via state API, restore by re-setting.
2660
-
2661
-
2662
- async def _fetch_entity_state(client: Any, entity_id: str) -> Any:
2663
- return await _rest_get_or_none(client, f"states/{entity_id}")
2664
-
2665
-
2666
- async def _restore_entity_state(client: Any, entity_id: str, config: Any) -> Any:
2667
- # ha_set_entity just calls /api/states/<entity_id> POST with state+attributes.
2668
- if isinstance(config, dict):
2669
- payload = {
2670
- "state": config.get("state"),
2671
- "attributes": config.get("attributes", {}),
2672
- }
2673
- else:
2674
- payload = {"state": str(config)}
2675
- return await _rest_post(client, f"states/{entity_id}", payload)
2676
-
2677
-
2678
2678
  # Devices — config/device_registry/{list,update}. ``ha_set_device`` mutates
2679
2679
  # the user-editable registry fields (name_by_user / area_id / disabled_by /
2680
2680
  # labels); restore re-applies exactly those. A device deleted by
@@ -3478,7 +3478,7 @@ async def _check_entity_collision(
3478
3478
  occupied = {row["entity_id"] for row in registry} | state_ids
3479
3479
  if target in occupied and target not in owned_ids:
3480
3480
  raise BackupRestoreError(
3481
- "The saved entity ID is occupied; it will not be overwritten",
3481
+ f"The saved entity ID {target} is occupied; it will not be overwritten",
3482
3482
  reason="entity_id_collision",
3483
3483
  conflicting_entity_id=target,
3484
3484
  )
@@ -3920,7 +3920,7 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
3920
3920
  DomainHandler("area_or_floor", _fetch_area_or_floor, _restore_area_or_floor)
3921
3921
  )
3922
3922
  mgr.register(DomainHandler("todo_item", _fetch_todo_item, _restore_todo_item))
3923
- mgr.register(DomainHandler("entity", _fetch_entity_state, _restore_entity_state))
3923
+ mgr.register(DomainHandler("entity", fetch_entity, restore_entity))
3924
3924
  mgr.register(DomainHandler("device", _fetch_device, _restore_device))
3925
3925
  mgr.register(DomainHandler("integration", fetch_integration, restore_integration))
3926
3926
  mgr.register(DomainHandler("file", _fetch_file, _restore_file))
@@ -594,7 +594,7 @@ class HelperConfigTools:
594
594
  icon: Annotated[
595
595
  str | None,
596
596
  Field(
597
- description="Material Design Icon (e.g., 'mdi:bell'); '' or ' ' clears it, except a zone's stored icon (the icon in the zone's own config, as the Home Assistant UI stores it; ha_get_zone shows it), which cannot be removed. On create, a storage helper's icon goes into its stored config when Home Assistant's schema for the type has an icon field, otherwise (person, tag, a new zone, or without the ha_mcp_tools component) into the entity registry; an update always sets the registry icon, and the stored icon too where the schema has one. Automatic backups hold the registry icon of a person, tag or zone only, so restoring another helper's backup does not bring back an icon kept in the registry; without the component, every storage helper other than a zone keeps its icon there",
597
+ description="Material Design Icon (e.g., 'mdi:bell'); '' or ' ' clears it, except a zone's stored icon (the icon in the zone's own config, as the Home Assistant UI stores it; ha_get_zone shows it), which cannot be removed. On create, a storage helper's icon goes into its stored config when Home Assistant's schema for the type has an icon field, otherwise (person, tag, a new zone, or without the ha_mcp_tools component) into the entity registry; an update always sets the registry icon, and the stored icon too where the schema has one. Restoring a storage helper's automatic backup also puts back its registry icon, unless the backup predates registry icons being recorded; a flow helper's backup holds no icon, so its restore does not set one",
598
598
  default=None,
599
599
  ),
600
600
  ] = None,