ha-mcp-dev 8.7.0.dev3067__tar.gz → 8.7.0.dev3072__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.dev3067 → ha_mcp_dev-8.7.0.dev3072}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/pyproject.toml.orig +1 -1
  4. ha_mcp_dev-8.7.0.dev3072/src/ha_mcp/backup_dashboards.py +257 -0
  5. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_manager.py +71 -94
  6. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/dashboard_card_describe.py +73 -46
  7. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_config_dashboards.py +149 -201
  8. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_resources.py +107 -110
  9. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_zones.py +18 -6
  10. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/LICENSE +0 -0
  11. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/README.md +0 -0
  12. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/__init__.py +0 -0
  13. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_rich_compat.py +0 -0
  16. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/__init__.py +0 -0
  17. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  18. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  19. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  20. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  21. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  22. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  23. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  24. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  25. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  26. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  27. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  28. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  29. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  30. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  31. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  32. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  33. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  34. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  35. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  36. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  37. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  38. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  39. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  40. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  41. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  42. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  43. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  44. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  45. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  46. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  47. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  48. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  49. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  50. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  51. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  52. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  53. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  54. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  55. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  56. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  57. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  58. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  59. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  60. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  61. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  62. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  63. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  64. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  65. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  66. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  67. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  68. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  69. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  70. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  71. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  72. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  73. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  74. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  75. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  76. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  77. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  78. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  79. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  80. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  81. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  82. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  83. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  84. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  85. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  86. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  87. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  88. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  89. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  90. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  91. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  92. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  93. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  94. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  95. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  96. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  97. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  98. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  99. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  100. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  101. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  102. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  103. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  104. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  105. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  106. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  107. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  108. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  109. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  110. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  111. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  112. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  113. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  114. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  115. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  116. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  117. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  118. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  119. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  120. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  121. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  122. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  123. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  124. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  125. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  126. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  127. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  128. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  129. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  130. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  131. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  132. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  133. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  134. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  135. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  136. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  137. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  138. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  139. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  140. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  141. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  142. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  143. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  144. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  145. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  146. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  147. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  148. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  149. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  150. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  151. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  152. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  153. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  154. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  155. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  156. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  157. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  158. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  159. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  160. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  161. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  162. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  163. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  164. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  165. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  166. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  167. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  168. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  169. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  170. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  171. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  172. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  173. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  174. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  175. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  176. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  177. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  178. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  179. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  180. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  181. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  182. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  183. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  184. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  185. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  186. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  187. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  188. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  189. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  190. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  191. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  192. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  193. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  194. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  195. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  196. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  197. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  198. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  199. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  200. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  201. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  202. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  203. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  204. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  205. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  206. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  207. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  208. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  209. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  210. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  211. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  212. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  213. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  214. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  215. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  216. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  217. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  218. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  219. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  220. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  221. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  222. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  223. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  224. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  225. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  226. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  227. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  228. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  229. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  230. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  231. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  232. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  233. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  234. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  235. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  236. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  237. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  238. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  239. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  240. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  241. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  242. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  243. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  244. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  245. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  246. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  247. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  248. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  249. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  250. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  251. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  252. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  253. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  254. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  255. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  256. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  257. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  258. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  259. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  260. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  261. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  262. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  263. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  264. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  265. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  266. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  267. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  268. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  269. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  270. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  271. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  272. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  273. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  274. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  275. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  276. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  277. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  278. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  279. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  280. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  281. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  282. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  283. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  284. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  285. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  286. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  287. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  288. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  289. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  290. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  291. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  292. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  293. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  294. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  295. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  296. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  297. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  298. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  299. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  300. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  301. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  302. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  303. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  304. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  305. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  306. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  307. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  308. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  309. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  310. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  311. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  312. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  313. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  314. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  315. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  316. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  317. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  318. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  319. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  320. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  321. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  322. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  323. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  324. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  325. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  326. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  327. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  328. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  329. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  330. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  331. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  332. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  333. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  334. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  335. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  336. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  337. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  338. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  339. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  340. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  341. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  342. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  343. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  344. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  345. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  346. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  347. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  348. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  349. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  350. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  351. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  352. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  353. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  354. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  355. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  356. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  357. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  358. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  359. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  360. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  361. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  362. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  363. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  364. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  365. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  366. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  367. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  368. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  369. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  370. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  371. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  372. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  373. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  374. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  375. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  376. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  377. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  378. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  379. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  380. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  381. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  382. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  383. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  384. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  385. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  386. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  387. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  388. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  389. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  390. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  391. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  392. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  393. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  394. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  395. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  396. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  397. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  398. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  399. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  400. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  401. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  402. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  403. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  404. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  405. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  406. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  407. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  408. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  409. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  410. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  411. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  412. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  413. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  414. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  415. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  416. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  417. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  418. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  419. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  420. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  421. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  422. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  423. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  424. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  425. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  426. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  427. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  428. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  429. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  430. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  431. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/requirements.txt +0 -0
  432. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  433. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  434. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  435. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  436. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  437. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  438. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  439. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  440. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  441. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  442. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  443. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  444. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  445. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  446. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  447. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  448. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  449. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  450. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  451. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  452. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  453. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  454. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  455. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  456. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  457. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  458. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  459. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  460. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  461. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  462. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  463. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  464. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  465. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  466. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  467. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  468. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  469. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  470. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  471. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  472. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  473. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  474. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  475. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  476. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  477. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  478. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  479. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  480. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  481. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  482. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  483. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  484. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  485. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  486. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  487. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  488. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/_version.py +0 -0
  489. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/app_discovery.py +0 -0
  490. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/auth/__init__.py +0 -0
  491. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/auth/consent_form.py +0 -0
  492. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/auth/oidc_compat.py +0 -0
  493. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/auth/provider.py +0 -0
  494. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_diff.py +0 -0
  495. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_entity_ids.py +0 -0
  496. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_helper_target.py +0 -0
  497. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_integrations.py +0 -0
  498. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_tags.py +0 -0
  499. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/backup_zones.py +0 -0
  500. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/browser_landing.py +0 -0
  501. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/__init__.py +0 -0
  502. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/admin_routes.py +0 -0
  503. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/rest_client.py +0 -0
  504. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/supervisor_client.py +0 -0
  505. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/websocket_client.py +0 -0
  506. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/client/websocket_listener.py +0 -0
  507. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config.py +0 -0
  508. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config_backup.py +0 -0
  509. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config_meta.py +0 -0
  510. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config_overrides.py +0 -0
  511. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config_registry.py +0 -0
  512. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/config_settings.py +0 -0
  513. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  514. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  515. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  516. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  517. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  518. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  519. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/errors.py +0 -0
  520. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/ha_request_queue.py +0 -0
  521. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  522. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/http_transport.py +0 -0
  523. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/image_info.py +0 -0
  524. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/llm_exposure.py +0 -0
  525. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/log_filters.py +0 -0
  526. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/__init__.py +0 -0
  527. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/approval_queue.py +0 -0
  528. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/decision_pin.py +0 -0
  529. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/decisions.py +0 -0
  530. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/editing.py +0 -0
  531. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/evaluator.py +0 -0
  532. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/events.py +0 -0
  533. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/handlers.py +0 -0
  534. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/middleware.py +0 -0
  535. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/model.py +0 -0
  536. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/mrtr.py +0 -0
  537. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/persistence.py +0 -0
  538. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/server_channels.py +0 -0
  539. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/policy/value_sources.py +0 -0
  540. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/py.typed +0 -0
  541. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/read_only.py +0 -0
  542. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/redaction.py +0 -0
  543. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/renamed_tools.py +0 -0
  544. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  545. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  546. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  547. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  548. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  549. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  550. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  551. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  552. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  553. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  554. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  555. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  556. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  557. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  558. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  559. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  560. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  561. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/server.py +0 -0
  562. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/server_instructions.py +0 -0
  563. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/server_lifespan.py +0 -0
  564. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/server_tool_text.py +0 -0
  565. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/__init__.py +0 -0
  566. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  567. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  568. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  569. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  570. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  571. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  572. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  573. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  574. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  575. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  576. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_theme.py +0 -0
  577. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  578. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  579. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  580. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  581. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  582. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  583. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  584. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  585. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  586. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  587. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  588. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  589. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  590. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  591. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  592. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  593. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  594. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  595. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings.css +0 -0
  596. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings.html +0 -0
  597. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  598. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  599. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  600. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  601. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  602. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  603. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  604. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  605. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  606. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/smoke_test.py +0 -0
  607. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  608. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/strict_bps.py +0 -0
  609. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tool_dispatch.py +0 -0
  610. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/__init__.py +0 -0
  611. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/area_messages.py +0 -0
  612. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/auto_backup.py +0 -0
  613. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/backup.py +0 -0
  614. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/backup_access.py +0 -0
  615. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  616. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  617. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/best_practice_result.py +0 -0
  618. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  619. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  620. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  621. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/blueprint_write.py +0 -0
  622. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/bug_report_config.py +0 -0
  623. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  624. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/bulk_selector.py +0 -0
  625. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/coercion.py +0 -0
  626. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_api.py +0 -0
  627. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_config_entries.py +0 -0
  628. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_config_reads.py +0 -0
  629. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  630. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_devices.py +0 -0
  631. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  632. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_registries.py +0 -0
  633. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  634. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  635. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  636. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  637. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  638. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  639. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  640. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  641. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  642. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  643. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  644. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  645. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  646. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  647. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  648. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  649. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  650. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  651. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  652. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  653. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  654. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  655. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  656. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_write_errors.py +0 -0
  657. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  658. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/core_contract.py +0 -0
  659. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  660. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  661. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/dev_backup.py +0 -0
  662. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/device_control.py +0 -0
  663. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/device_enrichment.py +0 -0
  664. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  665. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/energy_preferences.py +0 -0
  666. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  667. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/entity_registration.py +0 -0
  668. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/entity_removal.py +0 -0
  669. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  670. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  671. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  672. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/hacs_registration.py +0 -0
  673. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/helper_flows.py +0 -0
  674. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/helpers.py +0 -0
  675. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/history_response.py +0 -0
  676. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  677. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  678. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/log_common.py +0 -0
  679. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/log_sources.py +0 -0
  680. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  681. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  682. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/__init__.py +0 -0
  683. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/base.py +0 -0
  684. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/matter.py +0 -0
  685. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/thread.py +0 -0
  686. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  687. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/zwave.py +0 -0
  688. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  689. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/recorder_errors.py +0 -0
  690. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/reference_validator.py +0 -0
  691. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/registry.py +0 -0
  692. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  693. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/response_helpers.py +0 -0
  694. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/scene_discovery.py +0 -0
  695. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/__init__.py +0 -0
  696. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/base.py +0 -0
  697. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/component.py +0 -0
  698. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/entities.py +0 -0
  699. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/legacy.py +0 -0
  700. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/modes.py +0 -0
  701. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/overview.py +0 -0
  702. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/response.py +0 -0
  703. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/search/state.py +0 -0
  704. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  705. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  706. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  707. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  708. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  709. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  710. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  711. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  712. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  713. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  714. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  715. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/statistics_resets.py +0 -0
  716. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/system_restart.py +0 -0
  717. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tool_hints.py +0 -0
  718. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  719. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_addons.py +0 -0
  720. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_areas.py +0 -0
  721. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  722. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  723. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  724. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_calendar.py +0 -0
  725. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_camera.py +0 -0
  726. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_categories.py +0 -0
  727. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_code.py +0 -0
  728. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  729. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  730. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  731. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  732. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  733. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_dev.py +0 -0
  734. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_energy.py +0 -0
  735. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_entities.py +0 -0
  736. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  737. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_groups.py +0 -0
  738. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_hacs.py +0 -0
  739. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_history.py +0 -0
  740. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_integrations.py +0 -0
  741. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_labels.py +0 -0
  742. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_logs.py +0 -0
  743. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_radio.py +0 -0
  744. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_registry.py +0 -0
  745. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_search.py +0 -0
  746. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  747. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_service.py +0 -0
  748. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_services.py +0 -0
  749. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_system.py +0 -0
  750. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_themes.py +0 -0
  751. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_todo.py +0 -0
  752. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_traces.py +0 -0
  753. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_updates.py +0 -0
  754. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_utility.py +0 -0
  755. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  756. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  757. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  758. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/util_helpers.py +0 -0
  759. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/validation_middleware.py +0 -0
  760. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/tools/ws_waiters.py +0 -0
  761. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/__init__.py +0 -0
  762. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/categorized_search.py +0 -0
  763. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/compact_params.py +0 -0
  764. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/component_helpers.py +0 -0
  765. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/component_search.py +0 -0
  766. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  767. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  768. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/transport_security.py +0 -0
  769. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/update_check.py +0 -0
  770. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/__init__.py +0 -0
  771. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/config_hash.py +0 -0
  772. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/config_write_lock.py +0 -0
  773. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  774. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/data_paths.py +0 -0
  775. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  776. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/domain_handlers.py +0 -0
  777. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/entity_membership.py +0 -0
  778. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  779. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  780. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  781. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/operation_manager.py +0 -0
  782. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/python_sandbox.py +0 -0
  783. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  784. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/skill_loader.py +0 -0
  785. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/utils/usage_logger.py +0 -0
  786. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/visibility/__init__.py +0 -0
  787. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/visibility/enforcement.py +0 -0
  788. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/visibility/model.py +0 -0
  789. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/src/ha_mcp/visibility/persistence.py +0 -0
  790. {ha_mcp_dev-8.7.0.dev3067 → ha_mcp_dev-8.7.0.dev3072}/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.dev3067
3
+ Version: 8.7.0.dev3072
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.dev3067"
7
+ version = "8.7.0.dev3072"
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.dev3067"
7
+ version = "8.7.0.dev3072"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -0,0 +1,257 @@
1
+ """Auto-backup handlers for dashboards.
2
+
3
+ A dashboard snapshot, marked ``kind: "dashboard_settings"``, holds the
4
+ dashboard's ``lovelace/dashboards/list`` storage row beside its config body,
5
+ ``{"dashboard": <row>, "config": <body>}``, so a restore can re-create a deleted
6
+ dashboard: Core's ``lovelace/config/save`` answers ``config_not_found`` for a
7
+ url_path it has no dashboard for. A restore reads the live list before any
8
+ write; a dashboard that still exists gets its config back, then its settings
9
+ through ``lovelace/dashboards/update``. The row is ``None`` for a dashboard the
10
+ list holds no storage row for (YAML, or a fresh install's default before Core
11
+ migrates it); an unreadable list fails the capture instead. The body is
12
+ ``None`` for a dashboard whose config was never saved. A dashboard snapshot
13
+ without that ``kind`` predates the row and holds the body alone; it restores
14
+ and compares as the body only.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Any
20
+
21
+ from .backup_entity_ids import _manager
22
+ from .client.rest_client import HomeAssistantCommandError, HomeAssistantError
23
+
24
+ # Core's DASHBOARD_BASE_UPDATE_FIELDS: what lovelace/dashboards/update accepts.
25
+ _SETTINGS_FIELDS = ("title", "icon", "require_admin", "show_in_sidebar")
26
+ _DASHBOARD_KIND = "dashboard_settings"
27
+
28
+
29
+ def valid_dashboard_capture(config: Any) -> bool:
30
+ """The shape a ``_DASHBOARD_KIND`` snapshot's config must have."""
31
+ if not isinstance(config, dict) or set(config) != {"dashboard", "config"}:
32
+ return False
33
+ row = config["dashboard"]
34
+ return row is None or (
35
+ isinstance(row, dict) and isinstance(row.get("url_path"), str)
36
+ )
37
+
38
+
39
+ def dashboard_snapshot(data: dict[str, Any]) -> tuple[dict[str, Any], bool]:
40
+ """A snapshot's ``{"dashboard", "config"}`` value, and whether it is a
41
+ legacy body-only snapshot (one written without ``_DASHBOARD_KIND``)."""
42
+ if data.get("kind") == _DASHBOARD_KIND:
43
+ return data["config"], False
44
+ return {"dashboard": None, "config": data["config"]}, True
45
+
46
+
47
+ def _storage_row(
48
+ dashboards: list[dict[str, Any]] | None, url_path: str
49
+ ) -> dict[str, Any] | None:
50
+ return next(
51
+ (
52
+ d
53
+ for d in dashboards or []
54
+ if d.get("url_path") == url_path and d.get("mode") == "storage"
55
+ ),
56
+ None,
57
+ )
58
+
59
+
60
+ async def fetch_dashboard(client: Any, entity_id: str) -> Any:
61
+ """Fetch a dashboard config via the same helper the get tool uses.
62
+
63
+ The identifier is pre-resolved to its canonical url_path via the shared
64
+ ``_resolve_dashboard`` (component ``list`` when available), then the config is
65
+ read through the component ``get`` (one in-process frame) with a fall back to
66
+ the legacy ``lovelace/config`` read (``_get_dashboard_config_internal``, which
67
+ handles the WS envelope, force-cache-bypass, and structured error wrapping).
68
+ The component refuses YAML bodies, so those capture through legacy unchanged.
69
+ Imported lazily to avoid an import cycle.
70
+ """
71
+ from ha_mcp._vendor.fastmcp.exceptions import ToolError
72
+
73
+ from .tools.tools_config_dashboards import (
74
+ _component_dashboard_config,
75
+ _get_dashboard_config_internal,
76
+ _resolve_dashboard,
77
+ )
78
+
79
+ # The set/delete tools accept the canonical url_path, HA's internal
80
+ # (underscored) dashboard id and the ``default`` alias for Core's
81
+ # ``lovelace`` item. ``_get_dashboard_config_internal`` does NOT
82
+ # lazy-resolve (an internal id 404s with "Unknown config specified" and
83
+ # the snapshot is skipped), so pre-resolve to the form the tool targets.
84
+ fetch_path = "lovelace" if entity_id == "default" else entity_id
85
+ unread = (
86
+ "Could not read lovelace/dashboards/list, so the dashboard's settings "
87
+ "could not be captured"
88
+ )
89
+ try:
90
+ match, dashboards = await _resolve_dashboard(client, fetch_path)
91
+ except (HomeAssistantError, ToolError) as err:
92
+ raise HomeAssistantError(unread) from err
93
+ if dashboards is None:
94
+ raise HomeAssistantError(unread)
95
+ if match and match.get("url_path"):
96
+ fetch_path = match["url_path"]
97
+
98
+ row = _storage_row(dashboards, fetch_path)
99
+ config = await _component_dashboard_config(client, fetch_path)
100
+ if config is None:
101
+ # Legacy read: YAML dashboards, no component, and not-found.
102
+ try:
103
+ config, _config_hash = await _get_dashboard_config_internal(
104
+ client, fetch_path
105
+ )
106
+ except (ToolError, HomeAssistantError) as err:
107
+ # Both carry HA's preserved ``config_not_found`` code: an unknown
108
+ # url_path ("Unknown config specified", also the create path), or
109
+ # a dashboard whose config was never saved, which keeps its row.
110
+ msg = str(err).lower()
111
+ if "not_found" not in msg and "unknown config" not in msg:
112
+ raise
113
+ config = None
114
+ if row is None:
115
+ return None
116
+ return {"dashboard": row, "config": config}
117
+
118
+
119
+ def _config_write(url_path: str | None, body: Any) -> dict[str, Any]:
120
+ """Put back ``body``; ``None`` was "no stored config", which Core's
121
+ ``lovelace/config/delete`` restores (it succeeds when nothing is stored).
122
+ No ``url_path`` targets Core's default store."""
123
+ message: dict[str, Any] = (
124
+ {"type": "lovelace/config/delete"}
125
+ if body is None
126
+ else {"type": "lovelace/config/save", "config": body}
127
+ )
128
+ return message if url_path is None else {**message, "url_path": url_path}
129
+
130
+
131
+ async def _save(client: Any, url_path: str, config: Any) -> Any:
132
+ return await _manager()._ws_send(client, _config_write(url_path, config))
133
+
134
+
135
+ async def _saved(client: Any, url_path: str, config: Any) -> bool:
136
+ """Write; ``False`` when Core has no dashboard at ``url_path``."""
137
+ try:
138
+ await _save(client, url_path, config)
139
+ except HomeAssistantCommandError as err:
140
+ if err.code != "config_not_found":
141
+ raise
142
+ return False
143
+ return True
144
+
145
+
146
+ async def restore_dashboard(client: Any, entity_id: str, config: Any) -> Any:
147
+ from .tools.tools_config_dashboards import _resolve_dashboard
148
+
149
+ row = config["dashboard"]
150
+ body = config["config"]
151
+ if row is None:
152
+ return await _restore_body(client, entity_id, body)
153
+ url_path = row["url_path"]
154
+ _match, dashboards = await _resolve_dashboard(client, url_path)
155
+ if dashboards is None:
156
+ raise HomeAssistantError(
157
+ "Could not read lovelace/dashboards/list, so nothing was restored"
158
+ )
159
+ live = _storage_row(dashboards, url_path)
160
+ if live is None:
161
+ return await _recreate(client, row, body)
162
+ await _save(client, url_path, body)
163
+ return await _restore_settings(client, live["id"], row)
164
+
165
+
166
+ async def _recreate(client: Any, row: dict[str, Any], body: Any) -> Any:
167
+ bm = _manager()
168
+ url_path = row["url_path"]
169
+ # The component's rows carry ``icon: None`` for an unset icon, which Core's
170
+ # create schema rejects; an omitted field takes Core's default.
171
+ fields = bm._strip_readonly(row, "id", "mode")
172
+ create = {
173
+ "type": "lovelace/dashboards/create",
174
+ **{key: value for key, value in fields.items() if value is not None},
175
+ }
176
+ if "-" not in url_path:
177
+ # Core's own single-word dashboards (``lovelace``, ``map``) need this.
178
+ create["allow_single_word"] = True
179
+ try:
180
+ await bm._ws_send(client, create)
181
+ except HomeAssistantCommandError as err:
182
+ # Deleting ``lovelace`` re-registers Core's built-in panel there, so
183
+ # create raises url_already_exists, sent as home_assistant_error.
184
+ if url_path != "lovelace" or err.code != "home_assistant_error":
185
+ raise
186
+ return await _restore_default_store(client, body)
187
+ if body is not None:
188
+ await _save(client, url_path, body)
189
+ return None
190
+
191
+
192
+ async def _restore_settings(
193
+ client: Any, dashboard_id: str, row: dict[str, Any]
194
+ ) -> None:
195
+ """Put back the row's settings after its config; ``icon: None`` clears it."""
196
+ bm = _manager()
197
+ fields = {key: row[key] for key in _SETTINGS_FIELDS if key in row}
198
+ # Core's own list omits ``icon`` when none is stored; the component's sends None.
199
+ fields.setdefault("icon", None)
200
+ update = {"type": "lovelace/dashboards/update", "dashboard_id": dashboard_id}
201
+ try:
202
+ await bm._ws_send(client, {**update, **fields})
203
+ except bm._CAPTURE_TRANSIENT_ERRORS as err:
204
+ raise bm.BackupRestoreError(
205
+ f"The config of dashboard {row['url_path']} was restored, but its "
206
+ "settings (title, icon, sidebar, admin) may not have been.",
207
+ apply_status="unknown",
208
+ reason="settings_not_restored",
209
+ ) from err
210
+
211
+
212
+ async def _restore_default_store(client: Any, body: Any) -> dict[str, Any]:
213
+ """Put the body in Core's default store, which the built-in panel reads."""
214
+ if body is None:
215
+ return {
216
+ "note": "Home Assistant shows its auto-generated default dashboard "
217
+ "at /lovelace again, as before; its saved title and icon are not "
218
+ "restored."
219
+ }
220
+ await _manager()._ws_send(client, _config_write(None, body))
221
+ return {
222
+ "note": "The config was restored to Home Assistant's default dashboard "
223
+ "store, shown at /lovelace. At the next restart Home Assistant moves it "
224
+ "back into a 'lovelace' dashboard with its default title and icon."
225
+ }
226
+
227
+
228
+ async def _restore_body(client: Any, entity_id: str, config: Any) -> Any:
229
+ """Restore a snapshot's body alone to the dashboard it was taken from."""
230
+ from .tools.tools_config_dashboards import _resolve_dashboard
231
+
232
+ url_path = "lovelace" if entity_id == "default" else entity_id
233
+ if await _saved(client, url_path, config):
234
+ return None
235
+ # The snapshot may name the dashboard by its internal id.
236
+ match, dashboards = await _resolve_dashboard(client, url_path)
237
+ if dashboards is None:
238
+ raise HomeAssistantError("Could not read lovelace/dashboards/list")
239
+ if match and match["url_path"] != url_path:
240
+ return await _save(client, match["url_path"], config)
241
+ raise _manager().BackupRestoreError(
242
+ f"Dashboard {url_path} no longer exists, and this snapshot holds no "
243
+ "dashboard settings to re-create it from. Nothing was changed.",
244
+ reason="entry_deleted",
245
+ suggestions=[
246
+ f"Re-create it with ha_config_set_dashboard(url_path={url_path!r}, "
247
+ "title=...), then restore this snapshot again."
248
+ ],
249
+ )
250
+
251
+
252
+ def dashboard_comparison(current: Any, *, legacy: bool) -> Any:
253
+ """The live value to diff a snapshot against: a legacy snapshot compares
254
+ with the live body."""
255
+ if current is None or not legacy:
256
+ return current
257
+ return current["config"]
@@ -66,6 +66,14 @@ import yaml # type: ignore[import-untyped]
66
66
  from ha_mcp._vendor.fastmcp.exceptions import ToolError
67
67
  from ha_mcp._vendor.websockets.exceptions import ConnectionClosed
68
68
 
69
+ from .backup_dashboards import (
70
+ _DASHBOARD_KIND,
71
+ dashboard_comparison,
72
+ dashboard_snapshot,
73
+ fetch_dashboard,
74
+ restore_dashboard,
75
+ valid_dashboard_capture,
76
+ )
69
77
  from .backup_diff import (
70
78
  _TEXT_KIND,
71
79
  DiffResponse,
@@ -215,6 +223,17 @@ def _validate_snapshot_envelope(data: dict[str, Any]) -> None:
215
223
  for key in ("domain", "entity_id"):
216
224
  if not isinstance(data[key], str) or (key == "domain" and not data[key]):
217
225
  raise InvalidBackupSnapshotError(f"Snapshot has invalid {key}")
226
+ if data.get("kind") == _DASHBOARD_KIND and not valid_dashboard_capture(
227
+ data["config"]
228
+ ):
229
+ raise InvalidBackupSnapshotError("Snapshot has invalid config")
230
+
231
+
232
+ def _handler_config(data: dict[str, Any]) -> Any:
233
+ """The config a domain handler restores from a snapshot."""
234
+ if data["domain"] == "dashboard":
235
+ return dashboard_snapshot(data)[0]
236
+ return data["config"]
218
237
 
219
238
 
220
239
  class _FlowHelperReadError(HomeAssistantError):
@@ -320,7 +339,8 @@ _MAX_SAME_SECOND = 100
320
339
  # Domains whose snapshot ``config`` is raw text (file/YAML content) rather
321
340
  # than a structured dict. They carry a ``kind: "text"`` marker in the
322
341
  # snapshot payload and diff via a unified text diff instead of JSON-Patch
323
- # (#1579 PR2). Everything else is the implicit ``"dict"`` kind.
342
+ # (#1579 PR2). Dashboard snapshots carry ``kind: "dashboard_settings"``
343
+ # (backup_dashboards); everything else is the implicit ``"dict"`` kind.
324
344
  #
325
345
  # ``yaml_file`` is a whole-file YAML-config snapshot: same fetch as ``file``
326
346
  # (read_file), but restored via edit_yaml_config(action="replace_file") because
@@ -1048,6 +1068,8 @@ class BackupManager:
1048
1068
  }
1049
1069
  if domain in _TEXT_DOMAINS:
1050
1070
  payload["kind"] = _TEXT_KIND
1071
+ elif domain == "dashboard":
1072
+ payload["kind"] = _DASHBOARD_KIND
1051
1073
  body = yaml.safe_dump(payload, default_flow_style=False, sort_keys=False)
1052
1074
  # mkstemp creates a unique 0600 inode before any configuration is written.
1053
1075
  fd, tmp_name = tempfile.mkstemp(
@@ -1491,7 +1513,7 @@ class BackupManager:
1491
1513
  ) -> dict[str, Any]:
1492
1514
  domain = data["domain"]
1493
1515
  entity_id = data["entity_id"]
1494
- config = data["config"]
1516
+ config = _handler_config(data)
1495
1517
  handler = self.handler_for(domain)
1496
1518
  if handler is None:
1497
1519
  raise BackupRestoreError(
@@ -1634,6 +1656,15 @@ class BackupManager:
1634
1656
  if handler is None:
1635
1657
  raise LookupError(f"No diff handler registered for domain {domain!r}")
1636
1658
  current = await handler.fetch(self._client, data["entity_id"])
1659
+ if domain == "dashboard":
1660
+ _stored, legacy = dashboard_snapshot(data)
1661
+ current = dashboard_comparison(current, legacy=legacy)
1662
+ elif domain == "dashboard_resource" and current is None:
1663
+ # A re-created resource carries a Core-generated id, which is not
1664
+ # a difference the snapshot can restore.
1665
+ live = await _dashboard_resource_like(self._client, data["config"])
1666
+ if live is not None:
1667
+ current = {**live, "id": data["config"].get("id")}
1637
1668
  if (
1638
1669
  isinstance(current, dict)
1639
1670
  and isinstance(data["config"], dict)
@@ -2046,86 +2077,6 @@ async def _restore_scene(client: Any, entity_id: str, config: Any) -> Any:
2046
2077
  return await client.upsert_scene_config(config, entity_id)
2047
2078
 
2048
2079
 
2049
- # Dashboards — WS lovelace/config (fetch) and lovelace/config/save (restore).
2050
-
2051
-
2052
- async def _fetch_dashboard(client: Any, entity_id: str) -> Any:
2053
- """Fetch a dashboard config via the same helper the get tool uses.
2054
-
2055
- The identifier is pre-resolved to its canonical url_path via the shared
2056
- ``_resolve_dashboard`` (component ``list`` when available), then the config is
2057
- read through the component ``get`` (one in-process frame) with a fall back to
2058
- the legacy ``lovelace/config`` read (``_get_dashboard_config_internal``, which
2059
- handles the WS envelope, force-cache-bypass, and structured error wrapping).
2060
- The component refuses YAML bodies, so those capture through legacy unchanged.
2061
- Imported lazily to avoid an import cycle.
2062
- """
2063
- from ha_mcp._vendor.fastmcp.exceptions import ToolError
2064
-
2065
- from .tools.tools_config_dashboards import (
2066
- _component_dashboard_config,
2067
- _get_dashboard_config_internal,
2068
- _resolve_dashboard,
2069
- )
2070
-
2071
- # The set/delete tools accept BOTH the canonical hyphenated url_path
2072
- # AND HA's internal (underscored) dashboard id, eagerly resolving the
2073
- # latter before writing. ``_get_dashboard_config_internal`` does NOT
2074
- # lazy-resolve, so an internal-id identifier 404s with "Unknown config
2075
- # specified" and the pre-write snapshot is silently skipped. Pre-resolve
2076
- # to the canonical url_path so capture works for whichever form the
2077
- # caller passed (matching the form the write tool ultimately targets).
2078
- fetch_path = entity_id
2079
- try:
2080
- match, _ = await _resolve_dashboard(client, entity_id)
2081
- if match and match.get("url_path"):
2082
- fetch_path = match["url_path"]
2083
- except (HomeAssistantError, ToolError) as err:
2084
- # Resolver failure (transport/shape) — fall through with the
2085
- # original identifier; the canonical form is often already correct.
2086
- logger.debug(
2087
- "Auto-backup: dashboard resolve failed for %r: %s — using as-is",
2088
- entity_id,
2089
- err,
2090
- )
2091
-
2092
- # Component fast path (freshness-safe in-memory read); None ⇒ legacy below,
2093
- # which also covers YAML dashboards and not-found (nothing to back up).
2094
- component_config = await _component_dashboard_config(client, fetch_path)
2095
- if component_config is not None:
2096
- return component_config
2097
-
2098
- try:
2099
- config, _config_hash = await _get_dashboard_config_internal(client, fetch_path)
2100
- except ToolError as err:
2101
- # ToolError carries the structured failure payload, including HA's
2102
- # preserved ``config_not_found`` code; treat a missing/unknown
2103
- # dashboard as "nothing to back up" (also covers a brand-new dashboard
2104
- # on the create path). "Unknown config specified" is HA's message for
2105
- # an unresolved url_path.
2106
- msg = str(err).lower()
2107
- if "not_found" in msg or "config_not_found" in msg or "unknown config" in msg:
2108
- return None
2109
- raise
2110
- except HomeAssistantError as err:
2111
- msg = str(err).lower()
2112
- if "not_found" in msg or "config_not_found" in msg or "unknown config" in msg:
2113
- return None
2114
- raise
2115
- return config
2116
-
2117
-
2118
- async def _restore_dashboard(client: Any, entity_id: str, config: Any) -> Any:
2119
- return await _ws_send(
2120
- client,
2121
- {
2122
- "type": "lovelace/config/save",
2123
- "url_path": entity_id,
2124
- "config": config,
2125
- },
2126
- )
2127
-
2128
-
2129
2080
  def _require_list(value: Any, endpoint: str) -> list[Any]:
2130
2081
  """Return ``value`` if it's a list, else raise.
2131
2082
 
@@ -2165,24 +2116,50 @@ def _require_dict(value: Any, endpoint: str) -> dict[str, Any]:
2165
2116
  return value
2166
2117
 
2167
2118
 
2168
- # Dashboard resources — WS lovelace_resources commands.
2119
+ # Dashboard resources — WS lovelace/resources commands. Rows store the
2120
+ # resource type as ``type``; the create/update field is ``res_type``. A restore
2121
+ # of a deleted resource re-creates it under a new id, so a snapshot falls back
2122
+ # to the row that holds its url and type; Core does not keep urls unique, so a
2123
+ # row that only shares the url is another resource and is left alone.
2124
+ async def _dashboard_resources(client: Any) -> list[Any]:
2125
+ return _require_list(
2126
+ await _ws_send(client, {"type": "lovelace/resources"}), "lovelace/resources"
2127
+ )
2169
2128
 
2170
2129
 
2171
2130
  async def _fetch_dashboard_resource(client: Any, entity_id: str) -> Any:
2172
- resources = _require_list(
2173
- await _ws_send(client, {"type": "lovelace/resources"}), "lovelace/resources"
2131
+ resources = await _dashboard_resources(client)
2132
+ return next((r for r in resources if str(r.get("id")) == entity_id), None)
2133
+
2134
+
2135
+ async def _dashboard_resource_like(client: Any, config: dict[str, Any]) -> Any:
2136
+ """The live row with the snapshot's url and type, else ``None``."""
2137
+ resources = await _dashboard_resources(client)
2138
+ return next(
2139
+ (
2140
+ r
2141
+ for r in resources
2142
+ if r.get("url") == config["url"] and r.get("type") == config.get("type")
2143
+ ),
2144
+ None,
2174
2145
  )
2175
- for res in resources:
2176
- if str(res.get("id")) == entity_id:
2177
- return res
2178
- return None
2179
2146
 
2180
2147
 
2181
2148
  async def _restore_dashboard_resource(client: Any, entity_id: str, config: Any) -> Any:
2182
- payload = _strip_readonly(config, "id")
2183
- payload["resource_id"] = entity_id
2184
- payload["type"] = "lovelace/resources/update"
2185
- return await _ws_send(client, payload)
2149
+ # Core imported old ``resources:`` entries without a type (RESOURCE_FIELDS).
2150
+ payload = _strip_readonly(config, "id", "type")
2151
+ if "type" in config:
2152
+ payload["res_type"] = config["type"]
2153
+ update = {"type": "lovelace/resources/update", "resource_id": entity_id}
2154
+ try:
2155
+ return await _ws_send(client, {**update, **payload})
2156
+ except HomeAssistantCommandError as err:
2157
+ if err.code != "not_found": # not_found: deleted since the snapshot
2158
+ raise
2159
+ live = await _dashboard_resource_like(client, config)
2160
+ if live is not None: # an earlier restore re-created it
2161
+ return live
2162
+ return await _ws_send(client, {"type": "lovelace/resources/create", **payload})
2186
2163
 
2187
2164
 
2188
2165
  # Labels — config/label_registry/{list,update}
@@ -3925,7 +3902,7 @@ def register_default_handlers(mgr: BackupManager, _client: Any) -> None:
3925
3902
  mgr.register(DomainHandler("automation", _fetch_automation, _restore_automation))
3926
3903
  mgr.register(DomainHandler("script", _fetch_script, _restore_script))
3927
3904
  mgr.register(DomainHandler("scene", _fetch_scene, _restore_scene))
3928
- mgr.register(DomainHandler("dashboard", _fetch_dashboard, _restore_dashboard))
3905
+ mgr.register(DomainHandler("dashboard", fetch_dashboard, restore_dashboard))
3929
3906
  mgr.register(
3930
3907
  DomainHandler(
3931
3908
  "dashboard_resource", _fetch_dashboard_resource, _restore_dashboard_resource
@@ -6,7 +6,7 @@ Home Assistant serves; this module compacts it the way helper ``describe`` does.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from typing import Any
9
+ from typing import Any, NoReturn
10
10
 
11
11
  from ..client.websocket_client import get_websocket_client
12
12
  from ..errors import ErrorCode, create_error_response
@@ -38,6 +38,77 @@ def _flatten(schema: list[Any]) -> list[dict[str, Any]]:
38
38
  return fields
39
39
 
40
40
 
41
+ def _raise_describe_error(result: dict[str, Any], card_type: str | None) -> NoReturn:
42
+ """Map the component's describe error to a tool error."""
43
+ error = result.get("error")
44
+ if error == "describe_timeout":
45
+ raise_tool_error(
46
+ create_error_response(
47
+ ErrorCode.TIMEOUT_OPERATION,
48
+ "Describing this card took longer than Home Assistant's command budget.",
49
+ suggestions=["Retry; a loaded index usually answers within a second"],
50
+ context={"action": "describe", "card_type": card_type},
51
+ )
52
+ )
53
+ if error == "definitions_loading":
54
+ raise_tool_error(
55
+ create_error_response(
56
+ ErrorCode.SERVICE_CALL_FAILED,
57
+ "Home Assistant is still indexing the installed frontend's card "
58
+ "definitions (the first describe after a Home Assistant start; a "
59
+ "slow board can take minutes). Retry shortly.",
60
+ suggestions=[
61
+ "Retry in a minute; the index is kept until the next restart"
62
+ ],
63
+ context={"action": "describe", "card_type": card_type},
64
+ )
65
+ )
66
+ if error in ("custom_cards_loading", "custom_card_not_inspected"):
67
+ status = result.get("custom_status", {})
68
+ loading = error == "custom_cards_loading"
69
+ raise_tool_error(
70
+ create_error_response(
71
+ ErrorCode.SERVICE_CALL_FAILED,
72
+ "Custom card inspection is still loading; retry shortly."
73
+ if loading
74
+ else "This custom card could not be inspected from dashboard resources.",
75
+ suggestions=["Retry after resource loading finishes"]
76
+ if loading
77
+ else [
78
+ "Check the resource inspection status and type spelling",
79
+ "Cards loaded through extra JavaScript may work in the browser without appearing in dashboard resources",
80
+ ],
81
+ context={
82
+ "action": "describe",
83
+ "card_type": card_type,
84
+ "custom_status": status,
85
+ },
86
+ )
87
+ )
88
+ if error == "unknown_card_type":
89
+ raise_tool_error(
90
+ create_error_response(
91
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
92
+ f"'{card_type}' is not a known card type.",
93
+ suggestions=[
94
+ "Use one of: " + ", ".join(result.get("card_types", [])),
95
+ ],
96
+ context={"action": "describe", "card_type": card_type},
97
+ )
98
+ )
99
+ raise_tool_error(
100
+ create_error_response(
101
+ ErrorCode.SERVICE_CALL_FAILED,
102
+ "Home Assistant's card definitions are unavailable.",
103
+ details=str(error),
104
+ suggestions=[
105
+ "Use ha_get_skill_guide(file='references/dashboard-cards.md') for static card guidance"
106
+ ],
107
+ context={"action": "describe", "card_type": card_type},
108
+ )
109
+ )
110
+
111
+
41
112
  async def describe_card_response(client: Any, card_type: str | None) -> dict[str, Any]:
42
113
  """The card type list, or one card type's fields as its UI editor defines them."""
43
114
  card_type = card_type or None
@@ -73,51 +144,7 @@ async def describe_card_response(client: Any, card_type: str | None) -> dict[str
73
144
  if not isinstance(result, dict):
74
145
  result = {}
75
146
  if result.get("success") is not True:
76
- error = result.get("error")
77
- if error in ("custom_cards_loading", "custom_card_not_inspected"):
78
- status = result.get("custom_status", {})
79
- loading = error == "custom_cards_loading"
80
- raise_tool_error(
81
- create_error_response(
82
- ErrorCode.SERVICE_CALL_FAILED,
83
- "Custom card inspection is still loading; retry shortly."
84
- if loading
85
- else "This custom card could not be inspected from dashboard resources.",
86
- suggestions=["Retry after resource loading finishes"]
87
- if loading
88
- else [
89
- "Check the resource inspection status and type spelling",
90
- "Cards loaded through extra JavaScript may work in the browser without appearing in dashboard resources",
91
- ],
92
- context={
93
- "action": "describe",
94
- "card_type": card_type,
95
- "custom_status": status,
96
- },
97
- )
98
- )
99
- if error == "unknown_card_type":
100
- raise_tool_error(
101
- create_error_response(
102
- ErrorCode.VALIDATION_INVALID_PARAMETER,
103
- f"'{card_type}' is not a known card type.",
104
- suggestions=[
105
- "Use one of: " + ", ".join(result.get("card_types", [])),
106
- ],
107
- context={"action": "describe", "card_type": card_type},
108
- )
109
- )
110
- raise_tool_error(
111
- create_error_response(
112
- ErrorCode.SERVICE_CALL_FAILED,
113
- "Home Assistant's card definitions are unavailable.",
114
- details=str(error),
115
- suggestions=[
116
- "Use ha_get_skill_guide(file='references/dashboard-cards.md') for static card guidance"
117
- ],
118
- context={"action": "describe", "card_type": card_type},
119
- )
120
- )
147
+ _raise_describe_error(result, card_type)
121
148
  if card_type is None:
122
149
  return {
123
150
  "success": True,