ha-mcp-dev 8.4.3.dev2542__tar.gz → 8.4.3.dev2544__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 (307) hide show
  1. {ha_mcp_dev-8.4.3.dev2542/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2544}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/backup_manager.py +54 -6
  4. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/config.py +5 -5
  5. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/en.json +1 -1
  6. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.js +1 -1
  7. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  8. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/LICENSE +0 -0
  9. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/MANIFEST.in +0 -0
  10. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/README.md +0 -0
  11. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/setup.cfg +0 -0
  12. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__init__.py +0 -0
  13. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_rich_compat.py +0 -0
  16. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/__init__.py +0 -0
  17. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/requirements.txt +0 -0
  18. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  19. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  20. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  21. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  22. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  23. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  24. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  25. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  26. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  27. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  28. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  29. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  30. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  54. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_version.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/__init__.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/consent_form.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/oidc_compat.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/provider.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/browser_landing.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/__init__.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/rest_client.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/supervisor_client.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_client.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_listener.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/errors.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/llm_exposure.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/log_filters.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/__init__.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/approval_queue.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/editing.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/evaluator.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/handlers.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/middleware.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/model.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/persistence.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/value_sources.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/py.typed +0 -0
  105. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/read_only.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/redaction.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/renamed_tools.py +0 -0
  108. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  109. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  110. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  111. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  112. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  113. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  114. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  115. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  116. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  117. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  118. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  119. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  120. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  121. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  122. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  123. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  124. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  125. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  134. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  135. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  136. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  137. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  138. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  139. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  140. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  141. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  143. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  144. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  145. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  146. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  147. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  148. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  149. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/server.py +0 -0
  150. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/__init__.py +0 -0
  151. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  152. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  153. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_theme.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  163. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  164. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  165. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  166. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  167. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.css +0 -0
  178. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.html +0 -0
  179. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/smoke_test.py +0 -0
  180. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  181. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/strict_bps.py +0 -0
  182. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/__init__.py +0 -0
  183. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/auto_backup.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/backup.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_result.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_write.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/bulk_selector.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_api.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_entries.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_reads.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_devices.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registries.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/device_control.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/hacs_registration.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/helpers.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_common.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/__init__.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/base.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/matter.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/thread.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zwave.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/reference_validator.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/registry.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_addons.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_areas.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_calendar.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_camera.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_categories.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_code.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dev.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_energy.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_entities.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_groups.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_hacs.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_history.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_integrations.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_labels.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_logs.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_radio.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_registry.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_resources.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_search.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_service.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_services.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_system.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_themes.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_todo.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_traces.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_updates.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_utility.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_zones.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/util_helpers.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/validation_middleware.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/__init__.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/categorized_search.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transport_security.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/update_check.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/__init__.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_hash.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_write_lock.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/data_paths.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/domain_handlers.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/entity_membership.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/operation_manager.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/python_sandbox.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/skill_loader.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/usage_logger.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/__init__.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/enforcement.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/model.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/persistence.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/resolver.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  301. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  302. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  303. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  304. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  305. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/tests/__init__.py +0 -0
  306. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/tests/test_constants.py +0 -0
  307. {ha_mcp_dev-8.4.3.dev2542 → ha_mcp_dev-8.4.3.dev2544}/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.4.3.dev2542
3
+ Version: 8.4.3.dev2544
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.4.3.dev2542"
7
+ version = "8.4.3.dev2544"
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
@@ -7,7 +7,11 @@ Storage path resolution
7
7
  -----------------------
8
8
  ``Settings.auto_backup_dir`` overrides; otherwise defaults to
9
9
  ``/data/ha_mcp_backups`` in the add-on (SUPERVISOR_TOKEN set + ``/data``
10
- exists), else ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``.
10
+ exists), else ``<data dir>/backups`` where the data dir is what
11
+ ``utils.data_paths.get_data_dir`` resolves (``HA_MCP_CONFIG_DIR``,
12
+ ``~/.ha-mcp``, or the tmpdir fallback). Installs that still hold snapshots
13
+ under the pre-#2372 default ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``
14
+ keep using that directory; see ``_resolve_default_dir``.
11
15
 
12
16
  File format
13
17
  -----------
@@ -55,6 +59,7 @@ import yaml # type: ignore[import-untyped]
55
59
  from fastmcp.exceptions import ToolError
56
60
 
57
61
  from .client.rest_client import HomeAssistantConnectionError, HomeAssistantError
62
+ from .utils.data_paths import get_data_dir
58
63
 
59
64
  logger = logging.getLogger(__name__)
60
65
 
@@ -263,17 +268,60 @@ def _now_iso() -> str:
263
268
  return datetime.now(UTC).isoformat()
264
269
 
265
270
 
266
- def _resolve_default_dir() -> Path:
267
- """Pick a sane default backup directory for the current deployment mode."""
268
- # Addon detection: Supervisor sets SUPERVISOR_TOKEN AND /data exists.
269
- if os.environ.get("SUPERVISOR_TOKEN") and Path("/data").is_dir():
270
- return Path("/data/ha_mcp_backups")
271
+ # Add-on default. Named in the add-on option descriptions, so it stays put.
272
+ _ADDON_BACKUP_DIR = Path("/data/ha_mcp_backups")
273
+
274
+
275
+ def _legacy_default_dir() -> Path:
276
+ """The non-add-on default before #2372: XDG user-data, outside the data dir."""
271
277
  xdg = os.environ.get("XDG_DATA_HOME")
272
278
  if xdg:
273
279
  return Path(xdg) / "ha_mcp" / "backups"
274
280
  return (Path.home() / ".local" / "share" / "ha_mcp" / "backups").resolve()
275
281
 
276
282
 
283
+ def _holds_files(path: Path) -> bool:
284
+ """Whether ``path`` is a directory with at least one entry.
285
+
286
+ An unreadable or missing directory counts as empty: nothing in it can be
287
+ listed or restored from, so there is nothing to keep using.
288
+ """
289
+ try:
290
+ return any(path.iterdir())
291
+ except OSError:
292
+ return False
293
+
294
+
295
+ def _resolve_default_dir() -> Path:
296
+ """Pick a sane default backup directory for the current deployment mode.
297
+
298
+ Add-on (Supervisor sets ``SUPERVISOR_TOKEN`` and ``/data`` exists):
299
+ ``/data/ha_mcp_backups``. Otherwise ``backups/`` inside the data dir, the
300
+ directory that already holds the settings and that every documented
301
+ Docker recipe persists as the ``ha-mcp-data`` volume. The previous default,
302
+ ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``, sat outside that
303
+ volume: under a ``read_only`` root it was EROFS, which fails the mandatory
304
+ pre-write snapshots closed, and on a writable root the snapshots were
305
+ discarded with the container (#2372).
306
+
307
+ An install that already holds snapshots under the previous default keeps
308
+ using it so its restore points stay listed and rotation keeps counting
309
+ them; only installs with nothing there move to the data dir.
310
+ """
311
+ if os.environ.get("SUPERVISOR_TOKEN") and _ADDON_BACKUP_DIR.parent.is_dir():
312
+ return _ADDON_BACKUP_DIR
313
+ legacy = _legacy_default_dir()
314
+ if _holds_files(legacy):
315
+ logger.info(
316
+ "Auto-backup: keeping existing backup dir %s (new installs default "
317
+ "to %s; set HAMCP_BACKUP_DIR to choose explicitly)",
318
+ legacy,
319
+ get_data_dir() / "backups",
320
+ )
321
+ return legacy
322
+ return get_data_dir() / "backups"
323
+
324
+
277
325
  # Sentinel returned by ``BackupManager._fetch_config_for_snapshot`` when there
278
326
  # is nothing to snapshot — a handled transient fetch failure (already logged),
279
327
  # or a None config for an entity that did not exist. Distinct from any real
@@ -400,7 +400,7 @@ class Settings(BaseSettings):
400
400
 
401
401
  # Backup directory override. Empty ("") resolves at runtime to a
402
402
  # deployment-mode default: ``/data/ha_mcp_backups`` in the add-on,
403
- # otherwise ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``.
403
+ # otherwise ``<data dir>/backups`` (see ``backup_manager._resolve_default_dir``).
404
404
  auto_backup_dir: str = Field("", alias="HAMCP_BACKUP_DIR")
405
405
 
406
406
  # Calendar event backups query an ahead-of-now window to locate the
@@ -776,8 +776,8 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
776
776
  )
777
777
 
778
778
  # Override-file location is the same data dir that holds tool_config.json
779
- # (resolved via ``utils.data_paths.get_data_dir`` — addon ``/data``,
780
- # ``HA_MCP_CONFIG_DIR``, ``XDG_DATA_HOME``, or a tmpdir fallback).
779
+ # (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
780
+ # addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
781
781
  # Imported lazily inside helpers to avoid a circular import at module
782
782
  # load.
783
783
  _FEATURE_FLAG_OVERRIDE_FILENAME = "feature_flags.json"
@@ -1656,8 +1656,8 @@ BACKUP_OVERRIDE_FIELDS: tuple[BackupOverrideField, ...] = (
1656
1656
  )
1657
1657
 
1658
1658
  # Override-file location is the same data dir that holds tool_config.json
1659
- # (resolved via ``utils.data_paths.get_data_dir`` — addon ``/data``,
1660
- # ``HA_MCP_CONFIG_DIR``, ``XDG_DATA_HOME``, or a tmpdir fallback).
1659
+ # (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
1660
+ # addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
1661
1661
  # Imported lazily inside helpers to avoid a circular import at module
1662
1662
  # load (``utils.data_paths`` imports from ``_version`` which imports
1663
1663
  # from ``config`` transitively in some test layouts).
@@ -251,7 +251,7 @@
251
251
  "backup.fields.auto_backup_retain_per_entity.label": "Retain per entity",
252
252
  "backup.fields.auto_backup_retain_per_entity.help": "Maximum snapshots kept per entity (1–10000). Older ones rotate out.",
253
253
  "backup.fields.auto_backup_dir.label": "Backup directory override",
254
- "backup.fields.auto_backup_dir.help": "Leave empty to use the default directory; otherwise enter an absolute path.",
254
+ "backup.fields.auto_backup_dir.help": "Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.",
255
255
  "backup.fields.auto_backup_calendar_lookahead_days.label": "Calendar lookahead (days)",
256
256
  "backup.fields.auto_backup_calendar_lookahead_days.help": "How far ahead to query calendar events for pre-edit snapshots. Range 1–365.",
257
257
  "backup.fields.enable_snapshot_delete.label": "Allow snapshot deletion",
@@ -1438,7 +1438,7 @@ const BACKUP_FIELD_LABELS = {
1438
1438
  },
1439
1439
  auto_backup_dir: {
1440
1440
  label: 'Backup directory override',
1441
- help: 'Empty = default (/data/ha_mcp_backups in the App (add-on), $XDG_DATA_HOME/ha_mcp/backups otherwise). Override with an absolute path.',
1441
+ help: 'Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.',
1442
1442
  },
1443
1443
  auto_backup_calendar_lookahead_days: {
1444
1444
  label: 'Calendar lookahead (days)',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2542
3
+ Version: 8.4.3.dev2544
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