ha-mcp-dev 8.3.0.dev2456__tar.gz → 8.3.0.dev2461__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 (303) hide show
  1. {ha_mcp_dev-8.3.0.dev2456/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.3.0.dev2461}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/settings.js +105 -84
  4. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/tests/test_constants.py +1 -1
  6. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/LICENSE +0 -0
  7. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/README.md +0 -0
  9. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/setup.cfg +0 -0
  10. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_rich_compat.py +0 -0
  14. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/__init__.py +0 -0
  15. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/requirements.txt +0 -0
  16. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  17. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  18. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  19. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  20. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  21. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  22. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  23. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  24. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  25. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  26. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  27. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  28. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  29. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  30. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  31. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  32. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  33. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  34. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  35. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  36. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  37. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  38. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  39. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  40. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  41. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  42. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  43. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  44. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  45. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  46. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  47. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  48. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  49. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  50. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  51. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  52. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  53. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  54. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  55. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  56. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  57. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  58. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  59. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  60. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  61. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  62. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  63. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  64. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  65. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  66. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  67. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  68. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  69. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  70. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  71. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  72. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/_version.py +0 -0
  73. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/auth/__init__.py +0 -0
  74. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/auth/consent_form.py +0 -0
  75. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/auth/oidc_compat.py +0 -0
  76. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/auth/provider.py +0 -0
  77. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/backup_manager.py +0 -0
  78. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/browser_landing.py +0 -0
  79. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/client/__init__.py +0 -0
  80. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/client/rest_client.py +0 -0
  81. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/client/supervisor_client.py +0 -0
  82. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/client/websocket_client.py +0 -0
  83. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/client/websocket_listener.py +0 -0
  84. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/config.py +0 -0
  85. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  86. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  87. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  88. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  89. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  90. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  91. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/errors.py +0 -0
  92. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  93. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/llm_exposure.py +0 -0
  94. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/log_filters.py +0 -0
  95. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/__init__.py +0 -0
  96. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/approval_queue.py +0 -0
  97. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/editing.py +0 -0
  98. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/evaluator.py +0 -0
  99. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/handlers.py +0 -0
  100. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/middleware.py +0 -0
  101. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/model.py +0 -0
  102. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/persistence.py +0 -0
  103. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/policy/value_sources.py +0 -0
  104. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/py.typed +0 -0
  105. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/read_only.py +0 -0
  106. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/redaction.py +0 -0
  107. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/renamed_tools.py +0 -0
  108. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  109. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  110. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  111. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  112. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  113. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  114. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  115. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  116. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  117. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  118. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  119. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  120. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  121. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  122. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  123. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  124. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  125. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  126. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  127. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  128. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  129. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  130. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  131. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  132. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  133. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  134. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  135. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  136. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  137. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  138. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  139. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  140. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  141. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  142. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  143. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  144. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  145. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  146. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  147. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  148. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  149. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/server.py +0 -0
  150. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/__init__.py +0 -0
  151. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  152. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  153. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  154. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  155. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  156. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  157. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  158. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  159. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  160. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  161. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_theme.py +0 -0
  162. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  163. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  164. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  165. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  166. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  167. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  168. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  169. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  170. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  171. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  172. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  173. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  174. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  175. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  176. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  177. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  178. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/settings.css +0 -0
  179. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/settings_ui/settings.html +0 -0
  180. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/smoke_test.py +0 -0
  181. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  182. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/strict_bps.py +0 -0
  183. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/__init__.py +0 -0
  184. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/auto_backup.py +0 -0
  185. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/backup.py +0 -0
  186. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  187. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/best_practice_result.py +0 -0
  188. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  189. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/bulk_selector.py +0 -0
  190. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_api.py +0 -0
  191. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_config_entries.py +0 -0
  192. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_config_reads.py +0 -0
  193. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_devices.py +0 -0
  194. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_registries.py +0 -0
  195. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  196. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  197. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  198. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  199. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  200. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  201. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  202. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  203. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/device_control.py +0 -0
  204. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  205. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/hacs_registration.py +0 -0
  206. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/helpers.py +0 -0
  207. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  208. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/log_common.py +0 -0
  209. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/log_sources.py +0 -0
  210. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  211. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/__init__.py +0 -0
  212. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/base.py +0 -0
  213. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/matter.py +0 -0
  214. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/thread.py +0 -0
  215. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  216. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/radio/zwave.py +0 -0
  217. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/reference_validator.py +0 -0
  218. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/registry.py +0 -0
  219. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  220. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  221. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  222. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  223. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  224. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  225. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  226. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  227. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  228. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  229. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  230. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  231. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_addons.py +0 -0
  232. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_areas.py +0 -0
  233. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  234. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  235. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  236. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_calendar.py +0 -0
  237. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_camera.py +0 -0
  238. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_categories.py +0 -0
  239. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_code.py +0 -0
  240. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  241. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  242. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  243. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  244. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  245. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  246. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_dev.py +0 -0
  247. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_energy.py +0 -0
  248. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_entities.py +0 -0
  249. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  250. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_groups.py +0 -0
  251. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_hacs.py +0 -0
  252. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_history.py +0 -0
  253. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_integrations.py +0 -0
  254. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_labels.py +0 -0
  255. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_logs.py +0 -0
  256. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_radio.py +0 -0
  257. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_registry.py +0 -0
  258. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_resources.py +0 -0
  259. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_search.py +0 -0
  260. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  261. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_service.py +0 -0
  262. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_services.py +0 -0
  263. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_system.py +0 -0
  264. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_themes.py +0 -0
  265. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_todo.py +0 -0
  266. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_traces.py +0 -0
  267. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_updates.py +0 -0
  268. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_utility.py +0 -0
  269. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  270. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  271. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  272. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/tools_zones.py +0 -0
  273. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/util_helpers.py +0 -0
  274. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/tools/validation_middleware.py +0 -0
  275. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/transforms/__init__.py +0 -0
  276. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/transforms/categorized_search.py +0 -0
  277. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  278. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/transport_security.py +0 -0
  279. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/update_check.py +0 -0
  280. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/__init__.py +0 -0
  281. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/config_hash.py +0 -0
  282. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/config_write_lock.py +0 -0
  283. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/data_paths.py +0 -0
  284. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/domain_handlers.py +0 -0
  285. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/entity_membership.py +0 -0
  286. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  287. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  288. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/operation_manager.py +0 -0
  289. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/python_sandbox.py +0 -0
  290. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/skill_loader.py +0 -0
  291. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/utils/usage_logger.py +0 -0
  292. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/visibility/__init__.py +0 -0
  293. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/visibility/enforcement.py +0 -0
  294. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/visibility/model.py +0 -0
  295. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/visibility/persistence.py +0 -0
  296. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp/visibility/resolver.py +0 -0
  297. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  298. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  299. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  300. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  301. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  302. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/tests/__init__.py +0 -0
  303. {ha_mcp_dev-8.3.0.dev2456 → ha_mcp_dev-8.3.0.dev2461}/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.3.0.dev2456
3
+ Version: 8.3.0.dev2461
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.3.0.dev2456"
7
+ version = "8.3.0.dev2461"
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
@@ -489,7 +489,11 @@ async function loadTools() {
489
489
  updateStatus(t('status.loaded', {}, 'Loaded'));
490
490
  }
491
491
 
492
- async function applyInfoChrome() {
492
+ // Restart-chrome half of applyInfoChrome: which restart control is shown
493
+ // and what the restart notice tells the user to do. Split out (with the
494
+ // footer below) so applyInfoChrome stays orchestration — the branch ladder
495
+ // here alone sits near the complexity limit.
496
+ function _applyRestartChrome(info) {
493
497
  // Show restart button if running as add-on; show Stop Sidecar
494
498
  // button only when this page is served by the stdio sidecar
495
499
  // (HTTP modes serve the same HTML but is_sidecar=false there, so
@@ -499,84 +503,91 @@ async function applyInfoChrome() {
499
503
  // reopen Claude Desktop" vs "click Restart Add-on" vs "restart
500
504
  // your Docker container") instead of a generic "restart the add-on"
501
505
  // that only matches one of three real deployment surfaces.
502
- try {
503
- const infoResp = await fetch('./api/settings/info');
504
- const info = await infoResp.json();
505
- const noticeEl = document.getElementById('restartNoticeText');
506
- if (info.is_addon) {
507
- document.getElementById('restartBtn').style.display = '';
508
- if (noticeEl) {
509
- noticeEl.textContent = t(
510
- 'notice.restart.addon',
511
- {},
512
- '⚠ Changes saved. Click "Restart App (add-on)" for them to take effect. Then refresh the MCP tool list in your AI client.'
513
- );
514
- }
515
- } else if (info.deployment_mode === 'embedded') {
516
- // In-process (custom component) server: the restart endpoint reloads
517
- // the server config entry, which reinstalls-if-newer and swaps the
518
- // worker onto the freshly installed code.
519
- const rbtn = document.getElementById('restartBtn');
520
- rbtn.style.display = '';
521
- restartTargetEmbedded = true;
522
- rbtn.textContent = t('actions.restart_server', {}, 'Restart HA-MCP Server');
523
- if (noticeEl) {
524
- noticeEl.textContent = t(
525
- 'notice.restart.embedded',
526
- {},
527
- '⚠ Changes saved. Click "Restart HA-MCP Server" for them to take effect. Then refresh the MCP tool list in your AI client.'
528
- );
529
- }
530
- } else if (info.is_sidecar) {
531
- if (noticeEl) {
532
- noticeEl.textContent = t(
533
- 'notice.restart.sidecar',
534
- {},
535
- '⚠ Changes saved. Fully quit and reopen your MCP client for them to take effect.'
536
- );
537
- }
538
- document.getElementById('sidecarStopRow').style.display = '';
539
- } else if (noticeEl) {
540
- // HTTP / Docker / standalone — no button we can wire to a restart,
541
- // so describe the action in process terms, then the client-refresh
542
- // step (remote connectors cache the tool list, same as add-on mode).
506
+ const noticeEl = document.getElementById('restartNoticeText');
507
+ if (info.is_addon) {
508
+ document.getElementById('restartBtn').style.display = '';
509
+ if (noticeEl) {
543
510
  noticeEl.textContent = t(
544
- 'notice.restart.standalone',
511
+ 'notice.restart.addon',
545
512
  {},
546
- '⚠ Changes saved. Restart the ha-mcp process, then refresh the MCP tool list in your AI client.'
513
+ '⚠ Changes saved. Click "Restart App (add-on)" for them to take effect. Then refresh the MCP tool list in your AI client.'
547
514
  );
548
515
  }
549
- // Footer — show the running build and the same deployment classification
550
- // used by ha_report_issue. The backend keeps embedded and sidecar distinct
551
- // because they need different restart behavior; preserve those concise
552
- // names here and clarify the less obvious packaging-oriented values.
553
- if (info.version) {
554
- const fEl = document.getElementById('versionFooterText');
555
- const deploymentMode = typeof info.deployment_mode === 'string'
556
- ? info.deployment_mode
557
- : '';
558
- const deploymentLabels = {
559
- embedded: 'embedded',
560
- sidecar: 'sidecar',
561
- addon: t('footer.deployment.addon', {}, 'app/add-on'),
562
- docker: t('footer.deployment.docker', {}, 'container/docker'),
563
- pyinstaller: t('footer.deployment.pyinstaller', {}, 'standalone binary'),
564
- git: t('footer.deployment.git', {}, 'source checkout'),
565
- pypi: t('footer.deployment.pypi', {}, 'python package'),
566
- unknown: t('footer.deployment.unknown', {}, 'unknown'),
567
- };
568
- const deploymentLabel = Object.prototype.hasOwnProperty.call(
569
- deploymentLabels, deploymentMode
570
- ) ? deploymentLabels[deploymentMode] : deploymentMode;
571
- const installation = deploymentLabel
572
- ? ' · ' + t(
573
- 'footer.installation',
574
- {method: deploymentLabel},
575
- 'installation: {method}'
576
- )
577
- : '';
578
- if (fEl) fEl.textContent = 'ha-mcp ' + info.version + installation;
516
+ } else if (info.deployment_mode === 'embedded') {
517
+ // In-process (custom component) server: the restart endpoint reloads
518
+ // the server config entry, which reinstalls-if-newer and swaps the
519
+ // worker onto the freshly installed code.
520
+ const rbtn = document.getElementById('restartBtn');
521
+ rbtn.style.display = '';
522
+ restartTargetEmbedded = true;
523
+ rbtn.textContent = t('actions.restart_server', {}, 'Restart HA-MCP Server');
524
+ if (noticeEl) {
525
+ noticeEl.textContent = t(
526
+ 'notice.restart.embedded',
527
+ {},
528
+ '⚠ Changes saved. Click "Restart HA-MCP Server" for them to take effect. Then refresh the MCP tool list in your AI client.'
529
+ );
530
+ }
531
+ } else if (info.is_sidecar) {
532
+ if (noticeEl) {
533
+ noticeEl.textContent = t(
534
+ 'notice.restart.sidecar',
535
+ {},
536
+ '⚠ Changes saved. Fully quit and reopen your MCP client for them to take effect.'
537
+ );
579
538
  }
539
+ document.getElementById('sidecarStopRow').style.display = '';
540
+ } else if (noticeEl) {
541
+ // HTTP / Docker / standalone — no button we can wire to a restart,
542
+ // so describe the action in process terms, then the client-refresh
543
+ // step (remote connectors cache the tool list, same as add-on mode).
544
+ noticeEl.textContent = t(
545
+ 'notice.restart.standalone',
546
+ {},
547
+ '⚠ Changes saved. Restart the ha-mcp process, then refresh the MCP tool list in your AI client.'
548
+ );
549
+ }
550
+ }
551
+
552
+ // Footer — show the running build and the same deployment classification
553
+ // used by ha_report_issue. The backend keeps embedded and sidecar distinct
554
+ // because they need different restart behavior; preserve those concise
555
+ // names here and clarify the less obvious packaging-oriented values.
556
+ function _applyVersionFooter(info) {
557
+ if (!info.version) return;
558
+ const fEl = document.getElementById('versionFooterText');
559
+ const deploymentMode = typeof info.deployment_mode === 'string'
560
+ ? info.deployment_mode
561
+ : '';
562
+ const deploymentLabels = {
563
+ embedded: 'embedded',
564
+ sidecar: 'sidecar',
565
+ addon: t('footer.deployment.addon', {}, 'app/add-on'),
566
+ docker: t('footer.deployment.docker', {}, 'container/docker'),
567
+ pyinstaller: t('footer.deployment.pyinstaller', {}, 'standalone binary'),
568
+ git: t('footer.deployment.git', {}, 'source checkout'),
569
+ pypi: t('footer.deployment.pypi', {}, 'python package'),
570
+ unknown: t('footer.deployment.unknown', {}, 'unknown'),
571
+ };
572
+ const deploymentLabel = Object.prototype.hasOwnProperty.call(
573
+ deploymentLabels, deploymentMode
574
+ ) ? deploymentLabels[deploymentMode] : deploymentMode;
575
+ const installation = deploymentLabel
576
+ ? ' · ' + t(
577
+ 'footer.installation',
578
+ {method: deploymentLabel},
579
+ 'installation: {method}'
580
+ )
581
+ : '';
582
+ if (fEl) fEl.textContent = 'ha-mcp ' + info.version + installation;
583
+ }
584
+
585
+ async function applyInfoChrome() {
586
+ try {
587
+ const infoResp = await fetch('./api/settings/info');
588
+ const info = await infoResp.json();
589
+ _applyRestartChrome(info);
590
+ _applyVersionFooter(info);
580
591
  } catch (e) {
581
592
  // A transient /api/settings/info failure must not leave the restart
582
593
  // button hidden / the restart notice unset silently — log it so the
@@ -3627,14 +3638,28 @@ async function policyDecide(token, action) {
3627
3638
  // have landed with only its response lost — so re-read first and revert only
3628
3639
  // when the readback actually shows the old value.
3629
3640
  //
3630
- // `spec` is {readState, repaint, revertKey, revertText}: readState() returns
3631
- // {value, known} for this toggle's slice of policyState/readOnlyState, and
3632
- // repaint() is the toggle's own painter.
3641
+ // `spec` is {readState, revertKey, revertText}: readState() returns
3642
+ // {value, known} for this toggle's slice of policyState/readOnlyState.
3643
+ //
3644
+ // Repaints are NOT per-toggle. The re-read below is loadPolicyState(),
3645
+ // which refreshes — or, through _clearFlagSwitchState(), clears — the
3646
+ // state slices of ALL THREE switches. Repainting only the toggle being
3647
+ // saved left the other two painted from state that no longer existed:
3648
+ // a failed re-read after a Read Only Mode save cleared both policy
3649
+ // slices while their switches stayed editable at the stale value with
3650
+ // #policyUnknownNotice hidden, and vice versa for #roUnknownNotice.
3651
+ function _repaintFlagSwitches() {
3652
+ paintPolicyGlobalToggles();
3653
+ syncReadOnlyToggle();
3654
+ render();
3655
+ }
3656
+
3633
3657
  async function handleFailedFlagSave(checkbox, previous, saved, spec) {
3634
3658
  if (saved === false) {
3659
+ // No re-read happened, so the other switches' state is untouched and
3660
+ // repainting them is a no-op — one shape for both branches.
3635
3661
  checkbox.checked = previous;
3636
- spec.repaint();
3637
- render();
3662
+ _repaintFlagSwitches();
3638
3663
  updateStatus(t(spec.revertKey, {}, spec.revertText), false, true);
3639
3664
  return;
3640
3665
  }
@@ -3661,8 +3686,7 @@ async function handleFailedFlagSave(checkbox, previous, saved, spec) {
3661
3686
  'reload to see what the server has.');
3662
3687
  }
3663
3688
  // Paint before the status line so the repaint can't clobber it.
3664
- spec.repaint();
3665
- render();
3689
+ _repaintFlagSwitches();
3666
3690
  updateStatus(msg, ok, !ok);
3667
3691
  }
3668
3692
 
@@ -3677,7 +3701,6 @@ document.getElementById('policy-master-toggle').addEventListener('change', async
3677
3701
  if (!saved) {
3678
3702
  await handleFailedFlagSave(e.target, previous, saved, {
3679
3703
  readState: () => ({value: policyState.enabled, known: policyState.enabledKnown}),
3680
- repaint: paintPolicyGlobalToggles,
3681
3704
  revertKey: 'policies.errors.master_save',
3682
3705
  revertText:
3683
3706
  'Tool Security Policies change did not save. The server still has the previous value',
@@ -3713,7 +3736,6 @@ document.getElementById('policy-manage-tool-toggle').addEventListener('change',
3713
3736
  if (!saved) {
3714
3737
  await handleFailedFlagSave(e.target, previous, saved, {
3715
3738
  readState: () => ({value: policyState.manageToolEnabled, known: policyState.manageToolKnown}),
3716
- repaint: paintPolicyGlobalToggles,
3717
3739
  revertKey: 'policies.errors.manage_tool_save',
3718
3740
  revertText:
3719
3741
  'Policy-editing tool change did not save. The server still has the previous value',
@@ -3744,7 +3766,6 @@ document.getElementById('read-only-mode-toggle').addEventListener('change', asyn
3744
3766
  if (!saved) {
3745
3767
  await handleFailedFlagSave(e.target, previous, saved, {
3746
3768
  readState: () => ({value: readOnlyState.enabled, known: readOnlyState.enabledKnown}),
3747
- repaint: syncReadOnlyToggle,
3748
3769
  revertKey: 'tools.read_only.save_failed',
3749
3770
  revertText:
3750
3771
  'Read Only Mode change did not save. The server still has the previous value',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.3.0.dev2456
3
+ Version: 8.3.0.dev2461
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
@@ -20,7 +20,7 @@ NON_ADMIN_TEST_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIzNzkyOTc
20
20
  # Home Assistant Docker image for E2E/performance/UAT tests.
21
21
  # Keep in sync with .github/workflows/e2e-tests.yml and pr.yml.
22
22
  # renovate: datasource=docker depName=ghcr.io/home-assistant/home-assistant
23
- HA_TEST_IMAGE = "ghcr.io/home-assistant/home-assistant:2026.8.0"
23
+ HA_TEST_IMAGE = "ghcr.io/home-assistant/home-assistant:2026.8.3"
24
24
 
25
25
  # Test user credentials (for UI access)
26
26
  TEST_USER = "mcp"