ha-mcp-dev 9.1.0.dev3302__tar.gz → 9.1.0.dev3307__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 (833) hide show
  1. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/PKG-INFO +1 -1
  2. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/pyproject.toml +1 -1
  3. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/pyproject.toml.orig +1 -1
  4. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_dashboards.py +29 -11
  5. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_manager.py +7 -7
  6. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/capture.py +6 -0
  7. ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/dashboard_screenshot/theme_check.py +78 -0
  8. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/auto_backup.py +17 -5
  9. ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/tools/resource_codec.py +356 -0
  10. ha_mcp_dev-9.1.0.dev3307/src/ha_mcp/tools/resource_patch.py +286 -0
  11. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_dashboards.py +7 -7
  12. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_resources.py +219 -412
  13. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/LICENSE +0 -0
  14. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/README.md +0 -0
  15. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/__init__.py +0 -0
  16. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/__main__.py +0 -0
  17. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_pypi_marker +0 -0
  18. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_rich_compat.py +0 -0
  19. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/__init__.py +0 -0
  20. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  21. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  22. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  23. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  24. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  25. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  26. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  27. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  28. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  29. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  30. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  31. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  32. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  33. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  34. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  35. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  36. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  37. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  38. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  39. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  40. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  41. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  42. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  43. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  44. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  45. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  46. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  47. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  48. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  49. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  50. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  51. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  52. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  53. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  54. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  55. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  56. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  57. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  58. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  59. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  60. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  61. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  62. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  63. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  64. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  65. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  66. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  67. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  68. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  69. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  70. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  71. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  72. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  73. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  74. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  75. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  76. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  77. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  78. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  79. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  80. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  81. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
  82. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  83. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  84. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  85. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  86. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  87. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  88. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  89. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  90. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  91. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  92. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  93. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  94. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  95. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  96. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  97. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  98. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  99. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  100. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  101. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  102. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  103. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  104. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  105. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  106. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  107. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  108. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  109. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  110. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  111. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  112. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  113. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  114. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  115. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  116. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  117. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  118. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  119. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  120. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  121. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  122. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  123. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  124. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  125. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  126. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  127. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  128. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  129. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  130. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  131. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  132. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  133. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  134. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  135. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  136. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  137. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  138. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  139. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  140. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  141. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  142. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  143. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  144. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  145. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  146. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  147. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  148. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  149. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  150. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  151. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  152. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  153. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  154. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  155. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  156. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  157. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  158. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  159. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  160. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  161. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  162. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  163. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  164. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  165. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  166. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  167. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  168. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  169. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  170. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  171. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  172. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  173. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  174. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  175. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  176. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  177. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  178. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  179. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  180. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  181. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  182. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  183. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  184. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  185. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  186. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  187. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  188. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  189. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  190. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  191. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  192. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  193. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  194. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  195. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  196. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  197. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  198. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  199. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  200. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  201. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  202. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  203. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  204. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  205. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  206. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  207. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  208. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  209. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  210. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  211. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  212. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  213. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  214. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  215. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  216. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  217. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  218. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  219. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  220. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  221. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  222. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  223. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  224. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  225. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  226. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  227. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  228. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  229. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  230. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  231. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  232. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  233. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  234. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  235. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  236. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  237. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  238. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  239. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  240. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  241. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
  242. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
  243. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
  244. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
  245. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
  246. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
  247. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
  248. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
  249. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  250. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  251. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  252. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  253. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  254. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  255. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  256. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  257. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  258. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  259. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  260. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  261. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  262. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  263. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  264. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  265. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  266. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  267. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  268. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  269. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  270. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  271. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  272. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  273. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  274. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  275. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  276. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  277. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  278. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  279. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  280. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  281. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  282. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  283. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  284. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  285. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  286. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  287. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  288. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  289. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  290. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  291. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  292. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  293. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  294. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  295. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  296. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  297. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  298. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  299. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  300. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  301. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  302. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  303. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  304. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  305. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  306. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  307. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  308. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  309. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  310. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  311. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  312. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  313. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  314. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  315. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  316. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  317. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  318. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  319. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  320. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  321. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  322. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  323. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  324. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  325. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  326. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  327. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  328. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  329. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  330. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  331. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  332. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  333. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  334. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  335. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  336. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  337. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  338. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  339. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  340. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  341. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  342. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  343. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  344. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  345. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  346. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  347. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  348. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  349. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  350. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  351. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  352. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  353. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  354. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  355. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  356. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  357. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  358. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  359. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  360. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  361. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  362. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  363. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  364. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  365. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  366. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  367. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  368. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  369. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  370. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  371. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  372. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  373. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  374. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  375. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  376. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  377. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  378. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  379. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  380. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  381. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  382. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  383. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  384. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  385. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  386. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  387. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  388. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  389. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  390. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  391. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  392. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  393. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  394. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  395. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  396. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  397. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  398. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  399. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  400. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  401. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  402. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  403. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  404. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  405. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  406. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  407. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  408. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  409. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  410. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  411. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  412. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  413. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  414. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  415. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  416. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  417. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  418. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  419. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  420. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  421. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  422. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  423. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  424. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  425. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  426. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  427. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  428. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  429. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  430. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  431. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  432. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  433. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  434. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  435. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  436. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  437. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  438. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  439. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  440. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  441. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  442. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  443. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/requirements.txt +0 -0
  444. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  445. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  446. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  447. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  448. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  449. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  450. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  451. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  452. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  453. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  454. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  455. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  456. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  457. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  458. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  459. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  460. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  461. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  462. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  463. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  464. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  465. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  466. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  467. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  468. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  469. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  470. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  471. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  472. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  473. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  474. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  475. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  476. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  477. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  478. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  479. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  480. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  481. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  482. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  483. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  484. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  485. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  486. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  487. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  488. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  489. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  490. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  491. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  492. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  493. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  494. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  495. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  496. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  497. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  498. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  499. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  500. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/_version.py +0 -0
  501. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/app_discovery.py +0 -0
  502. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/__init__.py +0 -0
  503. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/consent_form.py +0 -0
  504. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/iss_stamp.py +0 -0
  505. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/oidc_compat.py +0 -0
  506. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/auth/provider.py +0 -0
  507. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_diff.py +0 -0
  508. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_entities.py +0 -0
  509. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_entity_ids.py +0 -0
  510. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_helper_target.py +0 -0
  511. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_integrations.py +0 -0
  512. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_tags.py +0 -0
  513. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_todo.py +0 -0
  514. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/backup_zones.py +0 -0
  515. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/browser_landing.py +0 -0
  516. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/__init__.py +0 -0
  517. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/admin_routes.py +0 -0
  518. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/error_log_journald.py +0 -0
  519. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/models.py +0 -0
  520. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/rest_client.py +0 -0
  521. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/supervisor_client.py +0 -0
  522. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/websocket_client.py +0 -0
  523. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/client/websocket_listener.py +0 -0
  524. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config.py +0 -0
  525. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_backup.py +0 -0
  526. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_meta.py +0 -0
  527. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_overrides.py +0 -0
  528. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_registry.py +0 -0
  529. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/config_settings.py +0 -0
  530. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  531. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  532. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
  533. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  534. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  535. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  536. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/errors.py +0 -0
  537. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/ha_request_queue.py +0 -0
  538. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  539. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/http_transport.py +0 -0
  540. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/image_info.py +0 -0
  541. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/ipv6_lan_guard.py +0 -0
  542. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/listen_sockets.py +0 -0
  543. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/llm_exposure.py +0 -0
  544. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/log_filters.py +0 -0
  545. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/mcp_client_context.py +0 -0
  546. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/__init__.py +0 -0
  547. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/approval_queue.py +0 -0
  548. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/decision_pin.py +0 -0
  549. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/decisions.py +0 -0
  550. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/editing.py +0 -0
  551. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/evaluator.py +0 -0
  552. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/events.py +0 -0
  553. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/handlers.py +0 -0
  554. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/middleware.py +0 -0
  555. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/model.py +0 -0
  556. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/mrtr.py +0 -0
  557. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/persistence.py +0 -0
  558. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/server_channels.py +0 -0
  559. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/policy/value_sources.py +0 -0
  560. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/py.typed +0 -0
  561. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/read_only.py +0 -0
  562. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/redaction.py +0 -0
  563. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/renamed_tools.py +0 -0
  564. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  565. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  566. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  567. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  568. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  569. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  570. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  571. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  572. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  573. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  574. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  575. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  576. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  577. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  578. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  579. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  580. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  581. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server.py +0 -0
  582. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_instructions.py +0 -0
  583. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_lifespan.py +0 -0
  584. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/server_tool_text.py +0 -0
  585. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/__init__.py +0 -0
  586. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  587. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  588. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  589. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
  590. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  591. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  592. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  593. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  594. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  595. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  596. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  597. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_theme.py +0 -0
  598. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  599. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  600. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  601. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  602. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  603. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  604. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  605. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  606. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  607. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
  608. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  609. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  610. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  611. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  612. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  613. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  614. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  615. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  616. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  617. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings.css +0 -0
  618. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings.html +0 -0
  619. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  620. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  621. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  622. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  623. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  624. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  625. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  626. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  627. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  628. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
  629. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/smoke_test.py +0 -0
  630. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  631. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/storage_helper_types.py +0 -0
  632. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/strict_bps.py +0 -0
  633. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tool_dispatch.py +0 -0
  634. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/__init__.py +0 -0
  635. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
  636. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/area_messages.py +0 -0
  637. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/automation_errors.py +0 -0
  638. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup.py +0 -0
  639. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_access.py +0 -0
  640. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  641. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_snapshot.py +0 -0
  642. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
  643. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  644. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_result.py +0 -0
  645. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  646. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  647. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  648. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/blueprint_write.py +0 -0
  649. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_config.py +0 -0
  650. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
  651. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_sources.py +0 -0
  652. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  653. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/bulk_selector.py +0 -0
  654. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/coercion.py +0 -0
  655. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_api.py +0 -0
  656. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_automation.py +0 -0
  657. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_config_entries.py +0 -0
  658. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_config_reads.py +0 -0
  659. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  660. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_devices.py +0 -0
  661. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  662. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_registries.py +0 -0
  663. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  664. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/component_todo.py +0 -0
  665. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  666. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  667. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  668. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  669. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  670. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  671. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  672. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  673. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  674. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_file_visibility.py +0 -0
  675. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  676. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  677. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  678. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  679. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  680. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  681. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  682. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  683. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  684. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  685. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  686. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  687. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  688. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_write_errors.py +0 -0
  689. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  690. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/core_contract.py +0 -0
  691. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  692. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  693. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  694. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
  695. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/dev_backup.py +0 -0
  696. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/device_control.py +0 -0
  697. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/device_enrichment.py +0 -0
  698. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  699. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/energy_preferences.py +0 -0
  700. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
  701. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  702. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_registration.py +0 -0
  703. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_removal.py +0 -0
  704. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  705. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  706. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  707. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/hacs_backend.py +0 -0
  708. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/hacs_registration.py +0 -0
  709. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/helper_flows.py +0 -0
  710. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/helpers.py +0 -0
  711. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/history_response.py +0 -0
  712. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  713. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  714. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_common.py +0 -0
  715. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources.py +0 -0
  716. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  717. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
  718. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  719. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/__init__.py +0 -0
  720. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/base.py +0 -0
  721. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/matter.py +0 -0
  722. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/thread.py +0 -0
  723. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  724. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zwave.py +0 -0
  725. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  726. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/recorder_errors.py +0 -0
  727. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/reference_validator.py +0 -0
  728. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/registry.py +0 -0
  729. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  730. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/response_helpers.py +0 -0
  731. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/scene_discovery.py +0 -0
  732. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/__init__.py +0 -0
  733. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/base.py +0 -0
  734. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/component.py +0 -0
  735. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/entities.py +0 -0
  736. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/legacy.py +0 -0
  737. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/modes.py +0 -0
  738. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/overview.py +0 -0
  739. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/response.py +0 -0
  740. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/search/state.py +0 -0
  741. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/server_version.py +0 -0
  742. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  743. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  744. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  745. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  746. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  747. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  748. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  749. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  750. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  751. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  752. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_calendar.py +0 -0
  753. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  754. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/statistics_resets.py +0 -0
  755. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/system_restart.py +0 -0
  756. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tool_hints.py +0 -0
  757. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  758. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_addons.py +0 -0
  759. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_areas.py +0 -0
  760. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  761. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  762. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  763. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_calendar.py +0 -0
  764. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_camera.py +0 -0
  765. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_categories.py +0 -0
  766. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_code.py +0 -0
  767. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  768. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  769. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  770. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  771. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  772. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_dev.py +0 -0
  773. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_energy.py +0 -0
  774. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_entities.py +0 -0
  775. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  776. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_groups.py +0 -0
  777. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_hacs.py +0 -0
  778. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_history.py +0 -0
  779. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_integrations.py +0 -0
  780. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_labels.py +0 -0
  781. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_logs.py +0 -0
  782. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_radio.py +0 -0
  783. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_registry.py +0 -0
  784. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_search.py +0 -0
  785. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  786. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_service.py +0 -0
  787. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_services.py +0 -0
  788. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_system.py +0 -0
  789. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_themes.py +0 -0
  790. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_todo.py +0 -0
  791. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_traces.py +0 -0
  792. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_updates.py +0 -0
  793. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_utility.py +0 -0
  794. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  795. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  796. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  797. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/tools_zones.py +0 -0
  798. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/update_categories.py +0 -0
  799. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/util_helpers.py +0 -0
  800. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/validation_middleware.py +0 -0
  801. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/tools/ws_waiters.py +0 -0
  802. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/__init__.py +0 -0
  803. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/categorized_search.py +0 -0
  804. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/compact_params.py +0 -0
  805. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/component_helpers.py +0 -0
  806. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/component_search.py +0 -0
  807. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  808. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  809. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/transport_security.py +0 -0
  810. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/update_check.py +0 -0
  811. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/__init__.py +0 -0
  812. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/config_hash.py +0 -0
  813. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/config_write_lock.py +0 -0
  814. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  815. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/data_paths.py +0 -0
  816. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  817. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/domain_handlers.py +0 -0
  818. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/entity_membership.py +0 -0
  819. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  820. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  821. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  822. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/operation_manager.py +0 -0
  823. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/python_sandbox.py +0 -0
  824. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  825. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/skill_loader.py +0 -0
  826. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/utils/usage_logger.py +0 -0
  827. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/__init__.py +0 -0
  828. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/config_files.py +0 -0
  829. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/enforcement.py +0 -0
  830. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
  831. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/model.py +0 -0
  832. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/persistence.py +0 -0
  833. {ha_mcp_dev-9.1.0.dev3302 → ha_mcp_dev-9.1.0.dev3307}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 9.1.0.dev3302
3
+ Version: 9.1.0.dev3307
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.1.0.dev3302"
7
+ version = "9.1.0.dev3307"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.1.0.dev3302"
7
+ version = "9.1.0.dev3307"
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
@@ -21,8 +21,10 @@ from typing import Any
21
21
  from .backup_entity_ids import _manager
22
22
  from .client.rest_client import HomeAssistantCommandError, HomeAssistantError
23
23
 
24
- # Core's DASHBOARD_BASE_UPDATE_FIELDS: what lovelace/dashboards/update accepts.
25
- _SETTINGS_FIELDS = ("title", "icon", "require_admin", "show_in_sidebar")
24
+ # Keys of Core's stored dashboard item that lovelace/dashboards/update does not
25
+ # take. Without the component, which reads Core's update schema, a restore sends
26
+ # back the rest of the item.
27
+ _ROW_ONLY_FIELDS = ("id", "url_path", "mode")
26
28
  _DASHBOARD_KIND = "dashboard_settings"
27
29
 
28
30
 
@@ -169,16 +171,17 @@ async def restore_dashboard(client: Any, entity_id: str, config: Any) -> Any:
169
171
  async def _recreate(client: Any, row: dict[str, Any], body: Any) -> Any:
170
172
  bm = _manager()
171
173
  url_path = row["url_path"]
172
- # The component's rows carry ``icon: None`` for an unset icon, which Core's
173
- # create schema rejects; an omitted field takes Core's default.
174
+ # Rows captured by an older component carry ``icon: None`` for an unset
175
+ # icon, which Core's create schema rejects; an omitted field takes Core's
176
+ # default.
174
177
  fields = bm._strip_readonly(row, "id", "mode")
175
178
  create = {
176
179
  "type": "lovelace/dashboards/create",
177
180
  **{key: value for key, value in fields.items() if value is not None},
181
+ # The row is one Core already accepted, so its path needs no hyphen
182
+ # check (Core's own single-word dashboards: ``lovelace``, ``map``).
183
+ "allow_single_word": True,
178
184
  }
179
- if "-" not in url_path:
180
- # Core's own single-word dashboards (``lovelace``, ``map``) need this.
181
- create["allow_single_word"] = True
182
185
  try:
183
186
  await bm._ws_send(client, create)
184
187
  except HomeAssistantCommandError as err:
@@ -197,21 +200,36 @@ async def _restore_settings(
197
200
  ) -> None:
198
201
  """Put back the row's settings after its config; ``icon: None`` clears it."""
199
202
  bm = _manager()
200
- fields = {key: row[key] for key in _SETTINGS_FIELDS if key in row}
201
- # Core's own list omits ``icon`` when none is stored; the component's sends None.
202
- fields.setdefault("icon", None)
203
+ update_fields = await _update_fields(client)
204
+ if update_fields:
205
+ fields = {k: v for k, v in row.items() if k in update_fields}
206
+ else:
207
+ fields = {k: v for k, v in row.items() if k not in _ROW_ONLY_FIELDS}
208
+ if not update_fields or "icon" in update_fields:
209
+ # Core's list omits ``icon`` when none is stored; None clears a live one.
210
+ fields.setdefault("icon", None)
203
211
  update = {"type": "lovelace/dashboards/update", "dashboard_id": dashboard_id}
204
212
  try:
205
213
  await bm._ws_send(client, {**update, **fields})
206
214
  except bm._CAPTURE_TRANSIENT_ERRORS as err:
207
215
  raise bm.BackupRestoreError(
208
216
  f"The config of dashboard {row['url_path']} was restored, but its "
209
- "settings (title, icon, sidebar, admin) may not have been.",
217
+ "settings may not have been.",
210
218
  apply_status="unknown",
211
219
  reason="settings_not_restored",
212
220
  ) from err
213
221
 
214
222
 
223
+ async def _update_fields(client: Any) -> list[str] | None:
224
+ """The keys Core's ``lovelace/dashboards/update`` schema accepts, from the
225
+ component; ``None`` without a component that reports them."""
226
+ from .tools.tools_config_dashboards import _dashboards_via_component
227
+
228
+ result = await _dashboards_via_component(client, "list")
229
+ fields = result.get("update_fields") if result else None
230
+ return fields if isinstance(fields, list) else None
231
+
232
+
215
233
  async def _restore_default_store(client: Any, body: Any) -> dict[str, Any]:
216
234
  """Put the body in Core's default store, which the built-in panel reads."""
217
235
  if body is None:
@@ -2179,16 +2179,16 @@ async def _dashboard_resource_like(client: Any, config: dict[str, Any]) -> Any:
2179
2179
 
2180
2180
 
2181
2181
  async def _restore_dashboard_resource(client: Any, entity_id: str, config: Any) -> Any:
2182
- # Core imported old ``resources:`` entries without a type (RESOURCE_FIELDS).
2183
2182
  payload = _strip_readonly(config, "id", "type")
2184
- if "type" in config:
2183
+ if "type" in config: # Core imported old ``resources:`` entries without one
2185
2184
  payload["res_type"] = config["type"]
2186
2185
  update = {"type": "lovelace/resources/update", "resource_id": entity_id}
2187
- try:
2188
- return await _ws_send(client, {**update, **payload})
2189
- except HomeAssistantCommandError as err:
2190
- if err.code != "not_found": # not_found: deleted since the snapshot
2191
- raise
2186
+ async with registry_update_lock("dashboard_resource", entity_id): # the tool's lock
2187
+ try:
2188
+ return await _ws_send(client, {**update, **payload})
2189
+ except HomeAssistantCommandError as err:
2190
+ if err.code != "not_found": # not_found: deleted since the snapshot
2191
+ raise
2192
2192
  live = await _dashboard_resource_like(client, config)
2193
2193
  if live is not None: # an earlier restore re-created it
2194
2194
  return live
@@ -26,6 +26,7 @@ from ..errors import ErrorCode, create_error_response
26
26
  from ..tools.helpers import raise_tool_error
27
27
  from .engine_compat import is_legacy_puppet
28
28
  from .provision import TOKEN_HINT, EngineKind, resolve_engine
29
+ from .theme_check import check_requested_theme
29
30
  from .theme_guard import ThemeGuard
30
31
 
31
32
  logger = logging.getLogger(__name__)
@@ -886,6 +887,11 @@ async def capture_dashboard_images(
886
887
  render_timeout_seconds=render_timeout_seconds,
887
888
  )
888
889
  viewports = _capture_viewports(options)
890
+ theme_warnings = await check_requested_theme(
891
+ client, options.theme, options.dark_mode
892
+ )
893
+ if capture_warnings is not None:
894
+ capture_warnings.extend(theme_warnings)
889
895
 
890
896
  engine_target = await resolve_engine()
891
897
  engine_url = engine_target.url
@@ -0,0 +1,78 @@
1
+ """Check a screenshot's requested theme against Home Assistant's own themes.
2
+
3
+ The engine renders an unknown theme name as the default theme and reports no
4
+ error, so the name is checked against Core's ``frontend/get_themes`` first.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ from typing import Any
11
+
12
+ from ..errors import ErrorCode, create_error_response
13
+ from ..tools.helpers import raise_tool_error
14
+ from ..tools.util_helpers import websocket_error_message
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ # The frontend's built-in theme; Core's theme list holds only installed ones.
19
+ _BUILT_IN_THEME = "default"
20
+
21
+
22
+ def _unchecked(theme: str, reason: str) -> list[str]:
23
+ return [
24
+ f"Home Assistant's theme list could not be read ({reason}), so theme "
25
+ f"{theme!r} was not checked; an unknown name renders the default theme."
26
+ ]
27
+
28
+
29
+ async def check_requested_theme(
30
+ client: Any, theme: str | None, dark_mode: bool
31
+ ) -> list[str]:
32
+ """Refuse a theme Home Assistant does not have.
33
+
34
+ Returns warnings for a theme list that could not be read and for a
35
+ ``dark_mode`` naming a mode the theme's data does not define.
36
+ """
37
+ if theme is None or client is None or theme == _BUILT_IN_THEME:
38
+ return []
39
+ try:
40
+ result = await client.send_websocket_message({"type": "frontend/get_themes"})
41
+ except Exception as exc: # an optional pre-check must not fail the render
42
+ logger.warning(
43
+ "frontend/get_themes failed; theme %r not checked: %s",
44
+ theme,
45
+ exc,
46
+ exc_info=True,
47
+ )
48
+ return _unchecked(theme, str(exc))
49
+ if isinstance(result, dict) and result.get("success") is False:
50
+ return _unchecked(theme, websocket_error_message(result.get("error")))
51
+ listing = result.get("result") if isinstance(result, dict) else None
52
+ themes = listing.get("themes") if isinstance(listing, dict) else None
53
+ if not isinstance(themes, dict):
54
+ return _unchecked(theme, "unexpected response")
55
+ if theme not in themes:
56
+ raise_tool_error(
57
+ create_error_response(
58
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
59
+ f"Home Assistant has no theme named {theme!r}",
60
+ context={"installed_themes": [_BUILT_IN_THEME, *themes]},
61
+ suggestions=["Use one of installed_themes, or omit theme"],
62
+ )
63
+ )
64
+ entry = themes[theme]
65
+ modes = entry.get("modes") if isinstance(entry, dict) else None
66
+ if not isinstance(modes, dict):
67
+ modes = {}
68
+ if dark_mode and "dark" not in modes:
69
+ return [
70
+ f"Theme {theme!r} defines no dark mode in Home Assistant's theme "
71
+ "list, so dark_mode=true has no dark variant to use."
72
+ ]
73
+ if not dark_mode and modes and "light" not in modes:
74
+ return [
75
+ f"Theme {theme!r} defines only a dark mode in Home Assistant's theme "
76
+ "list, so dark_mode=false has no light variant to use."
77
+ ]
78
+ return []
@@ -44,6 +44,7 @@ from ..backup_manager import (
44
44
  from ..config import get_global_settings
45
45
  from ..errors import TOOL_ERROR_LOG_LEVEL, ErrorCode, create_error_response
46
46
  from .helpers import raise_tool_error
47
+ from .resource_patch import resource_write_lock
47
48
 
48
49
  logger = logging.getLogger(__name__)
49
50
 
@@ -398,11 +399,19 @@ def with_auto_backup(
398
399
  async def _template_write_context(
399
400
  client: Any, settings: Any, domain: str, entity_id: str
400
401
  ) -> AsyncIterator[None]:
401
- """Keep a helper edit's capture and mutation in the restore critical section.
402
-
403
- The lock is needed even when ordinary auto-backup is disabled: restores
404
- of existing flow helpers require a safety snapshot before replacing
405
- their current options.
402
+ """Keep a write's capture and mutation in one critical section.
403
+
404
+ Flow helpers and integrations share the restore critical section. The lock
405
+ is needed even when ordinary auto-backup is disabled: restores of existing
406
+ flow helpers require a safety snapshot before replacing their current
407
+ options.
408
+
409
+ Dashboard resources take their per-resource write lock here, so the
410
+ snapshot, the tool's own read (an ``edits=`` patch) and its write cannot
411
+ interleave with another write through this server. Writes from the Home
412
+ Assistant UI or other processes are not serialized, so the snapshot can
413
+ predate an edit made there that the write then replaces. The resource
414
+ tools must not take the lock again: ``asyncio.Lock`` is not reentrant.
406
415
  """
407
416
  # Both options-update tools take stable config-entry IDs. Alias-based helper
408
417
  # removal and dotted subentry targets have separate resolution paths.
@@ -413,6 +422,9 @@ async def _template_write_context(
413
422
  manager = get_backup_manager(client, settings)
414
423
  async with manager.config_entry_write_guard(entity_id):
415
424
  yield
425
+ elif domain == "dashboard_resource" and entity_id:
426
+ async with resource_write_lock(entity_id):
427
+ yield
416
428
  else:
417
429
  yield
418
430
 
@@ -0,0 +1,356 @@
1
+ """Inline dashboard-resource codec: ``data:`` URI encoding/decoding and list rendering.
2
+
3
+ Pure functions shared by the resource tools. Kept apart from
4
+ ``tools_resources`` so the tool module holds only the MCP surface.
5
+ """
6
+
7
+ import base64
8
+ import hashlib
9
+ import re
10
+ from typing import Any
11
+ from urllib.parse import urlsplit
12
+
13
+ from ..errors import ErrorCode, create_error_response
14
+ from .helpers import raise_tool_error
15
+
16
+ # Legacy Cloudflare Worker URL. Only used to recognize and locally decode
17
+ # inline resources created before the data: URI switch (#2060) — this server
18
+ # never fetches it. The worker deployment stays up so pre-existing dashboards
19
+ # keep loading until their resources are converted.
20
+ LEGACY_WORKER_BASE_URL = "https://ha-mcp-resources.rapid-math-bbad.workers.dev"
21
+
22
+ # data: URI media types per inline resource_type ('js'/'html' are url-mode
23
+ # only). CSS carries an explicit charset because stylesheets, unlike module
24
+ # scripts, have no spec-mandated UTF-8 fallback.
25
+ _DATA_URI_MIME: dict[str, str] = {
26
+ "module": "text/javascript",
27
+ "css": "text/css;charset=utf-8",
28
+ }
29
+
30
+ # URL prefixes recognized as ha-mcp inline resources — DERIVED from the media
31
+ # types above rather than restated, so the read side cannot drift from the
32
+ # write side (a desync would make the server fail to recognize its own
33
+ # output, leaking raw base64 URLs into list responses). Each media type is
34
+ # accepted with and without the charset parameter so resources written
35
+ # before and after a charset change both still decode. Foreign data: URLs
36
+ # match nothing here and pass through untouched instead of being claimed.
37
+ _ALLOWED_DATA_URI_PREFIXES = tuple(
38
+ f"data:{base}{charset};base64,"
39
+ # dict.fromkeys dedupes while keeping a deterministic order.
40
+ for base in dict.fromkeys(mime.split(";", 1)[0] for mime in _DATA_URI_MIME.values())
41
+ for charset in ("", ";charset=utf-8")
42
+ )
43
+ # Scheme and media type are case-insensitive (RFC 3986/2397); prefixes are
44
+ # lowercase, so matching lowercases the URL head. Longest prefix is 42 chars.
45
+ _DATA_URI_HEAD = max(len(p) for p in _ALLOWED_DATA_URI_PREFIXES)
46
+
47
+ _B64_URLSAFE_RE = re.compile(r"[A-Za-z0-9_-]*={0,2}")
48
+
49
+ # Longest data: URL echoed verbatim for a resource we cannot decode.
50
+ # Beyond this the value is truncated: a corrupt or foreign payload can be
51
+ # ~171KB of base64, and echoing it whole would flood the response.
52
+ _MAX_ECHOED_URL = 300
53
+
54
+ # Characters of decoded content shown in list previews.
55
+ _PREVIEW_LENGTH = 150
56
+
57
+ # Total decoded content emitted per include_content=True response. A page
58
+ # of max-size resources would otherwise return limit x MAX_CONTENT_SIZE
59
+ # (up to ~64MB). Rows past the budget are FLAGGED, never shortened —
60
+ # handing back a silently-truncated payload is how a resource gets
61
+ # destroyed on write-back.
62
+ _MAX_CONTENT_BUDGET = 512_000
63
+
64
+ # Maximum inline content size, in UTF-8 bytes. The old 24KB bound was the
65
+ # content budget derived from the worker's ~32KB encoded URL-path limit;
66
+ # data: URIs impose no comparable limit, so the cap is now sized to fit
67
+ # established single-file card bundles without truncation while bounding
68
+ # what every dashboard load ships (the registered URL rides the Lovelace
69
+ # bootstrap to every browser) and what auto-backup snapshots per edit.
70
+ MAX_CONTENT_SIZE = 128_000
71
+
72
+
73
+ def content_sha256(content: str) -> str:
74
+ """SHA-256 hex digest over the UTF-8 bytes of decoded resource content."""
75
+ return hashlib.sha256(content.encode("utf-8")).hexdigest()
76
+
77
+
78
+ def _data_uri_for(content: str, resource_type: str) -> str:
79
+ """Encode content as a base64 ``data:`` URI for the given resource type.
80
+
81
+ Standard base64 (not URL-safe): browsers decode data: URIs with the
82
+ standard alphabet. Deterministic — same content, same URI.
83
+ """
84
+ mime = _DATA_URI_MIME.get(resource_type)
85
+ if mime is None:
86
+ raise_tool_error(
87
+ create_error_response(
88
+ code=ErrorCode.VALIDATION_INVALID_PARAMETER,
89
+ message=f"Inline content does not support resource_type={resource_type!r}",
90
+ suggestions=["Use resource_type='module' or 'css' for inline content"],
91
+ )
92
+ )
93
+ encoded = base64.b64encode(content.encode("utf-8")).decode("ascii")
94
+ return f"data:{mime};base64,{encoded}"
95
+
96
+
97
+ def _match_data_uri_prefix(url: str) -> str | None:
98
+ """Return the matched ha-mcp inline data: prefix of ``url``, else None.
99
+
100
+ Prefix matching is case-insensitive (scheme and media type are
101
+ case-insensitive per RFC 3986/2397); the payload's case is preserved.
102
+ """
103
+ head = url[:_DATA_URI_HEAD].lower()
104
+ for prefix in _ALLOWED_DATA_URI_PREFIXES:
105
+ if head.startswith(prefix):
106
+ return prefix
107
+ return None
108
+
109
+
110
+ def _decode_data_uri(url: str) -> str | None:
111
+ """Decode one of our base64 ``data:`` URIs back to content.
112
+
113
+ None for foreign data: URLs (other media types, percent-encoded form) —
114
+ those are passed through untouched, not claimed as inline resources —
115
+ and for corrupt payloads (``validate=True``: a payload the browser's
116
+ forgiving-base64 would reject must not be reported as valid content).
117
+ """
118
+ prefix = _match_data_uri_prefix(url)
119
+ if prefix is None:
120
+ return None
121
+ try:
122
+ return base64.b64decode(url[len(prefix) :], validate=True).decode("utf-8")
123
+ except Exception: # noqa: BLE001
124
+ return None
125
+
126
+
127
+ def _is_data_url(url: str) -> bool:
128
+ """True when ``url`` parses as the ``data:`` scheme in a browser.
129
+
130
+ ``urlsplit`` applies WHATWG's leading C0-control-or-space strip and
131
+ ASCII tab/newline/CR removal before reading the scheme (the
132
+ CVE-2023-24329 hardening; this package requires Python >=3.13), and
133
+ lowercases it. A raw ``url[:5]`` check would miss ``" data:..."`` and
134
+ ``"da\\tta:..."``, which browsers still load.
135
+ """
136
+ return urlsplit(url).scheme == "data"
137
+
138
+
139
+ def _pad_b64(encoded: str) -> str:
140
+ """Reject non-alphabet characters, then restore any stripped ``=`` padding.
141
+
142
+ ``urlsafe_b64decode`` has no ``validate=`` parameter, so strictness has
143
+ to be enforced here; the padding fix-up keeps genuine worker URLs (which
144
+ always carried padding) working either way.
145
+ """
146
+ if not _B64_URLSAFE_RE.fullmatch(encoded):
147
+ raise ValueError("non-base64 characters in payload")
148
+ return encoded + "=" * (-len(encoded) % 4)
149
+
150
+
151
+ def _has_inline_url_shape(url: str) -> bool:
152
+ """True when ``url`` LOOKS like one of ours, regardless of decodability.
153
+
154
+ Only used to flag a recognized-but-corrupt payload; the decode result
155
+ itself (never this) decides what counts as an inline resource.
156
+ """
157
+ if _match_data_uri_prefix(url) is not None:
158
+ return True
159
+ prefix = f"{LEGACY_WORKER_BASE_URL}/"
160
+ return url[: len(prefix)].lower() == prefix.lower()
161
+
162
+
163
+ def _looks_like_preview(content: str) -> bool:
164
+ """Cheap pre-filter: could ``content`` be a list-tool ``_preview``?
165
+
166
+ Previews are ``_PREVIEW_LENGTH`` characters plus a trailing ``"..."``.
167
+ Two shapes qualify: that signature itself (tolerating surrounding
168
+ whitespace), and exactly ``_PREVIEW_LENGTH`` characters, which is what
169
+ an agent produces by stripping the ellipsis.
170
+
171
+ Deliberately narrow. Everything matching pays a WS round-trip and, if
172
+ that round-trip fails, is refused — so matching ordinary short content
173
+ (a legitimate 20-character CSS tweak) would make routine updates
174
+ fragile for no safety gain, since such content cannot be a preview of
175
+ anything.
176
+ """
177
+ stripped = content.strip()
178
+ if stripped.endswith("...") and len(stripped) <= _PREVIEW_LENGTH + 3:
179
+ return True
180
+ return len(stripped) == _PREVIEW_LENGTH
181
+
182
+
183
+ def _is_preview_of(content: str, stored: str) -> bool:
184
+ """True when ``content`` is the truncated preview of ``stored``.
185
+
186
+ Tolerates the ellipsis being stripped and surrounding whitespace, so a
187
+ lightly-mangled preview writeback is still caught.
188
+ """
189
+ if len(stored) <= _PREVIEW_LENGTH:
190
+ # Short resources have no truncated preview to confuse with.
191
+ return False
192
+ candidate = content.strip().removesuffix("...")
193
+ return bool(candidate) and stored.startswith(candidate)
194
+
195
+
196
+ def _decode_inline_content(url: str) -> tuple[str, bool] | None:
197
+ """Decode an inline resource URL to ``(content, is_legacy_worker)``.
198
+
199
+ ``None`` when the URL is not one of ours, or is one of ours but holds
200
+ an empty/corrupt payload. This is the single source of truth for "is
201
+ this an inline resource we can show", so the list summary counts and
202
+ the per-resource markers can never disagree. Returning one ``None``
203
+ rather than a ``(None, bool)`` pair keeps the meaningless
204
+ "not-ours-but-legacy" combination unrepresentable and forces callers
205
+ through one check instead of indexing the tuple.
206
+ """
207
+ content = _decode_data_uri(url)
208
+ if content:
209
+ return content, False
210
+ legacy = _decode_legacy_worker_url(url)
211
+ if legacy:
212
+ return legacy, True
213
+ return None
214
+
215
+
216
+ def _decode_legacy_worker_url(url: str) -> str | None:
217
+ """Decode a legacy worker inline URL back to content (pure local base64).
218
+
219
+ The worker embedded URL-safe base64 in its path; decoding needs no
220
+ network. Anchored to the worker origin — lookalike hosts that merely
221
+ contain the worker host string are not decoded. Returns None if the URL
222
+ is not a legacy worker URL.
223
+ """
224
+ prefix = f"{LEGACY_WORKER_BASE_URL}/"
225
+ # Scheme and host are case-insensitive; the base64 payload is not.
226
+ if url[: len(prefix)].lower() != prefix.lower():
227
+ return None
228
+ try:
229
+ # Extract base64 part: https://worker.dev/{base64}?type=module
230
+ encoded = url[len(prefix) :].split("?", maxsplit=1)[0]
231
+ # validate=True mirrors _decode_data_uri: urlsafe_b64decode otherwise
232
+ # silently DISCARDS non-alphabet characters, so a junk path could
233
+ # decode to plausible text and be masked as inline content.
234
+ return base64.urlsafe_b64decode(_pad_b64(encoded)).decode("utf-8")
235
+ except Exception: # noqa: BLE001
236
+ return None
237
+
238
+
239
+ def _summarize_resources(
240
+ resources: list[Any],
241
+ keep_start: int,
242
+ keep_stop: int,
243
+ ) -> tuple[dict[str, int], int, dict[int, tuple[str, bool]]]:
244
+ """Count resources by type, and decode every inline one exactly once.
245
+
246
+ Returns ``(by_type_counts, inline_count, {index: (content, is_legacy)})``.
247
+
248
+ Decoding is deliberately WHOLE-SET: ``inline_count`` reports the full
249
+ registry and must agree with the per-resource ``_inline`` markers, and
250
+ only a real decode can tell a genuine inline resource from a corrupt
251
+ payload that merely looks like one.
252
+
253
+ RETENTION, by contrast, is page-scoped: only indices in
254
+ ``[keep_start, keep_stop)`` are kept in the returned map. Holding every
255
+ decoded payload would mean a ``limit=1`` call sat on the whole
256
+ registry's content — up to ``MAX_CONTENT_SIZE`` per resource — for a
257
+ one-row response. Because the page's entries are retained, nothing is
258
+ decoded twice.
259
+ """
260
+ by_type_counts: dict[str, int] = {}
261
+ inline_count = 0
262
+ decoded_by_index: dict[int, tuple[str, bool]] = {}
263
+ for index, resource in enumerate(resources):
264
+ res = resource if isinstance(resource, dict) else {}
265
+ res_type = res.get("type")
266
+ if isinstance(res_type, str):
267
+ by_type_counts[res_type] = by_type_counts.get(res_type, 0) + 1
268
+ url = res.get("url", "")
269
+ if isinstance(url, str):
270
+ decoded = _decode_inline_content(url)
271
+ if decoded:
272
+ inline_count += 1
273
+ if keep_start <= index < keep_stop:
274
+ decoded_by_index[index] = decoded
275
+ return by_type_counts, inline_count, decoded_by_index
276
+
277
+
278
+ def _process_resource_list(
279
+ resources: list[Any],
280
+ decoded_page: list[tuple[str, bool] | None],
281
+ include_content: bool,
282
+ *,
283
+ include_hash: bool = False,
284
+ ) -> tuple[list[dict[str, Any]], int]:
285
+ """Render one page of resources. Returns ``(rows, truncated_count)``.
286
+
287
+ ``decoded_page`` carries the already-decoded ``(content, is_legacy)`` for
288
+ each row (``None`` when the resource is not a decodable inline one), so
289
+ this never re-decodes and can never classify a resource differently than
290
+ the caller's summary did.
291
+
292
+ With ``include_content``, content is emitted until the per-response byte
293
+ budget is spent; rows past it are marked ``_content_truncated`` rather
294
+ than silently shortened, because a truncated value written back would
295
+ destroy the resource.
296
+ """
297
+ processed: list[dict[str, Any]] = []
298
+ truncated_count = 0
299
+ content_budget = _MAX_CONTENT_BUDGET
300
+
301
+ for resource, decoded in zip(resources, decoded_page, strict=True):
302
+ res = dict(resource) if isinstance(resource, dict) else {"url": resource}
303
+ url = res.get("url", "")
304
+ content, is_legacy = decoded if decoded else (None, False)
305
+
306
+ if content:
307
+ content_bytes = len(content.encode("utf-8"))
308
+ res["_inline"] = True
309
+ res["_size"] = content_bytes
310
+ if include_hash:
311
+ res["_config_hash"] = content_sha256(content)
312
+ if is_legacy:
313
+ # The full remediation text lives once at response level;
314
+ # repeating it per resource wasted ~330 chars each.
315
+ res["_legacy_worker"] = True
316
+
317
+ if include_content:
318
+ cost = content_bytes
319
+ if cost <= content_budget:
320
+ res["_content"] = content
321
+ content_budget -= cost
322
+ else:
323
+ res["_content_truncated"] = True
324
+ truncated_count += 1
325
+ else:
326
+ preview = content[:_PREVIEW_LENGTH]
327
+ if len(content) > _PREVIEW_LENGTH:
328
+ preview += "..."
329
+ res["_preview"] = preview
330
+
331
+ res["url"] = "[inline]"
332
+ elif isinstance(url, str) and _has_inline_url_shape(url):
333
+ # Recognized as one of ours but the payload does not decode
334
+ # (empty, corrupt, or not UTF-8). Say so explicitly: without a
335
+ # marker this reads as "an external resource, not my problem",
336
+ # which is the wrong conclusion for someone debugging a card
337
+ # that stopped rendering. The real URL stays visible (truncated
338
+ # if huge) because that is what diagnosis needs.
339
+ res["_decode_error"] = True
340
+ if len(url) > _MAX_ECHOED_URL:
341
+ res["_url_length"] = len(url)
342
+ res["url"] = url[:_MAX_ECHOED_URL] + "…[truncated]"
343
+
344
+ processed.append(res)
345
+ return processed, truncated_count
346
+
347
+
348
+ def _check_ws_error(result: Any) -> str | None:
349
+ """Check a WebSocket result for errors. Returns error message or None."""
350
+ if isinstance(result, dict) and not result.get("success", True):
351
+ error = result.get("error", {})
352
+ if isinstance(error, dict):
353
+ msg: str = error.get("message", str(error)) or "Unknown error"
354
+ return msg
355
+ return str(error) or "Unknown error"
356
+ return None