ha-mcp-dev 8.5.0.dev2734__tar.gz → 8.5.0.dev2740__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 (736) hide show
  1. {ha_mcp_dev-8.5.0.dev2734/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.5.0.dev2740}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/client/rest_client.py +137 -30
  4. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/client/websocket_client.py +134 -13
  5. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/server.py +2 -2
  6. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/az.json +1 -1
  7. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/cs.json +1 -1
  8. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/de.json +1 -1
  9. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/eo.json +1 -1
  10. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/es.json +1 -1
  11. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/fr.json +1 -1
  12. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/it.json +1 -1
  13. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/ko.json +1 -1
  14. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/nl.json +1 -1
  15. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/pl.json +1 -1
  16. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/ru.json +1 -1
  17. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/sv.json +1 -1
  18. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/zh-Hans.json +1 -1
  19. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/zh-Hant.json +1 -1
  20. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_reload_watch.py +1 -1
  21. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/hacs_registration.py +1 -1
  22. ha_mcp_dev-8.5.0.dev2740/src/ha_mcp/tools/tools_utility.py +472 -0
  23. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  24. ha_mcp_dev-8.5.0.dev2734/src/ha_mcp/tools/tools_utility.py +0 -278
  25. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/LICENSE +0 -0
  26. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/MANIFEST.in +0 -0
  27. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/README.md +0 -0
  28. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/setup.cfg +0 -0
  29. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/__init__.py +0 -0
  30. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/__main__.py +0 -0
  31. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_pypi_marker +0 -0
  32. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_rich_compat.py +0 -0
  33. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/__init__.py +0 -0
  34. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  35. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  36. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  37. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  38. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  39. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  40. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  41. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  42. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  43. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  44. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  45. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  46. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  47. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  48. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  49. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  50. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  51. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  52. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  53. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  54. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  55. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  56. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  57. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  58. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  59. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  60. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  61. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  62. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  63. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  64. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  65. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  66. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  67. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  68. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  69. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  70. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  71. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  72. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  73. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  74. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  75. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  76. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  77. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  78. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  79. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  80. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  81. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  82. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  83. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  84. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  85. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  86. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  87. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  88. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  89. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  90. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  91. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  92. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  93. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  94. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  95. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  96. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  97. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  98. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  99. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  100. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  101. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  102. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  103. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  104. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  105. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  106. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  107. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  108. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  109. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  110. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  111. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  112. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  113. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  114. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  115. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  116. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  117. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  118. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  119. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  120. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  121. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  122. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  123. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  124. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  125. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  126. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  127. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  128. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  129. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  130. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  131. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  132. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  133. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  134. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  135. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  136. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  137. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  138. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  139. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  140. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  141. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  142. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  143. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  144. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  145. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  146. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  147. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  148. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  149. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  150. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  151. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  152. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  153. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  154. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  155. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  156. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  157. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  158. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  159. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  160. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  161. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  162. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  163. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  164. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  165. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  166. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  167. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  168. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  169. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  170. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  171. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  172. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  173. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  174. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  175. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  176. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  177. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  178. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  179. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  180. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  181. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  182. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  183. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  184. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  185. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  186. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  187. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  188. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  189. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  190. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  191. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  192. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  193. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  194. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  195. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  196. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  197. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  198. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  199. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  200. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  201. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  202. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  203. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  204. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  205. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  206. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  207. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  208. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  209. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  210. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  211. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  212. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  213. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  214. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  215. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  216. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  217. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  218. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  219. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  220. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  221. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  222. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  223. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  224. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  225. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  226. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  227. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  228. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  229. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  230. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  231. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  232. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  233. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  234. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  235. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  236. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  237. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  238. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  239. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  240. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  241. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  242. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  243. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  244. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  245. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  246. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  247. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  248. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  249. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  250. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  251. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  252. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  253. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  254. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  255. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  256. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  257. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  258. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  259. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  260. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  261. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  262. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  263. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  264. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  265. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  266. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  267. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  268. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  269. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  270. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  271. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  272. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  273. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  274. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  275. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  276. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  277. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  278. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  279. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  280. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  281. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  282. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  283. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  284. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  285. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  286. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  287. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  288. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  289. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  290. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  291. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  292. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  293. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  294. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  295. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  296. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  297. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  298. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  299. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  300. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  301. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  302. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  303. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  304. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  305. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  306. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  307. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  308. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  309. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  310. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  311. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  312. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  313. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  314. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  315. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  316. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  317. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  318. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  319. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  320. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  321. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  322. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  323. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  324. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  325. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  326. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  327. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  328. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  329. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  330. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  331. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  332. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  333. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  334. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  335. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  336. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  337. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  338. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  339. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  340. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  341. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  342. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  343. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  344. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  345. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  346. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  347. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  348. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  349. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  350. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  351. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  352. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  353. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  354. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  355. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  356. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  357. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  358. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  359. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  360. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  361. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  362. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  363. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  364. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  365. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  366. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  367. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  368. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  369. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  370. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  371. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  372. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  373. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  374. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  375. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  376. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  377. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  378. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  379. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  380. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  381. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  382. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  383. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  384. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  385. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  386. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  387. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  388. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  389. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  390. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  391. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  392. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  393. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  394. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  395. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  396. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  397. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  398. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  399. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  400. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  401. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  402. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  403. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  404. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  405. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  406. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  407. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  408. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  409. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  410. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  411. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  412. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  413. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  414. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  415. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  416. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  417. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  418. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  419. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  420. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  421. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  422. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  423. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  424. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  425. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  426. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  427. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  428. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  429. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  430. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  431. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  432. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  433. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  434. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  435. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  436. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  437. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  438. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  439. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  440. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  441. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  442. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  443. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  444. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/requirements.txt +0 -0
  445. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  446. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  447. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  448. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  449. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  450. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  451. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  452. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  453. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  454. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  455. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  456. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  457. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  458. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  459. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  460. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  461. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  462. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  463. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  464. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  465. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  466. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  467. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  468. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  469. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  470. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  471. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  472. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  473. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  474. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  475. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  476. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  477. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  478. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  479. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  480. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  481. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  482. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  483. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  484. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  485. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  486. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  487. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  488. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  489. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  490. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  491. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  492. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  493. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  494. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  495. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  496. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  497. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  498. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  499. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  500. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  501. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/_version.py +0 -0
  502. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/auth/__init__.py +0 -0
  503. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/auth/consent_form.py +0 -0
  504. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/auth/oidc_compat.py +0 -0
  505. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/auth/provider.py +0 -0
  506. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/backup_manager.py +0 -0
  507. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/browser_landing.py +0 -0
  508. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/client/__init__.py +0 -0
  509. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/client/supervisor_client.py +0 -0
  510. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/client/websocket_listener.py +0 -0
  511. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/config.py +0 -0
  512. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  513. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  514. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  515. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  516. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  517. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  518. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/errors.py +0 -0
  519. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/ha_request_queue.py +0 -0
  520. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  521. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/http_transport.py +0 -0
  522. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/llm_exposure.py +0 -0
  523. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/log_filters.py +0 -0
  524. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/__init__.py +0 -0
  525. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/approval_queue.py +0 -0
  526. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/decision_pin.py +0 -0
  527. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/decisions.py +0 -0
  528. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/editing.py +0 -0
  529. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/evaluator.py +0 -0
  530. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/events.py +0 -0
  531. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/handlers.py +0 -0
  532. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/middleware.py +0 -0
  533. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/model.py +0 -0
  534. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/persistence.py +0 -0
  535. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/policy/value_sources.py +0 -0
  536. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/py.typed +0 -0
  537. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/read_only.py +0 -0
  538. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/redaction.py +0 -0
  539. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/renamed_tools.py +0 -0
  540. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  541. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  542. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  543. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  544. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  545. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  546. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  547. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  548. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  549. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  550. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  551. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  552. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  553. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  554. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  555. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  556. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  557. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  558. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  559. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  560. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  561. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  562. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  563. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  564. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  565. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  566. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  567. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  568. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  569. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  570. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  571. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  572. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  573. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  574. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  575. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  576. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  577. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  578. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  579. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  580. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  581. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/__init__.py +0 -0
  582. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  583. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  584. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  585. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  586. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  587. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  588. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  589. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  590. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  591. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  592. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_theme.py +0 -0
  593. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  594. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  595. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  596. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  597. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/settings.css +0 -0
  598. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/settings.html +0 -0
  599. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/settings_ui/settings.js +0 -0
  600. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/smoke_test.py +0 -0
  601. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  602. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/strict_bps.py +0 -0
  603. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tool_dispatch.py +0 -0
  604. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/__init__.py +0 -0
  605. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/auto_backup.py +0 -0
  606. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/backup.py +0 -0
  607. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  608. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/best_practice_result.py +0 -0
  609. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  610. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  611. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  612. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/blueprint_write.py +0 -0
  613. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/bulk_selector.py +0 -0
  614. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_api.py +0 -0
  615. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_config_entries.py +0 -0
  616. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_config_reads.py +0 -0
  617. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  618. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_devices.py +0 -0
  619. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_registries.py +0 -0
  620. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  621. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  622. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  623. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  624. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  625. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  626. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  627. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  628. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/device_control.py +0 -0
  629. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/entity_registration.py +0 -0
  630. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  631. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/helpers.py +0 -0
  632. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  633. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/log_common.py +0 -0
  634. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/log_sources.py +0 -0
  635. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  636. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  637. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/__init__.py +0 -0
  638. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/base.py +0 -0
  639. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/matter.py +0 -0
  640. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/thread.py +0 -0
  641. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  642. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/radio/zwave.py +0 -0
  643. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/reference_validator.py +0 -0
  644. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/registry.py +0 -0
  645. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  646. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/scene_discovery.py +0 -0
  647. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  648. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  649. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  650. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  651. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  652. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  653. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  654. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  655. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  656. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  657. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  658. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_addons.py +0 -0
  659. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_areas.py +0 -0
  660. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  661. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  662. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  663. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_calendar.py +0 -0
  664. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_camera.py +0 -0
  665. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_categories.py +0 -0
  666. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_code.py +0 -0
  667. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  668. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  669. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  670. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  671. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  672. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  673. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_dev.py +0 -0
  674. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_energy.py +0 -0
  675. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_entities.py +0 -0
  676. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  677. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_groups.py +0 -0
  678. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_hacs.py +0 -0
  679. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_history.py +0 -0
  680. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_integrations.py +0 -0
  681. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_labels.py +0 -0
  682. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_logs.py +0 -0
  683. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_radio.py +0 -0
  684. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_registry.py +0 -0
  685. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_resources.py +0 -0
  686. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_search.py +0 -0
  687. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  688. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_service.py +0 -0
  689. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_services.py +0 -0
  690. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_system.py +0 -0
  691. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_themes.py +0 -0
  692. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_todo.py +0 -0
  693. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_traces.py +0 -0
  694. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_updates.py +0 -0
  695. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  696. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  697. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  698. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/tools_zones.py +0 -0
  699. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/util_helpers.py +0 -0
  700. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/tools/validation_middleware.py +0 -0
  701. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transforms/__init__.py +0 -0
  702. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transforms/categorized_search.py +0 -0
  703. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transforms/component_search.py +0 -0
  704. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  705. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  706. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/transport_security.py +0 -0
  707. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/update_check.py +0 -0
  708. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/__init__.py +0 -0
  709. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/config_hash.py +0 -0
  710. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/config_write_lock.py +0 -0
  711. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  712. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/data_paths.py +0 -0
  713. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  714. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/domain_handlers.py +0 -0
  715. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/entity_membership.py +0 -0
  716. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  717. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  718. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  719. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/operation_manager.py +0 -0
  720. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/python_sandbox.py +0 -0
  721. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  722. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/skill_loader.py +0 -0
  723. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/utils/usage_logger.py +0 -0
  724. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/visibility/__init__.py +0 -0
  725. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/visibility/enforcement.py +0 -0
  726. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/visibility/model.py +0 -0
  727. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/visibility/persistence.py +0 -0
  728. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp/visibility/resolver.py +0 -0
  729. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  730. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  731. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  732. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  733. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  734. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/tests/__init__.py +0 -0
  735. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/tests/test_constants.py +0 -0
  736. {ha_mcp_dev-8.5.0.dev2734 → ha_mcp_dev-8.5.0.dev2740}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.5.0.dev2734
3
+ Version: 8.5.0.dev2740
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.5.0.dev2734"
7
+ version = "8.5.0.dev2740"
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
@@ -239,6 +239,91 @@ _NO_ANSWER_ERRORS = (
239
239
  WebSocketException,
240
240
  )
241
241
 
242
+ RENDER_NO_VERDICT_WITHOUT_REPORT_ERRORS = (
243
+ "No template result from Home Assistant. With report_errors=false Home "
244
+ "Assistant does not report a failed render (it only writes the error to "
245
+ "its own log), so the template most likely failed. Retry with "
246
+ "report_errors=true to get the error."
247
+ )
248
+
249
+
250
+ def _is_typed_template_error(error: str) -> bool:
251
+ """True for ``"UndefinedError: ..."``-style messages that name the class."""
252
+ name = error.partition(": ")[0]
253
+ return name.isidentifier() and name.endswith(("Error", "Exception"))
254
+
255
+
256
+ def _pick_render_error(first: str, queue: asyncio.Queue[dict[str, Any]]) -> str:
257
+ """Choose the clearest of the ERROR events already queued after ``first``.
258
+
259
+ One failure can arrive as several events: an undefined attribute is
260
+ reported once bare (``'dict object' has no attribute 'split'``) and once
261
+ with its class (``UndefinedError: ...``). The class-named one is kept.
262
+ """
263
+ candidates = [first]
264
+ while True:
265
+ try:
266
+ event = queue.get_nowait().get("event") or {}
267
+ except (asyncio.QueueEmpty, asyncio.QueueShutDown):
268
+ break
269
+ error = event.get("error")
270
+ if event.get("level") == "ERROR" and isinstance(error, str):
271
+ candidates.append(error)
272
+ return next((e for e in candidates if _is_typed_template_error(e)), first)
273
+
274
+
275
+ async def _read_render_verdict(
276
+ queue: asyncio.Queue[dict[str, Any]],
277
+ template: Any,
278
+ wait: float,
279
+ report_errors: bool,
280
+ ) -> dict[str, Any]:
281
+ """Read ``render_template`` events up to the render's verdict."""
282
+ warnings: list[str] = []
283
+ try:
284
+ async with asyncio.timeout(wait):
285
+ while True:
286
+ event = (await queue.get()).get("event") or {}
287
+ if "result" in event:
288
+ response: dict[str, Any] = {
289
+ "success": True,
290
+ "result": event["result"],
291
+ "template": template,
292
+ "listeners": event.get("listeners", {}),
293
+ }
294
+ break
295
+ error = event.get("error")
296
+ if not isinstance(error, str):
297
+ logger.debug("render_template: unrecognised event %r", event)
298
+ continue
299
+ if event.get("level") == "ERROR":
300
+ response = {
301
+ "success": False,
302
+ "error": _pick_render_error(error, queue),
303
+ "template": template,
304
+ }
305
+ break
306
+ if error not in warnings:
307
+ warnings.append(error)
308
+ except TimeoutError:
309
+ response = {
310
+ "success": False,
311
+ "error": (
312
+ "Event timeout - template result not received"
313
+ if report_errors
314
+ else RENDER_NO_VERDICT_WITHOUT_REPORT_ERRORS
315
+ ),
316
+ "no_verdict": True,
317
+ "template": template,
318
+ }
319
+ except asyncio.QueueShutDown as e:
320
+ raise HomeAssistantConnectionError(
321
+ "WebSocket connection to Home Assistant closed while rendering the template"
322
+ ) from e
323
+ if warnings:
324
+ response["warnings"] = warnings
325
+ return response
326
+
242
327
 
243
328
  class HomeAssistantClient:
244
329
  """Authenticated HTTP client for Home Assistant API."""
@@ -1768,7 +1853,7 @@ class HomeAssistantClient:
1768
1853
  )
1769
1854
  acquiring = False
1770
1855
 
1771
- # Special handling for render_template which returns an event with the actual result
1856
+ # render_template is a subscription; see _handle_render_template.
1772
1857
  if message.get("type") == "render_template":
1773
1858
  return await self._handle_render_template(ws_client, message)
1774
1859
 
@@ -1868,37 +1953,46 @@ class HomeAssistantClient:
1868
1953
  async def _handle_render_template(
1869
1954
  self, ws_client: Any, message: dict[str, Any]
1870
1955
  ) -> dict[str, Any]:
1871
- """Handle render_template WebSocket command with event-based response."""
1956
+ """Render a template, keeping the errors and warnings HA reports.
1957
+
1958
+ ``render_template`` opens a subscription. With ``report_errors`` HA sends
1959
+ each template error or warning as an ``{"error", "level"}`` event,
1960
+ possibly before the result frame (#2522). The first ERROR event or
1961
+ ``{"result", "listeners"}`` event is the render's verdict; WARNING
1962
+ events seen before it are returned in ``warnings`` whatever the
1963
+ outcome. Without ``report_errors`` HA only logs a failed render and
1964
+ never sends a verdict, so the wait runs out (``no_verdict``). The
1965
+ subscription is released in every case, or HA keeps re-rendering the
1966
+ template on every relevant state change for the life of the socket.
1967
+ """
1968
+ template = message.get("template")
1872
1969
  template_timeout = message.get("timeout", 3)
1970
+ report_errors = message.get("report_errors", True)
1971
+ params: dict[str, Any] = {
1972
+ "template": template,
1973
+ "timeout": template_timeout,
1974
+ "report_errors": report_errors,
1975
+ }
1976
+ if message.get("strict"):
1977
+ params["strict"] = True
1978
+ if message.get("variables") is not None:
1979
+ params["variables"] = message["variables"]
1873
1980
 
1874
1981
  try:
1875
- _, event_response = await ws_client.send_command_with_event(
1876
- "render_template",
1877
- wait_timeout=template_timeout + 2,
1878
- template=message.get("template"),
1879
- timeout=template_timeout,
1880
- report_errors=message.get("report_errors", True),
1982
+ sub_id, queue = await ws_client.subscribe_command(
1983
+ "render_template", wait_timeout=template_timeout + 2, **params
1881
1984
  )
1882
- logger.debug(f"WebSocket render_template event: {event_response}")
1883
-
1884
- # Extract template result from event
1885
- if "event" in event_response and "result" in event_response["event"]:
1886
- template_result = event_response["event"]["result"]
1887
- listeners_info = event_response["event"].get("listeners", {})
1888
-
1889
- return {
1890
- "success": True,
1891
- "result": template_result,
1892
- "template": message.get("template"),
1893
- "listeners": listeners_info,
1894
- }
1895
- else:
1896
- return {
1897
- "success": False,
1898
- "error": "Invalid event response format",
1899
- "template": message.get("template"),
1900
- }
1901
-
1985
+ except HomeAssistantCommandError as e:
1986
+ # A rejection of the command itself: the render exceeded its
1987
+ # timeout, or the template/variables failed HA's schema.
1988
+ return {
1989
+ "success": False,
1990
+ "error": str(e).removeprefix(
1991
+ "subscribe_command('render_template') failed: "
1992
+ ),
1993
+ "error_code": e.code,
1994
+ "template": template,
1995
+ }
1902
1996
  except TimeoutError:
1903
1997
  # Template-level, not transport-level: the wait budget here is the
1904
1998
  # caller's own ``timeout`` (default 3s) plus two seconds, and a
@@ -1908,7 +2002,8 @@ class HomeAssistantClient:
1908
2002
  return {
1909
2003
  "success": False,
1910
2004
  "error": "Event timeout - template result not received",
1911
- "template": message.get("template"),
2005
+ "no_verdict": True,
2006
+ "template": template,
1912
2007
  }
1913
2008
  except Exception as e:
1914
2009
  if isinstance(e, _NO_ANSWER_ERRORS):
@@ -1917,12 +2012,24 @@ class HomeAssistantClient:
1917
2012
  # in ``send_websocket_message`` — the very swallow this branch
1918
2013
  # used to hide (#1947).
1919
2014
  raise
2015
+ # Neither Home Assistant's answer nor a dead transport: a fault on
2016
+ # this side. Flagged so the tool does not present it as an error
2017
+ # in the caller's template.
2018
+ logger.exception("render_template failed on the client side")
1920
2019
  return {
1921
2020
  "success": False,
1922
2021
  "error": str(e),
1923
- "template": message.get("template"),
2022
+ "client_error": True,
2023
+ "template": template,
1924
2024
  }
1925
2025
 
2026
+ try:
2027
+ return await _read_render_verdict(
2028
+ queue, template, template_timeout + 2, report_errors
2029
+ )
2030
+ finally:
2031
+ await ws_client.release_subscription(sub_id)
2032
+
1926
2033
  async def _resolve_script_id(self, identifier: str) -> str:
1927
2034
  """
1928
2035
  Resolve a script identifier to its storage key via the entity registry.
@@ -155,6 +155,9 @@ class WebSocketConnectionState:
155
155
  # registered for a given id, every event with that id is pushed
156
156
  # into it instead of going to ``event_type``-keyed handlers.
157
157
  self._subscription_queues: dict[int, asyncio.Queue[dict[str, Any]]] = {}
158
+ # Ids of subscribe commands whose caller gave up before Home Assistant
159
+ # acknowledged them. See ``take_abandoned_subscription``.
160
+ self._abandoned_subscriptions: set[int] = set()
158
161
 
159
162
  def next_message_id(self) -> int:
160
163
  """Reserve the next available WebSocket message identifier."""
@@ -213,6 +216,24 @@ class WebSocketConnectionState:
213
216
  # Same GC guard as cancel_pending_request above.
214
217
  future.exception()
215
218
 
219
+ def mark_abandoned_subscription(self, message_id: int) -> None:
220
+ """Record a subscribe command whose acknowledgement nobody awaits."""
221
+ self._abandoned_subscriptions.add(message_id)
222
+
223
+ def take_abandoned_subscription(self, message_id: int) -> bool:
224
+ """Forget an abandoned subscribe command; True if it was one.
225
+
226
+ Home Assistant may register a subscription only after the caller has
227
+ given up and the immediate release answered ``not_found`` — a
228
+ ``render_template`` setup waits out the template's own timeout first.
229
+ Its late acknowledgement then arrives with no pending request, and
230
+ this is how the dispatch recognises that it still has to release it.
231
+ """
232
+ if message_id in self._abandoned_subscriptions:
233
+ self._abandoned_subscriptions.discard(message_id)
234
+ return True
235
+ return False
236
+
216
237
  def store_auth_message(self, message_type: str, data: dict[str, Any]) -> None:
217
238
  """Store an authentication handshake message."""
218
239
  self._auth_messages[message_type] = data
@@ -267,6 +288,8 @@ class WebSocketConnectionState:
267
288
  for queue in self._subscription_queues.values():
268
289
  queue.shutdown(immediate=True)
269
290
  self._subscription_queues.clear()
291
+ # Subscriptions die with the socket, and ids restart on the next one.
292
+ self._abandoned_subscriptions.clear()
270
293
 
271
294
  self._auth_messages.clear()
272
295
 
@@ -370,6 +393,9 @@ class HomeAssistantWebSocketClient:
370
393
  self._send_lock: asyncio.Lock | None = None
371
394
  self._lock_loop: asyncio.AbstractEventLoop | None = None
372
395
  self._state = WebSocketConnectionState()
396
+ # Releases of subscriptions acknowledged after their caller gave up,
397
+ # held here so the tasks are not garbage-collected mid-flight.
398
+ self._late_releases: set[asyncio.Task[None]] = set()
373
399
  # Reason the most recent connect() attempt failed (exception text),
374
400
  # or None. Surfaced by callers so the agent sees *why* a WebSocket
375
401
  # connection failed instead of an opaque "Failed to connect" string.
@@ -594,13 +620,24 @@ class HomeAssistantWebSocketClient:
594
620
  self._state.store_auth_message(message_type, data)
595
621
  return
596
622
 
597
- # Handle command responses
598
- if message_id is not None:
623
+ # Handle command responses. An event frame is never the reply to a
624
+ # command, even when it shares the command's id and arrives first:
625
+ # render_template reports template errors as events before its result
626
+ # frame (#2522).
627
+ if message_id is not None and message_type != "event":
599
628
  future = self._state.resolve_pending_request(message_id)
600
629
  if future:
601
630
  if not future.cancelled():
602
631
  future.set_result(data)
603
632
  return
633
+ if self._state.take_abandoned_subscription(message_id):
634
+ if message_type == "result" and data.get("success"):
635
+ task = asyncio.ensure_future(
636
+ self._release_abandoned_subscription(message_id)
637
+ )
638
+ self._late_releases.add(task)
639
+ task.add_done_callback(self._late_release_done)
640
+ return
604
641
 
605
642
  # Handle events
606
643
  if message_type == "event":
@@ -818,9 +855,9 @@ class HomeAssistantWebSocketClient:
818
855
  ) -> tuple[dict[str, Any], dict[str, Any]]:
819
856
  """Send a command that returns a result followed by an event response.
820
857
 
821
- Some HA WebSocket commands (e.g. system_health/info, render_template)
822
- reply with an immediate result message and then deliver the actual data
823
- in a subsequent event message sharing the same message ID.
858
+ Some HA WebSocket commands (e.g. system_health/info) reply with an
859
+ immediate result message and then deliver the actual data in a
860
+ subsequent event message sharing the same message ID.
824
861
 
825
862
  Args:
826
863
  command_type: Type of command to send.
@@ -945,6 +982,7 @@ class HomeAssistantWebSocketClient:
945
982
  # something that was never registered answers not_found, which
946
983
  # the release treats as its ordinary outcome.
947
984
  self.cancel_pending_response(message_id)
985
+ self._state.mark_abandoned_subscription(message_id)
948
986
  await self._run_cleanup(
949
987
  self._release_abandoned_subscription(message_id),
950
988
  f"abandoned subscribe_events({message_id})",
@@ -964,6 +1002,7 @@ class HomeAssistantWebSocketClient:
964
1002
  # it is this operation's job, not the caller's, because the id it
965
1003
  # needs is the one the caller never receives.
966
1004
  self.cancel_pending_response(message_id)
1005
+ self._state.mark_abandoned_subscription(message_id)
967
1006
  await self._run_cleanup(
968
1007
  self._release_abandoned_subscription(message_id),
969
1008
  f"abandoned subscribe_events({message_id})",
@@ -1019,9 +1058,11 @@ class HomeAssistantWebSocketClient:
1019
1058
  e,
1020
1059
  )
1021
1060
 
1022
- async def _run_cleanup(self, coro: Coroutine[Any, Any, None], what: str) -> None:
1061
+ async def _run_cleanup(self, coro: Coroutine[Any, Any, None], what: str) -> bool:
1023
1062
  """Run ``coro`` to completion or to a deadline, from a cancelled path.
1024
1063
 
1064
+ Returns whether it finished; False means the deadline stopped it.
1065
+
1025
1066
  Cleanup scheduled while a cancellation is propagating cannot simply
1026
1067
  be awaited: the await is cancelled in turn, and under a cancel scope
1027
1068
  again at every suspension, so the tidying never happens. It also
@@ -1083,9 +1124,11 @@ class HomeAssistantWebSocketClient:
1083
1124
  # stop it, then collect the outcome so a late failure does
1084
1125
  # not surface as an orphaned "exception was never
1085
1126
  # retrieved".
1086
- if not task.done():
1127
+ finished = task.done()
1128
+ if not finished:
1087
1129
  task.cancel()
1088
1130
  await asyncio.gather(task, return_exceptions=True)
1131
+ return finished
1089
1132
 
1090
1133
  async def _release_abandoned_subscription(self, message_id: int) -> None:
1091
1134
  """Ask Home Assistant to drop a subscription we can no longer name.
@@ -1145,7 +1188,7 @@ class HomeAssistantWebSocketClient:
1145
1188
  self,
1146
1189
  command_type: str,
1147
1190
  *,
1148
- timeout: float = 30.0,
1191
+ wait_timeout: float = 30.0,
1149
1192
  **kwargs: Any,
1150
1193
  ) -> tuple[int, asyncio.Queue[dict[str, Any]]]:
1151
1194
  """Send a subscribe-style command and return (subscription_id, queue).
@@ -1158,10 +1201,15 @@ class HomeAssistantWebSocketClient:
1158
1201
  event-type handler registry; use this method for everything
1159
1202
  else.
1160
1203
 
1204
+ ``wait_timeout`` is named apart from ``**kwargs`` because those become
1205
+ fields of the command, and some commands (``render_template``) carry a
1206
+ ``timeout`` field of their own.
1207
+
1161
1208
  Returns:
1162
1209
  (subscription_id, queue) — ``await queue.get()`` yields each
1163
1210
  incoming ``{"id": N, "type": "event", "event": ...}`` payload.
1164
- Cancel the subscription via :meth:`unsubscribe_command`.
1211
+ Cancel the subscription via :meth:`unsubscribe_command`, or
1212
+ :meth:`release_subscription` from a ``finally``.
1165
1213
  """
1166
1214
  if not self._state.is_ready:
1167
1215
  raise HomeAssistantConnectionError("WebSocket not authenticated")
@@ -1183,20 +1231,34 @@ class HomeAssistantWebSocketClient:
1183
1231
  except BaseException:
1184
1232
  # Cancellation mid-send: skips the clause above and would leave BOTH
1185
1233
  # the queue and the pending future registered — the queue never
1186
- # drains and buffers every later event for this id forever.
1234
+ # drains and buffers every later event for this id forever. The
1235
+ # frame may already be on the wire, so release it on Home
1236
+ # Assistant's side too, as subscribe_events does.
1187
1237
  self._state.unregister_subscription_queue(message_id)
1188
1238
  self.cancel_pending_response(message_id)
1239
+ self._state.mark_abandoned_subscription(message_id)
1240
+ await self._run_cleanup(
1241
+ self._release_abandoned_subscription(message_id),
1242
+ f"abandoned {command_type}({message_id})",
1243
+ )
1189
1244
  raise
1190
1245
 
1191
1246
  try:
1192
- response = await asyncio.wait_for(result_future, timeout=timeout)
1247
+ response = await asyncio.wait_for(result_future, timeout=wait_timeout)
1193
1248
  except BaseException:
1194
1249
  # A cancelled caller leaks the pending future AND the subscription
1195
1250
  # queue, which keeps accumulating events with no reader. The
1196
- # cleanup is exception-type-independent and the original exception
1197
- # re-raises unchanged.
1251
+ # command is on the wire, so Home Assistant may have registered
1252
+ # the subscription: the caller never receives its id, so releasing
1253
+ # it is this method's job. The original exception re-raises
1254
+ # unchanged.
1198
1255
  self._state.unregister_subscription_queue(message_id)
1199
1256
  self.cancel_pending_response(message_id)
1257
+ self._state.mark_abandoned_subscription(message_id)
1258
+ await self._run_cleanup(
1259
+ self._release_abandoned_subscription(message_id),
1260
+ f"abandoned {command_type}({message_id})",
1261
+ )
1200
1262
  raise
1201
1263
 
1202
1264
  if response.get("type") == "result" and response.get("success"):
@@ -1208,6 +1270,65 @@ class HomeAssistantWebSocketClient:
1208
1270
  f"subscribe_command({command_type!r}) failed: {error_msg}", error_code
1209
1271
  )
1210
1272
 
1273
+ async def release_subscription(self, subscription_id: int) -> None:
1274
+ """Release a :meth:`subscribe_command` subscription from a ``finally``.
1275
+
1276
+ Unlike :meth:`unsubscribe_command` this never raises and survives the
1277
+ caller's cancellation: a failed or timed-out release must not replace
1278
+ the result the caller already has, and a cancelled caller must still
1279
+ release, or Home Assistant keeps the subscription for the life of the
1280
+ socket.
1281
+ """
1282
+ self._state.unregister_subscription_queue(subscription_id)
1283
+ socket = self.websocket
1284
+ if await self._run_cleanup(
1285
+ self._release_abandoned_subscription(subscription_id),
1286
+ f"subscription {subscription_id}",
1287
+ ):
1288
+ return
1289
+ # The deadline stopped the release before ``unsubscribe_events`` went
1290
+ # out (the send lock was held throughout), and the subscription's ack
1291
+ # has already been consumed, so nothing else will release it.
1292
+ task = asyncio.ensure_future(self._finish_release(subscription_id, socket))
1293
+ self._late_releases.add(task)
1294
+ task.add_done_callback(self._late_release_done)
1295
+
1296
+ def _late_release_done(self, task: asyncio.Task[None]) -> None:
1297
+ """Collect cleanup outcomes while keeping unexpected failures visible."""
1298
+ self._late_releases.discard(task)
1299
+ if task.cancelled():
1300
+ return
1301
+ error = task.exception()
1302
+ if isinstance(error, HomeAssistantCommandTimeout) and self._state.is_ready:
1303
+ logger.warning(
1304
+ "Background subscription release timed out; could not confirm "
1305
+ "subscription cleanup in Home Assistant"
1306
+ )
1307
+ elif isinstance(
1308
+ error,
1309
+ (
1310
+ HomeAssistantConnectionError,
1311
+ HomeAssistantCommandTimeout,
1312
+ websockets.exceptions.ConnectionClosed,
1313
+ ),
1314
+ ):
1315
+ logger.debug("Background subscription release failed: %s", error)
1316
+ elif error is not None:
1317
+ logger.error(
1318
+ "Unexpected background subscription release failure",
1319
+ exc_info=(type(error), error, error.__traceback__),
1320
+ )
1321
+
1322
+ async def _finish_release(self, subscription_id: int, socket: Any) -> None:
1323
+ """Complete a release the cleanup deadline cut short, on the same socket.
1324
+
1325
+ A reconnect drops the subscription with the old socket and restarts
1326
+ message ids, so on a new socket the id could name an unrelated one.
1327
+ """
1328
+ if self.websocket is not socket:
1329
+ return
1330
+ await self._release_abandoned_subscription(subscription_id)
1331
+
1211
1332
  async def unsubscribe_command(
1212
1333
  self,
1213
1334
  subscription_id: int,
@@ -900,8 +900,8 @@ class HomeAssistantSmartMCPServer:
900
900
  # which measures both sides at test time.
901
901
  #
902
902
  # It was the largest full description in the GATEWAY catalog this was
903
- # measured against, not in the repo: ha_eval_template (5834) and
904
- # ha_get_system_health (5811) are both larger and both unmapped.
903
+ # measured against, not in the repo: ha_get_system_health (5811) is
904
+ # larger and unmapped.
905
905
  # The reduction is smaller than pure compression would give because
906
906
  # the safety content below is kept inline. The routing matrix STAYS —
907
907
  # the `action` parameter's own Field description says "Valid (scope,
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Şablonu emal et",
703
- "description": "Home Assistant-ın şablon mühərrikindən istifadə edərək Jinja2 şablonlarını emal edin."
703
+ "description": "Home Assistant-də Jinja2 şablonunun render edilməsini və ya avtomatlaşdırma şərtinin yoxlanılmasını icra edin."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Tətbiqləri (əlavələri) al",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "Vyhodnotit šablonu",
672
- "description": "Vyhodnotit šablony Jinja2 pomocí šablonovacího enginu Home Assistant."
672
+ "description": "Provede vykreslení šablony Jinja2 nebo kontrolu podmínki automatizace v Home Assistant."
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "Získat aplikace (doplňky)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Template auswerten",
703
- "description": "Wertet ein Jinja2-Template mit der Home-Assistant-Engine aus."
703
+ "description": "Führe ein Jinja2-Template-Rendering oder eine Automatisierungs-Bedingungsprüfung in Home Assistant aus."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Apps (Add-ons) abrufen",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "Taksi Ŝablonon",
672
- "description": "Taksi Jinja2-ŝablonojn uzante la ŝablonan motoron de Home Assistant."
672
+ "description": "Plenumi Jinja2-ŝablonan rendorigon, aŭ aŭtomatigan kondiĉan kontrolon, en Home Assistant."
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "Akiri programojn (aldonaĵojn)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Evaluar plantilla",
703
- "description": "Evalúa plantillas Jinja2 con el motor de plantillas de Home Assistant."
703
+ "description": "Ejecuta una renderización de plantilla Jinja2, o una comprobación de condición de automatización, en Home Assistant."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Obtener Apps (add-ons)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Évaluer le modèle",
703
- "description": "Évalue un modèle Jinja2 avec le moteur Home Assistant."
703
+ "description": "Exécute le rendu d'un modèle Jinja2 ou une vérification de condition d'automatisation dans Home Assistant."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Obtenir des applications (add-ons)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Valuta un template",
703
- "description": "Valuta i template Jinja2 usando il motore dei template di Home Assistant."
703
+ "description": "Esegue il rendering di un template Jinja2 o un controllo delle condizioni di un'automazione in Home Assistant."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Ottieni app (componenti aggiuntivi)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "템플릿 평가",
703
- "description": "Home Assistant 템플릿 엔진으로 Jinja2 템플릿을 평가합니다."
703
+ "description": "Home Assistant에서 Jinja2 템플릿 렌더링 또는 자동화 조건 검사를 실행합니다."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "앱(애드온) 조회",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "Evalueer Sjabloon",
672
- "description": "Evalueer Jinja2-sjablonen met behulp van de sjabloonengine van Home Assistant."
672
+ "description": "Voer een Jinja2-sjabloonweergave of een automatiseringsvoorwaardecontrole uit in Home Assistant."
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "Apps ophalen (add-ons)",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "Oceń szablon",
672
- "description": "Oceń szablony Jinja2 za pomocą silnika szablonów Home Assistant."
672
+ "description": "Wykonaj renderowanie szablonu Jinja2 lub sprawdź warunek automatyzacji w Home Assistant."
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "Pobierz aplikacje (dodatki)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "Вычислить шаблон",
703
- "description": "Вычислить Jinja2-шаблон с помощью движка Home Assistant."
703
+ "description": "Выполнить рендеринг шаблона Jinja2 или проверку условия автоматизации в Home Assistant."
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "Получить приложения (аддоны)",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "Utvärdera Mall",
672
- "description": "Utvärdera Jinja2-mallar med Home Assistants mallmotor."
672
+ "description": "Kör en Jinja2-mallrendering eller en automationsvillkorskontroll i Home Assistant."
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "Hämta appar (tillägg)",
@@ -700,7 +700,7 @@
700
700
  },
701
701
  "ha_eval_template": {
702
702
  "title": "评估模板",
703
- "description": "使用 Home Assistant 的模板引擎评估 Jinja2 模板。"
703
+ "description": "在 Home Assistant 中执行 Jinja2 模板渲染或自动化条件检查。"
704
704
  },
705
705
  "ha_get_app": {
706
706
  "title": "获取应用(add-on)",
@@ -669,7 +669,7 @@
669
669
  },
670
670
  "ha_eval_template": {
671
671
  "title": "評估範本",
672
- "description": "使用 Home Assistant 的範本引擎評估 Jinja2 範本。"
672
+ "description": "在 Home Assistant 中執行 Jinja2 範本渲染或自動化條件檢查。"
673
673
  },
674
674
  "ha_get_app": {
675
675
  "title": "取得應用程式 (add-ons)",