ha-mcp-dev 9.0.0.dev3182__tar.gz → 9.0.0.dev3184__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 (808) hide show
  1. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/PKG-INFO +1 -1
  2. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/pyproject.toml +1 -1
  3. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/pyproject.toml.orig +1 -1
  4. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_diff.py +12 -9
  5. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config_meta.py +1 -0
  6. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config_settings.py +15 -0
  7. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/redaction.py +209 -31
  8. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/en.json +3 -1
  9. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings.css +14 -7
  10. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +33 -37
  11. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_addons.py +10 -36
  12. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/LICENSE +0 -0
  13. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/README.md +0 -0
  14. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/__init__.py +0 -0
  15. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/__main__.py +0 -0
  16. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_pypi_marker +0 -0
  17. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_rich_compat.py +0 -0
  18. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/__init__.py +0 -0
  19. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  20. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  21. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  22. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  23. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  24. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  25. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  26. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  27. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  28. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  29. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  30. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  31. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  32. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  33. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  34. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  35. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  36. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  37. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  38. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  39. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  40. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  41. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  42. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  43. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  44. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  45. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  46. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  47. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  48. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  49. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  50. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  51. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  52. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  53. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  54. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  55. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  56. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  57. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  58. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  59. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  60. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  61. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  62. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  63. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  64. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  65. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  66. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  67. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  68. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  69. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  70. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  71. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  72. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  73. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  74. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  75. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  76. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  77. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  78. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  79. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  80. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
  81. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  82. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  83. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  84. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  85. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  86. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  87. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  88. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  89. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  90. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  91. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  92. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  93. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  94. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  95. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  96. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  97. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  98. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  99. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  100. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  101. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  102. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  103. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  104. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  105. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  106. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  107. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  108. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  109. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  110. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  111. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  112. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  113. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  114. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  115. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  116. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  117. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  118. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  119. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  120. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  121. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  122. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  123. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  124. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  125. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  126. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  127. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  128. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  129. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  130. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  131. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  132. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  133. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  134. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  135. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  136. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  137. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  138. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  139. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  140. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  141. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  142. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  143. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  144. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  145. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  146. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  147. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  148. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  149. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  150. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  151. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  152. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  153. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  154. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  155. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  156. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  157. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  158. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  159. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  160. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  161. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  162. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  163. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  164. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  165. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  166. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  167. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  168. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  169. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  170. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  171. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  172. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  173. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  174. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  175. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  176. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  177. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  178. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  179. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  180. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  181. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  182. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  183. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  184. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  185. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  186. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  187. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  188. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  189. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  190. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  191. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  192. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  193. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  194. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  195. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  196. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  197. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  198. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  199. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  200. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  201. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  202. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  203. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  204. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  205. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  206. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  207. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  208. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  209. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  210. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  211. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  212. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  213. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  214. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  215. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  216. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  217. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  218. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  219. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  220. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  221. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  222. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  223. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  224. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  225. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  226. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  227. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  228. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  229. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  230. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  231. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  232. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  233. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  234. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  235. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  236. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  237. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  238. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  239. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  240. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
  241. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
  242. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
  243. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
  244. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
  245. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
  246. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
  247. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
  248. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  249. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  250. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  251. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  252. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  253. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  254. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  255. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  256. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  257. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  258. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  259. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  260. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  261. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  262. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  263. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  264. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  265. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  266. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  267. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  268. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  269. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  270. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  271. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  272. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  273. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  274. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  275. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  276. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  277. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  278. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  279. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  280. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  281. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  282. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  283. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  284. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  285. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  286. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  287. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  288. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  289. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  290. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  291. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  292. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  293. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  294. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  295. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  296. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  297. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  298. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  299. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  300. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  301. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  302. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  303. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  304. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  305. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  306. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  307. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  308. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  309. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  310. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  311. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  312. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  313. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  314. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  315. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  316. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  317. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  318. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  319. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  320. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  321. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  322. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  323. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  324. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  325. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  326. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  327. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  328. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  329. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  330. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  331. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  332. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  333. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  334. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  335. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  336. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  337. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  338. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  339. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  340. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  341. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  342. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  343. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  344. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  345. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  346. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  347. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  348. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  349. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  350. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  351. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  352. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  353. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  354. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  355. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  356. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  357. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  358. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  359. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  360. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  361. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  362. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  363. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  364. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  365. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  366. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  367. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  368. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  369. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  370. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  371. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  372. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  373. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  374. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  375. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  376. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  377. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  378. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  379. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  380. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  381. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  382. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  383. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  384. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  385. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  386. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  387. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  388. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  389. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  390. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  391. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  392. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  393. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  394. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  395. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  396. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  397. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  398. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  399. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  400. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  401. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  402. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  403. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  404. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  405. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  406. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  407. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  408. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  409. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  410. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  411. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  412. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  413. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  414. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  415. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  416. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  417. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  418. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  419. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  420. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  421. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  422. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  423. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  424. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  425. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  426. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  427. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  428. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  429. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  430. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  431. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  432. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  433. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  434. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  435. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  436. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  437. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  438. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  439. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  440. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  441. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  442. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/requirements.txt +0 -0
  443. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  444. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  445. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  446. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  447. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  448. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  449. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  450. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  451. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  452. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  453. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  454. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  455. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  456. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  457. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  458. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  459. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  460. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  461. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  462. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  463. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  464. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  465. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  466. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  467. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  468. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  469. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  470. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  471. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  472. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  473. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  474. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  475. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  476. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  477. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  478. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  479. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  480. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  481. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  482. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  483. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  484. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  485. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  486. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  487. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  488. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  489. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  490. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  491. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  492. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  493. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  494. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  495. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  496. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  497. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  498. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  499. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/_version.py +0 -0
  500. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/app_discovery.py +0 -0
  501. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/auth/__init__.py +0 -0
  502. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/auth/consent_form.py +0 -0
  503. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/auth/iss_stamp.py +0 -0
  504. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/auth/oidc_compat.py +0 -0
  505. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/auth/provider.py +0 -0
  506. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_dashboards.py +0 -0
  507. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_entity_ids.py +0 -0
  508. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_helper_target.py +0 -0
  509. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_integrations.py +0 -0
  510. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_manager.py +0 -0
  511. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_tags.py +0 -0
  512. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/backup_zones.py +0 -0
  513. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/browser_landing.py +0 -0
  514. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/__init__.py +0 -0
  515. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/admin_routes.py +0 -0
  516. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/error_log_journald.py +0 -0
  517. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/models.py +0 -0
  518. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/rest_client.py +0 -0
  519. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/supervisor_client.py +0 -0
  520. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/websocket_client.py +0 -0
  521. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/client/websocket_listener.py +0 -0
  522. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config.py +0 -0
  523. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config_backup.py +0 -0
  524. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config_overrides.py +0 -0
  525. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/config_registry.py +0 -0
  526. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  527. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  528. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  529. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  530. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  531. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  532. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/errors.py +0 -0
  533. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/ha_request_queue.py +0 -0
  534. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  535. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/http_transport.py +0 -0
  536. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/image_info.py +0 -0
  537. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/llm_exposure.py +0 -0
  538. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/log_filters.py +0 -0
  539. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/__init__.py +0 -0
  540. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/approval_queue.py +0 -0
  541. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/decision_pin.py +0 -0
  542. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/decisions.py +0 -0
  543. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/editing.py +0 -0
  544. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/evaluator.py +0 -0
  545. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/events.py +0 -0
  546. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/handlers.py +0 -0
  547. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/middleware.py +0 -0
  548. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/model.py +0 -0
  549. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/mrtr.py +0 -0
  550. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/persistence.py +0 -0
  551. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/server_channels.py +0 -0
  552. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/policy/value_sources.py +0 -0
  553. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/py.typed +0 -0
  554. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/read_only.py +0 -0
  555. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/renamed_tools.py +0 -0
  556. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  557. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  558. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  559. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  560. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  561. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  562. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  563. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  564. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  565. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  566. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  567. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  568. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  569. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  570. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  571. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  572. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  573. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/server.py +0 -0
  574. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/server_instructions.py +0 -0
  575. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/server_lifespan.py +0 -0
  576. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/server_tool_text.py +0 -0
  577. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/__init__.py +0 -0
  578. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  579. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  580. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  581. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
  582. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  583. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  584. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  585. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  586. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  587. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  588. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  589. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_theme.py +0 -0
  590. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  591. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  592. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  593. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  594. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  595. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  596. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  597. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  598. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  599. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  600. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  601. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  602. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  603. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  604. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  605. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  606. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  607. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings.html +0 -0
  608. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  609. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  610. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  611. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  612. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  613. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  614. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  615. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  616. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
  617. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/smoke_test.py +0 -0
  618. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  619. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/strict_bps.py +0 -0
  620. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tool_dispatch.py +0 -0
  621. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/__init__.py +0 -0
  622. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
  623. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/area_messages.py +0 -0
  624. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/auto_backup.py +0 -0
  625. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/backup.py +0 -0
  626. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/backup_access.py +0 -0
  627. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  628. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  629. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/best_practice_result.py +0 -0
  630. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  631. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  632. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  633. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/blueprint_write.py +0 -0
  634. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/bug_report_config.py +0 -0
  635. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/bug_report_templates.py +0 -0
  636. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/bulk_selector.py +0 -0
  637. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/coercion.py +0 -0
  638. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_api.py +0 -0
  639. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_config_entries.py +0 -0
  640. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_config_reads.py +0 -0
  641. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  642. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_devices.py +0 -0
  643. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  644. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_registries.py +0 -0
  645. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  646. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  647. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  648. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  649. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  650. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  651. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  652. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  653. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  654. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  655. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  656. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  657. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  658. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  659. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  660. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  661. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  662. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  663. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  664. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  665. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  666. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  667. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  668. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_write_errors.py +0 -0
  669. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  670. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/core_contract.py +0 -0
  671. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  672. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  673. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  674. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/dev_backup.py +0 -0
  675. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/device_control.py +0 -0
  676. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/device_enrichment.py +0 -0
  677. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  678. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/energy_preferences.py +0 -0
  679. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  680. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/entity_registration.py +0 -0
  681. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/entity_removal.py +0 -0
  682. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  683. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  684. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  685. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/hacs_registration.py +0 -0
  686. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/helper_flows.py +0 -0
  687. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/helpers.py +0 -0
  688. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/history_response.py +0 -0
  689. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  690. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  691. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/log_common.py +0 -0
  692. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/log_sources.py +0 -0
  693. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  694. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
  695. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  696. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/__init__.py +0 -0
  697. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/base.py +0 -0
  698. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/matter.py +0 -0
  699. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/thread.py +0 -0
  700. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  701. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/zwave.py +0 -0
  702. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  703. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/recorder_errors.py +0 -0
  704. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/reference_validator.py +0 -0
  705. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/registry.py +0 -0
  706. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  707. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/response_helpers.py +0 -0
  708. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/scene_discovery.py +0 -0
  709. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/__init__.py +0 -0
  710. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/base.py +0 -0
  711. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/component.py +0 -0
  712. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/entities.py +0 -0
  713. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/legacy.py +0 -0
  714. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/modes.py +0 -0
  715. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/overview.py +0 -0
  716. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/response.py +0 -0
  717. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/search/state.py +0 -0
  718. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/server_version.py +0 -0
  719. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  720. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  721. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  722. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  723. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  724. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  725. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  726. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  727. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  728. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  729. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/statistics_calendar.py +0 -0
  730. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  731. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/statistics_resets.py +0 -0
  732. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/system_restart.py +0 -0
  733. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tool_hints.py +0 -0
  734. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  735. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_areas.py +0 -0
  736. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  737. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  738. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  739. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_calendar.py +0 -0
  740. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_camera.py +0 -0
  741. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_categories.py +0 -0
  742. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_code.py +0 -0
  743. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  744. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  745. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  746. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  747. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  748. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  749. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_dev.py +0 -0
  750. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_energy.py +0 -0
  751. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_entities.py +0 -0
  752. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  753. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_groups.py +0 -0
  754. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_hacs.py +0 -0
  755. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_history.py +0 -0
  756. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_integrations.py +0 -0
  757. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_labels.py +0 -0
  758. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_logs.py +0 -0
  759. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_radio.py +0 -0
  760. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_registry.py +0 -0
  761. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_resources.py +0 -0
  762. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_search.py +0 -0
  763. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  764. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_service.py +0 -0
  765. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_services.py +0 -0
  766. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_system.py +0 -0
  767. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_themes.py +0 -0
  768. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_todo.py +0 -0
  769. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_traces.py +0 -0
  770. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_updates.py +0 -0
  771. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_utility.py +0 -0
  772. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  773. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  774. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  775. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/tools_zones.py +0 -0
  776. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/util_helpers.py +0 -0
  777. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/validation_middleware.py +0 -0
  778. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/tools/ws_waiters.py +0 -0
  779. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/__init__.py +0 -0
  780. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/categorized_search.py +0 -0
  781. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/compact_params.py +0 -0
  782. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/component_helpers.py +0 -0
  783. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/component_search.py +0 -0
  784. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  785. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  786. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/transport_security.py +0 -0
  787. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/update_check.py +0 -0
  788. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/__init__.py +0 -0
  789. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/config_hash.py +0 -0
  790. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/config_write_lock.py +0 -0
  791. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  792. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/data_paths.py +0 -0
  793. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  794. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/domain_handlers.py +0 -0
  795. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/entity_membership.py +0 -0
  796. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  797. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  798. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  799. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/operation_manager.py +0 -0
  800. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/python_sandbox.py +0 -0
  801. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  802. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/skill_loader.py +0 -0
  803. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/utils/usage_logger.py +0 -0
  804. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/visibility/__init__.py +0 -0
  805. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/visibility/enforcement.py +0 -0
  806. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/visibility/model.py +0 -0
  807. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/visibility/persistence.py +0 -0
  808. {ha_mcp_dev-9.0.0.dev3182 → ha_mcp_dev-9.0.0.dev3184}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 9.0.0.dev3182
3
+ Version: 9.0.0.dev3184
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Keywords: mcp,home-assistant,ai,automation,smart-home
6
6
  Author: Julien
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3182"
7
+ version = "9.0.0.dev3184"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3182"
7
+ version = "9.0.0.dev3184"
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
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import difflib
10
10
  import logging
11
+ from io import StringIO
11
12
  from typing import Any, Literal, TypedDict
12
13
 
13
14
  logger = logging.getLogger(__name__)
@@ -134,15 +135,17 @@ def _build_text_diff_response(
134
135
  "unchanged": False,
135
136
  "truncated": False,
136
137
  }
137
- lines = list(
138
- difflib.unified_diff(
139
- str(current).splitlines(),
140
- stored.splitlines(),
141
- fromfile="current",
142
- tofile="snapshot",
143
- lineterm="",
144
- )
145
- )
138
+ lines: list[str] = []
139
+ # Split only at LF: Unicode separators are file content, not diff lines.
140
+ for line in difflib.unified_diff(
141
+ list(StringIO(str(current))),
142
+ list(StringIO(stored)),
143
+ fromfile="current",
144
+ tofile="snapshot",
145
+ ):
146
+ lines.append(line.removesuffix("\n"))
147
+ if not line.endswith("\n"):
148
+ lines.append("\")
146
149
  truncated = len(lines) > _MAX_DIFF_LINES
147
150
  if truncated:
148
151
  lines = lines[:_MAX_DIFF_LINES]
@@ -31,6 +31,7 @@ AdvancedSection = Literal[
31
31
  "sidecar",
32
32
  "beta_codemode",
33
33
  "beta_yamlkeys",
34
+ "redact_keys",
34
35
  "developer",
35
36
  ]
36
37
 
@@ -559,6 +559,21 @@ class Settings(BaseSettings):
559
559
  Field(False, alias="REDACT_SECRETS")
560
560
  )
561
561
 
562
+ # App option names to redact like ``format: password`` fields, for apps
563
+ # whose schema ships a secret as a plain string (#2843). Format: see
564
+ # ``redaction._listed_entries``. Consulted only while ``redact_secrets``
565
+ # is on; the UI nests it under that toggle. Restart-required because the
566
+ # app reads its options only at start, though other installs apply it live.
567
+ redact_app_option_keys: Annotated[
568
+ str,
569
+ Setting(
570
+ surface="advanced",
571
+ section="redact_keys",
572
+ app=_ALL_FLAVORS,
573
+ restart_required=True,
574
+ ),
575
+ ] = Field("", alias="REDACT_APP_OPTION_KEYS")
576
+
562
577
  # Mandatory best-practice skills — server-side master switch for the
563
578
  # write-tool skill_content delivery feature (issue #1182). When True
564
579
  # (default), the six write tools (automations / scripts / scenes /
@@ -8,12 +8,14 @@ surfaces stop returning operator secrets verbatim:
8
8
  proxy-mode 403 hints): every ``options`` value whose Supervisor-serialized
9
9
  ``schema`` entry carries ``format: "password"`` is replaced with a
10
10
  set/empty sentinel. The schema is authoritative — keys without a schema
11
- entry are never touched, and no name-based guessing happens.
11
+ entry are never touched, and option names are never guessed at. The only
12
+ name-based match is the operator's own ``redact_app_option_keys`` list;
13
+ listed options and PEM private-key values are treated as password fields.
12
14
  2. **Integration options** (``ha_get_integration``): fields the
13
15
  options-flow schema marks with a password text selector are replaced the
14
16
  same way, on both the harvested options and the ``include_schema=True``
15
17
  schema echo (whose ``suggested_value`` carries the live value).
16
- 3. **Every other tool response**: password values seen while serving 1 and 2
18
+ 3. **Every other tool response**: secret values seen while serving 1 and 2
17
19
  are remembered in a process-local known-secrets set, and
18
20
  :class:`RedactSecretsMiddleware` (registered just outside the
19
21
  entity-visibility outbound scan, which stays innermost) scrubs any
@@ -162,63 +164,239 @@ def _iter_schema_entries(schema: Any) -> Iterable[dict[str, Any]]:
162
164
  yield entry
163
165
 
164
166
 
165
- def redact_addon_options(options: Any, schema: Any) -> Any:
166
- """Copy of ``options`` with ``format: password`` values sentinel-replaced.
167
+ def _listed_entries() -> list[tuple[str, str]]:
168
+ """``(scope, name)`` pairs from ``redact_app_option_keys`` (#2843).
167
169
 
168
- Walks nested option groups recursively (a group's value may be a dict or,
169
- with ``multiple``, a list of dicts). Keys without a schema entry pass
170
- through untouched. Non-dict ``options`` are returned as-is.
170
+ Entries are separated by commas or newlines. ``name`` applies to every
171
+ app (scope ``""``); ``<slug>:<name>`` to one app.
171
172
  """
173
+ entries: list[tuple[str, str]] = []
174
+ for entry in re.split(r"[,\n]", get_global_settings().redact_app_option_keys):
175
+ scope, _sep, name = (part.strip() for part in entry.rpartition(":"))
176
+ if name:
177
+ entries.append((scope, name))
178
+ return entries
179
+
180
+
181
+ def _scope_matches(scope: str, slug: str) -> bool:
182
+ # A store app's slug carries its repository's prefix (``cebe7a76_...``,
183
+ # ``core_...``), which the app's own docs and repository leave out, so
184
+ # the unprefixed slug names the app too.
185
+ return scope == slug or scope == slug.partition("_")[2]
186
+
187
+
188
+ def _operator_listed_option_keys(slug: str) -> frozenset[str]:
189
+ return frozenset(
190
+ name
191
+ for scope, name in _listed_entries()
192
+ if not scope or _scope_matches(scope, slug)
193
+ )
194
+
195
+
196
+ def _schema_names(schema: Any) -> set[str]:
197
+ names: set[str] = set()
198
+ for entry in _iter_schema_entries(schema):
199
+ names.add(entry["name"])
200
+ names |= _schema_names(entry.get("schema"))
201
+ return names
202
+
203
+
204
+ def _option_names(options: Any) -> set[str]:
205
+ names: set[str] = set()
206
+ items = options if isinstance(options, list) else [options]
207
+ for item in items:
208
+ if isinstance(item, dict):
209
+ for name, value in item.items():
210
+ names.add(name)
211
+ names |= _option_names(value)
212
+ return names
213
+
214
+
215
+ def _is_secret_option(
216
+ entry: dict[str, Any], value: Any, listed: frozenset[str]
217
+ ) -> bool:
218
+ return (
219
+ entry.get("format") == "password"
220
+ or entry["name"] in listed
221
+ or contains_pem_private_key(value)
222
+ )
223
+
224
+
225
+ def redact_addon_info(
226
+ addon: dict[str, Any], slug: str
227
+ ) -> tuple[dict[str, Any], list[str]]:
228
+ """Redacted copy of a Supervisor ``/addons/<slug>/info`` result, and warnings.
229
+
230
+ Registers the app's secret values for the known-value scrub. Without a
231
+ readable schema the password fields cannot be told apart, so every option
232
+ value is redacted, like the integration surface does.
233
+ """
234
+ options = addon.get("options")
235
+ schema = addon.get("schema")
236
+ if not isinstance(options, dict) or not options:
237
+ return addon, []
238
+ listed = _operator_listed_option_keys(slug)
239
+ if not isinstance(schema, list) or not schema:
240
+ # Every value is masked here, but only listed ones are known secrets
241
+ # worth scrubbing from other responses.
242
+ register_known_secret_values(_collect_stored(options, listed, False))
243
+ redacted = {key: sentinel_replacement(value) for key, value in options.items()}
244
+ return {**addon, "options": redacted}, [
245
+ f"redact_secrets: no options schema readable for '{slug}' — "
246
+ "every option value was redacted conservatively (the "
247
+ "password fields cannot be told apart without the schema)"
248
+ ]
249
+ register_known_secret_values(_collect_addon_secret_values(options, schema, listed))
250
+ unknown = sorted(
251
+ {
252
+ name
253
+ for scope, name in _listed_entries()
254
+ if scope and _scope_matches(scope, slug)
255
+ }
256
+ - _schema_names(schema)
257
+ - _option_names(options)
258
+ )
259
+ warnings = (
260
+ [
261
+ f"redact_app_option_keys names {', '.join(unknown)} for '{slug}', "
262
+ "but this app has no such option, so nothing was redacted for them"
263
+ ]
264
+ if unknown
265
+ else []
266
+ )
267
+ redacted = _redact_addon_options(options, schema, listed)
268
+ return {**addon, "options": redacted}, warnings
269
+
270
+
271
+ def redact_addon_options(options: Any, schema: Any, slug: str) -> Any:
272
+ """Copy of ``options`` with secret values sentinel-replaced.
273
+
274
+ A value is secret when its schema entry carries ``format: password``, its
275
+ name (or the name of a group containing it) is listed for ``slug`` in
276
+ ``redact_app_option_keys``, or it holds a PEM private key. Listed names
277
+ are also redacted in values Supervisor kept after an app update dropped
278
+ the option or changed it between a group and a plain field, keeping the
279
+ stored shape around them. Walks nested option groups recursively (a
280
+ group's value may be a dict or, with ``multiple``, a list of dicts).
281
+ Other keys without a schema entry pass through untouched. Non-dict
282
+ ``options`` are returned as-is.
283
+ """
284
+ return _redact_addon_options(options, schema, _operator_listed_option_keys(slug))
285
+
286
+
287
+ def _redact_addon_options(
288
+ options: Any, schema: Any, listed: frozenset[str], whole: bool = False
289
+ ) -> Any:
290
+ """``whole``: the options sit inside a listed group, so all are secret."""
172
291
  if not isinstance(options, dict):
173
292
  return options
174
293
  out = dict(options)
294
+ known: set[str] = set()
175
295
  for entry in _iter_schema_entries(schema):
176
296
  name = entry["name"]
297
+ known.add(name)
177
298
  if name not in out:
178
299
  continue
179
300
  value = out[name]
180
301
  nested = entry.get("schema")
302
+ secret = whole or name in listed
303
+ # A manual app update can turn a field into a group or back without
304
+ # Supervisor converting the stored value, so a mismatched value is
305
+ # walked like a stored option the schema no longer describes.
181
306
  if isinstance(nested, list):
182
- if isinstance(value, dict):
183
- out[name] = redact_addon_options(value, nested)
184
- elif isinstance(value, list):
185
- out[name] = [
186
- redact_addon_options(item, nested)
187
- if isinstance(item, dict)
188
- else item
189
- for item in value
190
- ]
191
- continue
192
- if entry.get("format") == "password" or contains_pem_private_key(value):
307
+ out[name] = _redact_group(value, nested, listed, secret)
308
+ elif secret or _is_secret_option(entry, value, listed):
193
309
  # multiple: true passwords are a list — sentinel_replacement
194
310
  # keeps the container shape so the option's type survives.
195
311
  out[name] = sentinel_replacement(value)
312
+ elif isinstance(value, (dict, list)):
313
+ out[name] = _redact_stored(value, listed, False)
314
+ for name in out.keys() - known:
315
+ out[name] = _redact_stored(out[name], listed, whole or name in listed)
196
316
  return out
197
317
 
198
318
 
199
- def collect_addon_secret_values(options: Any, schema: Any) -> set[str]:
200
- """Live ``format: password`` option values, for the known-value scrub."""
319
+ def _redact_group(
320
+ value: Any, schema: list[Any], listed: frozenset[str], secret: bool
321
+ ) -> Any:
322
+ if isinstance(value, dict):
323
+ return _redact_addon_options(value, schema, listed, secret)
324
+ if isinstance(value, list):
325
+ return [
326
+ _redact_addon_options(item, schema, listed, secret)
327
+ if isinstance(item, dict)
328
+ else _redact_stored(item, listed, secret)
329
+ for item in value
330
+ ]
331
+ return value if value is None else _redact_stored(value, listed, secret)
332
+
333
+
334
+ def _redact_stored(value: Any, listed: frozenset[str], secret: bool) -> Any:
335
+ """Redact a stored option the schema no longer describes.
336
+
337
+ Supervisor keeps an option's saved value after an app update drops it
338
+ from the schema or changes its type, so a listed secret can outlive its
339
+ schema entry. Only the listed names can be matched here; the shape is
340
+ kept.
341
+ """
342
+ if isinstance(value, dict):
343
+ return {
344
+ key: _redact_stored(item, listed, secret or key in listed)
345
+ for key, item in value.items()
346
+ }
347
+ if isinstance(value, list):
348
+ return [_redact_stored(item, listed, secret) for item in value]
349
+ return sentinel_replacement(value) if secret else value
350
+
351
+
352
+ def collect_addon_secret_values(options: Any, schema: Any, slug: str) -> set[str]:
353
+ """Live secret option values (see ``redact_addon_options``), for the scrub."""
354
+ return _collect_addon_secret_values(
355
+ options, schema, _operator_listed_option_keys(slug)
356
+ )
357
+
358
+
359
+ def _collect_addon_secret_values(
360
+ options: Any, schema: Any, listed: frozenset[str], whole: bool = False
361
+ ) -> set[str]:
201
362
  values: set[str] = set()
202
363
  if not isinstance(options, dict):
203
364
  return values
365
+ known: set[str] = set()
204
366
  for entry in _iter_schema_entries(schema):
205
- value = options.get(entry["name"])
367
+ name = entry["name"]
368
+ known.add(name)
369
+ value = options.get(name)
206
370
  nested = entry.get("schema")
371
+ secret = whole or name in listed
207
372
  if isinstance(nested, list):
208
- if isinstance(value, dict):
209
- values |= collect_addon_secret_values(value, nested)
210
- elif isinstance(value, list):
211
- for item in value:
212
- if isinstance(item, dict):
213
- values |= collect_addon_secret_values(item, nested)
373
+ items = value if isinstance(value, list) else [value]
374
+ for item in items:
375
+ if isinstance(item, dict):
376
+ values |= _collect_addon_secret_values(item, nested, listed, secret)
377
+ else:
378
+ values |= _collect_stored(item, listed, secret)
214
379
  continue
215
- if entry.get("format") == "password" or contains_pem_private_key(value):
216
- candidates = value if isinstance(value, list) else [value]
217
- for candidate in candidates:
218
- values |= known_values_for_option_item(candidate)
380
+ values |= _collect_stored(
381
+ value, listed, secret or _is_secret_option(entry, value, listed)
382
+ )
383
+ for name in options.keys() - known:
384
+ values |= _collect_stored(options[name], listed, whole or name in listed)
219
385
  return values
220
386
 
221
387
 
388
+ def _collect_stored(value: Any, listed: frozenset[str], secret: bool) -> set[str]:
389
+ """Known-value strings of a stored option (see ``_redact_stored``)."""
390
+ if isinstance(value, dict):
391
+ values: set[str] = set()
392
+ for key, item in value.items():
393
+ values |= _collect_stored(item, listed, secret or key in listed)
394
+ return values
395
+ if isinstance(value, list):
396
+ return set().union(*(_collect_stored(item, listed, secret) for item in value))
397
+ return known_values_for_option_item(value) if secret else set()
398
+
399
+
222
400
  def sentinel_option_keys(options: Any, _prefix: str = "") -> list[str]:
223
401
  """Dotted paths of submitted option values that equal a redaction sentinel.
224
402
 
@@ -138,7 +138,7 @@
138
138
  "features.read_only_mode.label": "Read Only Mode",
139
139
  "features.read_only_mode.help": "Toggles all write tools off, and removes ability for tools to make any write or destructive calls. Mixed read/write tools — backups, Apps (add-ons), energy preferences, voice pipelines, and code mode when enabled — stay available with their write operations blocked. Same toggle as the web UI Tools tab. Off by default. Requires restart to take effect.",
140
140
  "features.redact_secrets.label": "Redact Secrets",
141
- "features.redact_secrets.help": "Redacts secrets from tool responses before they reach the AI assistant. App (add-on) options and integration fields marked as passwords are replaced with a set/empty marker (so \"is this credential configured?\" stays answerable), and other tool responses are scrubbed of secret values the server has already seen (values shorter than 6 characters are skipped, since replacing tiny fragments would corrupt unrelated output). Fields not marked as passwords by their schema cannot be detected. Off by default.",
141
+ "features.redact_secrets.help": "Redacts secrets from tool responses before they reach the AI assistant. App (add-on) options and integration fields marked as passwords are replaced with a set/empty marker (so \"is this credential configured?\" stays answerable), and other tool responses are scrubbed of secret values the server has already seen (values shorter than 6 characters are skipped, since replacing tiny fragments would corrupt unrelated output). Other fields are not detected, except private keys in app options and the app option names listed below. Off by default.",
142
142
  "features.enable_mandatory_bps.label": "Attach best-practice skills on writes",
143
143
  "features.enable_mandatory_bps.help": "Master switch for the write-tool skill content delivery feature (issue #1182). When enabled (default), the six config write tools (automations, scripts, scenes, helpers, dashboards, raw YAML) attach the canonical Home Assistant best-practice reference files under `skill_content` on every successful write, plus auto-embed any reference sections cited by best-practice warnings. Each tool also exposes a per-call `MandatoryBPS` parameter the agent can set to false on subsequent calls once it has the content. When this master switch is off, NO skill_content goes out regardless of the per-call parameter or BP warnings. Recommended ON as the first choice; disable only for models with very small context windows. Turning this off may degrade write accuracy. Requires restart to take effect.",
144
144
  "features.enable_strict_mandatory_bps.label": "Strict best-practices mode",
@@ -516,6 +516,8 @@
516
516
  "advanced.code_mode_saved_tools_path.help": "JSON file used to persist custom tools across restarts.",
517
517
  "advanced.extra_yaml_write_keys.label": "Extra YAML write keys",
518
518
  "advanced.extra_yaml_write_keys.help": "Extra top-level keys ha_config_set_yaml may write in addition to the built-in ones, for YAML-first integrations on this install (e.g. alert2). Enter one key per line or separate keys with commas. Keys that redefine Home Assistant's own trust boundary can never be added and are ignored. Requires custom component 1.2.4 or newer.",
519
+ "advanced.redact_app_option_keys.label": "Extra app option keys to redact",
520
+ "advanced.redact_app_option_keys.help": "App (add-on) option names to redact like password fields, for apps whose schema stores a secret as plain text (for example backup_password). Separate names with commas or new lines. A name applies to every app; write app_slug:name to limit it to one app. Naming an option group covers every option in it. Used only while Redact Secrets is on. Empty by default.",
519
521
  "advanced.sidecar_pin_port.label": "Settings UI sidecar port",
520
522
  "advanced.sidecar_pin_port.help": "0 picks a free port on first start and keeps it for later restarts; a port in the range pins a preferred port (falls back to a free one if taken).",
521
523
  "advanced.enable_dev_mode.label": "Developer mode",
@@ -511,28 +511,35 @@
511
511
  .feature-row.beta-sub,
512
512
  .feature-row.codemode-sub,
513
513
  .feature-row.yaml-packages-sub,
514
- .feature-row.mandatory-bps-sub { position: relative; }
514
+ .feature-row.mandatory-bps-sub,
515
+ .feature-row.redact-sub { position: relative; }
515
516
  .feature-row.beta-sub::before,
516
517
  .feature-row.codemode-sub::before,
517
518
  .feature-row.yaml-packages-sub::before,
518
- .feature-row.mandatory-bps-sub::before {
519
+ .feature-row.mandatory-bps-sub::before,
520
+ .feature-row.redact-sub::before {
519
521
  content: ""; position: absolute; top: 0; bottom: 0; width: 2px; background: var(--border);
520
522
  }
521
523
  .feature-row.beta-sub.dimmed,
522
524
  .feature-row.codemode-sub.dimmed,
523
525
  .feature-row.yaml-packages-sub.dimmed,
524
- .feature-row.mandatory-bps-sub.dimmed { opacity: 0.38; }
526
+ .feature-row.mandatory-bps-sub.dimmed,
527
+ .feature-row.redact-sub.dimmed { opacity: 0.38; }
525
528
  .feature-row.beta-sub.dimmed input,
526
529
  .feature-row.codemode-sub.dimmed input,
527
530
  .feature-row.yaml-packages-sub.dimmed input,
528
- .feature-row.mandatory-bps-sub.dimmed input { cursor: not-allowed; }
531
+ .feature-row.mandatory-bps-sub.dimmed input,
532
+ .feature-row.redact-sub.dimmed input { cursor: not-allowed; }
529
533
 
530
534
  /* Depth 1 — nested directly under a top-level toggle (beta-sub under the
531
- master; strict-mode under the non-beta enable_mandatory_bps row). */
535
+ master; strict-mode under the non-beta enable_mandatory_bps row; extra
536
+ redacted app option keys under redact_secrets). */
532
537
  .feature-row.beta-sub,
533
- .feature-row.mandatory-bps-sub { padding-left: 32px; }
538
+ .feature-row.mandatory-bps-sub,
539
+ .feature-row.redact-sub { padding-left: 32px; }
534
540
  .feature-row.beta-sub::before,
535
- .feature-row.mandatory-bps-sub::before { left: 12px; }
541
+ .feature-row.mandatory-bps-sub::before,
542
+ .feature-row.redact-sub::before { left: 12px; }
536
543
 
537
544
  /* Depth 2 — nested under a beta-sub parent (yaml packages under
538
545
  enable_yaml_config_editing; code-mode numerics under enable_code_mode). */
@@ -25,7 +25,7 @@ const FEATURE_META = {
25
25
  },
26
26
  redact_secrets: {
27
27
  label: "Redact Secrets",
28
- help: "Redacts secrets from tool responses before they reach the AI assistant. App (add-on) options and integration fields marked as passwords are replaced with a set/empty marker (so \"is this credential configured?\" stays answerable), and other tool responses are scrubbed of secret values the server has already seen (values shorter than 6 characters are skipped, since replacing tiny fragments would corrupt unrelated output). Fields not marked as passwords by their schema cannot be detected. Off by default.",
28
+ help: "Redacts secrets from tool responses before they reach the AI assistant. App (add-on) options and integration fields marked as passwords are replaced with a set/empty marker (so \"is this credential configured?\" stays answerable), and other tool responses are scrubbed of secret values the server has already seen (values shorter than 6 characters are skipped, since replacing tiny fragments would corrupt unrelated output). Other fields are not detected, except private keys in app options and the app option names listed below. Off by default.",
29
29
  },
30
30
  enable_mandatory_bps: {
31
31
  label: "Attach best-practice skills on writes",
@@ -107,6 +107,18 @@ const MANDATORY_BPS_SUB_FLAGS = [
107
107
  'enable_strict_mandatory_bps',
108
108
  ];
109
109
 
110
+ // Non-master toggles with rows nested under them; flipping one re-renders
111
+ // the panel so those rows dim or undim at once.
112
+ const PARENTS_WITH_SUB_ROWS = new Set([
113
+ 'enable_yaml_config_editing',
114
+ 'enable_mandatory_bps',
115
+ 'redact_secrets',
116
+ ]);
117
+
118
+ // Advanced text settings edited as a one-per-line list and saved
119
+ // comma-joined.
120
+ const LIST_EDITOR_FIELDS = new Set(['extra_yaml_write_keys', 'redact_app_option_keys']);
121
+
110
122
  // Cached add-on flag. Each settings endpoint (/api/settings/features,
111
123
  // /api/settings/advanced, /api/settings/backup-config) returns
112
124
  // ``is_addon`` so the env-locked banner copy can adapt — the addon
@@ -284,40 +296,18 @@ function renderFeatureFlags(flags) {
284
296
  // master off then back on restores the user's prior sub-flag
285
297
  // selections automatically, which is the intended UX for an
286
298
  // opt-in beta surface.
287
- if (isMaster) {
288
- if (_lastFeatureFlags[fieldName]) {
289
- _lastFeatureFlags[fieldName] = {
290
- ..._lastFeatureFlags[fieldName],
291
- value: input.checked,
292
- };
293
- renderFeatureFlags(_lastFeatureFlags);
294
- }
295
- }
296
- // Re-render on enable_yaml_config_editing flip so the 3
297
- // packages sub-rows dim/undim immediately. Same pattern as the
298
- // master flip above — value is mutated in the live cache and
299
- // the panel re-renders synchronously while the save POST runs
300
- // in the background.
301
- if (fieldName === 'enable_yaml_config_editing') {
302
- if (_lastFeatureFlags[fieldName]) {
303
- _lastFeatureFlags[fieldName] = {
304
- ..._lastFeatureFlags[fieldName],
305
- value: input.checked,
306
- };
307
- renderFeatureFlags(_lastFeatureFlags);
308
- }
309
- }
310
- // Re-render on enable_mandatory_bps flip so the strict-mode
311
- // sub-row dims/undims immediately. Same live-cache pattern as
312
- // the master and yaml-config flips above.
313
- if (fieldName === 'enable_mandatory_bps') {
314
- if (_lastFeatureFlags[fieldName]) {
315
- _lastFeatureFlags[fieldName] = {
316
- ..._lastFeatureFlags[fieldName],
317
- value: input.checked,
318
- };
319
- renderFeatureFlags(_lastFeatureFlags);
320
- }
299
+ //
300
+ // The other parents with nested rows re-render the same way, so
301
+ // their sub-rows dim/undim immediately.
302
+ if (
303
+ (isMaster || PARENTS_WITH_SUB_ROWS.has(fieldName)) &&
304
+ _lastFeatureFlags[fieldName]
305
+ ) {
306
+ _lastFeatureFlags[fieldName] = {
307
+ ..._lastFeatureFlags[fieldName],
308
+ value: input.checked,
309
+ };
310
+ renderFeatureFlags(_lastFeatureFlags);
321
311
  }
322
312
  saveFeatureFlag(fieldName, input.checked);
323
313
  });
@@ -385,6 +375,11 @@ function renderFeatureFlags(flags) {
385
375
  lockedByGate: !parentOn,
386
376
  });
387
377
  }
378
+ // Extra app option keys to redact (#2843), nested under redact_secrets
379
+ // and dimmed while it is off.
380
+ if (fieldName === 'redact_secrets') {
381
+ renderAdvancedSubRows(targetBody, 'redact_keys', 'redact-sub', !f.value);
382
+ }
388
383
  // After the enable_filesystem_tools row, inject the custom-directories
389
384
  // editor (issue #1567). Dimmed when either the master beta is off or
390
385
  // filesystem tools itself is off. The list is component-owned and fetched
@@ -473,7 +468,8 @@ function renderSubFlagRows(flags, parentEl, subFieldNames, { cssClass, lockedByG
473
468
 
474
469
  // Shared renderer for non-bool sub-rows that live in ADVANCED_SETTINGS_FIELDS
475
470
  // but render nested under a feature toggle (code-mode numerics under
476
- // enable_code_mode, extra YAML write keys under enable_yaml_config_editing).
471
+ // enable_code_mode, extra YAML write keys under enable_yaml_config_editing,
472
+ // extra redacted app option keys under redact_secrets).
477
473
  // They save through commitAdvancedEdit rather than saveFeatureFlag, which is
478
474
  // why renderSubFlagRows (checkbox-only) cannot serve them.
479
475
  function renderAdvancedSubRows(parentEl, section, cssClass, lockedByGate) {
@@ -482,7 +478,7 @@ function renderAdvancedSubRows(parentEl, section, cssClass, lockedByGate) {
482
478
  const meta = localizeMeta('advanced', f.field, {});
483
479
  const row = document.createElement('div');
484
480
  row.className = 'feature-row ' + cssClass + (lockedByGate ? ' dimmed' : '');
485
- const multiline = f.field === 'extra_yaml_write_keys';
481
+ const multiline = LIST_EDITOR_FIELDS.has(f.field);
486
482
  if (multiline) row.classList.add('list-editor');
487
483
 
488
484
  const info = document.createElement('div');
@@ -42,11 +42,10 @@ from ..errors import (
42
42
  )
43
43
  from ..redaction import (
44
44
  collect_addon_secret_values,
45
- redact_addon_options,
45
+ redact_addon_info,
46
46
  redaction_enabled,
47
47
  register_known_secret_values,
48
48
  sentinel_option_keys,
49
- sentinel_replacement,
50
49
  )
51
50
  from ..utils.python_sandbox import (
52
51
  PythonSandboxError,
@@ -997,34 +996,9 @@ async def get_addon_info(client: HomeAssistantClient, slug: str) -> dict[str, An
997
996
  result: dict[str, Any] = {"success": True, "addon": addon}
998
997
 
999
998
  if redaction_enabled():
1000
- options = addon.get("options")
1001
- schema = addon.get("schema")
1002
- if isinstance(options, dict) and options:
1003
- if isinstance(schema, list) and schema:
1004
- register_known_secret_values(
1005
- collect_addon_secret_values(options, schema)
1006
- )
1007
- result["addon"] = {
1008
- **addon,
1009
- "options": redact_addon_options(options, schema),
1010
- }
1011
- else:
1012
- # No readable schema (absent, malformed, or empty) — the
1013
- # password fields cannot be told apart, so fail closed like
1014
- # the integration surface does rather than passing raw
1015
- # options through.
1016
- result["addon"] = {
1017
- **addon,
1018
- "options": {
1019
- key: sentinel_replacement(value)
1020
- for key, value in options.items()
1021
- },
1022
- }
1023
- result.setdefault("warnings", []).append(
1024
- f"redact_secrets: no options schema readable for '{slug}' — "
1025
- "every option value was redacted conservatively (the "
1026
- "password fields cannot be told apart without the schema)"
1027
- )
999
+ result["addon"], warnings = redact_addon_info(addon, slug)
1000
+ if warnings:
1001
+ result["warnings"] = warnings
1028
1002
 
1029
1003
  # Extracted AFTER redaction so an app (add-on) that schema-marks log_level as
1030
1004
  # a password surfaces the sentinel here, never the live value.
@@ -3065,22 +3039,22 @@ class AddOnTools:
3065
3039
  merged_options = _merge_options(current_options, config_data["options"])
3066
3040
 
3067
3041
  # Both the live current options and the merged result are
3068
- # password-bearing; remember them for the global known-value
3042
+ # secret-bearing; remember them for the global known-value
3069
3043
  # scrub (this path fetches info directly, bypassing
3070
3044
  # get_addon_info's harvesting). The merged copy carries any
3071
- # password the caller is submitting right now — without it a
3045
+ # secret the caller is submitting right now — without it a
3072
3046
  # freshly written secret stays unknown to the scrub until some
3073
3047
  # later read harvests it.
3074
- if redaction_enabled() and isinstance(addon_info.get("schema"), list):
3048
+ schema_ui: list | None = addon_info.get("schema")
3049
+ if redaction_enabled() and isinstance(schema_ui, list):
3075
3050
  register_known_secret_values(
3076
- collect_addon_secret_values(current_options, addon_info["schema"])
3077
- | collect_addon_secret_values(merged_options, addon_info["schema"])
3051
+ collect_addon_secret_values(current_options, schema_ui, slug)
3052
+ | collect_addon_secret_values(merged_options, schema_ui, slug)
3078
3053
  )
3079
3054
 
3080
3055
  # Pre-write schema check: identify fields not in the app's schema.
3081
3056
  # Supervisor silently drops unknown fields on write; surfacing them
3082
3057
  # here lets the caller correct mistakes before any state is changed.
3083
- schema_ui: list | None = addon_info.get("schema")
3084
3058
  if schema_ui is not None:
3085
3059
  allowed_keys = {item["name"] for item in schema_ui if "name" in item}
3086
3060
  ignored_fields = [