ha-mcp-dev 8.7.0.dev3045__tar.gz → 8.7.0.dev3050__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 (784) hide show
  1. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/pyproject.toml.orig +1 -1
  4. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_meta.py +2 -0
  5. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_registry.py +6 -0
  6. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_settings.py +14 -0
  7. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server.py +10 -168
  8. ha_mcp_dev-8.7.0.dev3050/src/ha_mcp/server_instructions.py +141 -0
  9. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server_tool_text.py +9 -2
  10. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_advanced.py +3 -1
  11. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_tools_meta.py +2 -1
  12. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/de.json +2 -0
  13. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/en.json +2 -0
  14. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +2 -0
  15. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bug_report_config.py +6 -0
  16. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_dev.py +35 -36
  17. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/categorized_search.py +2 -1
  18. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/skill_loader.py +26 -0
  19. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/LICENSE +0 -0
  20. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/README.md +0 -0
  21. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/__init__.py +0 -0
  22. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/__main__.py +0 -0
  23. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_pypi_marker +0 -0
  24. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_rich_compat.py +0 -0
  25. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/__init__.py +0 -0
  26. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  27. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  28. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  29. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  30. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  31. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  32. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  33. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  34. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  35. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  36. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  37. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  38. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  39. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  40. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  41. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  42. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  43. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  44. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  45. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  46. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  47. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  48. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  49. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  50. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  51. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  52. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  53. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  54. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  55. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  56. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  57. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  58. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  59. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  60. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  61. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  62. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  63. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  64. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  65. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  66. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  67. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  68. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  69. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  70. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  71. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  72. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  73. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  74. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  75. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  76. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  77. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  78. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  79. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  80. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  81. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  82. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  83. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  84. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  85. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  86. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  87. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  88. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  89. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  90. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  91. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  92. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  93. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  94. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  95. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  96. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  97. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  98. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  99. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  100. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  101. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  102. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  103. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  104. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  105. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  106. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  107. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  108. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  109. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  110. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  111. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  112. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  113. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  114. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  115. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  116. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  117. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  118. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  119. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  120. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  121. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  122. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  123. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  124. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  125. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  126. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  127. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  128. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  129. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  130. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  131. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  132. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  133. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  134. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  135. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  136. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  137. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  138. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  139. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  140. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  141. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  142. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  143. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  144. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  145. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  146. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  147. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  148. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  149. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  150. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  151. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  152. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  153. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  154. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  155. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  156. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  157. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  158. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  159. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  160. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  161. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  162. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  163. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  164. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  165. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  166. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  167. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  168. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  169. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  170. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  171. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  172. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  173. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  174. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  175. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  176. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  177. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  178. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  179. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  180. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  181. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  182. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  183. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  184. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  185. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  186. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  187. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  188. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  189. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  190. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  191. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  192. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  193. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  194. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  195. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  196. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  197. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  198. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  199. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  200. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  201. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  202. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  203. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  204. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  205. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  206. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  207. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  208. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  209. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  210. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  211. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  212. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  213. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  214. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  215. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  216. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  217. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  218. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  219. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  220. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  221. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  222. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  223. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  224. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  225. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  226. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  227. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  228. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  229. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  230. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  231. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  232. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  233. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  234. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  235. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  236. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  237. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  238. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  239. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  240. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  241. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  242. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  243. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  244. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  245. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  246. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  247. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  248. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  249. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  250. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  251. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  252. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  253. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  254. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  255. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  256. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  257. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  258. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  259. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  260. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  261. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  262. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  263. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  264. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  265. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  266. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  267. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  268. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  269. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  270. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  271. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  272. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  273. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  274. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  275. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  276. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  277. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  278. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  279. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  280. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  281. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  282. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  283. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  284. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  285. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  286. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  287. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  288. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  289. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  290. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  291. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  292. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  293. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  294. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  295. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  296. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  297. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  298. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  299. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  300. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  301. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  302. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  303. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  304. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  305. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  306. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  307. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  308. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  309. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  310. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  311. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  312. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  313. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  314. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  315. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  316. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  317. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  318. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  319. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  320. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  321. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  322. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  323. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  324. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  325. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  326. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  327. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  328. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  329. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  330. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  331. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  332. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  333. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  334. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  335. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  336. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  337. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  338. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  339. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  340. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  341. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  342. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  343. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  344. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  345. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  346. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  347. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  348. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  349. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  350. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  351. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  352. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  353. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  354. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  355. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  356. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  357. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  358. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  359. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  360. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  361. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  362. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  363. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  364. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  365. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  366. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  367. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  368. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  369. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  370. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  371. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  372. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  373. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  374. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  375. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  376. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  377. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  378. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  379. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  380. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  381. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  382. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  383. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  384. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  385. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  386. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  387. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  388. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  389. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  390. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  391. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  392. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  393. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  394. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  395. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  396. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  397. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  398. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  399. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  400. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  401. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  402. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  403. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  404. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  405. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  406. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  407. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  408. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  409. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  410. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  411. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  412. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  413. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  414. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  415. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  416. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  417. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  418. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  419. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  420. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  421. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  422. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  423. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  424. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  425. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  426. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  427. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  428. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  429. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  430. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  431. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  432. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  433. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  434. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  435. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  436. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  437. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  438. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  439. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  440. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/requirements.txt +0 -0
  441. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  442. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  443. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  444. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  445. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  446. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  447. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  448. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  449. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  450. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  451. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  452. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  453. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  454. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  455. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  456. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  457. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  458. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  459. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  460. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  461. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  462. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  463. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  464. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  465. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  466. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  467. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  468. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  469. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  470. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  471. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  472. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  473. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  474. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  475. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  476. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  477. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  478. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  479. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  480. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  481. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  482. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  483. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  484. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  485. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  486. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  487. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  488. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  489. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  490. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  491. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  492. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  493. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  494. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  495. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  496. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  497. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_version.py +0 -0
  498. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/app_discovery.py +0 -0
  499. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/__init__.py +0 -0
  500. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/consent_form.py +0 -0
  501. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/oidc_compat.py +0 -0
  502. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/provider.py +0 -0
  503. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_diff.py +0 -0
  504. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_entity_ids.py +0 -0
  505. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_integrations.py +0 -0
  506. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_manager.py +0 -0
  507. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_tags.py +0 -0
  508. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/browser_landing.py +0 -0
  509. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/__init__.py +0 -0
  510. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/admin_routes.py +0 -0
  511. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/rest_client.py +0 -0
  512. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/supervisor_client.py +0 -0
  513. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/websocket_client.py +0 -0
  514. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/websocket_listener.py +0 -0
  515. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config.py +0 -0
  516. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_backup.py +0 -0
  517. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_overrides.py +0 -0
  518. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  519. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  520. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  521. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  522. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  523. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  524. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/errors.py +0 -0
  525. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/ha_request_queue.py +0 -0
  526. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  527. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/http_transport.py +0 -0
  528. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/image_info.py +0 -0
  529. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/llm_exposure.py +0 -0
  530. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/log_filters.py +0 -0
  531. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/__init__.py +0 -0
  532. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/approval_queue.py +0 -0
  533. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/decision_pin.py +0 -0
  534. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/decisions.py +0 -0
  535. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/editing.py +0 -0
  536. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/evaluator.py +0 -0
  537. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/events.py +0 -0
  538. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/handlers.py +0 -0
  539. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/middleware.py +0 -0
  540. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/model.py +0 -0
  541. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/mrtr.py +0 -0
  542. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/persistence.py +0 -0
  543. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/server_channels.py +0 -0
  544. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/value_sources.py +0 -0
  545. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/py.typed +0 -0
  546. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/read_only.py +0 -0
  547. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/redaction.py +0 -0
  548. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/renamed_tools.py +0 -0
  549. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  550. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  551. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  552. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  553. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  554. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  555. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  556. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  557. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  558. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  559. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  560. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  561. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  562. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  563. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  564. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  565. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  566. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server_lifespan.py +0 -0
  567. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/__init__.py +0 -0
  568. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  569. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  570. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  571. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  572. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  573. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  574. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  575. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  576. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  577. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_theme.py +0 -0
  578. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  579. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  580. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  581. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  582. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  583. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  584. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  585. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  586. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  587. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  588. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  589. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  590. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  591. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  592. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  593. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings.css +0 -0
  594. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings.html +0 -0
  595. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  596. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  597. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  598. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  599. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  600. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  601. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  602. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  603. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/smoke_test.py +0 -0
  604. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  605. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/strict_bps.py +0 -0
  606. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tool_dispatch.py +0 -0
  607. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/__init__.py +0 -0
  608. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/area_messages.py +0 -0
  609. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/auto_backup.py +0 -0
  610. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup.py +0 -0
  611. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup_access.py +0 -0
  612. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  613. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  614. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_result.py +0 -0
  615. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  616. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  617. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  618. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_write.py +0 -0
  619. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  620. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bulk_selector.py +0 -0
  621. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/coercion.py +0 -0
  622. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_api.py +0 -0
  623. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_config_entries.py +0 -0
  624. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_config_reads.py +0 -0
  625. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  626. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_devices.py +0 -0
  627. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  628. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_registries.py +0 -0
  629. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  630. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  631. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  632. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  633. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  634. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  635. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  636. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  637. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  638. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  639. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  640. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  641. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  642. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  643. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  644. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  645. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  646. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  647. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  648. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  649. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  650. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  651. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_write_errors.py +0 -0
  652. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  653. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/core_contract.py +0 -0
  654. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  655. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  656. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  657. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dev_backup.py +0 -0
  658. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/device_control.py +0 -0
  659. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/device_enrichment.py +0 -0
  660. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  661. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/energy_preferences.py +0 -0
  662. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  663. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_registration.py +0 -0
  664. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  665. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  666. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  667. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/hacs_registration.py +0 -0
  668. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/helper_flows.py +0 -0
  669. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/helpers.py +0 -0
  670. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/history_response.py +0 -0
  671. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  672. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_common.py +0 -0
  673. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources.py +0 -0
  674. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  675. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  676. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/__init__.py +0 -0
  677. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/base.py +0 -0
  678. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/matter.py +0 -0
  679. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/thread.py +0 -0
  680. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  681. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zwave.py +0 -0
  682. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  683. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/recorder_errors.py +0 -0
  684. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/reference_validator.py +0 -0
  685. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/registry.py +0 -0
  686. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  687. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/response_helpers.py +0 -0
  688. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/scene_discovery.py +0 -0
  689. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/__init__.py +0 -0
  690. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/base.py +0 -0
  691. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/component.py +0 -0
  692. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/entities.py +0 -0
  693. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/legacy.py +0 -0
  694. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/modes.py +0 -0
  695. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/overview.py +0 -0
  696. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/response.py +0 -0
  697. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/state.py +0 -0
  698. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  699. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  700. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  701. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  702. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  703. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  704. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  705. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  706. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  707. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  708. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  709. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/statistics_resets.py +0 -0
  710. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/system_restart.py +0 -0
  711. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tool_hints.py +0 -0
  712. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  713. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_addons.py +0 -0
  714. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_areas.py +0 -0
  715. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  716. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  717. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  718. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_calendar.py +0 -0
  719. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_camera.py +0 -0
  720. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_categories.py +0 -0
  721. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_code.py +0 -0
  722. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  723. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  724. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  725. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  726. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  727. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  728. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_energy.py +0 -0
  729. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_entities.py +0 -0
  730. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  731. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_groups.py +0 -0
  732. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_hacs.py +0 -0
  733. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_history.py +0 -0
  734. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_integrations.py +0 -0
  735. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_labels.py +0 -0
  736. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_logs.py +0 -0
  737. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_radio.py +0 -0
  738. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_registry.py +0 -0
  739. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_resources.py +0 -0
  740. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_search.py +0 -0
  741. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  742. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_service.py +0 -0
  743. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_services.py +0 -0
  744. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_system.py +0 -0
  745. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_themes.py +0 -0
  746. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_todo.py +0 -0
  747. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_traces.py +0 -0
  748. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_updates.py +0 -0
  749. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_utility.py +0 -0
  750. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  751. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  752. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  753. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_zones.py +0 -0
  754. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/util_helpers.py +0 -0
  755. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/validation_middleware.py +0 -0
  756. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/ws_waiters.py +0 -0
  757. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/__init__.py +0 -0
  758. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/compact_params.py +0 -0
  759. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/component_helpers.py +0 -0
  760. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/component_search.py +0 -0
  761. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  762. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  763. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transport_security.py +0 -0
  764. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/update_check.py +0 -0
  765. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/__init__.py +0 -0
  766. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/config_hash.py +0 -0
  767. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/config_write_lock.py +0 -0
  768. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  769. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/data_paths.py +0 -0
  770. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  771. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/domain_handlers.py +0 -0
  772. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/entity_membership.py +0 -0
  773. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  774. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  775. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  776. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/operation_manager.py +0 -0
  777. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/python_sandbox.py +0 -0
  778. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  779. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/usage_logger.py +0 -0
  780. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/__init__.py +0 -0
  781. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/enforcement.py +0 -0
  782. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/model.py +0 -0
  783. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/persistence.py +0 -0
  784. {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.7.0.dev3045
3
+ Version: 8.7.0.dev3050
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.7.0.dev3045"
7
+ version = "8.7.0.dev3050"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.7.0.dev3045"
7
+ version = "8.7.0.dev3050"
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
@@ -75,6 +75,8 @@ class Setting:
75
75
  range: tuple[float, float] | None = None
76
76
  off_value: int | None = None
77
77
  choices: tuple[str, ...] | None = None
78
+ # Free text whose line breaks matter; the UI edits it in a textarea.
79
+ multiline: bool = False
78
80
  # An env value that does not parse or is out of range logs a warning and
79
81
  # gives the default, instead of failing the settings validation.
80
82
  lenient: bool = False
@@ -19,6 +19,7 @@ from ha_mcp.config_settings import Settings
19
19
 
20
20
  __all__ = [
21
21
  "ADDON_SYNCED_ADVANCED_FIELDS",
22
+ "ADVANCED_MULTILINE",
22
23
  "ADVANCED_RESTART_REQUIRED",
23
24
  "ADVANCED_SETTINGS_FIELDS",
24
25
  "BACKUP_OVERRIDE_FIELDS",
@@ -244,6 +245,11 @@ _ADVANCED_SETTINGS_CHOICES: dict[str, tuple[str, ...]] = {
244
245
  if setting.choices is not None
245
246
  }
246
247
 
248
+ # Advanced string fields edited as multi-line text (renders as <textarea>).
249
+ ADVANCED_MULTILINE: frozenset[str] = frozenset(
250
+ name for name, _field, setting in _settings_of("advanced") if setting.multiline
251
+ )
252
+
247
253
  # Advanced fields that take effect only after a restart of the MCP server.
248
254
  ADVANCED_RESTART_REQUIRED: frozenset[str] = frozenset(
249
255
  name
@@ -280,6 +280,20 @@ class Settings(BaseSettings):
280
280
  Setting(surface="advanced", section="tools_surface", restart_required=True),
281
281
  ] = Field("all", alias="ENABLED_TOOL_MODULES")
282
282
 
283
+ # Free text appended to the MCP server instructions, so every client
284
+ # connecting to this installation gets the same user-defined guidance
285
+ # (e.g. where household notes live). Empty adds nothing.
286
+ custom_instructions: Annotated[
287
+ str,
288
+ Setting(
289
+ surface="advanced",
290
+ section="tools_surface",
291
+ app=_ALL_FLAVORS,
292
+ restart_required=True,
293
+ multiline=True,
294
+ ),
295
+ ] = Field("", alias="HAMCP_CUSTOM_INSTRUCTIONS")
296
+
283
297
  # Dashboard partial update tools (python_transform, find_card)
284
298
  # These are token-efficient alternatives to full config replacement.
285
299
  # Disable when using clients with programmatic tool use (future).
@@ -19,16 +19,19 @@ from pydantic import Field
19
19
  from .config import _PACKAGE_VERSION, get_global_settings
20
20
  from .errors import ErrorCode, create_error_response
21
21
  from .http_transport import HttpTransportFastMCP as FastMCP
22
+ from .server_instructions import (
23
+ build_skills_instructions,
24
+ compose_instructions,
25
+ skill_tool_hidden,
26
+ )
22
27
  from .server_lifespan import server_lifespan
23
28
  from .server_tool_text import (
24
- ISSUE_FILING_INSTRUCTIONS,
25
29
  LITE_DOCSTRING_DESTINATIONS,
26
30
  LITE_DOCSTRINGS,
27
- READ_ONLY_INSTRUCTIONS,
28
31
  SEARCH_KEYWORDS,
29
32
  SEARCH_TOOL_DESCRIPTION,
33
+ SKILL_TOOL_NAME,
30
34
  SKILL_USE_BEFORE_KEYWORDS,
31
- TOOL_DISCOVERY_INSTRUCTIONS,
32
35
  )
33
36
  from .tools.helpers import raise_tool_error
34
37
  from .tools.tool_hints import read_only_hints
@@ -46,12 +49,6 @@ if TYPE_CHECKING:
46
49
 
47
50
  logger = logging.getLogger(__name__)
48
51
 
49
- # Name of the consolidated skill tool. Defined as a module
50
- # constant so settings UI, instructions, tests, and pinning all agree on
51
- # one canonical string. 18 chars — well under the 40-char cap that
52
- # Cloudflare's MCP portal enforces (#1121).
53
- SKILL_TOOL_NAME = "ha_get_skill_guide"
54
-
55
52
  # Names this tool replaced in #1134. Appended to the catalog description
56
53
  # so agents trained on the prior catalog (or pasting old instructions)
57
54
  # see the redirect inside the tool itself, not just via BM25 keyword
@@ -319,147 +316,18 @@ class HomeAssistantSmartMCPServer:
319
316
 
320
317
  return get_skills_dir()
321
318
 
322
- def _skill_tool_hidden(self) -> bool:
323
- """True when ha_get_skill_guide will be absent from the catalog.
324
-
325
- The tool is user- or env-disableable only while strict-BPS mode
326
- is off (#1886) — apply_tool_visibility strips the disable
327
- otherwise. Consulted at instruction-build time so the skills
328
- header doesn't direct clients to a tool that is not being
329
- served. Fails toward False (mention the tool): a wrong mention
330
- costs one unknown-tool error, a wrong omission hides the only
331
- non-resource access path.
332
- """
333
- try:
334
- from .settings_ui._persistence import effective_tool_config
335
- from .settings_ui._tools_meta import effective_mandatory_tools
336
-
337
- states = effective_tool_config().get("tools", {})
338
- return states.get(
339
- SKILL_TOOL_NAME
340
- ) == "disabled" and SKILL_TOOL_NAME not in effective_mandatory_tools(
341
- self.settings
342
- )
343
- except Exception:
344
- logger.debug("skill-tool visibility lookup failed", exc_info=True)
345
- return False
346
-
347
319
  def _build_instructions(self) -> str:
348
320
  """Compose the server instructions sent in the MCP initialize response."""
349
- sections: list[str] = []
350
- skills = self._build_skills_instructions()
351
- if skills:
352
- sections.append(skills)
353
-
354
- # Surface Read Only Mode in the startup instructions so clients
355
- # that show server instructions warn the model up front. Startup
356
- # state only — live flips are covered by the structured
357
- # READ_ONLY_MODE call errors and the ha_get_overview field.
358
- if self.settings.read_only_mode:
359
- sections.append(READ_ONLY_INSTRUCTIONS)
360
- sections.append(ISSUE_FILING_INSTRUCTIONS)
361
- return "\n\n".join(sections)
321
+ return compose_instructions(self._build_skills_instructions(), self.settings)
362
322
 
363
323
  def _build_skills_instructions(self) -> str | None:
364
- """Build server instructions from bundled skill frontmatter.
365
-
366
- Reads the description field from each SKILL.md's YAML frontmatter
367
- and includes it as-is in the server instructions. The description
368
- is authored for LLM consumption and should not be parsed or
369
- restructured by code.
370
-
371
- Returns None when no skills directory or no parseable skills are
372
- present, leaving instructions unchanged from the default (None).
373
- """
374
- skills_dir = self._get_skills_dir()
375
- if not skills_dir:
376
- return None
377
-
378
- try:
379
- entries = sorted(skills_dir.iterdir())
380
- except OSError as e:
381
- logger.warning("Could not read skills directory %s: %s", skills_dir, e)
382
- return None
383
-
384
- skill_blocks: list[str] = []
385
- for skill_dir in entries:
386
- main_file = skill_dir / "SKILL.md"
387
- if not skill_dir.is_dir() or not main_file.exists():
388
- continue
389
-
390
- block = self._build_skill_block(skill_dir.name, main_file)
391
- if block:
392
- skill_blocks.append(block)
393
-
394
- if not skill_blocks:
395
- return None
396
-
397
- if self._skill_tool_hidden():
398
- # The user disabled the skill tool (possible only outside
399
- # strict-BPS mode, #1886) — directing clients to it would
400
- # steer them into a tool that is not in the catalog. Their
401
- # stated fallback is a local skills install.
402
- access_method = (
403
- "Read the skill via MCP resources (resources/read with the "
404
- "skill:// URI) — if you can read these instructions, you "
405
- "should be able to access resources as well. If for any "
406
- "reason you cannot access MCP resources, refer to your "
407
- "locally installed copy of these skills instead (the "
408
- f"{SKILL_TOOL_NAME} fallback tool is disabled on this "
409
- "server)."
410
- )
411
- else:
412
- access_method = (
413
- "Read the skill via MCP resources (resources/read with the "
414
- "skill:// URI) — if you can read these instructions, you "
415
- "should be able to access resources as well. If for any "
416
- f"reason you cannot access MCP resources, call {SKILL_TOOL_NAME}() "
417
- "with no arguments as a fallback: it returns SKILL.md, then "
418
- "pass file='<path>' for a reference file. If you can access "
419
- "resources normally, do "
420
- "not waste time or tokens on that tool."
421
- )
422
-
423
- header = (
424
- "IMPORTANT: This server provides best-practice skills that MUST "
425
- "be consulted before performing matching actions. "
426
- "Read the SKILL.md for the matching skill "
427
- "\u2014 it contains a Reference Files table that maps tasks to "
428
- "specific reference files. You MUST read the referenced files "
429
- "that match your current task before proceeding. "
430
- "Do NOT load all reference files upfront "
431
- "\u2014 only the ones the table directs you to.\n\n"
432
- f"How to access: {access_method}\n"
324
+ """The skills section of the instructions, or None without skills."""
325
+ return build_skills_instructions(
326
+ self._get_skills_dir(), self.settings, skill_tool_hidden(self.settings)
433
327
  )
434
328
 
435
- instructions = header + "\n".join(skill_blocks)
436
-
437
- # Append tool search instructions when enabled
438
- if self.settings.enable_tool_search:
439
- instructions += TOOL_DISCOVERY_INSTRUCTIONS.format(
440
- pinned=", ".join(DEFAULT_PINNED_TOOLS)
441
- )
442
-
443
- return instructions
444
-
445
329
  _parse_skill_frontmatter = staticmethod(parse_skill_frontmatter)
446
330
 
447
- def _build_skill_block(self, skill_name: str, main_file: Path) -> str | None:
448
- """Build an instruction block for a single skill.
449
-
450
- Reads the description field from YAML frontmatter and includes it
451
- verbatim. The description is designed for LLM consumption and
452
- contains its own trigger conditions and symptom indicators.
453
- """
454
- frontmatter = self._parse_skill_frontmatter(main_file)
455
- if not frontmatter:
456
- return None
457
-
458
- description = frontmatter["description"]
459
- uri = f"skill://{skill_name}/SKILL.md"
460
-
461
- return f"\n### Skill: {skill_name} ({uri})\n{description.strip()}"
462
-
463
331
  def _apply_settings_visibility(self) -> None:
464
332
  """Apply persisted tool visibility from ``tool_config.json``.
465
333
 
@@ -1089,32 +957,6 @@ class HomeAssistantSmartMCPServer:
1089
957
  else:
1090
958
  logger.warning(message, *args)
1091
959
 
1092
- def _list_bundled_skills(
1093
- self, skills_dir: Path
1094
- ) -> list[tuple[str, Path, dict[str, Any]]]:
1095
- """Return parsed (name, dir, frontmatter) triples for valid bundled skills.
1096
-
1097
- Skips entries that aren't directories, lack ``SKILL.md``, or whose
1098
- frontmatter doesn't parse. Sorted by directory name for stable
1099
- ordering across clients.
1100
- """
1101
- try:
1102
- entries = sorted(skills_dir.iterdir())
1103
- except OSError as e:
1104
- logger.warning("Could not read skills directory %s: %s", skills_dir, e)
1105
- return []
1106
-
1107
- skills: list[tuple[str, Path, dict[str, Any]]] = []
1108
- for skill_dir in entries:
1109
- main_file = skill_dir / "SKILL.md"
1110
- if not skill_dir.is_dir() or not main_file.exists():
1111
- continue
1112
- frontmatter = self._parse_skill_frontmatter(main_file)
1113
- if not frontmatter:
1114
- continue
1115
- skills.append((skill_dir.name, skill_dir, frontmatter))
1116
- return skills
1117
-
1118
960
  def _register_skill_guide_tool(self, skills_dir: Path | None) -> int:
1119
961
  """Register the ``ha_get_skill_guide`` tool unconditionally.
1120
962
 
@@ -0,0 +1,141 @@
1
+ """The instructions the server sends in the MCP initialize response.
2
+
3
+ Sections, in order: the bundled best-practice skills with how to read them
4
+ (plus the tool-search note when that mode is on), the Read Only Mode
5
+ warning, the issue-filing rule, and the installation owner's
6
+ ``custom_instructions``. The skills header and access fallbacks are
7
+ defined here; the notices come from ``server_tool_text``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import logging
13
+ from pathlib import Path
14
+ from typing import TYPE_CHECKING
15
+
16
+ from .server_tool_text import (
17
+ ISSUE_FILING_INSTRUCTIONS,
18
+ READ_ONLY_INSTRUCTIONS,
19
+ SKILL_TOOL_NAME,
20
+ TOOL_DISCOVERY_INSTRUCTIONS,
21
+ )
22
+ from .transforms import DEFAULT_PINNED_TOOLS
23
+ from .utils.skill_loader import list_skills
24
+
25
+ if TYPE_CHECKING:
26
+ from .config_settings import Settings
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+ OWNER_HEADING = "## Instructions from this installation's owner"
31
+
32
+ _SKILLS_HEADER = (
33
+ "IMPORTANT: This server provides best-practice skills that MUST "
34
+ "be consulted before performing matching actions. "
35
+ "Read the SKILL.md for the matching skill "
36
+ "— it contains a Reference Files table that maps tasks to "
37
+ "specific reference files. You MUST read the referenced files "
38
+ "that match your current task before proceeding. "
39
+ "Do NOT load all reference files upfront "
40
+ "— only the ones the table directs you to.\n\n"
41
+ "How to access: {access_method}\n"
42
+ )
43
+
44
+ _RESOURCE_ACCESS = (
45
+ "Read the skill via MCP resources (resources/read with the "
46
+ "skill:// URI) — if you can read these instructions, you "
47
+ "should be able to access resources as well. "
48
+ )
49
+
50
+ # The user disabled the skill tool (possible only outside strict-BPS mode,
51
+ # #1886) — directing clients to it would steer them into a tool that is not
52
+ # in the catalog. Their stated fallback is a local skills install.
53
+ _LOCAL_SKILLS_FALLBACK = (
54
+ "If for any reason you cannot access MCP resources, refer to your "
55
+ "locally installed copy of these skills instead (the "
56
+ f"{SKILL_TOOL_NAME} fallback tool is disabled on this server)."
57
+ )
58
+
59
+ _SKILL_TOOL_FALLBACK = (
60
+ f"If for any reason you cannot access MCP resources, call {SKILL_TOOL_NAME}() "
61
+ "with no arguments as a fallback: it returns SKILL.md, then "
62
+ "pass file='<path>' for a reference file. If you can access "
63
+ "resources normally, do not waste time or tokens on that tool."
64
+ )
65
+
66
+
67
+ def skill_tool_hidden(settings: Settings) -> bool:
68
+ """True when ha_get_skill_guide will be absent from the catalog.
69
+
70
+ The tool is user- or env-disableable only while strict-BPS mode
71
+ is off (#1886) — apply_tool_visibility strips the disable
72
+ otherwise. Consulted at instruction-build time so the skills
73
+ header doesn't direct clients to a tool that is not being
74
+ served. Fails toward False (mention the tool): a wrong mention
75
+ costs one unknown-tool error, a wrong omission hides the only
76
+ non-resource access path.
77
+ """
78
+ try:
79
+ from .settings_ui._persistence import effective_tool_config
80
+ from .settings_ui._tools_meta import effective_mandatory_tools
81
+
82
+ states = effective_tool_config(settings).get("tools", {})
83
+ return states.get(
84
+ SKILL_TOOL_NAME
85
+ ) == "disabled" and SKILL_TOOL_NAME not in effective_mandatory_tools(settings)
86
+ except Exception:
87
+ logger.debug("skill-tool visibility lookup failed", exc_info=True)
88
+ return False
89
+
90
+
91
+ def skill_block(skill_name: str, description: str) -> str:
92
+ """One skill's entry: its resource URI and its LLM-authored description."""
93
+ uri = f"skill://{skill_name}/SKILL.md"
94
+ return f"\n### Skill: {skill_name} ({uri})\n{description.strip()}"
95
+
96
+
97
+ def build_skills_instructions(
98
+ skills_dir: Path | None, settings: Settings, tool_hidden: bool
99
+ ) -> str | None:
100
+ """Build the skills section from each bundled SKILL.md's frontmatter.
101
+
102
+ The description field is authored for LLM consumption and included
103
+ as-is, never parsed or restructured by code. Returns None when there is
104
+ no skills directory or no parseable skill; the instructions then start
105
+ with the notices.
106
+ """
107
+ skills = list_skills(skills_dir) if skills_dir else []
108
+ if not skills:
109
+ return None
110
+
111
+ fallback = _LOCAL_SKILLS_FALLBACK if tool_hidden else _SKILL_TOOL_FALLBACK
112
+ header = _SKILLS_HEADER.format(access_method=_RESOURCE_ACCESS + fallback)
113
+ instructions = header + "\n".join(
114
+ skill_block(name, frontmatter["description"])
115
+ for name, _dir, frontmatter in skills
116
+ )
117
+
118
+ if settings.enable_tool_search:
119
+ instructions += TOOL_DISCOVERY_INSTRUCTIONS.format(
120
+ pinned=", ".join(DEFAULT_PINNED_TOOLS)
121
+ )
122
+
123
+ return instructions
124
+
125
+
126
+ def compose_instructions(skills: str | None, settings: Settings) -> str:
127
+ """Join the skills section with the startup notices and the owner's text."""
128
+ sections = [skills] if skills else []
129
+ # Surface Read Only Mode in the startup instructions so clients
130
+ # that show server instructions warn the model up front. Startup
131
+ # state only — live flips are covered by the structured
132
+ # READ_ONLY_MODE call errors and the ha_get_overview field.
133
+ if settings.read_only_mode:
134
+ sections.append(READ_ONLY_INSTRUCTIONS)
135
+ sections.append(ISSUE_FILING_INSTRUCTIONS)
136
+ custom = settings.custom_instructions.strip()
137
+ if custom:
138
+ # Length only: the text itself is the owner's and may be personal.
139
+ logger.info("custom_instructions active (%d characters)", len(custom))
140
+ sections.append(f"{OWNER_HEADING}\n{custom}")
141
+ return "\n\n".join(sections)
@@ -1,12 +1,19 @@
1
1
  """Static text the server publishes about its tools.
2
2
 
3
3
  Holds the search tool description, the BM25 keyword boosts, the lite
4
- docstring variants with their destinations, and the skill keyword block.
5
- ``HomeAssistantSmartMCPServer`` exposes each one as a class attribute.
4
+ docstring variants with their destinations and the skill keyword block,
5
+ which ``HomeAssistantSmartMCPServer`` exposes as class attributes, plus the
6
+ skill tool's name and the instruction notices ``server_instructions`` uses.
6
7
  """
7
8
 
8
9
  from __future__ import annotations
9
10
 
11
+ # Name of the consolidated skill tool. Defined as a module constant so the
12
+ # tool registration, the instructions, the mandatory-tool set, the default
13
+ # pins and the tests agree on one canonical string. 18 chars — well under
14
+ # the 40-char cap that Cloudflare's MCP portal enforces (#1121).
15
+ SKILL_TOOL_NAME = "ha_get_skill_guide"
16
+
10
17
  # Description for the unified search tool
11
18
  SEARCH_TOOL_DESCRIPTION = (
12
19
  "Search ALL Home Assistant tools by ENGLISH keyword. Each hit is "
@@ -88,7 +88,7 @@ def _advanced_field_row(
88
88
  _ADVANCED_SETTINGS_SENTINELS,
89
89
  OAUTH_MODE_TOKEN,
90
90
  )
91
- from ..config_registry import ADVANCED_RESTART_REQUIRED
91
+ from ..config_registry import ADVANCED_MULTILINE, ADVANCED_RESTART_REQUIRED
92
92
 
93
93
  origin = _origin_for_advanced_field(env_name, overrides=overrides)
94
94
  value: Any = getattr(settings, fname, None)
@@ -122,6 +122,8 @@ def _advanced_field_row(
122
122
  choices = _ADVANCED_SETTINGS_CHOICES.get(fname)
123
123
  if choices is not None:
124
124
  row["choices"] = list(choices)
125
+ if fname in ADVANCED_MULTILINE:
126
+ row["multiline"] = True
125
127
  return row
126
128
 
127
129
 
@@ -18,6 +18,7 @@ import logging
18
18
  from collections.abc import Iterable
19
19
  from typing import TYPE_CHECKING, Any, NamedTuple, NotRequired, TypedDict
20
20
 
21
+ from ..server_tool_text import SKILL_TOOL_NAME
21
22
  from ..transforms import categorize_capability
22
23
 
23
24
  if TYPE_CHECKING:
@@ -116,7 +117,7 @@ MANDATORY_TOOLS: set[str] = {
116
117
  # _save_feature_flags) so each direction of the conflict gets an
117
118
  # actionable error.
118
119
  BPS_MANDATORY_TOOLS: set[str] = {
119
- "ha_get_skill_guide",
120
+ SKILL_TOOL_NAME,
120
121
  }
121
122
 
122
123
 
@@ -472,6 +472,8 @@
472
472
  "advanced.dashboard_screenshot_engine_url.help": "Basis-URL der Screenshot-Engine. Lasse leer für Supervisor-Auto-Discovery. Wirkt sofort.",
473
473
  "advanced.enable_websocket.label": "WebSocket aktivieren",
474
474
  "advanced.enable_websocket.help": "WebSocket-Zustandsüberwachung. Das Deaktivieren fällt auf Polling zurück und beeinträchtigt viele Tools.",
475
+ "advanced.custom_instructions.label": "Eigene Server-Anweisungen",
476
+ "advanced.custom_instructions.help": "Text, den jeder verbundene KI-Assistent als Teil der MCP-Server-Anweisungen erhält – zum Beispiel, wo Notizen zum Haushalt liegen und wann sie gelesen oder aktualisiert werden sollen. Auch Teil des Prompts von Home-Assistant-Sprachassistenten (Assist), die dieses Toolset nutzen. Gedacht für Hinweise, die alle deine Clients auf einmal erreichen sollen; halte ihn kurz und ohne Geheimnisse. Leer lassen, um nichts hinzuzufügen. Erfordert einen Neustart; Clients sehen die Änderung nach dem erneuten Verbinden.",
475
477
  "advanced.enabled_tool_modules.label": "Aktivierte Tool-Module",
476
478
  "advanced.enabled_tool_modules.help": "Kommagetrennte Modulnamen oder 'all'.",
477
479
  "advanced.enable_dashboard_partial_tools.label": "Dashboard-Partial-Update-Tools",
@@ -472,6 +472,8 @@
472
472
  "advanced.dashboard_screenshot_engine_url.help": "Base URL of the screenshot engine. Leave blank for Supervisor auto-discovery. Applies immediately.",
473
473
  "advanced.enable_websocket.label": "Enable WebSocket",
474
474
  "advanced.enable_websocket.help": "WebSocket state monitoring. Disabling falls back to polling and degrades many tools.",
475
+ "advanced.custom_instructions.label": "Custom server instructions",
476
+ "advanced.custom_instructions.help": "Text sent to every AI assistant that connects, as part of the MCP server instructions — for example where household notes are kept and when to read or update them. Also part of the prompt of Home Assistant conversation agents (Assist) that use this toolset. Use it for guidance that should reach all your clients at once; keep it short and free of secrets. Leave empty to add nothing. Requires restart; clients see the change when they reconnect.",
475
477
  "advanced.enabled_tool_modules.label": "Enabled tool modules",
476
478
  "advanced.enabled_tool_modules.help": "Comma-separated module names, or 'all'.",
477
479
  "advanced.enable_dashboard_partial_tools.label": "Dashboard partial-update tools",
@@ -136,6 +136,8 @@ function renderAdvancedSection(containerId, fields) {
136
136
  (f.max !== undefined ? `max="${f.max}" ` : '') +
137
137
  (f.type === 'float' ? 'step="0.1" ' : '') +
138
138
  (f.editable ? '' : 'disabled') + '>';
139
+ } else if (f.multiline) {
140
+ controlHtml = `<textarea rows="4" name="adv:${escapeHtml(f.field)}" data-adv-field="${escapeHtml(f.field)}" aria-labelledby="label-adv-${escapeHtml(f.field)}" ${f.editable ? '' : 'disabled'}>${escapeHtml(String(f.value ?? ''))}</textarea>`;
139
141
  } else {
140
142
  // str
141
143
  controlHtml = `<input type="text" name="adv:${escapeHtml(f.field)}" data-adv-field="${escapeHtml(f.field)}" aria-labelledby="label-adv-${escapeHtml(f.field)}" value="${escapeHtml(String(f.value ?? ''))}" ${f.editable ? '' : 'disabled'}>`;
@@ -40,6 +40,12 @@ def collect_config_toggles(settings: Settings) -> dict[str, Any]:
40
40
  [item for item in raw.split(",") if item.strip()]
41
41
  )
42
42
 
43
+ # Presence only: the text is the owner's and may be personal.
44
+ custom = getattr(settings, "custom_instructions", "")
45
+ toggles["custom_instructions_set"] = bool(
46
+ isinstance(custom, str) and custom.strip()
47
+ )
48
+
43
49
  toggles.update(_tool_config_diagnostics(settings))
44
50
  return toggles
45
51
 
@@ -164,7 +164,8 @@ def _apply_policy_guard_row_locks(fname: str, row: dict[str, Any]) -> None:
164
164
  see ``editable: true`` on rows whose set/reset the guards refuse:
165
165
  ``enable_tool_security_policies`` while access is off, and
166
166
  ``dev_tools_security_policy_access`` plus
167
- ``enable_security_policy_tool`` always (web UI / env var only).
167
+ ``enable_security_policy_tool`` and ``custom_instructions`` always
168
+ (web UI / env var only).
168
169
  A row that is ALREADY non-editable (env-pinned) keeps its plain env
169
170
  story: the pin refuses the write before these guards would, and
170
171
  stamping a policy reason there would misdirect the fix toward the
@@ -181,7 +182,7 @@ def _apply_policy_guard_row_locks(fname: str, row: dict[str, Any]) -> None:
181
182
  row["editable"] = False
182
183
  row["locked_reason"] = "web_ui_or_env_only"
183
184
  row["value"] = _security_policy_access_enabled()
184
- elif fname == "enable_security_policy_tool":
185
+ elif fname in _HUMAN_ONLY_SETTINGS:
185
186
  if row["editable"]:
186
187
  row["editable"] = False
187
188
  row["locked_reason"] = "web_ui_or_env_only"
@@ -215,48 +216,46 @@ def _require_security_policy_access(operation: str) -> None:
215
216
  )
216
217
 
217
218
 
219
+ # Settings dev tools may never write, in either direction, with the refusal
220
+ # message and where a human changes them instead.
221
+ _HUMAN_ONLY_SETTINGS: dict[str, tuple[str, str]] = {
222
+ "enable_security_policy_tool": (
223
+ "it registers ha_manage_security_policy, which can rewrite the tool "
224
+ "security policies gating the agent.",
225
+ "Change it in the web settings UI (Tool Security Policies tab) or via "
226
+ "the ENABLE_SECURITY_POLICY_TOOL env var.",
227
+ ),
228
+ "dev_tools_security_policy_access": (
229
+ "it is the toggle governing their own access to tool security policies.",
230
+ "Change it in the web settings UI (Server Settings tab, Developer "
231
+ "section) or via the HAMCP_DEV_SECURITY_POLICY_ACCESS env var.",
232
+ ),
233
+ "custom_instructions": (
234
+ "its text is sent to every connected agent as server instructions.",
235
+ "Change it in the web settings UI (Server Settings tab, Advanced) or "
236
+ "via the HAMCP_CUSTOM_INSTRUCTIONS env var.",
237
+ ),
238
+ }
239
+
240
+
218
241
  def _guard_security_policy_setting(setting: str) -> None:
219
242
  """Gate set/reset of the settings that define the dev tools' leash.
220
243
 
221
- ``dev_tools_security_policy_access`` is refused unconditionally — even
222
- with access ON — so the agent can neither grant itself policy access
223
- nor revoke it; that toggle belongs to the web settings UI and the env
224
- var alone. ``enable_security_policy_tool`` gets the same unconditional
225
- refusal: it registers ha_manage_security_policy, which can rewrite the
226
- policies gating the agent, and its toggle belongs to the Tool Security
227
- Policies tab (issue #2148) — a dev-tools write would reach the same
228
- end state as unbuckling the leash, one restart later.
229
- ``enable_tool_security_policies`` is the whole gating engine's master
230
- switch, so writing it needs access.
244
+ ``_HUMAN_ONLY_SETTINGS`` are refused even with access ON: the agent may
245
+ neither grant nor revoke its own policy access, nor register
246
+ ha_manage_security_policy (#2148; the same end state as unbuckling the
247
+ leash, one restart later), nor rewrite the text steering every agent.
248
+ ``enable_tool_security_policies`` is the gating engine's master switch,
249
+ so writing it needs access.
231
250
  """
232
- if setting == "enable_security_policy_tool":
233
- raise_tool_error(
234
- create_error_response(
235
- ErrorCode.AUTH_INSUFFICIENT_PERMISSIONS,
236
- "'enable_security_policy_tool' cannot be changed by dev "
237
- "tools: it registers ha_manage_security_policy, which can "
238
- "rewrite the tool security policies gating the agent.",
239
- context={"setting": setting},
240
- suggestions=[
241
- "Change it in the web settings UI (Tool Security "
242
- "Policies tab) or via the ENABLE_SECURITY_POLICY_TOOL "
243
- "env var.",
244
- ],
245
- )
246
- )
247
- if setting == "dev_tools_security_policy_access":
251
+ if setting in _HUMAN_ONLY_SETTINGS:
252
+ reason, where = _HUMAN_ONLY_SETTINGS[setting]
248
253
  raise_tool_error(
249
254
  create_error_response(
250
255
  ErrorCode.AUTH_INSUFFICIENT_PERMISSIONS,
251
- "'dev_tools_security_policy_access' cannot be changed by dev "
252
- "tools: it is the toggle governing their own access to tool "
253
- "security policies.",
256
+ f"'{setting}' cannot be changed by dev tools: {reason}",
254
257
  context={"setting": setting},
255
- suggestions=[
256
- "Change it in the web settings UI (Server Settings tab, "
257
- "Developer section) or via the "
258
- "HAMCP_DEV_SECURITY_POLICY_ACCESS env var.",
259
- ],
258
+ suggestions=[where],
260
259
  )
261
260
  )
262
261
  if setting == "enable_tool_security_policies":