ha-mcp-dev 9.0.0.dev3172__tar.gz → 9.0.0.dev3178__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 (809) hide show
  1. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/PKG-INFO +1 -1
  2. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/pyproject.toml +1 -1
  3. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/pyproject.toml.orig +1 -1
  4. ha_mcp_dev-9.0.0.dev3178/src/ha_mcp/client/error_log_journald.py +241 -0
  5. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/models.py +8 -2
  6. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/rest_client.py +62 -154
  7. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config.py +10 -0
  8. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/log_filters.py +37 -0
  9. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/error_log_parsing.py +274 -51
  10. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/log_common.py +1 -7
  11. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/log_sources.py +284 -64
  12. ha_mcp_dev-9.0.0.dev3178/src/ha_mcp/tools/system_restart.py +231 -0
  13. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_logs.py +101 -29
  14. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_system.py +15 -19
  15. ha_mcp_dev-9.0.0.dev3172/src/ha_mcp/tools/system_restart.py +0 -134
  16. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/LICENSE +0 -0
  17. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/README.md +0 -0
  18. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/__init__.py +0 -0
  19. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/__main__.py +0 -0
  20. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_pypi_marker +0 -0
  21. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_rich_compat.py +0 -0
  22. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/__init__.py +0 -0
  23. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  24. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  25. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  26. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  27. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  28. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  29. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  30. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  31. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  32. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  33. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  34. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  35. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  36. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  37. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  38. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  39. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  40. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  41. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  42. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  43. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  44. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  45. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  46. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  47. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  48. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  49. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  50. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  51. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  52. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  53. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  54. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  55. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  56. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  57. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  58. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  59. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  60. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  61. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  62. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  63. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  64. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  65. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  66. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  67. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  68. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  69. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  70. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  71. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  72. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  73. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  74. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  75. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  76. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  77. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  78. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  79. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  80. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  81. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  82. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  83. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  84. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
  85. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  86. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  87. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  88. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  89. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  90. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  91. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  92. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  93. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  94. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  95. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  96. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  97. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  98. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  99. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  100. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  101. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  102. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  103. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  104. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  105. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  106. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  107. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  108. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  109. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  110. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  111. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  112. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  113. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  114. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  115. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  116. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  117. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  118. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  119. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  120. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  121. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  122. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  123. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  124. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  125. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  126. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  127. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  128. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  129. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  130. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  131. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  132. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  133. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  134. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  135. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  136. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  137. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  138. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  139. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  140. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  141. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  142. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  143. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  144. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  145. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  146. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  147. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  148. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  149. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  150. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  151. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  152. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  153. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  154. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  155. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  156. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  157. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  158. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  159. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  160. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  161. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  162. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  163. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  164. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  165. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  166. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  167. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  168. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  169. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  170. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  171. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  172. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  173. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  174. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  175. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  176. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  177. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  178. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  179. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  180. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  181. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  182. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  183. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  184. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  185. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  186. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  187. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  188. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  189. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  190. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  191. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  192. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  193. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  194. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  195. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  196. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  197. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  198. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  199. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  200. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  201. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  202. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  203. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  204. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  205. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  206. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  207. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  208. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  209. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  210. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  211. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  212. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  213. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  214. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  215. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  216. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  217. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  218. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  219. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  220. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  221. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  222. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  223. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  224. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  225. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  226. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  227. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  228. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  229. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  230. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  231. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  232. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  233. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  234. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  235. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  236. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  237. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  238. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  239. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  240. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  241. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  242. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  243. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  244. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
  245. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
  246. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
  247. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
  248. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
  249. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
  250. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
  251. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
  252. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  253. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  254. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  255. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  256. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  257. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  258. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  259. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  260. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  261. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  262. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  263. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  264. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  265. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  266. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  267. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  268. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  269. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  270. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  271. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  272. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  273. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  274. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  275. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  276. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  277. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  278. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  279. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  280. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  281. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  282. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  283. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  284. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  285. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  286. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  287. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  288. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  289. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  290. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  291. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  292. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  293. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  294. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  295. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  296. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  297. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  298. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  299. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  300. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  301. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  302. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  303. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  304. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  305. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  306. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  307. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  308. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  309. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  310. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  311. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  312. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  313. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  314. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  315. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  316. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  317. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  318. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  319. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  320. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  321. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  322. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  323. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  324. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  325. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  326. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  327. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  328. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  329. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  330. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  331. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  332. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  333. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  334. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  335. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  336. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  337. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  338. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  339. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  340. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  341. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  342. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  343. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  344. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  345. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  346. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  347. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  348. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  349. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  350. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  351. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  352. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  353. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  354. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  355. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  356. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  357. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  358. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  359. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  360. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  361. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  362. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  363. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  364. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  365. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  366. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  367. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  368. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  369. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  370. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  371. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  372. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  373. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  374. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  375. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  376. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  377. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  378. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  379. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  380. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  381. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  382. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  383. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  384. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  385. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  386. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  387. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  388. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  389. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  390. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  391. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  392. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  393. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  394. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  395. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  396. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  397. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  398. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  399. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  400. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  401. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  402. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  403. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  404. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  405. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  406. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  407. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  408. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  409. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  410. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  411. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  412. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  413. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  414. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  415. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  416. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  417. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  418. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  419. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  420. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  421. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  422. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  423. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  424. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  425. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  426. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  427. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  428. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  429. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  430. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  431. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  432. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  433. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  434. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  435. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  436. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  437. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  438. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  439. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  440. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  441. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  442. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  443. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  444. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  445. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  446. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/requirements.txt +0 -0
  447. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  448. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  449. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  450. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  451. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  452. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  453. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  454. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  455. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  456. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  457. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  458. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  459. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  460. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  461. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  462. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  463. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  464. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  465. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  466. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  467. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  468. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  469. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  470. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  471. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  472. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  473. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  474. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  475. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  476. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  477. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  478. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  479. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  480. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  481. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  482. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  483. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  484. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  485. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  486. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  487. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  488. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  489. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  490. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  491. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  492. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  493. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  494. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  495. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  496. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  497. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  498. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  499. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  500. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  501. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  502. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  503. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/_version.py +0 -0
  504. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/app_discovery.py +0 -0
  505. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/auth/__init__.py +0 -0
  506. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/auth/consent_form.py +0 -0
  507. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/auth/iss_stamp.py +0 -0
  508. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/auth/oidc_compat.py +0 -0
  509. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/auth/provider.py +0 -0
  510. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_dashboards.py +0 -0
  511. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_diff.py +0 -0
  512. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_entity_ids.py +0 -0
  513. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_helper_target.py +0 -0
  514. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_integrations.py +0 -0
  515. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_manager.py +0 -0
  516. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_tags.py +0 -0
  517. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/backup_zones.py +0 -0
  518. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/browser_landing.py +0 -0
  519. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/__init__.py +0 -0
  520. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/admin_routes.py +0 -0
  521. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/supervisor_client.py +0 -0
  522. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/websocket_client.py +0 -0
  523. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/client/websocket_listener.py +0 -0
  524. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config_backup.py +0 -0
  525. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config_meta.py +0 -0
  526. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config_overrides.py +0 -0
  527. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config_registry.py +0 -0
  528. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/config_settings.py +0 -0
  529. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  530. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  531. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  532. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  533. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  534. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  535. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/errors.py +0 -0
  536. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/ha_request_queue.py +0 -0
  537. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  538. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/http_transport.py +0 -0
  539. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/image_info.py +0 -0
  540. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/llm_exposure.py +0 -0
  541. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/__init__.py +0 -0
  542. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/approval_queue.py +0 -0
  543. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/decision_pin.py +0 -0
  544. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/decisions.py +0 -0
  545. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/editing.py +0 -0
  546. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/evaluator.py +0 -0
  547. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/events.py +0 -0
  548. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/handlers.py +0 -0
  549. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/middleware.py +0 -0
  550. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/model.py +0 -0
  551. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/mrtr.py +0 -0
  552. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/persistence.py +0 -0
  553. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/server_channels.py +0 -0
  554. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/policy/value_sources.py +0 -0
  555. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/py.typed +0 -0
  556. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/read_only.py +0 -0
  557. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/redaction.py +0 -0
  558. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/renamed_tools.py +0 -0
  559. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  560. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  561. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  562. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  563. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  564. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  565. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  566. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  567. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  568. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  569. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  570. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  571. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  572. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  573. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  574. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  575. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  576. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/server.py +0 -0
  577. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/server_instructions.py +0 -0
  578. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/server_lifespan.py +0 -0
  579. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/server_tool_text.py +0 -0
  580. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/__init__.py +0 -0
  581. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  582. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  583. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  584. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
  585. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  586. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  587. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  588. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  589. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  590. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  591. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  592. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_theme.py +0 -0
  593. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  594. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  595. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  596. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  597. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  598. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  599. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  600. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  601. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  602. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  603. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  604. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  605. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  606. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  607. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  608. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  609. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  610. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  611. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings.css +0 -0
  612. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings.html +0 -0
  613. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  614. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  615. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  616. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  617. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  618. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  619. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  620. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  621. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  622. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
  623. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/smoke_test.py +0 -0
  624. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  625. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/strict_bps.py +0 -0
  626. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tool_dispatch.py +0 -0
  627. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/__init__.py +0 -0
  628. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
  629. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/area_messages.py +0 -0
  630. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/auto_backup.py +0 -0
  631. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/backup.py +0 -0
  632. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/backup_access.py +0 -0
  633. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  634. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  635. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/best_practice_result.py +0 -0
  636. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  637. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  638. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  639. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/blueprint_write.py +0 -0
  640. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/bug_report_config.py +0 -0
  641. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  642. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/bulk_selector.py +0 -0
  643. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/coercion.py +0 -0
  644. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_api.py +0 -0
  645. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_config_entries.py +0 -0
  646. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_config_reads.py +0 -0
  647. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  648. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_devices.py +0 -0
  649. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  650. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_registries.py +0 -0
  651. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  652. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  653. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  654. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  655. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  656. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  657. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  658. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  659. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  660. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  661. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  662. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  663. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  664. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  665. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  666. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  667. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  668. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  669. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  670. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  671. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  672. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  673. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  674. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_write_errors.py +0 -0
  675. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  676. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/core_contract.py +0 -0
  677. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  678. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  679. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  680. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/dev_backup.py +0 -0
  681. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/device_control.py +0 -0
  682. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/device_enrichment.py +0 -0
  683. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  684. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/energy_preferences.py +0 -0
  685. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  686. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/entity_registration.py +0 -0
  687. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/entity_removal.py +0 -0
  688. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  689. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  690. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/hacs_registration.py +0 -0
  691. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/helper_flows.py +0 -0
  692. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/helpers.py +0 -0
  693. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/history_response.py +0 -0
  694. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  695. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  696. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  697. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
  698. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  699. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/__init__.py +0 -0
  700. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/base.py +0 -0
  701. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/matter.py +0 -0
  702. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/thread.py +0 -0
  703. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  704. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/zwave.py +0 -0
  705. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  706. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/recorder_errors.py +0 -0
  707. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/reference_validator.py +0 -0
  708. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/registry.py +0 -0
  709. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  710. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/response_helpers.py +0 -0
  711. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/scene_discovery.py +0 -0
  712. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/__init__.py +0 -0
  713. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/base.py +0 -0
  714. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/component.py +0 -0
  715. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/entities.py +0 -0
  716. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/legacy.py +0 -0
  717. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/modes.py +0 -0
  718. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/overview.py +0 -0
  719. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/response.py +0 -0
  720. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/search/state.py +0 -0
  721. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/server_version.py +0 -0
  722. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  723. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  724. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  725. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  726. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  727. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  728. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  729. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  730. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  731. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  732. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/statistics_calendar.py +0 -0
  733. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  734. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/statistics_resets.py +0 -0
  735. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tool_hints.py +0 -0
  736. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  737. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_addons.py +0 -0
  738. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_areas.py +0 -0
  739. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  740. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  741. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  742. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_calendar.py +0 -0
  743. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_camera.py +0 -0
  744. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_categories.py +0 -0
  745. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_code.py +0 -0
  746. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  747. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  748. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  749. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  750. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  751. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  752. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_dev.py +0 -0
  753. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_energy.py +0 -0
  754. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_entities.py +0 -0
  755. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  756. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_groups.py +0 -0
  757. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_hacs.py +0 -0
  758. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_history.py +0 -0
  759. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_integrations.py +0 -0
  760. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_labels.py +0 -0
  761. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_radio.py +0 -0
  762. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_registry.py +0 -0
  763. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_resources.py +0 -0
  764. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_search.py +0 -0
  765. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  766. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_service.py +0 -0
  767. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_services.py +0 -0
  768. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_themes.py +0 -0
  769. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_todo.py +0 -0
  770. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_traces.py +0 -0
  771. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_updates.py +0 -0
  772. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_utility.py +0 -0
  773. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  774. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  775. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  776. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/tools_zones.py +0 -0
  777. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/util_helpers.py +0 -0
  778. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/validation_middleware.py +0 -0
  779. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/tools/ws_waiters.py +0 -0
  780. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/__init__.py +0 -0
  781. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/categorized_search.py +0 -0
  782. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/compact_params.py +0 -0
  783. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/component_helpers.py +0 -0
  784. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/component_search.py +0 -0
  785. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  786. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  787. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/transport_security.py +0 -0
  788. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/update_check.py +0 -0
  789. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/__init__.py +0 -0
  790. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/config_hash.py +0 -0
  791. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/config_write_lock.py +0 -0
  792. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  793. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/data_paths.py +0 -0
  794. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  795. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/domain_handlers.py +0 -0
  796. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/entity_membership.py +0 -0
  797. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  798. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  799. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  800. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/operation_manager.py +0 -0
  801. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/python_sandbox.py +0 -0
  802. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  803. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/skill_loader.py +0 -0
  804. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/utils/usage_logger.py +0 -0
  805. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/visibility/__init__.py +0 -0
  806. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/visibility/enforcement.py +0 -0
  807. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/visibility/model.py +0 -0
  808. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/visibility/persistence.py +0 -0
  809. {ha_mcp_dev-9.0.0.dev3172 → ha_mcp_dev-9.0.0.dev3178}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 9.0.0.dev3172
3
+ Version: 9.0.0.dev3178
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3172"
7
+ version = "9.0.0.dev3178"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3172"
7
+ version = "9.0.0.dev3178"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -0,0 +1,241 @@
1
+ """Journald window paging for the raw error log (Supervisor-backed installs).
2
+
3
+ Supervisor answers ``?lines=N`` with the N newest journald entries, and an
4
+ ``offset`` counts back from the newest one. That anchor moves whenever Home
5
+ Assistant logs another line, so a caller paging on the number can re-read or
6
+ skip entries between two calls. Supervisor also returns ``X-First-Cursor``,
7
+ which identifies the first (oldest) entry of the block it served, and accepts
8
+ ``Range: entries=<cursor>:<skip>:<count>``; HA's own log viewer pages on that
9
+ cursor for exactly this reason.
10
+
11
+ This module turns that into an opaque token carrying both the cursor and the
12
+ number of entries a page consumed from it: ``cursor:<X-First-Cursor>:<skip>``.
13
+ A page requested with a token is fetched entirely behind that resume point, so
14
+ lines logged in between cannot shift it and a page that returned only part of
15
+ its fetched window still resumes exactly. ``journald_page`` never computes
16
+ the skip itself -- only the tool layer knows which records a page returned --
17
+ so the token is built there and this module only applies it.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import logging
23
+ from collections.abc import Awaitable, Callable
24
+ from dataclasses import dataclass
25
+
26
+ from .models import ErrorLogPage
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+ CURSOR_TOKEN_PREFIX = "cursor:"
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class JournaldPage:
35
+ """One journald block plus the cursor of its oldest entry."""
36
+
37
+ text: str
38
+ first_cursor: str | None
39
+
40
+
41
+ JournaldFetch = Callable[[str], Awaitable[JournaldPage]]
42
+
43
+
44
+ def is_cursor_token(value: object) -> bool:
45
+ """True when ``value`` is a paging token produced by this module."""
46
+ return (
47
+ isinstance(value, str)
48
+ and value.startswith(CURSOR_TOKEN_PREFIX)
49
+ and bool(value[len(CURSOR_TOKEN_PREFIX) :])
50
+ )
51
+
52
+
53
+ def cursor_token(cursor: str, skip: int) -> str:
54
+ """Build the opaque ``next_offset`` value resuming ``skip`` entries in.
55
+
56
+ ``skip`` is the offset of the resume point from ``cursor`` (the oldest entry
57
+ of the page's fetched window); the next block ends one entry before it.
58
+ After a page that returned records, entry ``skip`` is the oldest entry the
59
+ page returned, so the next block starts with the entries fetched behind it.
60
+ A held-back tail sets it one past the tail's last line. Zero resumes
61
+ strictly behind ``cursor``, which is what a page that used its whole window
62
+ needs.
63
+ """
64
+ if skip < 0:
65
+ raise ValueError(f"skip must not be negative, got {skip}")
66
+ return f"{CURSOR_TOKEN_PREFIX}{cursor}:{skip}"
67
+
68
+
69
+ def parse_cursor_token(token: str) -> tuple[str, int]:
70
+ """Split ``token`` into its cursor and skip; raises ``ValueError`` if malformed.
71
+
72
+ The cursor itself never contains ``:`` (systemd cursors separate their
73
+ fields with ``;``), but the skip is still split off from the right so a
74
+ future cursor format cannot be mistaken for it.
75
+ """
76
+ if not token.startswith(CURSOR_TOKEN_PREFIX):
77
+ raise ValueError("not a cursor token")
78
+ cursor, separator, skip = token[len(CURSOR_TOKEN_PREFIX) :].rpartition(":")
79
+ if not separator or not cursor or not skip.isdigit():
80
+ raise ValueError(
81
+ "cursor token must read 'cursor:<cursor>:<entries>' as returned in "
82
+ "'next_offset'"
83
+ )
84
+ return cursor, int(skip)
85
+
86
+
87
+ def token_cursor(token: str) -> str:
88
+ """The cursor carried by ``token``; raises ``ValueError`` when malformed."""
89
+ return parse_cursor_token(token)[0]
90
+
91
+
92
+ def token_skip(token: str) -> int:
93
+ """The skip carried by ``token``; raises ``ValueError`` when malformed."""
94
+ return parse_cursor_token(token)[1]
95
+
96
+
97
+ def range_header(lines: int, offset: int = 0) -> str:
98
+ """The ``Range`` expression for the ``offset``-th window back from newest."""
99
+ return f"entries=:{-(offset + lines - 1)}:{lines}"
100
+
101
+
102
+ def cursor_range_header(cursor: str, skip: int, lines: int) -> str:
103
+ """The expression returning ``lines`` entries strictly behind ``cursor:skip``.
104
+
105
+ Gatewayd reads ``entries=<cursor>:<num_skip>:<num_entries>`` forward from
106
+ ``cursor + num_skip``, so ending the block just behind the resume point
107
+ (``cursor + skip``) means starting ``lines`` entries earlier. That makes a
108
+ cursor page the exact unfetched remainder: nothing the caller already saw
109
+ is repeated and nothing between pages is dropped.
110
+ """
111
+ return f"entries={cursor}:{skip - lines}:{lines}"
112
+
113
+
114
+ def container_page(text: str, lines: int, offset: int) -> ErrorLogPage:
115
+ """Window the whole-file ``/api/error_log`` body client-side.
116
+
117
+ Paging is exact here: the whole file is in hand, so ``has_more`` is simply
118
+ whether anything precedes the window.
119
+ """
120
+ all_lines = text.splitlines()
121
+ end = len(all_lines) - offset
122
+ if end <= 0:
123
+ return ErrorLogPage(text="", has_more=False)
124
+ start = max(end - lines, 0)
125
+ return ErrorLogPage(
126
+ text="\n".join(all_lines[start:end]),
127
+ has_more=start > 0,
128
+ first_cursor=None,
129
+ )
130
+
131
+
132
+ def first_cursor(response: object) -> str | None:
133
+ """Supervisor's ``X-First-Cursor`` from ``response``, when it carries one."""
134
+ headers = getattr(response, "headers", None)
135
+ if not headers:
136
+ return None
137
+ value = headers.get("X-First-Cursor")
138
+ return value or None
139
+
140
+
141
+ async def journald_page(
142
+ lines: int,
143
+ offset: int | str,
144
+ fetch: JournaldFetch,
145
+ ) -> ErrorLogPage:
146
+ """One journald window, anchored on the newest entry or on a cursor token."""
147
+ if is_cursor_token(offset):
148
+ if not isinstance(offset, str): # pragma: no cover - narrows the type
149
+ raise ValueError("cursor token must be a string")
150
+ cursor, skip = parse_cursor_token(offset)
151
+ return await _cursor_page(lines, cursor, skip, fetch)
152
+ if isinstance(offset, str):
153
+ raise ValueError("offset must be a non-negative integer or a cursor token")
154
+ return await _newest_page(lines, offset, fetch)
155
+
156
+
157
+ async def _newest_page(lines: int, offset: int, fetch: JournaldFetch) -> ErrorLogPage:
158
+ page = await fetch(range_header(lines, offset))
159
+ text_lines = page.text.splitlines()
160
+ if len(text_lines) < lines:
161
+ # Nothing clamps a window smaller than asked for, so a short window is
162
+ # the end of the journal.
163
+ return ErrorLogPage(text=page.text, has_more=False)
164
+ has_more = await _has_older_than(page.first_cursor, fetch)
165
+ return ErrorLogPage(
166
+ text=page.text,
167
+ has_more=has_more,
168
+ first_cursor=page.first_cursor,
169
+ )
170
+
171
+
172
+ async def _cursor_page(
173
+ lines: int, cursor: str, skip: int, fetch: JournaldFetch
174
+ ) -> ErrorLogPage:
175
+ page = await fetch(cursor_range_header(cursor, skip, lines))
176
+ entries = page.text.splitlines()
177
+ has_more = await _has_older_than(page.first_cursor, fetch)
178
+ if entries and not has_more and page.first_cursor:
179
+ # The block starts at the journal's head, so gatewayd clamped its start
180
+ # and kept reading forward: it may run past the resume point and repeat
181
+ # entries the previous page already returned. Keep only what precedes
182
+ # the resume point.
183
+ entries = entries[
184
+ : await _entries_before_resume(
185
+ cursor, skip, len(entries), page.first_cursor, fetch
186
+ )
187
+ ]
188
+ return ErrorLogPage(
189
+ text="\n".join(entries),
190
+ has_more=has_more,
191
+ first_cursor=page.first_cursor,
192
+ )
193
+
194
+
195
+ async def _entries_before_resume(
196
+ cursor: str,
197
+ skip: int,
198
+ count: int,
199
+ head: str,
200
+ fetch: JournaldFetch,
201
+ ) -> int:
202
+ """How many entries of a head-clamped block precede the resume point.
203
+
204
+ Gatewayd anchors ``entries=<cursor>:<skip>:<count>`` at ``cursor + skip``
205
+ and reads ``count`` entries forward. A skip that runs past the journal's
206
+ start is clamped to the head rather than rejected, so the block it returns
207
+ can contain entries at or after the resume point. Those entries duplicate
208
+ the previous page and, without trimming, hide the oldest ones behind them.
209
+
210
+ The resume point is ``skip`` entries after ``cursor``. Asking for the single
211
+ entry ``k`` entries before it returns the head exactly when ``k`` reaches it
212
+ (at or past the head the start clamps there), which binary-searches its
213
+ position without needing per-entry cursors — Supervisor rejects a JSON
214
+ Accept, so cursors are the only per-entry identity it will not serve.
215
+ """
216
+ low, high = 0, count
217
+ while low < high:
218
+ middle = (low + high) // 2
219
+ probe = await fetch(f"entries={cursor}:{skip - middle}:1")
220
+ if probe.first_cursor == head:
221
+ high = middle
222
+ else:
223
+ low = middle + 1
224
+ return low
225
+
226
+
227
+ async def _has_older_than(cursor: str | None, fetch: JournaldFetch) -> bool:
228
+ """True when an entry precedes ``cursor``.
229
+
230
+ Gatewayd clamps a skip that runs past the journal's start to its head
231
+ block instead of answering with an empty one, so the block's length says
232
+ nothing here. Its first cursor does: only a clamped probe starts on the
233
+ anchor entry itself. (The HA frontend uses the same signal to detect the
234
+ end of history.)
235
+ """
236
+ if not cursor:
237
+ return False
238
+ probe = await fetch(cursor_range_header(cursor, 0, 2))
239
+ if not probe.text.splitlines():
240
+ return False
241
+ return probe.first_cursor != cursor
@@ -10,9 +10,15 @@ class ErrorLogPage:
10
10
  """One bounded window of the error log, plus whether older history exists.
11
11
 
12
12
  ``has_more`` cannot be derived by the caller from ``text``: a journald
13
- window that comes back full may or may not have anything behind it (see
14
- ``_journald_error_log_page``), and only the fetching route knows which.
13
+ window that comes back full may or may not have anything behind it, and
14
+ only the fetching route knows which.
15
+
16
+ ``first_cursor`` is Supervisor's ``X-First-Cursor`` for the block -- the
17
+ oldest entry this window served -- and is ``None`` on installs that read a
18
+ whole log file. The tool layer turns it into the ``next_offset`` token, so
19
+ the cursor travels as data instead of being re-derived from the text.
15
20
  """
16
21
 
17
22
  text: str
18
23
  has_more: bool
24
+ first_cursor: str | None = None
@@ -8,7 +8,6 @@ import logging
8
8
  import os
9
9
  import ssl
10
10
  import time
11
- from collections.abc import Awaitable, Callable
12
11
  from dataclasses import dataclass
13
12
  from typing import Any, NoReturn
14
13
 
@@ -18,6 +17,13 @@ from .._vendor.websockets.exceptions import WebSocketException
18
17
  from .._version import get_supervisor_base_url, is_running_in_addon
19
18
  from ..config import get_global_settings
20
19
  from .admin_routes import is_admin_only_route
20
+ from .error_log_journald import (
21
+ JournaldPage,
22
+ container_page,
23
+ first_cursor,
24
+ journald_page,
25
+ range_header,
26
+ )
21
27
  from .models import ErrorLogPage
22
28
  from .supervisor_client import make_supervisor_httpx_client
23
29
 
@@ -62,16 +68,6 @@ _MAX_REQUEST_ATTEMPTS = 3
62
68
  # client mirrors that on every route, so all install types serve the same slice.
63
69
  # Shared with the tool layer, which sizes its fetch window against it.
64
70
  MIN_LOG_WINDOW_LINES = 2
65
- # Entries the has_more probe reads from just behind a full window. A one-entry
66
- # probe compared one rendered line, which a boundary duplicate (the same
67
- # timestamp-less traceback line logged twice) could false-match into "end of
68
- # history". Comparing a block this deep requires that many CONSECUTIVE
69
- # identical lines to straddle the boundary — and then the history a false stop
70
- # skips is more of the same duplicates. Timestamps cannot close the gap
71
- # instead: the colliding lines are exactly the ones without them, and
72
- # journald's cursor/timestamp metadata exists only in the journal export
73
- # format, which the hassio-proxy route cannot request.
74
- _PROBE_ENTRIES = 8
75
71
  NON_ADMIN_TOKEN_WARNING = (
76
72
  "ha-mcp does not officially support non-admin Home Assistant tokens. They "
77
73
  "still work, but admin-only operations fail. Use a long-lived access token "
@@ -898,126 +894,26 @@ class HomeAssistantClient:
898
894
  logger.debug("Checking configuration")
899
895
  return await self._request("POST", "/config/core/check_config")
900
896
 
901
- @staticmethod
902
- def _journald_range_header(lines: int, offset: int = 0) -> str:
903
- """Build Supervisor's journald ``Range`` header for a bounded window.
904
-
905
- Supervisor's log endpoints accept
906
- ``Range: entries=<cursor>:<num_skip>:<num_entries>`` and build
907
- ``entries=:-{N-1}:{N}`` themselves for a ``?lines=N`` request
908
- (supervisor/api/host.py). ``offset`` moves the window that many entries
909
- further back, so the returned slice ends ``offset`` entries before the
910
- newest one.
911
-
912
- A ``lines=1`` window is only expressible with a non-zero ``offset``: at
913
- ``offset=0`` the header degenerates to ``entries=:0:1``, whose
914
- non-negative skip reads from the OLDEST entry instead of the newest.
915
- Callers anchoring at the newest entry pass ``lines`` already floored at
916
- ``MIN_LOG_WINDOW_LINES``; the one-entry probe always carries an offset.
917
- """
918
- # Negate the computed skip rather than prefixing "-" so the degenerate
919
- # skip of 0 renders as ":0:" (non-negative, reads from the oldest
920
- # entry) instead of the ill-formed ":-0:".
921
- return f"entries=:{-(offset + lines - 1)}:{lines}"
897
+ async def _supervisor_core_logs(self, range_header: str) -> JournaldPage:
898
+ """Fetch one journald window straight from Supervisor, with its cursor."""
899
+ response = await self._supervisor_logs_response(
900
+ "core",
901
+ headers={"Accept": "text/plain", "Range": range_header},
902
+ params={"no_colors": "true"},
903
+ )
904
+ return JournaldPage(response.text, first_cursor(response))
922
905
 
923
- @staticmethod
924
- def _container_error_log_page(text: str, lines: int, offset: int) -> ErrorLogPage:
925
- """Window the whole-file ``/api/error_log`` body client-side.
926
-
927
- Same tail semantics as the journald Range the Supervisor-backed
928
- branches request, so ``get_error_log`` answers with the same slice of
929
- history on every install type. Paging is exact here — the whole file is
930
- in hand, so ``has_more`` is simply whether anything precedes the window.
931
- An ``offset`` past the start of the file yields an empty final page.
932
- """
933
- all_lines = text.splitlines()
934
- end = len(all_lines) - offset
935
- if end <= 0:
936
- return ErrorLogPage(text="", has_more=False)
937
- start = max(end - lines, 0)
938
- return ErrorLogPage(text="\n".join(all_lines[start:end]), has_more=start > 0)
939
-
940
- async def _supervisor_core_logs(self, lines: int, offset: int) -> str:
941
- """Fetch a journald window of HA Core's log straight from Supervisor."""
942
- return await self._supervisor_logs_get("core", lines=lines, offset=offset)
943
-
944
- async def _proxied_core_logs(self, lines: int, offset: int) -> str:
945
- """Fetch the same window through HA Core's hassio proxy with the LLA."""
906
+ async def _proxied_core_logs(self, range_header: str) -> JournaldPage:
907
+ """The same window through HA Core's hassio proxy."""
946
908
  response = await self._raw_request(
947
909
  "GET",
948
910
  "/hassio/core/logs",
949
- headers={
950
- "Accept": "text/plain",
951
- "Range": self._journald_range_header(lines, offset),
952
- },
911
+ headers={"Accept": "text/plain", "Range": range_header},
953
912
  params={"no_colors": "true"},
954
913
  )
955
- return response.text
956
-
957
- async def _journald_error_log_page(
958
- self,
959
- lines: int,
960
- offset: int,
961
- fetch: Callable[[int, int], Awaitable[str]],
962
- ) -> ErrorLogPage:
963
- """Read one journald window and settle ``has_more`` with a 1-entry probe.
964
-
965
- systemd's journal-gatewayd does not guard the negative-skip branch the
966
- way it guards the positive one (``sd_journal_previous_skip(-n_skip + 1)``
967
- returns no END_OF_STREAM): an offset past the start of the journal
968
- CLAMPS to the oldest entry and still answers with a full window. So a
969
- saturated window proves nothing about what lies behind it, and a
970
- count-based ``has_more`` would stay true forever — an agent following
971
- the pagination hint would loop on identical pages.
972
-
973
- Hence: a short or empty window means the journal really is exhausted
974
- (nothing clamps a window smaller), and a saturated one is settled by
975
- asking for the ``_PROBE_ENTRIES`` entries that should sit just behind
976
- it. If the journal has nothing there, the clamp starts the probe at
977
- the same oldest entry the window starts with, so the probe block
978
- equals the window's opening lines — identity means end of history. A
979
- differing block proves deeper history (an under-full span behind the
980
- window also clamps and misaligns, which correctly reads as "more").
981
- The identity check also terminates the degraded case where an
982
- intermediary strips the ``Range`` header (RFC 7233 permits it): both
983
- requests then return Supervisor's default window and compare equal.
984
-
985
- The saturation test counts lines only to decide whether to probe, never
986
- to answer: one journald entry can be a multi-line traceback, so the line
987
- count over-estimates entries and can only over-trigger the probe, which
988
- then gives the real answer. In practice the two rarely diverge here:
989
- docker's journald log driver — how HAOS captures Core's output —
990
- ingests stdout line by line, one journal entry per rendered line, so
991
- multi-line entries reach this endpoint only from native journal-API
992
- writers.
993
-
994
- Known imprecision, accepted: the identity check can still stop one
995
- page early when the compared block — ``_PROBE_ENTRIES`` lines, or the
996
- window's own length when that is smaller — is byte-identical across
997
- the boundary (see the constant's comment for why timestamps cannot
998
- disambiguate instead). The failure
999
- direction is a missed page of exactly those duplicates — bounded,
1000
- unlike the infinite loop a count-based ``has_more`` produces on the
1001
- clamp.
1002
- """
1003
- text = await fetch(lines, offset)
1004
- if not text or len(text.splitlines()) < lines:
1005
- return ErrorLogPage(text=text, has_more=False)
1006
- probe = await fetch(_PROBE_ENTRIES, offset + lines)
1007
- probe_lines = probe.splitlines()
1008
- window_lines = text.splitlines()
1009
- # Compare the shared-length prefix: with a window smaller than the
1010
- # probe (lines < _PROBE_ENTRIES), an end-of-history clamp returns a
1011
- # probe LONGER than the window, and a full-length compare would read
1012
- # that as "more history" forever — the small-limit loop this method
1013
- # exists to prevent.
1014
- shared = min(len(probe_lines), len(window_lines))
1015
- return ErrorLogPage(
1016
- text=text,
1017
- has_more=shared > 0 and probe_lines[:shared] != window_lines[:shared],
1018
- )
914
+ return JournaldPage(response.text, first_cursor(response))
1019
915
 
1020
- async def get_error_log(self, lines: int, offset: int = 0) -> ErrorLogPage:
916
+ async def get_error_log(self, lines: int, offset: int | str = 0) -> ErrorLogPage:
1021
917
  """Get a bounded window of the Home Assistant error log.
1022
918
 
1023
919
  ``lines`` is the number of log lines to fetch and ``offset`` how many
@@ -1054,15 +950,14 @@ class HomeAssistantClient:
1054
950
  keep the historical ``/api/error_log`` proxy path.
1055
951
 
1056
952
  The two Supervisor-backed branches express the window as a journald
1057
- ``Range`` header (see ``_journald_range_header``) and settle
1058
- ``has_more`` with a one-entry probe (see ``_journald_error_log_page``).
1059
- HA Core's hassio proxy forwards that header for its log paths
1060
- (``PATHS_LOGS`` in ``homeassistant/components/hassio/http.py``); an
1061
- intermediary that stripped it would degrade to Supervisor's 100-line
1062
- default, never to an unbounded fetch, and the probe still terminates
1063
- paging. ``/api/error_log`` is a whole-file plain-text endpoint with no
1064
- window support, so the container branch reads the file and applies the
1065
- same window client-side, where paging is exact.
953
+ ``Range`` header, either anchored on the newest entry (integer
954
+ ``offset``) or on an opaque cursor token from an earlier page; see
955
+ :mod:`ha_mcp.client.error_log_journald`. Working from Supervisor's
956
+ ``X-First-Cursor`` keeps a page stable while Home Assistant logs more
957
+ lines between two calls. ``/api/error_log`` is a whole-file plain-text
958
+ endpoint with no window support, so the container branch reads the file
959
+ and applies the same window client-side, where paging is exact and
960
+ integer offsets stay the contract.
1066
961
 
1067
962
  The middle branch was discovered by the HAOS E2E tier (#1326): the
1068
963
  test harness runs ha-mcp externally against a booted HAOS, hits
@@ -1085,7 +980,7 @@ class HomeAssistantClient:
1085
980
  logger.debug(
1086
981
  "Fetching error log via Supervisor direct (core service)"
1087
982
  )
1088
- return await self._journald_error_log_page(
983
+ return await journald_page(
1089
984
  window, offset, self._supervisor_core_logs
1090
985
  )
1091
986
 
@@ -1094,15 +989,18 @@ class HomeAssistantClient:
1094
989
  "Fetching error log via HA Core /hassio/core/logs proxy "
1095
990
  "(supervised)"
1096
991
  )
1097
- return await self._journald_error_log_page(
1098
- window, offset, self._proxied_core_logs
1099
- )
992
+ return await journald_page(window, offset, self._proxied_core_logs)
1100
993
 
994
+ if isinstance(offset, str):
995
+ raise HomeAssistantAPIError(
996
+ "Cursor-token paging needs a Supervisor-backed install; "
997
+ "the container /api/error_log endpoint has no cursor"
998
+ )
1101
999
  logger.debug("Fetching error log via HA Core proxy (Container/pip)")
1102
1000
  raw_response = await self._raw_request(
1103
1001
  "GET", "/error_log", headers={"Accept": "text/plain"}
1104
1002
  )
1105
- return self._container_error_log_page(raw_response.text, window, offset)
1003
+ return container_page(raw_response.text, window, offset)
1106
1004
  except TimeoutError as e:
1107
1005
  raise HomeAssistantConnectionError(
1108
1006
  f"Timeout fetching the error log after {self.timeout}s: "
@@ -1309,18 +1207,6 @@ class HomeAssistantClient:
1309
1207
  HomeAssistantConnectionError: Timeout or transport error, with
1310
1208
  distinct messages so callers can tell them apart.
1311
1209
  """
1312
- token = os.environ.get("SUPERVISOR_TOKEN", "")
1313
- if not token:
1314
- # The is_running_in_addon() gate already keys off SUPERVISOR_TOKEN
1315
- # being truthy, so a direct caller landing here without one is a
1316
- # detection/config mismatch — fail-fast with a distinct message
1317
- # so operators don't read it as "token rejected".
1318
- raise HomeAssistantAuthError(
1319
- f"Supervisor token absent at call time for /{path}/logs "
1320
- "(addon-mode gate fired but SUPERVISOR_TOKEN env var not set)"
1321
- )
1322
-
1323
- relative_path = f"/{path}/logs"
1324
1210
  headers = {"Accept": "text/plain"}
1325
1211
  # Presence-triggered flag: journald output carries ANSI escapes otherwise.
1326
1212
  params: dict[str, Any] = {"no_colors": "true"}
@@ -1330,14 +1216,36 @@ class HomeAssistantClient:
1330
1216
  # An offset window with no size asked for falls back to the
1331
1217
  # smallest one the Range syntax can express.
1332
1218
  size = lines if lines is not None else MIN_LOG_WINDOW_LINES
1333
- headers["Range"] = self._journald_range_header(size, offset)
1219
+ headers["Range"] = range_header(size, offset)
1334
1220
  params.pop("lines", None)
1335
1221
  logger.debug(
1336
- "Fetching %s%s via Supervisor direct (%s)",
1222
+ "Fetching %s/%s/logs via Supervisor direct (%s)",
1337
1223
  get_supervisor_base_url(),
1338
- relative_path,
1224
+ path,
1339
1225
  f"range={headers['Range']}" if offset is not None else f"lines={lines}",
1340
1226
  )
1227
+ response = await self._supervisor_logs_response(path, headers, params)
1228
+ return response.text
1229
+
1230
+ async def _supervisor_logs_response(
1231
+ self, path: str, headers: dict[str, str], params: dict[str, Any]
1232
+ ) -> httpx.Response:
1233
+ """Send one Supervisor ``/logs`` request and map its failures.
1234
+
1235
+ Split from ``_supervisor_logs_get`` so the error-log route can read
1236
+ Supervisor's ``X-First-Cursor`` while plain-text callers keep the body.
1237
+ """
1238
+ token = os.environ.get("SUPERVISOR_TOKEN", "")
1239
+ if not token:
1240
+ # The is_running_in_addon() gate already keys off SUPERVISOR_TOKEN
1241
+ # being truthy, so a direct caller landing here without one is a
1242
+ # detection/config mismatch — fail-fast with a distinct message
1243
+ # so operators don't read it as "token rejected".
1244
+ raise HomeAssistantAuthError(
1245
+ f"Supervisor token absent at call time for /{path}/logs "
1246
+ "(addon-mode gate fired but SUPERVISOR_TOKEN env var not set)"
1247
+ )
1248
+ relative_path = f"/{path}/logs"
1341
1249
 
1342
1250
  try:
1343
1251
  async with asyncio.timeout(self.timeout):
@@ -1393,7 +1301,7 @@ class HomeAssistantClient:
1393
1301
  status_code=response.status_code,
1394
1302
  response_data={"message": text_body, "path": path},
1395
1303
  )
1396
- return response.text
1304
+ return response
1397
1305
 
1398
1306
  async def _get_addon_logs_via_supervisor(
1399
1307
  self, slug: str, lines: int | None = None
@@ -167,6 +167,16 @@ def set_embedded_connection(
167
167
  _apply_embedded_connection(_settings)
168
168
 
169
169
 
170
+ def is_embedded_mode() -> bool:
171
+ """True when ha-mcp runs in-process inside Home Assistant.
172
+
173
+ Set by the custom component's in-process server entry via
174
+ ``set_embedded_connection``; false for the CLI, the HTTP launchers and the
175
+ app (add-on) build.
176
+ """
177
+ return bool(_EMBEDDED_CONNECTION)
178
+
179
+
170
180
  def get_embedded_config_dir() -> str | None:
171
181
  """Home Assistant's configuration directory, when running embedded.
172
182
 
@@ -159,6 +159,36 @@ def _add_filter_once(logger_name: str, filter_cls: type[logging.Filter]) -> None
159
159
  logger.addFilter(filter_cls())
160
160
 
161
161
 
162
+ def route_fastmcp_logs_to_root() -> None:
163
+ """Hand FastMCP's own log records to the embedding application.
164
+
165
+ The vendored FastMCP configures the ``fastmcp`` logger at import time with
166
+ ``propagate = False`` and a RichHandler of its own. In the in-process
167
+ embedded server that means its records bypass Home Assistant's logging:
168
+ they reach Core's stream without HA's header, never reach ``system_log``,
169
+ and error-log record grouping reads them as continuation lines of whatever
170
+ record preceded them. Clearing the handlers and letting the logger
171
+ propagate gives HA's handler the record, so it is formatted, level-gated
172
+ and grouped like any other Core record.
173
+
174
+ The import-time INFO level is dropped too (``NOTSET``), so ``fastmcp``
175
+ follows Home Assistant's default level and honours ``logger.set_level``
176
+ (or a ``logger:`` entry) for it like any integration's logger. Leaving it
177
+ at INFO would let FastMCP records through at a level HA was told to hide;
178
+ a threshold filter on Core's handlers would instead override the user's
179
+ own level for ``fastmcp`` and would stay attached to Core's handlers after
180
+ the embedded entry unloads.
181
+
182
+ Only the embedded server calls this. The CLI and the app launchers own
183
+ their stdout/stderr and must keep FastMCP's own handler.
184
+ """
185
+ logger = logging.getLogger("fastmcp")
186
+ for handler in list(logger.handlers):
187
+ logger.removeHandler(handler)
188
+ logger.propagate = True
189
+ logger.setLevel(logging.NOTSET)
190
+
191
+
162
192
  def install_sdk_log_filters() -> None:
163
193
  """Attach the suppression/demotion filters above to their MCP SDK loggers.
164
194
 
@@ -170,3 +200,10 @@ def install_sdk_log_filters() -> None:
170
200
  """
171
201
  _add_filter_once("mcp.server.streamable_http", StatelessSessionLogFilter)
172
202
  _add_filter_once("mcp.server.streamable_http_manager", SessionDisconnectLogFilter)
203
+ # Embedded-only: give FastMCP's own records to Home Assistant's logging so
204
+ # they carry HA's header, respect HA's levels and reach system_log. The CLI
205
+ # and app launchers own their output and keep FastMCP's handler.
206
+ from .config import is_embedded_mode
207
+
208
+ if is_embedded_mode():
209
+ route_fastmcp_logs_to_root()