ha-mcp-dev 8.7.0.dev3060__tar.gz → 8.7.0.dev3061__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 (790) hide show
  1. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/pyproject.toml.orig +1 -1
  4. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_entity_ids.py +77 -0
  5. ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/backup_helper_target.py +183 -0
  6. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_manager.py +79 -83
  7. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_tags.py +14 -13
  8. ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/backup_zones.py +107 -0
  9. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_backups.py +29 -0
  10. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/04_backups.js +16 -3
  11. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup.py +18 -18
  12. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_helper_collections.py +135 -24
  13. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_registry_lookup.py +5 -4
  14. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/create.py +84 -19
  15. ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/config_helpers/icon_route.py +31 -0
  16. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/update.py +64 -43
  17. ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/entity_removal.py +75 -0
  18. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/flow_helper_lookup.py +24 -0
  19. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_helpers.py +8 -6
  20. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_entities.py +13 -14
  21. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_integrations.py +49 -108
  22. ha_mcp_dev-8.7.0.dev3061/src/ha_mcp/tools/tools_zones.py +791 -0
  23. ha_mcp_dev-8.7.0.dev3060/src/ha_mcp/tools/tools_zones.py +0 -623
  24. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/LICENSE +0 -0
  25. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/README.md +0 -0
  26. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/__init__.py +0 -0
  27. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/__main__.py +0 -0
  28. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_pypi_marker +0 -0
  29. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_rich_compat.py +0 -0
  30. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/__init__.py +0 -0
  31. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  32. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  33. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  34. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  35. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  36. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  37. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  38. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  39. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  40. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  41. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  42. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  43. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  44. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  45. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  46. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  47. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  48. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  49. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  50. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  51. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  52. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  53. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  54. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  55. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  56. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  57. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  58. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  59. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  60. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  61. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  62. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  63. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  64. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  65. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  66. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  67. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  68. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  69. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  70. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  71. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  72. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  73. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  74. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  75. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  76. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  77. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  78. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  79. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  80. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  81. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  82. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  83. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  84. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  85. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  86. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  87. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  88. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  89. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  90. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  91. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  92. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  93. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  94. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  95. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  96. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  97. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  98. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  99. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  100. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  101. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  102. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  103. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  104. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  105. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  106. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  107. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  108. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  109. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  110. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  111. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  112. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  113. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  114. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  115. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  116. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  117. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  118. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  119. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  120. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  121. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  122. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  123. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  124. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  125. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  126. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  127. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  128. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  129. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  130. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  131. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  132. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  133. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  134. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  135. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  136. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  137. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  138. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  139. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  140. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  141. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  142. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  143. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  144. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  145. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  146. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  147. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  148. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  149. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  150. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  151. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  152. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  153. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  154. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  155. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  156. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  157. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  158. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  159. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  160. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  161. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  162. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  163. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  164. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  165. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  166. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  167. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  168. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  169. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  170. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  171. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  172. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  173. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  174. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  175. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  176. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  177. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  178. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  179. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  180. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  181. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  182. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  183. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  184. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  185. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  186. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  187. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  188. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  189. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  190. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  191. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  192. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  193. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  194. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  195. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  196. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  197. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  198. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  199. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  200. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  201. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  202. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  203. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  204. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  205. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  206. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  207. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  208. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  209. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  210. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  211. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  212. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  213. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  214. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  215. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  216. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  217. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  218. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  219. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  220. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  221. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  222. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  223. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  224. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  225. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  226. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  227. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  228. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  229. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  230. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  231. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  232. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  233. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  234. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  235. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  236. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  237. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  238. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  239. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  240. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  241. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  242. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  243. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  244. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  245. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  246. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  247. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  248. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  249. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  250. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  251. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  252. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  253. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  254. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  255. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  256. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  257. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  258. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  259. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  260. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  261. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  262. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  263. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  264. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  265. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  266. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  267. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  268. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  269. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  270. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  271. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  272. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  273. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  274. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  275. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  276. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  277. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  278. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  279. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  280. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  281. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  282. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  283. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  284. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  285. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  286. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  287. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  288. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  289. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  290. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  291. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  292. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  293. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  294. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  295. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  296. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  297. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  298. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  299. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  300. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  301. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  302. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  303. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  304. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  305. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  306. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  307. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  308. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  309. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  310. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  311. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  312. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  313. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  314. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  315. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  316. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  317. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  318. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  319. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  320. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  321. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  322. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  323. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  324. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  325. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  326. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  327. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  328. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  329. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  330. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  331. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  332. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  333. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  334. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  335. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  336. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  337. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  338. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  339. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  340. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  341. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  342. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  343. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  344. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  345. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  346. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  347. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  348. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  349. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  350. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  351. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  352. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  353. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  354. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  355. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  356. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  357. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  358. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  359. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  360. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  361. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  362. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  363. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  364. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  365. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  366. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  367. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  368. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  369. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  370. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  371. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  372. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  373. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  374. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  375. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  376. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  377. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  378. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  379. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  380. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  381. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  382. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  383. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  384. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  385. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  386. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  387. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  388. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  389. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  390. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  391. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  392. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  393. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  394. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  395. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  396. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  397. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  398. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  399. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  400. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  401. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  402. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  403. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  404. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  405. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  406. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  407. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  408. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  409. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  410. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  411. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  412. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  413. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  414. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  415. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  416. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  417. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  418. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  419. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  420. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  421. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  422. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  423. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  424. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  425. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  426. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  427. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  428. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  429. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  430. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  431. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  432. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  433. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  434. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  435. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  436. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  437. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  438. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  439. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  440. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  441. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  442. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  443. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  444. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  445. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/requirements.txt +0 -0
  446. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  447. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  448. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  449. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  450. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  451. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  452. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  453. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  454. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  455. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  456. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  457. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  458. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  459. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  460. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  461. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  462. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  463. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  464. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  465. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  466. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  467. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  468. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  469. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  470. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  471. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  472. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  473. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  474. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  475. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  476. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  477. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  478. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  479. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  480. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  481. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  482. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  483. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  484. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  485. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  486. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  487. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  488. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  489. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  490. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  491. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  492. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  493. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  494. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  495. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  496. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  497. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  498. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  499. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  500. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  501. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  502. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/_version.py +0 -0
  503. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/app_discovery.py +0 -0
  504. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/__init__.py +0 -0
  505. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/consent_form.py +0 -0
  506. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/oidc_compat.py +0 -0
  507. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/auth/provider.py +0 -0
  508. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_diff.py +0 -0
  509. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/backup_integrations.py +0 -0
  510. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/browser_landing.py +0 -0
  511. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/__init__.py +0 -0
  512. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/admin_routes.py +0 -0
  513. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/rest_client.py +0 -0
  514. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/supervisor_client.py +0 -0
  515. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/websocket_client.py +0 -0
  516. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/client/websocket_listener.py +0 -0
  517. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config.py +0 -0
  518. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_backup.py +0 -0
  519. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_meta.py +0 -0
  520. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_overrides.py +0 -0
  521. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_registry.py +0 -0
  522. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/config_settings.py +0 -0
  523. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  524. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  525. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  526. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  527. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  528. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  529. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/errors.py +0 -0
  530. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/ha_request_queue.py +0 -0
  531. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  532. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/http_transport.py +0 -0
  533. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/image_info.py +0 -0
  534. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/llm_exposure.py +0 -0
  535. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/log_filters.py +0 -0
  536. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/__init__.py +0 -0
  537. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/approval_queue.py +0 -0
  538. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/decision_pin.py +0 -0
  539. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/decisions.py +0 -0
  540. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/editing.py +0 -0
  541. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/evaluator.py +0 -0
  542. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/events.py +0 -0
  543. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/handlers.py +0 -0
  544. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/middleware.py +0 -0
  545. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/model.py +0 -0
  546. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/mrtr.py +0 -0
  547. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/persistence.py +0 -0
  548. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/server_channels.py +0 -0
  549. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/policy/value_sources.py +0 -0
  550. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/py.typed +0 -0
  551. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/read_only.py +0 -0
  552. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/redaction.py +0 -0
  553. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/renamed_tools.py +0 -0
  554. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  555. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  556. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  557. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  558. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  559. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  560. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  561. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  562. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  563. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  564. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  565. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  566. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  567. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  568. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  569. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  570. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  571. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server.py +0 -0
  572. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_instructions.py +0 -0
  573. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_lifespan.py +0 -0
  574. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/server_tool_text.py +0 -0
  575. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/__init__.py +0 -0
  576. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  577. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  578. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  579. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  580. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  581. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  582. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  583. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  584. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  585. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_theme.py +0 -0
  586. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  587. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  588. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  589. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  590. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  591. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  592. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  593. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  594. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  595. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  596. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  597. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  598. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  599. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  600. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  601. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  602. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  603. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  604. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings.css +0 -0
  605. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings.html +0 -0
  606. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  607. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  608. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  609. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  610. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  611. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  612. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  613. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  614. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/smoke_test.py +0 -0
  615. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  616. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/strict_bps.py +0 -0
  617. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tool_dispatch.py +0 -0
  618. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/__init__.py +0 -0
  619. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/area_messages.py +0 -0
  620. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/auto_backup.py +0 -0
  621. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup_access.py +0 -0
  622. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  623. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  624. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_result.py +0 -0
  625. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  626. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  627. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  628. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/blueprint_write.py +0 -0
  629. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bug_report_config.py +0 -0
  630. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  631. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/bulk_selector.py +0 -0
  632. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/coercion.py +0 -0
  633. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_api.py +0 -0
  634. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_config_entries.py +0 -0
  635. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_config_reads.py +0 -0
  636. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  637. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_devices.py +0 -0
  638. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/component_registries.py +0 -0
  639. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  640. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  641. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  642. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  643. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  644. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  645. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  646. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  647. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  648. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  649. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  650. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  651. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  652. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  653. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  654. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  655. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  656. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  657. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  658. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_write_errors.py +0 -0
  659. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  660. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/core_contract.py +0 -0
  661. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  662. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  663. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  664. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/dev_backup.py +0 -0
  665. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/device_control.py +0 -0
  666. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/device_enrichment.py +0 -0
  667. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  668. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/energy_preferences.py +0 -0
  669. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  670. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_registration.py +0 -0
  671. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  672. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  673. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/hacs_registration.py +0 -0
  674. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/helper_flows.py +0 -0
  675. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/helpers.py +0 -0
  676. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/history_response.py +0 -0
  677. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  678. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  679. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_common.py +0 -0
  680. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources.py +0 -0
  681. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  682. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  683. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/__init__.py +0 -0
  684. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/base.py +0 -0
  685. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/matter.py +0 -0
  686. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/thread.py +0 -0
  687. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  688. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zwave.py +0 -0
  689. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  690. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/recorder_errors.py +0 -0
  691. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/reference_validator.py +0 -0
  692. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/registry.py +0 -0
  693. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  694. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/response_helpers.py +0 -0
  695. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/scene_discovery.py +0 -0
  696. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/__init__.py +0 -0
  697. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/base.py +0 -0
  698. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/component.py +0 -0
  699. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/entities.py +0 -0
  700. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/legacy.py +0 -0
  701. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/modes.py +0 -0
  702. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/overview.py +0 -0
  703. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/response.py +0 -0
  704. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/search/state.py +0 -0
  705. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  706. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  707. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  708. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  709. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  710. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  711. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  712. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  713. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  714. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  715. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  716. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/statistics_resets.py +0 -0
  717. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/system_restart.py +0 -0
  718. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tool_hints.py +0 -0
  719. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  720. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_addons.py +0 -0
  721. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_areas.py +0 -0
  722. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  723. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  724. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  725. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_calendar.py +0 -0
  726. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_camera.py +0 -0
  727. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_categories.py +0 -0
  728. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_code.py +0 -0
  729. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  730. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  731. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  732. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  733. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  734. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_dev.py +0 -0
  735. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_energy.py +0 -0
  736. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  737. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_groups.py +0 -0
  738. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_hacs.py +0 -0
  739. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_history.py +0 -0
  740. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_labels.py +0 -0
  741. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_logs.py +0 -0
  742. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_radio.py +0 -0
  743. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_registry.py +0 -0
  744. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_resources.py +0 -0
  745. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_search.py +0 -0
  746. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  747. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_service.py +0 -0
  748. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_services.py +0 -0
  749. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_system.py +0 -0
  750. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_themes.py +0 -0
  751. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_todo.py +0 -0
  752. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_traces.py +0 -0
  753. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_updates.py +0 -0
  754. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_utility.py +0 -0
  755. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  756. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  757. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  758. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/util_helpers.py +0 -0
  759. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/validation_middleware.py +0 -0
  760. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/tools/ws_waiters.py +0 -0
  761. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/__init__.py +0 -0
  762. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/categorized_search.py +0 -0
  763. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/compact_params.py +0 -0
  764. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/component_helpers.py +0 -0
  765. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/component_search.py +0 -0
  766. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  767. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  768. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/transport_security.py +0 -0
  769. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/update_check.py +0 -0
  770. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/__init__.py +0 -0
  771. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/config_hash.py +0 -0
  772. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/config_write_lock.py +0 -0
  773. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  774. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/data_paths.py +0 -0
  775. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  776. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/domain_handlers.py +0 -0
  777. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/entity_membership.py +0 -0
  778. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  779. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  780. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  781. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/operation_manager.py +0 -0
  782. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/python_sandbox.py +0 -0
  783. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  784. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/skill_loader.py +0 -0
  785. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/utils/usage_logger.py +0 -0
  786. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/__init__.py +0 -0
  787. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/enforcement.py +0 -0
  788. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/model.py +0 -0
  789. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/persistence.py +0 -0
  790. {ha_mcp_dev-8.7.0.dev3060 → ha_mcp_dev-8.7.0.dev3061}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.7.0.dev3060
3
+ Version: 8.7.0.dev3061
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.7.0.dev3060"
7
+ version = "8.7.0.dev3061"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.7.0.dev3060"
7
+ version = "8.7.0.dev3061"
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
@@ -9,6 +9,8 @@ from __future__ import annotations
9
9
  from contextlib import AsyncExitStack
10
10
  from typing import Any
11
11
 
12
+ from ._vendor.websockets.exceptions import WebSocketException
13
+
12
14
 
13
15
  def _manager() -> Any:
14
16
  from . import backup_manager
@@ -16,6 +18,81 @@ def _manager() -> Any:
16
18
  return backup_manager
17
19
 
18
20
 
21
+ async def registry_row(
22
+ client: Any, platform: str, unique_id: str
23
+ ) -> dict[str, Any] | None:
24
+ """The entity-registry row of ``platform``'s entity with ``unique_id``."""
25
+ rows = await _manager()._entity_registry_rows(client)
26
+ return next(
27
+ (
28
+ row
29
+ for row in rows
30
+ if row.get("platform") == platform and row.get("unique_id") == unique_id
31
+ ),
32
+ None,
33
+ )
34
+
35
+
36
+ async def with_registry_icon(
37
+ client: Any, platform: str, item: dict[str, Any]
38
+ ) -> dict[str, Any]:
39
+ """The stored item plus the icon its entity's registry entry sets, if any.
40
+
41
+ The registry icon is the one the entity shows, and the helper tools write
42
+ it there (an update always; a create for a zone, or when Core's schema
43
+ has no icon field or cannot be read), so the stored item alone can miss
44
+ it. A failed registry read
45
+ propagates, so the capture reports it instead of saving a snapshot
46
+ without the icon.
47
+ """
48
+ entity = await registry_row(client, platform, str(item.get("id")))
49
+ return {**item, "registry_icon": entity.get("icon") if entity else None}
50
+
51
+
52
+ async def restore_registry_icon(
53
+ client: Any, platform: str, item_id: str, registry_icon: str | None
54
+ ) -> list[str]:
55
+ """Write the recorded registry icon back; problems come back as warnings,
56
+ because the stored item was already restored."""
57
+ bm = _manager()
58
+ try:
59
+ entity = await registry_row(client, platform, item_id)
60
+ if entity is None:
61
+ if registry_icon is None:
62
+ return []
63
+ return [
64
+ f"The registry icon {registry_icon} was not restored: "
65
+ f"{platform} {item_id} has no entity."
66
+ ]
67
+ async with bm.registry_update_lock("entity", entity["entity_id"]):
68
+ await bm._ws_send(
69
+ client,
70
+ {
71
+ "type": "config/entity_registry/update",
72
+ "entity_id": entity["entity_id"],
73
+ "icon": registry_icon,
74
+ },
75
+ )
76
+ except (*bm._CAPTURE_TRANSIENT_ERRORS, WebSocketException) as err:
77
+ return [f"The {platform} was restored, but its registry icon was not: {err}"]
78
+ return []
79
+
80
+
81
+ async def update_with_registry_icon(
82
+ client: Any, platform: str, item_id: str, payload: dict[str, Any]
83
+ ) -> Any:
84
+ """``<platform>/update`` without the snapshot's registry icon, then the icon."""
85
+ recorded = "registry_icon" in payload
86
+ registry_icon = payload.pop("registry_icon", None)
87
+ result = await _manager()._ws_send(client, payload)
88
+ warnings = (
89
+ await restore_registry_icon(client, platform, item_id, registry_icon)
90
+ if recorded
91
+ else []
92
+ )
93
+ return {**result, "warnings": warnings} if warnings else result
94
+
95
+
19
96
  def _recreated_unique_id(saved: dict[str, Any], old_entry: str, new_entry: str) -> str:
20
97
  """Core derives a helper entity's unique_id from its config-entry ID."""
21
98
  return str(saved["unique_id"]).replace(old_entry, new_entry)
@@ -0,0 +1,183 @@
1
+ """The storage helper a helper tool writes, for its pre-write snapshot (#2632).
2
+
3
+ ``ha_config_set_helper``, ``ha_remove_helpers_integrations`` and the zone tools
4
+ resolve their target as ``stored_target`` does: a bare id is a storage id,
5
+ and ``<type>.<name>`` is the entity_id of the helper's registry entry, whose
6
+ ``unique_id`` is the storage id. A renamed entity can carry another helper's
7
+ id as its name, so a bare id never names an entity. The snapshot resolves
8
+ the same way, so it holds the item the write changes. A restore whose write
9
+ fails raises through ``raise_with_restore_outcome``, so its caller still learns
10
+ the safety backup to revert with.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import json
16
+ from typing import Any, NoReturn
17
+
18
+ from ._vendor.fastmcp.exceptions import ToolError
19
+ from .backup_entity_ids import _manager
20
+
21
+
22
+ async def _stored_items(client: Any, helper_type: str) -> list[Any]:
23
+ bm = _manager()
24
+ listed = await bm._ws_send(client, {"type": f"{helper_type}/list"})
25
+ if helper_type == "person" and isinstance(listed, dict):
26
+ listed = listed.get("storage") # YAML-defined persons are not editable
27
+ items: list[Any] = bm._require_list(listed, f"{helper_type}/list")
28
+ return items
29
+
30
+
31
+ def stored_target(
32
+ helper_type: str, target: str, stored_ids: Any, rows: list[Any]
33
+ ) -> tuple[str | None, str | None]:
34
+ """The storage id and entity_id of the stored helper ``target`` names.
35
+
36
+ A bare ``target`` is a storage id; ``<type>.<name>`` is the entity_id of
37
+ a registry entry on the type's platform, whose unique_id is the storage id.
38
+ Its entity_id is None when the item has no registry entry, and both are
39
+ None when nothing matches. A storage id from the registry need not be
40
+ stored: a YAML helper has an entry but no stored item.
41
+ """
42
+ ids = {str(i) for i in stored_ids}
43
+ own = [r for r in rows if r.get("platform") == helper_type]
44
+ if target in ids:
45
+ entity = next(
46
+ (r.get("entity_id") for r in own if r.get("unique_id") == target), None
47
+ )
48
+ return target, entity
49
+ row = next((r for r in own if r.get("entity_id") == target), None)
50
+ if row is None or not row.get("unique_id"):
51
+ return None, None
52
+ return str(row["unique_id"]), target
53
+
54
+
55
+ async def fetch_helper(client: Any, entity_id: str, helper_type: str) -> Any:
56
+ """Fetch a storage helper's full config from its ``<helper_type>/list``.
57
+
58
+ Registered for the storage helper types only; flow helpers (config
59
+ entries) have their own handler family (``_make_flow_helper_handler``).
60
+ A failed list or registry read propagates: maybe_snapshot logs a WARNING,
61
+ or for a mandatory snapshot (a restore's safety backup) blocks the write,
62
+ rather than silently skipping.
63
+ """
64
+ bm = _manager()
65
+ items = await _stored_items(client, helper_type)
66
+ by_id = {str(item.get("id")): item for item in items}
67
+ storage_id, _ = stored_target(
68
+ helper_type, entity_id, by_id, await bm._entity_registry_rows(client)
69
+ )
70
+ item = by_id.get(storage_id) if storage_id else None
71
+ return await bm._registry_snapshot(client, helper_type, item) if item else None
72
+
73
+
74
+ async def safety_target(
75
+ client: Any, domain: str, entity_id: str, config: Any
76
+ ) -> str | None:
77
+ """The entity a restore's safety backup is taken under, None when the item
78
+ the restore writes no longer exists.
79
+
80
+ The restore writes a stored item by its id; the backup is keyed by the
81
+ entity_id the item had, which a rename since can leave naming nothing, or
82
+ another item. For a storage item the registry entry whose unique_id is the
83
+ stored id follows it. An item can outlive its registry entry, so only its
84
+ absence from the stored items means it is gone: the restore recreates it or
85
+ fails, and overwrites nothing that needs a backup.
86
+ """
87
+ bm = _manager()
88
+ platform = domain.removeprefix("helper_")
89
+ stored = config.get("id") if isinstance(config, dict) else None
90
+ if not stored or platform not in bm._HELPER_LIST_TYPES:
91
+ return entity_id
92
+ try:
93
+ rows = await bm._entity_registry_rows(client)
94
+ except bm._CAPTURE_TRANSIENT_ERRORS as err:
95
+ raise bm.MandatoryBackupError(
96
+ f"the entity registry could not be read: {type(err).__name__}",
97
+ safe_detail="the entity registry could not be read",
98
+ ) from err
99
+ target: str | None = next(
100
+ (
101
+ row["entity_id"]
102
+ for row in rows
103
+ if row.get("platform") == platform and row.get("unique_id") == str(stored)
104
+ ),
105
+ None,
106
+ )
107
+ if target is not None:
108
+ return target
109
+ try:
110
+ items = await _stored_items(client, platform)
111
+ except bm._CAPTURE_TRANSIENT_ERRORS as err:
112
+ raise bm.MandatoryBackupError(
113
+ f"the stored {platform} items could not be read: {type(err).__name__}",
114
+ safe_detail=f"the stored {platform} items could not be read",
115
+ ) from err
116
+ if not any(str(item.get("id")) == str(stored) for item in items):
117
+ return None
118
+ # Without a registry entry the item is found by its storage id.
119
+ return str(stored)
120
+
121
+
122
+ def require_holds(config: Any, stored: Any, entity_id: str) -> None:
123
+ """Block a restore whose safety backup would hold another item than the
124
+ one it overwrites: an entity_id the registry cannot follow, renamed since
125
+ the backup, can name another item."""
126
+ held = config.get("id") if isinstance(config, dict) else None
127
+ if held != stored:
128
+ raise _manager().BackupRestoreError(
129
+ f"Restore blocked: the safety backup would hold {held}, not {stored}, "
130
+ f"which this restore overwrites: {entity_id} names another item since "
131
+ "this backup. Nothing was changed.",
132
+ reason="backup_capture_failed",
133
+ suggestions=[
134
+ f"Find the current entity_id of {stored} with ha_search",
135
+ f"If {stored} has no entity, rename the entity that holds {entity_id}",
136
+ ],
137
+ )
138
+
139
+
140
+ def raise_with_restore_outcome(err: BaseException, outcome: dict[str, Any]) -> NoReturn:
141
+ """Raise a failed restore write's error with the restore's outcome.
142
+
143
+ Every error keeps the outcome as ``restore_outcome`` for the Settings
144
+ handler and is raised again as it is. A tool error reaches the MCP client
145
+ as its JSON text alone, so it is raised as a copy with the outcome in that
146
+ text as ``data``, chained to the original so logs keep where it failed.
147
+ """
148
+ err.restore_outcome = outcome # type: ignore[attr-defined]
149
+ original: BaseException = err
150
+ if not isinstance(err, ToolError):
151
+ raise original
152
+ try:
153
+ reply = json.loads(str(err))
154
+ except ValueError:
155
+ reply = None # raised below, outside this handler, to keep its context
156
+ if not isinstance(reply, dict):
157
+ raise original
158
+ data = reply.get("data")
159
+ reply["data"] = {**data, **outcome} if isinstance(data, dict) else outcome
160
+ carried = ToolError(
161
+ json.dumps(reply, indent=2, default=str), log_level=err.log_level
162
+ )
163
+ carried.__dict__.update(err.__dict__)
164
+ raise carried from err
165
+
166
+
167
+ def note_no_safety_backup(
168
+ outcome: Any, domain: str, target: str | None, config: Any
169
+ ) -> None:
170
+ """Say why a restore goes ahead without a safety backup."""
171
+ if target is None: # safety_target: the stored item no longer exists
172
+ stored = config.get("id") if isinstance(config, dict) else None
173
+ outcome["warnings"] = [
174
+ f"No safety backup was taken: {domain.removeprefix('helper_')} "
175
+ f"{stored} no longer exists, "
176
+ "so this restore overwrites none of its state."
177
+ ]
178
+ return
179
+ outcome["warnings"] = [
180
+ f"No safety backup was taken: nothing was found under {target}. If it "
181
+ "was renamed since this backup, the restore overwrites its current state "
182
+ "without one."
183
+ ]
@@ -75,9 +75,21 @@ from .backup_diff import (
75
75
  _compute_json_patch,
76
76
  _summarize_patch_counts,
77
77
  )
78
- from .backup_entity_ids import _restore_entity_ids
78
+ from .backup_entity_ids import (
79
+ _restore_entity_ids,
80
+ update_with_registry_icon,
81
+ with_registry_icon,
82
+ )
83
+ from .backup_helper_target import fetch_helper as _fetch_helper
84
+ from .backup_helper_target import note_no_safety_backup as _note_no_safety_backup
85
+ from .backup_helper_target import (
86
+ raise_with_restore_outcome as _raise_with_restore_outcome,
87
+ )
88
+ from .backup_helper_target import require_holds as _require_holds
89
+ from .backup_helper_target import safety_target as _safety_target
79
90
  from .backup_integrations import fetch_integration, restore_integration
80
91
  from .backup_tags import restore_tag, tag_snapshot
92
+ from .backup_zones import fetch_zone, restore_zone
81
93
  from .client.rest_client import (
82
94
  HomeAssistantCommandError,
83
95
  HomeAssistantConnectionError,
@@ -738,6 +750,7 @@ class BackupManager:
738
750
  force: bool = False,
739
751
  mandatory: bool = False,
740
752
  skip_reasons: list[str] | None = None,
753
+ holds: Any = None,
741
754
  ) -> Path | None:
742
755
  """Capture a snapshot for ``domain:entity_id`` if throttle elapsed.
743
756
 
@@ -765,6 +778,9 @@ class BackupManager:
765
778
 
766
779
  ``skip_reasons`` (best-effort mode) collects why a capture that was
767
780
  due did not happen, so the caller can tell its own caller.
781
+
782
+ ``holds`` is the id the captured item must have; another item raises
783
+ ``BackupRestoreError`` before anything is written.
768
784
  """
769
785
  if not force:
770
786
  await self.ensure_directory_ready()
@@ -809,6 +825,8 @@ class BackupManager:
809
825
  )
810
826
  if config is _SNAPSHOT_SKIP:
811
827
  return None
828
+ if holds is not None:
829
+ _require_holds(config, holds, entity_id)
812
830
  return await self._write_and_rotate(
813
831
  domain, entity_id, key, config, tool_name, now, mandatory=mandatory
814
832
  )
@@ -1502,7 +1520,9 @@ class BackupManager:
1502
1520
  flow_driven = is_flow or domain == "helper_config_subentry"
1503
1521
  if needs_safety and (flow_driven or take_safety_backup):
1504
1522
  step = "safety_backup"
1505
- safety_path = await self._capture_restore_safety(domain, entity_id)
1523
+ safety_path = await self._capture_restore_safety(
1524
+ domain, entity_id, outcome, config
1525
+ )
1506
1526
  if safety_path is not None:
1507
1527
  self._protect_snapshot(safety_path.name)
1508
1528
  await _await_backup_io(_require_restore_safety, safety_path)
@@ -1541,7 +1561,9 @@ class BackupManager:
1541
1561
  reason=_flow_failure_reason(step, err),
1542
1562
  **outcome,
1543
1563
  ) from err
1544
- raise
1564
+ # The error keeps its own type and code; the safety backup to revert
1565
+ # with and any warnings ride along for the caller.
1566
+ _raise_with_restore_outcome(err, {**outcome, "apply_status": apply_status})
1545
1567
  finally:
1546
1568
  if safety_path is not None:
1547
1569
  self._unprotect_snapshot(safety_path.name)
@@ -1559,21 +1581,41 @@ class BackupManager:
1559
1581
  # existing one is checked against the snapshot by its options flow.
1560
1582
  return await handler.fetch(self._client, entity_id) is not None
1561
1583
 
1562
- async def _capture_restore_safety(self, domain: str, entity_id: str) -> Path | None:
1584
+ async def _capture_restore_safety(
1585
+ self,
1586
+ domain: str,
1587
+ entity_id: str,
1588
+ outcome: dict[str, Any] | None = None,
1589
+ config: Any = None,
1590
+ ) -> Path | None:
1563
1591
  """Take a restore's recovery point; a failed capture raises and blocks it."""
1564
1592
  is_flow = _is_flow_helper_domain(domain)
1565
- path = await self.maybe_snapshot(
1566
- domain,
1567
- entity_id,
1568
- tool_name="ha_manage_backup.restore.safety",
1569
- force=is_flow or domain == "helper_config_subentry",
1570
- mandatory=True,
1571
- )
1593
+ flow_driven = is_flow or domain == "helper_config_subentry"
1594
+ if not flow_driven and not getattr(self._settings, "enable_auto_backup", False):
1595
+ return None # auto-backup off: no safety backup is promised
1596
+ # The restore overwrites the current state, so the throttle that a
1597
+ # recent snapshot of an older state set does not apply.
1598
+ target = await _safety_target(self._client, domain, entity_id, config)
1599
+ checked = not flow_driven and outcome is not None
1600
+ path = None
1601
+ if target is not None: # None: the item the restore writes is gone
1602
+ path = await self.maybe_snapshot(
1603
+ domain,
1604
+ target,
1605
+ tool_name="ha_manage_backup.restore.safety",
1606
+ force=True,
1607
+ mandatory=True,
1608
+ holds=config.get("id")
1609
+ if checked and isinstance(config, dict)
1610
+ else None,
1611
+ )
1572
1612
  if path is None and is_flow:
1573
1613
  raise MandatoryBackupError(
1574
1614
  f"{_flow_label(_flow_type(domain))} helper no longer exists; "
1575
1615
  "restore was not attempted"
1576
1616
  )
1617
+ if checked and path is None:
1618
+ _note_no_safety_backup(outcome, domain, target, config)
1577
1619
  return path
1578
1620
 
1579
1621
  # ----- diff ----------------------------------------------------------
@@ -1592,6 +1634,14 @@ class BackupManager:
1592
1634
  if handler is None:
1593
1635
  raise LookupError(f"No diff handler registered for domain {domain!r}")
1594
1636
  current = await handler.fetch(self._client, data["entity_id"])
1637
+ if (
1638
+ isinstance(current, dict)
1639
+ and isinstance(data["config"], dict)
1640
+ and "registry_icon" not in data["config"]
1641
+ ):
1642
+ # A snapshot from before registry icons were recorded: its restore
1643
+ # leaves the registry alone, so the icon is no difference.
1644
+ current.pop("registry_icon", None)
1595
1645
  if _is_flow_helper_domain(domain) and current is not None:
1596
1646
  # Both MCP and Settings preview this comparison. Registry metadata
1597
1647
  # is recreation-only; an existing-entry restore applies options.
@@ -2524,25 +2574,6 @@ async def _restore_calendar_event(client: Any, entity_id: str, config: Any) -> A
2524
2574
  return await _recreate_calendar_event(client, cal, event, start, end)
2525
2575
 
2526
2576
 
2527
- # Zones — zone/{list,update} (no ``config/`` prefix per HA's actual WS API;
2528
- # matches ``tools_zones.py`` which is the authoritative usage).
2529
-
2530
-
2531
- async def _fetch_zone(client: Any, entity_id: str) -> Any:
2532
- items = _require_list(await _ws_send(client, {"type": "zone/list"}), "zone/list")
2533
- for item in items:
2534
- if item.get("id") == entity_id or item.get("name") == entity_id:
2535
- return item
2536
- return None
2537
-
2538
-
2539
- async def _restore_zone(client: Any, entity_id: str, config: Any) -> Any:
2540
- payload = _strip_readonly(config, "id")
2541
- payload["type"] = "zone/update"
2542
- payload["zone_id"] = config.get("id", entity_id)
2543
- return await _ws_send(client, payload)
2544
-
2545
-
2546
2577
  # Areas / floors — config/area_registry/{list,update}, config/floor_registry/{list,update}
2547
2578
 
2548
2579
 
@@ -2717,8 +2748,9 @@ async def _restore_device(client: Any, entity_id: str, config: Any) -> Any:
2717
2748
  # Integration enable/disable — restore re-applies the disabled flag.
2718
2749
 
2719
2750
 
2720
- # Helpers — one handler family. Entity ID is "<helper_type>:<id>" so each
2721
- # helper type lists/restores via its native WS endpoints. The decorator
2751
+ # Helpers — one handler family. Entity ID is the id the tool was given (a bare
2752
+ # id or <type>.<id>); each helper type lists/restores via its native WS
2753
+ # endpoints (fetch: backup_helper_target.py). The decorator
2722
2754
  # constructs the domain key as ``helper_<type>`` so files group naturally.
2723
2755
 
2724
2756
  _HELPER_LIST_TYPES = {
@@ -2737,57 +2769,10 @@ _HELPER_LIST_TYPES = {
2737
2769
  }
2738
2770
 
2739
2771
 
2740
- async def _fetch_helper(client: Any, entity_id: str, helper_type: str) -> Any:
2741
- """Fetch a storage helper's full config from its ``<helper_type>/list``.
2742
-
2743
- Registered for ``_KNOWN_HELPER_TYPES`` only; flow helpers (config
2744
- entries) have their own handler family (``_make_flow_helper_handler``).
2745
- """
2746
- listed = await _ws_send(client, {"type": f"{helper_type}/list"})
2747
- if helper_type == "person" and isinstance(listed, dict):
2748
- listed = listed.get("storage") # YAML-defined persons are not editable
2749
- items = _require_list(listed, f"{helper_type}/list")
2750
- object_id = entity_id.split(".", 1)[-1] if "." in entity_id else entity_id
2751
- for item in items:
2752
- if item.get("id") == object_id or item.get("id") == entity_id:
2753
- return await tag_snapshot(client, item) if helper_type == "tag" else item
2754
- # Fallback for renamed helpers: after an entity_id rename the object_id
2755
- # no longer equals the storage collection id (which stays the original
2756
- # create-time id == the registry unique_id), so the direct match above
2757
- # misses and the snapshot was silently skipped. Resolve the unique_id
2758
- # via the entity registry and match on that — the same key the helper
2759
- # update tool itself resolves to.
2760
- eid = entity_id if "." in entity_id else f"{helper_type}.{entity_id}"
2761
- try:
2762
- entry = await _ws_send(
2763
- client, {"type": "config/entity_registry/get", "entity_id": eid}
2764
- )
2765
- except HomeAssistantError as err:
2766
- # Only a genuine "entity not found" means there's nothing to back up;
2767
- # transport/auth/5xx errors must propagate so maybe_snapshot logs a
2768
- # WARNING rather than silently skipping. Same POLICY as _fetch_automation,
2769
- # but matched on the message substring because config/entity_registry/get
2770
- # failures arrive as a WS command error with no status_code to switch on.
2771
- # Best-effort: if HA's not-found wording ever changes, a real miss
2772
- # degrades to a WARNING + skip (never a swallowed fatal error).
2773
- msg = str(err).lower()
2774
- if "not_found" in msg or "not found" in msg:
2775
- return None
2776
- raise
2777
- unique_id = entry.get("unique_id") if isinstance(entry, dict) else None
2778
- if unique_id:
2779
- for item in items:
2780
- if str(item.get("id")) == str(unique_id):
2781
- return (
2782
- await tag_snapshot(client, item) if helper_type == "tag" else item
2783
- )
2784
- return None
2785
-
2786
-
2787
2772
  async def _restore_helper(
2788
2773
  client: Any, entity_id: str, config: Any, helper_type: str
2789
2774
  ) -> Any:
2790
- """Restore a storage-backed helper via ``<helper_type>/update``.
2775
+ """Restore a storage helper via ``<helper_type>/update`` (tag, zone: restore_*).
2791
2776
 
2792
2777
  Symmetric with ``_fetch_helper``: only list-backed types are
2793
2778
  supported. Unsupported types raise ``LookupError`` so the restore
@@ -2803,9 +2788,19 @@ async def _restore_helper(
2803
2788
  payload = _strip_readonly(config, "id")
2804
2789
  payload["type"] = f"{helper_type}/update"
2805
2790
  payload[f"{helper_type}_id"] = config.get("id", entity_id)
2791
+ item_id = payload[f"{helper_type}_id"]
2806
2792
  if helper_type == "tag":
2807
- return await restore_tag(client, payload["tag_id"], payload)
2808
- return await _ws_send(client, payload)
2793
+ return await restore_tag(client, item_id, payload)
2794
+ if helper_type == "zone":
2795
+ return await restore_zone(client, item_id, payload)
2796
+ return await update_with_registry_icon(client, helper_type, item_id, payload)
2797
+
2798
+
2799
+ async def _registry_snapshot(client: Any, helper_type: str, item: dict) -> Any:
2800
+ """The stored item plus its registry icon, and for a tag its registry name."""
2801
+ if helper_type == "tag":
2802
+ return await tag_snapshot(client, item)
2803
+ return await with_registry_icon(client, helper_type, item)
2809
2804
 
2810
2805
 
2811
2806
  # Files & YAML (#1579 PR2) — capture is MCP-side via the ha_mcp_tools
@@ -3942,7 +3937,8 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
3942
3937
  mgr.register(
3943
3938
  DomainHandler("calendar_event", _fetch_calendar_event, _restore_calendar_event)
3944
3939
  )
3945
- mgr.register(DomainHandler("zone", _fetch_zone, _restore_zone))
3940
+ restore_zone_item = functools.partial(_restore_helper, helper_type="zone")
3941
+ mgr.register(DomainHandler("zone", fetch_zone, restore_zone_item))
3946
3942
  mgr.register(
3947
3943
  DomainHandler("area_or_floor", _fetch_area_or_floor, _restore_area_or_floor)
3948
3944
  )
@@ -1,4 +1,4 @@
1
- """A tag's name in its snapshot and on restore.
1
+ """A tag's name and icon in its snapshot and on restore.
2
2
 
3
3
  Core keeps a tag's name in the entity registry, not in the tag store:
4
4
  ``tag/list`` fills ``name`` with ``entity.name or entity.original_name`` (the
@@ -11,31 +11,29 @@ from __future__ import annotations
11
11
 
12
12
  from typing import Any
13
13
 
14
- from .backup_entity_ids import _manager
14
+ from .backup_entity_ids import _manager, registry_row, restore_registry_icon
15
15
 
16
16
 
17
17
  async def _tag_entity(client: Any, tag_id: str) -> dict[str, Any] | None:
18
- bm = _manager()
19
- return next(
20
- (
21
- row
22
- for row in await bm._entity_registry_rows(client)
23
- if row.get("platform") == "tag" and row.get("unique_id") == tag_id
24
- ),
25
- None,
26
- )
18
+ return await registry_row(client, "tag", tag_id)
27
19
 
28
20
 
29
21
  async def tag_snapshot(client: Any, item: dict[str, Any]) -> dict[str, Any]:
30
22
  """The listed tag with its registry name instead of the listed fallback."""
31
23
  entity = await _tag_entity(client, str(item.get("id")))
32
- return {**item, "name": entity.get("name") if entity else item.get("name")}
24
+ return {
25
+ **item,
26
+ "name": entity.get("name") if entity else item.get("name"),
27
+ "registry_icon": entity.get("icon") if entity else None,
28
+ }
33
29
 
34
30
 
35
31
  async def restore_tag(client: Any, tag_id: str, payload: dict[str, Any]) -> Any:
36
32
  """``tag/update`` without a name the tag never had; a name given after the
37
33
  snapshot is cleared in the registry, which ``tag/update`` cannot do."""
38
34
  bm = _manager()
35
+ recorded = "registry_icon" in payload
36
+ registry_icon = payload.pop("registry_icon", None)
39
37
  unnamed = payload.get("name") is None
40
38
  if unnamed:
41
39
  payload.pop("name", None)
@@ -51,4 +49,7 @@ async def restore_tag(client: Any, tag_id: str, payload: dict[str, Any]) -> Any:
51
49
  "name": None,
52
50
  },
53
51
  )
54
- return result
52
+ if not recorded:
53
+ return result
54
+ warnings = await restore_registry_icon(client, "tag", tag_id, registry_icon)
55
+ return {**result, "warnings": warnings} if warnings else result