ha-mcp-dev 9.1.0.dev3303__tar.gz → 9.1.0.dev3311__tar.gz

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