ha-mcp-dev 8.5.0.dev2793__tar.gz → 8.5.0.dev2797__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 (738) hide show
  1. {ha_mcp_dev-8.5.0.dev2793/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.5.0.dev2797}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/editing.py +38 -8
  4. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/evaluator.py +163 -41
  5. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/events.py +3 -2
  6. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/handlers.py +32 -14
  7. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/middleware.py +30 -17
  8. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/model.py +67 -13
  9. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/persistence.py +15 -3
  10. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/__init__.py +14 -9
  11. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/az.json +15 -1
  12. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/cs.json +15 -1
  13. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/de.json +15 -1
  14. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/en.json +15 -1
  15. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/eo.json +15 -1
  16. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/es.json +15 -1
  17. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/fr.json +15 -1
  18. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/it.json +15 -1
  19. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/ko.json +15 -1
  20. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/nl.json +15 -1
  21. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/pl.json +15 -1
  22. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/ru.json +15 -1
  23. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/sv.json +15 -1
  24. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/zh-Hans.json +15 -1
  25. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/zh-Hant.json +15 -1
  26. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.html +22 -5
  27. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.js +142 -31
  28. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_dev.py +56 -33
  29. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_security_policy.py +9 -4
  30. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  31. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/LICENSE +0 -0
  32. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/MANIFEST.in +0 -0
  33. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/README.md +0 -0
  34. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/setup.cfg +0 -0
  35. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/__init__.py +0 -0
  36. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/__main__.py +0 -0
  37. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_pypi_marker +0 -0
  38. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_rich_compat.py +0 -0
  39. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/__init__.py +0 -0
  40. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  41. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  42. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  43. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  44. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  45. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  46. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  47. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  48. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  49. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  50. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  51. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  52. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  53. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  54. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  55. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  56. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  57. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  58. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  59. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  60. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  61. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  62. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  63. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  64. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  65. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  66. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  67. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  68. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  69. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  70. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  71. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  72. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  73. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  74. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  75. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  76. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  77. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  78. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  79. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  80. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  81. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  82. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  83. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  84. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  85. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  86. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  87. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  88. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  89. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  90. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  91. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  92. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  93. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  94. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  95. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  96. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  97. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  98. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  99. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  100. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  101. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  102. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  103. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  104. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  105. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  106. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  107. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  108. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  109. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  110. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  111. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  112. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  113. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  114. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  115. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  116. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  117. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  118. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  119. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  120. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  121. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  122. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  123. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  124. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  125. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  126. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  127. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  128. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  129. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  130. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  131. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  132. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  133. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  134. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  135. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  136. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  137. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  138. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  139. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  140. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  141. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  142. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  143. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  144. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  145. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  146. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  147. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  148. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  149. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  150. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  151. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  152. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  153. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  154. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  155. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  156. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  157. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  158. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  159. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  160. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  161. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  162. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  163. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  164. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  165. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  166. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  167. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  168. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  169. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  170. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  171. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  172. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  173. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  174. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  175. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  176. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  177. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  178. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  179. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  180. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  181. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  182. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  183. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  184. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  185. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  186. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  187. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  188. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  189. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  190. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  191. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  192. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  193. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  194. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  195. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  196. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  197. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  198. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  199. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  200. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  201. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  202. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  203. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  204. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  205. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  206. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  207. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  208. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  209. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  210. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  211. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  212. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  213. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  214. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  215. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  216. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  217. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  218. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  219. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  220. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  221. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  222. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  223. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  224. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  225. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  226. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  227. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  228. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  229. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  230. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  231. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  232. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  233. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  234. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  235. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  236. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  237. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  238. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  239. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  240. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  241. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  242. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  243. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  244. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  245. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  246. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  247. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  248. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  249. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  250. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  251. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  252. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  253. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  254. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  255. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  256. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  257. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  258. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  259. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  260. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  261. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  262. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  263. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  264. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  265. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  266. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  267. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  268. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  269. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  270. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  271. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  272. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  273. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  274. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  275. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  276. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  277. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  278. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  279. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  280. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  281. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  282. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  283. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  284. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  285. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  286. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  287. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  288. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  289. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  290. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  291. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  292. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  293. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  294. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  295. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  296. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  297. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  298. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  299. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  300. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  301. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  302. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  303. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  304. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  305. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  306. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  307. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  308. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  309. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  310. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  311. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  312. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  313. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  314. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  315. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  316. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  317. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  318. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  319. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  320. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  321. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  322. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  323. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  324. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  325. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  326. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  327. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  328. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  329. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  330. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  331. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  332. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  333. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  334. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  335. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  336. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  337. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  338. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  339. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  340. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  341. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  342. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  343. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  344. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  345. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  346. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  347. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  348. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  349. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  350. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  351. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  352. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  353. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  354. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  355. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  356. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  357. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  358. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  359. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  360. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  361. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  362. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  363. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  364. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  365. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  366. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  367. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  368. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  369. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  370. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  371. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  372. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  373. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  374. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  375. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  376. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  377. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  378. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  379. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  380. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  381. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  382. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  383. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  384. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  385. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  386. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  387. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  388. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  389. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  390. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  391. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  392. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  393. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  394. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  395. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  396. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  397. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  398. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  399. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  400. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  401. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  402. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  403. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  404. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  405. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  406. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  407. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  408. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  409. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  410. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  411. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  412. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  413. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  414. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  415. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  416. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  417. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  418. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  419. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  420. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  421. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  422. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  423. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  424. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  425. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  426. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  427. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  428. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  429. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  430. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  431. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  432. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  433. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  434. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  435. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  436. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  437. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  438. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  439. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  440. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  441. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  442. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  443. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  444. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  445. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  446. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  447. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  448. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  449. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  450. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/requirements.txt +0 -0
  451. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  452. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  453. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  454. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  455. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  456. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  457. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  458. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  459. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  460. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  461. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  462. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  463. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  464. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  465. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  466. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  467. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  468. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  469. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  470. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  471. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  472. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  473. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  474. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  475. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  476. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  477. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  478. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  479. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  480. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  481. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  482. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  483. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  484. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  485. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  486. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  487. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  488. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  489. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  490. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  491. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  492. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  493. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  494. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  495. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  496. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  497. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  498. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  499. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  500. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  501. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  502. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  503. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  504. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  505. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  506. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  507. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/_version.py +0 -0
  508. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/__init__.py +0 -0
  509. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/consent_form.py +0 -0
  510. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/oidc_compat.py +0 -0
  511. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/auth/provider.py +0 -0
  512. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/backup_manager.py +0 -0
  513. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/browser_landing.py +0 -0
  514. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/__init__.py +0 -0
  515. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/admin_routes.py +0 -0
  516. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/rest_client.py +0 -0
  517. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/supervisor_client.py +0 -0
  518. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/websocket_client.py +0 -0
  519. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/client/websocket_listener.py +0 -0
  520. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/config.py +0 -0
  521. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  522. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  523. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  524. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  525. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  526. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  527. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/errors.py +0 -0
  528. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/ha_request_queue.py +0 -0
  529. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  530. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/http_transport.py +0 -0
  531. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/llm_exposure.py +0 -0
  532. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/log_filters.py +0 -0
  533. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/__init__.py +0 -0
  534. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/approval_queue.py +0 -0
  535. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/decision_pin.py +0 -0
  536. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/decisions.py +0 -0
  537. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/policy/value_sources.py +0 -0
  538. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/py.typed +0 -0
  539. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/read_only.py +0 -0
  540. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/redaction.py +0 -0
  541. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/renamed_tools.py +0 -0
  542. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  543. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  544. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  545. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  546. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  547. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  548. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  549. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  550. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  551. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  552. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  553. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  554. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  555. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  556. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  557. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  558. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  559. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  560. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  561. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  562. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  563. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  564. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  565. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  566. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  567. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  568. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  569. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  570. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  571. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  572. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  573. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  574. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  575. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  576. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  577. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  578. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  579. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  580. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  581. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  582. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  583. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/server.py +0 -0
  584. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/server_lifespan.py +0 -0
  585. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  586. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  587. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  588. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  589. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  590. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  591. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  592. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  593. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  594. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  595. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_theme.py +0 -0
  596. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  597. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  598. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  599. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/settings_ui/settings.css +0 -0
  600. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/smoke_test.py +0 -0
  601. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  602. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/strict_bps.py +0 -0
  603. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tool_dispatch.py +0 -0
  604. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/__init__.py +0 -0
  605. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/auto_backup.py +0 -0
  606. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/backup.py +0 -0
  607. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  608. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_result.py +0 -0
  609. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  610. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  611. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  612. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/blueprint_write.py +0 -0
  613. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/bulk_selector.py +0 -0
  614. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_api.py +0 -0
  615. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_config_entries.py +0 -0
  616. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_config_reads.py +0 -0
  617. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  618. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_devices.py +0 -0
  619. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_registries.py +0 -0
  620. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  621. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  622. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  623. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  624. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  625. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  626. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  627. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  628. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  629. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  630. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/device_control.py +0 -0
  631. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/entity_registration.py +0 -0
  632. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  633. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/hacs_registration.py +0 -0
  634. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/helpers.py +0 -0
  635. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  636. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_common.py +0 -0
  637. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources.py +0 -0
  638. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  639. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  640. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/__init__.py +0 -0
  641. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/base.py +0 -0
  642. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/matter.py +0 -0
  643. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/thread.py +0 -0
  644. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  645. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/radio/zwave.py +0 -0
  646. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/reference_validator.py +0 -0
  647. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/registry.py +0 -0
  648. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  649. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/scene_discovery.py +0 -0
  650. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  651. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  652. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  653. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  654. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  655. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  656. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  657. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  658. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  659. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  660. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  661. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_addons.py +0 -0
  662. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_areas.py +0 -0
  663. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  664. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  665. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  666. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_calendar.py +0 -0
  667. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_camera.py +0 -0
  668. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_categories.py +0 -0
  669. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_code.py +0 -0
  670. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  671. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  672. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  673. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  674. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  675. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  676. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_energy.py +0 -0
  677. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_entities.py +0 -0
  678. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  679. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_groups.py +0 -0
  680. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_hacs.py +0 -0
  681. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_history.py +0 -0
  682. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_integrations.py +0 -0
  683. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_labels.py +0 -0
  684. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_logs.py +0 -0
  685. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_radio.py +0 -0
  686. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_registry.py +0 -0
  687. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_resources.py +0 -0
  688. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_search.py +0 -0
  689. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_service.py +0 -0
  690. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_services.py +0 -0
  691. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_system.py +0 -0
  692. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_themes.py +0 -0
  693. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_todo.py +0 -0
  694. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_traces.py +0 -0
  695. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_updates.py +0 -0
  696. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_utility.py +0 -0
  697. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  698. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  699. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  700. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/tools_zones.py +0 -0
  701. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/util_helpers.py +0 -0
  702. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/tools/validation_middleware.py +0 -0
  703. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/__init__.py +0 -0
  704. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/categorized_search.py +0 -0
  705. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/component_search.py +0 -0
  706. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  707. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  708. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/transport_security.py +0 -0
  709. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/update_check.py +0 -0
  710. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/__init__.py +0 -0
  711. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/config_hash.py +0 -0
  712. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/config_write_lock.py +0 -0
  713. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  714. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/data_paths.py +0 -0
  715. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  716. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/domain_handlers.py +0 -0
  717. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/entity_membership.py +0 -0
  718. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  719. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  720. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  721. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/operation_manager.py +0 -0
  722. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/python_sandbox.py +0 -0
  723. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  724. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/skill_loader.py +0 -0
  725. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/utils/usage_logger.py +0 -0
  726. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/__init__.py +0 -0
  727. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/enforcement.py +0 -0
  728. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/model.py +0 -0
  729. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/persistence.py +0 -0
  730. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp/visibility/resolver.py +0 -0
  731. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  732. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  733. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  734. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  735. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  736. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/__init__.py +0 -0
  737. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/test_constants.py +0 -0
  738. {ha_mcp_dev-8.5.0.dev2793 → ha_mcp_dev-8.5.0.dev2797}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.5.0.dev2793
3
+ Version: 8.5.0.dev2797
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.5.0.dev2793"
7
+ version = "8.5.0.dev2797"
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
@@ -38,9 +38,9 @@ class PolicyCaller(NamedTuple):
38
38
  def _clear_remember_cache(server: Any | None) -> None:
39
39
  """Clear the approval remember-cache after a rule change.
40
40
 
41
- Called only when the rules actually changed, so a missing queue is
42
- worth a WARNING: the rules the operator just wrote are not what the
43
- engine (wherever it runs) is still remembering.
41
+ Called only when the rules or ``rule_effect`` actually changed, so a
42
+ missing queue is worth a WARNING: the gates the operator just wrote are
43
+ not what the engine (wherever it runs) is still remembering.
44
44
  """
45
45
  queue = getattr(server, "approval_queue", None)
46
46
  if queue is None:
@@ -101,9 +101,8 @@ async def set_policy(
101
101
  suggestions=[f"Call {caller.get_call} for the shape"],
102
102
  )
103
103
  )
104
- # ``rules`` defaults to [] on the model and Policy ignores unknown keys,
105
- # so an omitted (or misspelled) key would validate and silently delete
106
- # every approval gate. Demand it explicitly instead.
104
+ # ``rules`` defaults to [] on the model, so an omitted key would validate
105
+ # and silently delete every approval gate. Demand it explicitly instead.
107
106
  if "rules" not in policy:
108
107
  raise_tool_error(
109
108
  create_error_response(
@@ -176,7 +175,29 @@ def _pre_save_warnings(
176
175
  '"event_decisions_enabled": true if that was not intended. The '
177
176
  "stored PIN is untouched either way."
178
177
  )
179
- if not new_policy.rules:
178
+ if new_policy.rule_effect == "allow":
179
+ # In an allow list an added rule is the loosening direction.
180
+ added = [rule for rule in new_policy.rules if rule not in current.rules]
181
+ if added:
182
+ names = ", ".join(sorted({rule.tool_name for rule in added}))
183
+ warnings.append(
184
+ f"This write added {len(added)} approving rule(s), covering: "
185
+ f"{names}. Calls they match now run without approval."
186
+ )
187
+ if current.rule_effect != new_policy.rule_effect:
188
+ warnings.append(
189
+ f"This write switched rule_effect from '{current.rule_effect}' to "
190
+ f"'{new_policy.rule_effect}': every rule now "
191
+ + (
192
+ "approves the calls it matches, and every other call requires approval."
193
+ if new_policy.rule_effect == "allow"
194
+ else "requires approval for the calls it matches, and every "
195
+ "other call runs without approval."
196
+ )
197
+ )
198
+ # An empty require-approval list gates nothing, so its enforcement state
199
+ # is moot; an empty allow list gates every call and still needs it.
200
+ if not new_policy.rules and new_policy.rule_effect == "require_approval":
180
201
  return warnings
181
202
  policies_enabled = get_global_settings().enable_tool_security_policies
182
203
  if not policies_enabled:
@@ -214,6 +235,7 @@ def _commit_policy(
214
235
  """
215
236
  from ..utils.data_paths import get_data_dir
216
237
  from .decision_pin import is_pin_set
238
+ from .model import ALLOW_LIST_OMITTED_MESSAGE, drops_allow_list, gates_differ
217
239
  from .persistence import load_policy, save_policy
218
240
 
219
241
  data_dir = get_data_dir()
@@ -227,6 +249,14 @@ def _commit_policy(
227
249
  suggestions=["Inspect or delete the file, then retry"],
228
250
  )
229
251
  )
252
+ if drops_allow_list(new_policy, current):
253
+ raise_tool_error(
254
+ create_error_response(
255
+ ErrorCode.VALIDATION_MISSING_PARAMETER,
256
+ ALLOW_LIST_OMITTED_MESSAGE,
257
+ suggestions=[f"Call {caller.get_call} and resend the edited document"],
258
+ )
259
+ )
230
260
  if new_policy.event_decisions_enabled and not is_pin_set(data_dir):
231
261
  # No MCP tool takes the PIN as a parameter, returns it, or writes
232
262
  # the file it lives in: the component's deny floor blocks that
@@ -262,7 +292,7 @@ def _commit_policy(
262
292
  warnings = _pre_save_warnings(new_policy, current, expected, server)
263
293
  # Rebase onto the on-disk version so save_policy bumps to current+1.
264
294
  save_policy(data_dir, new_policy.model_copy(update={"version": current.version}))
265
- if rules_changed:
295
+ if gates_differ(current, new_policy):
266
296
  # The write has landed. Nothing after this point may turn a committed
267
297
  # save into a failure the caller would retry.
268
298
  try:
@@ -2,7 +2,7 @@
2
2
 
3
3
  import logging
4
4
  import re
5
- from collections.abc import Iterator
5
+ from collections.abc import Iterable, Iterator
6
6
  from enum import StrEnum
7
7
  from typing import Any
8
8
 
@@ -93,7 +93,13 @@ def has_dynamic_selector_targets(name: str, args: dict[str, Any]) -> bool:
93
93
  return name == "ha_bulk_control" and args.get("selector") is not None
94
94
 
95
95
 
96
- def iter_path_values(args: dict[str, Any], path: str) -> Iterator[Any]:
96
+ MISSING = object()
97
+ """What ``iter_path_values(..., report_missing=True)`` yields for a dead end."""
98
+
99
+
100
+ def iter_path_values(
101
+ args: dict[str, Any], path: str, *, report_missing: bool = False
102
+ ) -> Iterator[Any]:
97
103
  """Yield every value the dotted path resolves to.
98
104
 
99
105
  The leading ``args`` segment is implicit and stripped. A ``*`` segment
@@ -101,6 +107,12 @@ def iter_path_values(args: dict[str, Any], path: str) -> Iterator[Any]:
101
107
  across items for lists — so ``args.*`` yields every top-level
102
108
  argument, ``args.config.*`` yields every leaf of the ``config``
103
109
  sub-dict, and so on. Empty iterator = no match.
110
+
111
+ A branch that cannot continue (a missing key, a named segment on a value
112
+ that is not a dict, or a ``*`` on a scalar) is skipped, unless
113
+ ``report_missing``, which yields ``MISSING`` for it instead and also for a
114
+ ``*`` over an empty container. Allow mode needs that: an operation without
115
+ the constrained field is a value the predicate never saw.
104
116
  """
105
117
  parts = path.split(".")
106
118
  if parts[0] == "args":
@@ -112,36 +124,56 @@ def iter_path_values(args: dict[str, Any], path: str) -> Iterator[Any]:
112
124
  return
113
125
  head, tail = rest[0], rest[1:]
114
126
  if head == "*":
115
- if isinstance(cur, dict):
116
- for v in cur.values():
117
- yield from walk(v, tail)
118
- elif isinstance(cur, (list, tuple)):
119
- for v in cur:
120
- yield from walk(v, tail)
127
+ children = _children(cur)
128
+ if report_missing and not children:
129
+ # An empty container is a dead end too: the branch holds no
130
+ # value the predicate could examine.
131
+ children = None
132
+ elif isinstance(cur, dict) and head in cur:
133
+ children = [cur[head]]
134
+ else:
135
+ children = None
136
+ if children is None:
137
+ if report_missing:
138
+ yield MISSING
121
139
  return
122
- if isinstance(cur, dict) and head in cur:
123
- yield from walk(cur[head], tail)
140
+ for child in children:
141
+ yield from walk(child, tail)
124
142
 
125
143
  yield from walk(args, parts)
126
144
 
127
145
 
128
- def _ci(x: Any) -> Any:
146
+ def _children(node: Any) -> Iterable[Any] | None:
147
+ """What a ``*`` segment fans out over; None for a scalar."""
148
+ if isinstance(node, dict):
149
+ return node.values()
150
+ if isinstance(node, (list, tuple)):
151
+ return node
152
+ return None
153
+
154
+
155
+ def _ci(x: Any, strict: bool = False) -> Any:
129
156
  """Lower-case strings for case-insensitive comparison; pass other
130
157
  types through unchanged so type semantics (int != "1") survive.
131
- Used on both sides of every string op — security gates should fire
132
- whether the caller wrote 'Lock' or 'LOCK' or 'lock'."""
133
- return x.lower() if isinstance(x, str) else x
158
+ Used on both sides of the equality and membership ops — security gates
159
+ should fire whether the caller wrote 'Lock' or 'LOCK' or 'lock'.
134
160
 
161
+ ``strict`` keeps the case; ``match_predicate`` explains why allow mode
162
+ compares both ways."""
163
+ return x.lower() if isinstance(x, str) and not strict else x
135
164
 
136
- def _contains_matches(val: Any, pv: Any) -> bool:
165
+
166
+ def _contains_matches(val: Any, pv: Any, strict: bool) -> bool:
137
167
  if isinstance(val, str) and isinstance(pv, str):
138
- return pv.lower() in val.lower()
139
- # Mirror the case-insensitive treatment that ``eq`` / ``in`` /
140
- # ``not_in`` already apply: a rule listing ``["light.kitchen"]``
168
+ return _ci(pv, strict) in _ci(val, strict)
169
+ # Outside strict mode, mirror the case-insensitive treatment that ``eq``
170
+ # / ``in`` / ``not_in`` apply: a rule listing ``["light.kitchen"]``
141
171
  # must match an LLM passing ``"Light.Kitchen"``. Per-element
142
172
  # ``_ci`` guards non-string entries so mixed-type collections
143
173
  # (e.g. ``[1, "two"]``) keep their natural equality semantics.
144
- return isinstance(val, (list, tuple, set)) and any(_ci(pv) == _ci(x) for x in val)
174
+ return isinstance(val, (list, tuple, set)) and any(
175
+ _ci(pv, strict) == _ci(x, strict) for x in val
176
+ )
145
177
 
146
178
 
147
179
  def _numeric_matches(val: Any, op: str, pv: Any) -> bool:
@@ -160,59 +192,118 @@ def _numeric_matches(val: Any, op: str, pv: Any) -> bool:
160
192
  return False
161
193
 
162
194
 
163
- def _op_matches(val: Any, op: str, pv: Any) -> bool:
195
+ def _op_matches(val: Any, op: str, pv: Any, strict: bool = False) -> bool:
164
196
  """Apply one op to one concrete value. Predicate dispatches over
165
197
  the candidate values (which may be many for wildcard paths).
166
198
 
167
199
  String comparisons are case-insensitive (security gates shouldn't
168
- care whether the LLM lowercased its args). Non-string types
169
- preserve their natural comparison semantics.
200
+ care whether the LLM lowercased its args) unless ``strict`` (see
201
+ ``_ci``). Non-string types preserve their natural comparison semantics.
170
202
  """
171
203
  match op:
172
204
  case "eq":
173
- return bool(_ci(val) == _ci(pv))
205
+ return bool(_ci(val, strict) == _ci(pv, strict))
174
206
  case "neq":
175
- return bool(_ci(val) != _ci(pv))
207
+ return bool(_ci(val, strict) != _ci(pv, strict))
176
208
  case "in":
177
- return _ci(val) in [_ci(x) for x in (pv or [])]
209
+ return _ci(val, strict) in [_ci(x, strict) for x in (pv or [])]
178
210
  case "not_in":
179
- return _ci(val) not in [_ci(x) for x in (pv or [])]
211
+ return _ci(val, strict) not in [_ci(x, strict) for x in (pv or [])]
180
212
  case "regex":
181
213
  # `regex` is re.search (substring match). Anchor with ^...$
182
- # for full-match. re.IGNORECASE so '^light\.' matches 'Light.x'.
214
+ # for full-match. re.IGNORECASE (unless strict) so '^light\.'
215
+ # matches 'Light.x'.
183
216
  return (
184
217
  isinstance(val, str)
185
218
  and isinstance(pv, str)
186
- and re.search(pv, val, re.IGNORECASE) is not None
219
+ and re.search(pv, val, 0 if strict else re.IGNORECASE) is not None
187
220
  )
188
221
  case "contains":
189
- return _contains_matches(val, pv)
222
+ return _contains_matches(val, pv, strict)
190
223
  case "gt" | "lt":
191
224
  return _numeric_matches(val, op, pv)
192
225
  return False
193
226
 
194
227
 
195
- def match_predicate(predicate: Predicate, args: dict[str, Any]) -> bool:
196
- values = list(iter_path_values(args, predicate.path))
228
+ def match_predicate(
229
+ predicate: Predicate, args: dict[str, Any], *, strict: bool = False
230
+ ) -> bool:
231
+ """Whether ``predicate`` holds for ``args``.
232
+
233
+ Outside allow mode a wildcard path matches when ANY value at the wildcard
234
+ satisfies the op; for a non-wildcard path there is at most one value.
235
+
236
+ ``strict`` is allow mode, where a match APPROVES the call, so every
237
+ ambiguity must resolve towards "no match":
238
+
239
+ - EVERY branch the path reaches must hold the field, ``exists``
240
+ included, so ``args.operations.*.parameters.brightness`` does not
241
+ approve a batch whose unlock operation carries no ``parameters`` (or
242
+ an empty one), and ``args.*.entity_id`` does not approve a ``target``
243
+ object that names only an area. A scalar argument lacks every field,
244
+ so ``args.*.<field>`` approves no call that also has one. The
245
+ remaining rules do not apply to ``exists``.
246
+ - EVERY value must satisfy the op, and a list found at the path counts
247
+ as its items, so an approval naming ``light.a`` covers neither an
248
+ ``operations`` list nor an ``entity_id`` list that also names a lock.
249
+ - A string with a comma or surrounding whitespace never matches: Home
250
+ Assistant splits ``"light.a, lock.x"`` into two entity IDs and strips
251
+ each, so the string would stand for values the op never saw.
252
+ - A dict value (an object argument) can only be matched exactly, by
253
+ ``eq`` or ``in``; ``neq "lock.x"`` says nothing about what the object
254
+ holds, so it must not approve it.
255
+ - The op must hold both case-sensitively and case-insensitively. A
256
+ positive op (``eq``, ``in``) then needs the exact case, so
257
+ ``home/bridge`` does not approve the different MQTT topic
258
+ ``Home/Bridge``; a negated op (``neq``, ``not_in``) cannot be
259
+ satisfied by a case variant, because Home Assistant lower-cases
260
+ domains, services and entity IDs and would run ``LOCK`` as ``lock``.
261
+ """
262
+ values = list(iter_path_values(args, predicate.path, report_missing=strict))
263
+ if not values or any(v is MISSING for v in values):
264
+ return False
197
265
  if predicate.op == "exists":
198
- return bool(values)
266
+ return True
267
+ if not strict:
268
+ return any(_op_matches(v, predicate.op, predicate.value) for v in values)
269
+ values = list(_flatten_lists(values))
199
270
  if not values:
200
271
  return False
201
- # Existential semantics: a wildcard path matches if ANY value at the
202
- # wildcard satisfies the op. For non-wildcard paths there's at most
203
- # one value so the any() collapses to a single check.
204
- return any(_op_matches(v, predicate.op, predicate.value) for v in values)
272
+ return all(
273
+ not _splits_into_other_values(v)
274
+ and (not isinstance(v, dict) or predicate.op in ("eq", "in"))
275
+ and _op_matches(v, predicate.op, predicate.value, strict=True)
276
+ and _op_matches(v, predicate.op, predicate.value)
277
+ for v in values
278
+ )
279
+
205
280
 
281
+ def _splits_into_other_values(value: Any) -> bool:
282
+ return isinstance(value, str) and ("," in value or value != value.strip())
206
283
 
207
- def match_rule(rule: Rule, tool_name: str, args: dict[str, Any]) -> bool:
284
+
285
+ def _flatten_lists(values: Iterable[Any]) -> Iterator[Any]:
286
+ for value in values:
287
+ if isinstance(value, (list, tuple)):
288
+ yield from _flatten_lists(value)
289
+ else:
290
+ yield value
291
+
292
+
293
+ def match_rule(
294
+ rule: Rule, tool_name: str, args: dict[str, Any], *, strict: bool = False
295
+ ) -> bool:
208
296
  if rule.tool_name not in ("*", tool_name):
209
297
  return False
210
- return all(match_predicate(p, args) for p in rule.when)
298
+ return all(match_predicate(p, args, strict=strict) for p in rule.when)
211
299
 
212
300
 
213
301
  def find_matching_rule(
214
302
  tool_name: str, args: dict[str, Any], policy: Policy
215
303
  ) -> Rule | None:
304
+ """First rule gating this call under a require-approval list, else None."""
305
+ if policy.rule_effect != "require_approval":
306
+ return None
216
307
  for rule in policy.rules:
217
308
  if match_rule(rule, tool_name, args):
218
309
  return rule
@@ -231,8 +322,8 @@ def _predicate_reaches_operations(path: str) -> bool:
231
322
  literal segment right after that wildcard (e.g. ``domain`` in
232
323
  ``args.*.domain``) can only ever match a *dict* value at that level (like
233
324
  ``selector``) — ``walk()`` requires ``isinstance(cur, dict)`` for a
234
- literal head, so it silently yields nothing against a list and can never
235
- reach an operation row. Only a SECOND wildcard (``args.*.*...``, as in
325
+ literal head, so it yields no value against a list (only ``MISSING`` under
326
+ ``report_missing``) and can never reach an operation row. Only a SECOND wildcard (``args.*.*...``, as in
236
327
  ``args.*.*.entity_id``) or no further segment at all (bare ``args.*``,
237
328
  which yields the raw ``operations`` list value itself) can actually reach
238
329
  into the list. Any other concrete first segment (e.g. ``selector``) can
@@ -266,7 +357,38 @@ def _rule_needs_resolved_operations(rule: Rule) -> bool:
266
357
 
267
358
 
268
359
  def evaluate(tool_name: str, args: dict[str, Any], policy: Policy) -> Verdict:
269
- """Decide whether one tool call requires approval under ``policy``.
360
+ """Decide whether one tool call requires approval under ``policy``."""
361
+ if policy.rule_effect == "require_approval":
362
+ return _evaluate_require_approval_list(tool_name, args, policy)
363
+ return _evaluate_allow_list(tool_name, args, policy)
364
+
365
+
366
+ def _evaluate_allow_list(
367
+ tool_name: str, args: dict[str, Any], policy: Policy
368
+ ) -> Verdict:
369
+ """Allow mode: a call runs only when some rule approves it.
370
+
371
+ Unmatched calls, a ``ws_command`` call included, already require
372
+ approval here (a bare ``ha_call_service`` or ``*`` rule does approve
373
+ one), so the require-approval list's first fail-safe has
374
+ no counterpart. The selector one does: a rule that inspects
375
+ ``args.operations`` cannot see the targets a selector call resolves to
376
+ later, so it must not be what approves that call.
377
+ """
378
+ dynamic = has_dynamic_selector_targets(tool_name, args)
379
+ for rule in policy.rules:
380
+ if not match_rule(rule, tool_name, args, strict=True):
381
+ continue
382
+ if dynamic and _rule_needs_resolved_operations(rule):
383
+ continue
384
+ return Verdict.ALLOW
385
+ return Verdict.REQUIRE_APPROVAL
386
+
387
+
388
+ def _evaluate_require_approval_list(
389
+ tool_name: str, args: dict[str, Any], policy: Policy
390
+ ) -> Verdict:
391
+ """Require-approval mode (the default): gate matching calls.
270
392
 
271
393
  A normal rule match (``find_matching_rule``) decides most calls. Two
272
394
  fail-safes broaden approval beyond an exact predicate match, each only
@@ -84,9 +84,10 @@ def build_requested_payload(
84
84
  at ``ARG_VALUE_LIMIT``. The settings UI's pending list remains the place
85
85
  to read an argument in full.
86
86
 
87
- ``matched_rule`` is present exactly when a rule matched this call. The
87
+ ``matched_rule`` is present exactly when a rule gated this call. The
88
88
  policy's two fail-safes (``evaluator.evaluate``) gate a call without a
89
- matching rule, and then there is none to name.
89
+ matching rule, and under an allow list a call is gated because no rule
90
+ approved it; then there is none to name.
90
91
  """
91
92
  payload: dict[str, Any] = {
92
93
  "token": entry.token,
@@ -15,7 +15,12 @@ from starlette.responses import JSONResponse
15
15
  from ..utils.config_write_lock import config_write_guard
16
16
  from .approval_queue import ApprovalQueue
17
17
  from .decision_pin import clear_pin, is_pin_set, pin_status, set_pin, validate_pin
18
- from .model import Policy
18
+ from .model import (
19
+ ALLOW_LIST_OMITTED_MESSAGE,
20
+ Policy,
21
+ drops_allow_list,
22
+ gates_differ,
23
+ )
19
24
  from .persistence import load_policy, save_policy
20
25
  from .value_sources import (
21
26
  all_value_sources_for,
@@ -66,17 +71,24 @@ def _extract_arg_paths(parameters: dict[str, Any]) -> list[dict[str, Any]]:
66
71
  return out
67
72
 
68
73
 
74
+ def policy_file_corrupt_response(exc: ValueError) -> JSONResponse:
75
+ """The response for a corrupt or schema-invalid stored tool_policy.json.
76
+
77
+ Shared by GET and PUT here and in the sidecar: the body names the problem
78
+ and flags it (the page adds its repair hint on load), and the log records
79
+ it for whoever reads the server log rather than the page.
80
+ """
81
+ logger.warning("tool_policy.json could not be read: %s", exc)
82
+ return JSONResponse(
83
+ {"error": str(exc), "policy_file_corrupt": True}, status_code=500
84
+ )
85
+
86
+
69
87
  async def _get_config(data_dir: Path) -> JSONResponse:
70
88
  try:
71
89
  return JSONResponse(load_policy(data_dir).model_dump(mode="json"))
72
90
  except ValueError as e:
73
- # Surface a corrupt or schema-invalid tool_policy.json to the
74
- # UI so the user has a visible repair path; without this the
75
- # tab would just spinner forever on an opaque 500.
76
- return JSONResponse(
77
- {"error": str(e), "policy_file_corrupt": True},
78
- status_code=500,
79
- )
91
+ return policy_file_corrupt_response(e)
80
92
 
81
93
 
82
94
  async def _put_config(
@@ -94,7 +106,13 @@ async def _put_config(
94
106
  # sidecar runs this same handler in its own process) so a concurrent
95
107
  # writer can't slip between the read and the write and lose an update.
96
108
  async with config_write_guard():
97
- current = load_policy(data_dir)
109
+ try:
110
+ current = load_policy(data_dir)
111
+ except ValueError as e:
112
+ # No version to compare against, so the write is refused too.
113
+ return policy_file_corrupt_response(e)
114
+ if drops_allow_list(new_policy, current):
115
+ return JSONResponse({"error": ALLOW_LIST_OMITTED_MESSAGE}, status_code=400)
98
116
  # Inside the guard: DELETE /api/policy/decision-pin clears the PIN
99
117
  # under this same lock, and when the stored policy already has the
100
118
  # switch off it does so without bumping the version. Checked before
@@ -125,12 +143,12 @@ async def _put_config(
125
143
  status_code=409,
126
144
  )
127
145
  save_policy(data_dir, new_policy)
128
- # Drop the remember-cache only when rules actually changed.
146
+ # Drop the remember-cache only when the gates actually changed.
129
147
  # Editing just wait_seconds / approval_ttl_minutes shouldn't
130
- # invalidate in-flight remembered approvals; only a rule change
131
- # could make a previously-approved call now want a different
132
- # outcome.
133
- if current.rules != new_policy.rules:
148
+ # invalidate in-flight remembered approvals; only a rule or
149
+ # rule_effect change could make a previously-approved call now want
150
+ # a different outcome.
151
+ if gates_differ(current, new_policy):
134
152
  queue.clear_remember_cache()
135
153
  return JSONResponse({"saved": True, "version": new_policy.version + 1})
136
154
 
@@ -119,8 +119,9 @@ class PolicyMiddleware(Middleware):
119
119
  # rewrites a retired name before it arrives. Resolving it again costs a
120
120
  # dict lookup and removes the ordering dependency, which here is the
121
121
  # difference between gated and ungated: rules are keyed on the current
122
- # name, and ``evaluate`` returns ALLOW when nothing matches, so a gate
123
- # reading a stale name lets the call through.
122
+ # name, and under a require-approval list ``evaluate`` returns ALLOW
123
+ # when nothing matches, so a gate reading a stale name lets the call
124
+ # through (under an allow list it would gate an approved call).
124
125
  name = current_tool_name(context.message.name)
125
126
  # Normalize stringified JSON containers (a client like Claude Desktop
126
127
  # stdio can send a nested parameter, e.g. `selector`, as a JSON
@@ -171,8 +172,17 @@ class PolicyMiddleware(Middleware):
171
172
  remember_minutes = (
172
173
  0 if dynamic_targets else rule.remember_minutes if rule else 0
173
174
  )
175
+ # An allow list has no remember window (find_matching_rule returns no
176
+ # rule for it, so remember_minutes is 0). A remembered entry is then
177
+ # left over from a require-approval list: a call left pending there
178
+ # and approved after the switch, or a switch saved from the sidecar or
179
+ # by a hand edit, neither of which clears this cache. It must not
180
+ # approve a call the allow list gates.
181
+ reads_remembered = (
182
+ not dynamic_targets and policy.rule_effect == "require_approval"
183
+ )
174
184
 
175
- if not dynamic_targets and self._queue.is_remembered(name, args_hash):
185
+ if reads_remembered and self._queue.is_remembered(name, args_hash):
176
186
  return await call_next(context)
177
187
 
178
188
  # A dynamic selector call must never consume an entry it did not
@@ -201,6 +211,7 @@ class PolicyMiddleware(Middleware):
201
211
  name,
202
212
  args_hash,
203
213
  dynamic_targets=dynamic_targets,
214
+ reads_remembered=reads_remembered,
204
215
  remember_minutes=remember_minutes,
205
216
  ):
206
217
  return await call_next(context)
@@ -222,7 +233,7 @@ class PolicyMiddleware(Middleware):
222
233
  pending,
223
234
  name,
224
235
  args_hash,
225
- dynamic_targets=dynamic_targets,
236
+ reads_remembered=reads_remembered,
226
237
  remember_minutes=remember_minutes,
227
238
  ):
228
239
  return await call_next(context)
@@ -357,6 +368,7 @@ class PolicyMiddleware(Middleware):
357
368
  args_hash: str,
358
369
  *,
359
370
  dynamic_targets: bool,
371
+ reads_remembered: bool,
360
372
  remember_minutes: int,
361
373
  ) -> bool:
362
374
  """Act on an entry this call did not create. True means dispatch now.
@@ -383,7 +395,7 @@ class PolicyMiddleware(Middleware):
383
395
  existing,
384
396
  name,
385
397
  args_hash,
386
- dynamic_targets=dynamic_targets,
398
+ reads_remembered=reads_remembered,
387
399
  remember_minutes=remember_minutes,
388
400
  )
389
401
  if existing.decision == "denied":
@@ -397,7 +409,7 @@ class PolicyMiddleware(Middleware):
397
409
  name: str,
398
410
  args_hash: str,
399
411
  *,
400
- dynamic_targets: bool,
412
+ reads_remembered: bool,
401
413
  remember_minutes: int,
402
414
  ) -> bool:
403
415
  """Consume an approved entry for this invocation.
@@ -411,22 +423,23 @@ class PolicyMiddleware(Middleware):
411
423
  earlier in ``on_call_tool`` ran before the approval existed, which
412
424
  is why it has to be re-checked here rather than relied upon.
413
425
 
414
- A dynamic selector call never reads the remember-cache -- that
415
- same gate skips the lookup for it, and ``remember_minutes`` is
416
- forced to 0 -- so it must not consult one here either. No
417
- reachable case arms such a key today (``has_dynamic_selector_targets``
418
- is a pure function of the name and args that also produce
419
- ``args_hash``, so static and dynamic calls cannot collide on one
420
- key), but the guard keeps this branch degrading the same
421
- direction as the defensive claim check in
422
- ``_resolve_already_decided``: toward an extra prompt, never
423
- toward a dispatch the caller was not entitled to.
426
+ A call that skips that gate (``reads_remembered`` is false for a
427
+ dynamic selector call and for every call under an allow list) must
428
+ not consult the cache here either. Under an allow list an entry left
429
+ over from a require-approval list can be live. For a dynamic
430
+ selector call no reachable case arms one today
431
+ (``has_dynamic_selector_targets`` is a pure function of the name and
432
+ args that also produce ``args_hash``, so static and dynamic calls
433
+ cannot collide on one key), but the guard keeps this branch
434
+ degrading the same direction as the defensive claim check in
435
+ ``_resolve_already_decided``: toward an extra prompt, never toward a
436
+ dispatch the caller was not entitled to.
424
437
  """
425
438
  if self._queue.consume_and_maybe_remember(
426
439
  entry, remember_minutes=remember_minutes
427
440
  ):
428
441
  return True
429
- if dynamic_targets:
442
+ if not reads_remembered:
430
443
  return False
431
444
  return self._queue.is_remembered(name, args_hash)
432
445