ha-mcp-dev 8.4.3.dev2605__tar.gz → 8.4.3.dev2608__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 (313) hide show
  1. {ha_mcp_dev-8.4.3.dev2605/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2608}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/server.py +2 -1
  4. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_config_automations.py +62 -13
  5. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  6. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/LICENSE +0 -0
  7. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/README.md +0 -0
  9. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/setup.cfg +0 -0
  10. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_rich_compat.py +0 -0
  14. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/__init__.py +0 -0
  15. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/requirements.txt +0 -0
  16. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  17. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  18. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  19. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  20. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  21. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  22. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  23. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  24. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  25. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  26. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  27. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  28. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  29. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  30. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  52. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/_version.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/auth/__init__.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/auth/consent_form.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/auth/oidc_compat.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/auth/provider.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/backup_manager.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/browser_landing.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/client/__init__.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/client/rest_client.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/client/supervisor_client.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/client/websocket_client.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/client/websocket_listener.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/config.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/errors.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/ha_request_queue.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/llm_exposure.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/log_filters.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/__init__.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/approval_queue.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/editing.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/evaluator.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/handlers.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/middleware.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/model.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/persistence.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/policy/value_sources.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/py.typed +0 -0
  106. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/read_only.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/redaction.py +0 -0
  108. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/renamed_tools.py +0 -0
  109. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  110. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  111. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  112. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  113. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  114. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  115. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  116. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  117. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  118. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  119. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  120. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  121. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  122. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  123. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  124. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  125. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  134. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  135. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  136. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  137. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  138. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  139. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  140. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  141. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  143. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  144. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  145. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  146. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  147. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  148. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  149. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  150. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/__init__.py +0 -0
  151. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  152. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  153. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_theme.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  163. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  164. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  165. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  166. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  167. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  178. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/settings.css +0 -0
  179. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/settings.html +0 -0
  180. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/settings_ui/settings.js +0 -0
  181. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/smoke_test.py +0 -0
  182. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  183. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/strict_bps.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tool_dispatch.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/__init__.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/auto_backup.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/backup.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/best_practice_result.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/blueprint_write.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/bulk_selector.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_api.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_config_entries.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_config_reads.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_devices.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_registries.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/device_control.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/hacs_registration.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/helpers.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/log_common.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/log_sources.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/__init__.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/base.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/matter.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/thread.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/radio/zwave.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/reference_validator.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/registry.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_addons.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_areas.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_calendar.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_camera.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_categories.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_code.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_dev.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_energy.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_entities.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_groups.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_hacs.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_history.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_integrations.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_labels.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_logs.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_radio.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_registry.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_resources.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_search.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_service.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_services.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_system.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_themes.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_todo.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_traces.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_updates.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_utility.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/tools_zones.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/util_helpers.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/tools/validation_middleware.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/transforms/__init__.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/transforms/categorized_search.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/transport_security.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/update_check.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/__init__.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/config_hash.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/config_write_lock.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/data_paths.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/domain_handlers.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/entity_membership.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/operation_manager.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/python_sandbox.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/skill_loader.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/utils/usage_logger.py +0 -0
  301. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/visibility/__init__.py +0 -0
  302. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/visibility/enforcement.py +0 -0
  303. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/visibility/model.py +0 -0
  304. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/visibility/persistence.py +0 -0
  305. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp/visibility/resolver.py +0 -0
  306. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  307. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  308. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  309. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  310. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  311. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/tests/__init__.py +0 -0
  312. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/tests/test_constants.py +0 -0
  313. {ha_mcp_dev-8.4.3.dev2605 → ha_mcp_dev-8.4.3.dev2608}/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.dev2605
3
+ Version: 8.4.3.dev2608
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.dev2605"
7
+ version = "8.4.3.dev2608"
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
@@ -727,7 +727,8 @@ class HomeAssistantSmartMCPServer:
727
727
  "ha_config_get_automation), or `take_control_of_blueprint` "
728
728
  "to convert a blueprint-backed automation into an editable "
729
729
  "standalone one (the UI's Take control action). Omit "
730
- "`identifier` to create a new automation.\n\n"
730
+ "`identifier` to create a new automation. Reusing an identifier targets "
731
+ "the same automation; changing its alias requires config_hash from a prior read.\n\n"
731
732
  "For schema details, examples, and native-vs-template "
732
733
  "guidance, see ha_get_skill_guide or your locally "
733
734
  "installed skills."
@@ -543,8 +543,9 @@ class AutomationConfigTools:
543
543
  identifier: Annotated[
544
544
  str | None,
545
545
  Field(
546
- description="Automation entity_id or unique_id for updates. "
547
- "Required for python_transform. Omit to create new automation with generated unique_id.",
546
+ description="Target automation entity_id or HA config 'id' (unique_id). "
547
+ "Omit for creation with a generated ID. Values such as 'new' are literal IDs, not placeholders. "
548
+ "Required for python_transform.",
548
549
  default=None,
549
550
  ),
550
551
  ] = None,
@@ -567,7 +568,8 @@ class AutomationConfigTools:
567
568
  Field(
568
569
  description="Config hash from ha_config_get_automation for optimistic locking. "
569
570
  "REQUIRED for python_transform (validates automation unchanged). "
570
- "Optional for config updates (validates before full replacement if provided).",
571
+ "Required when a config update changes an existing automation's alias. "
572
+ "Otherwise optional for config updates (validates before full replacement if provided).",
571
573
  ),
572
574
  ] = None,
573
575
  take_control_of_blueprint: Annotated[
@@ -673,7 +675,11 @@ class AutomationConfigTools:
673
675
  - Add trigger: python_transform="config['triggers'].append({'trigger': 'state', 'entity_id': 'binary_sensor.motion', 'to': 'on'})"
674
676
  - Remove last action: python_transform="config['actions'].pop()"
675
677
 
676
- Creates a new automation (if identifier omitted) or updates existing automation with provided configuration.
678
+ Omit identifier and config['id'] to create a new automation with a generated ID.
679
+ A previously unused raw ID can also create an automation with that specific ID.
680
+ Reusing an identifier targets the same automation, even if the alias changes.
681
+ To intentionally rename or replace it, first read it with ha_config_get_automation
682
+ and pass its config_hash. A changed alias without that hash is rejected before writing.
677
683
 
678
684
  AUTOMATION TYPES:
679
685
 
@@ -732,8 +738,10 @@ class AutomationConfigTools:
732
738
  })
733
739
 
734
740
  Update existing automation:
741
+ current = ha_config_get_automation(identifier="automation.morning_routine")
735
742
  ha_config_set_automation(
736
743
  identifier="automation.morning_routine",
744
+ config_hash=current["config_hash"],
737
745
  config={
738
746
  "alias": "Updated Morning Routine",
739
747
  "triggers": [{"trigger": "time", "at": "06:30:00"}],
@@ -900,15 +908,18 @@ class AutomationConfigTools:
900
908
  # (trigger -> triggers, action -> actions, condition -> conditions).
901
909
  config_dict = _normalize_automation_config(config_dict)
902
910
 
903
- # Optional hash check for full config updates. When it runs it
904
- # resolves ``identifier`` to the storage key — thread that through so
905
- # the upsert doesn't re-resolve (issue #1813 Phase 0). Stays None on
906
- # the no-hash update path (raw identifier resolved once, in upsert).
911
+ # Both the hash check and alias guard read the resolved storage key.
912
+ # Reuse it for the write to avoid a second entity-ID lookup (#1813).
913
+ # Creation and responses without an id retain the existing fallback.
907
914
  resolved_id: str | None = None
908
915
  if identifier and config_hash:
909
916
  _, resolved_id = await self._fetch_and_verify_hash(
910
917
  identifier, config_hash, "set"
911
918
  )
919
+ elif identifier:
920
+ resolved_id = await self._guard_alias_replacement(
921
+ identifier, config_dict
922
+ )
912
923
 
913
924
  self._validate_required_fields(config_dict, identifier)
914
925
  bp_warnings = _check_best_practices(config_dict)
@@ -1014,11 +1025,11 @@ class AutomationConfigTools:
1014
1025
  """Upsert, threading a pre-resolved unique_id when available.
1015
1026
 
1016
1027
  When ``resolved_id`` is set the caller already resolved ``identifier``
1017
- (via ``_fetch_and_verify_hash``); pass it with ``_resolved=True`` so the
1028
+ (via the hash check or alias guard); pass it with ``_resolved=True`` so the
1018
1029
  REST client skips the redundant entity_id→unique_id lookup (issue #1813
1019
1030
  Phase 0). Otherwise fall back to the raw ``identifier`` and let the REST
1020
- client resolve — the create path (``identifier is None``) and the
1021
- no-hash update path both land here unchanged.
1031
+ client resolve — creation and fetched configs without an id use this
1032
+ fallback.
1022
1033
  """
1023
1034
  result: dict[str, Any]
1024
1035
  if resolved_id is not None:
@@ -1205,8 +1216,8 @@ class AutomationConfigTools:
1205
1216
  more: Home Assistant goes on counting the automation as a user of that
1206
1217
  blueprint until it is removed, so there is no release to wait for.
1207
1218
 
1208
- ``resolved_id`` (set only when the optional hash check pre-resolved
1209
- ``identifier``) is threaded to the upsert so it skips the redundant
1219
+ ``resolved_id`` (set when the hash check or alias guard fetched an id)
1220
+ is threaded to the upsert so it skips the redundant
1210
1221
  re-resolve; None falls back to resolving inside the REST client.
1211
1222
  """
1212
1223
  result = await self._upsert_automation(config_dict, identifier, resolved_id)
@@ -1309,6 +1320,44 @@ class AutomationConfigTools:
1309
1320
  and entry["entity_id"].startswith("automation.")
1310
1321
  ][:10]
1311
1322
 
1323
+ async def _guard_alias_replacement(
1324
+ self, identifier: str, config: dict[str, Any]
1325
+ ) -> str | None:
1326
+ """Require a prior read before replacing a differently named automation.
1327
+
1328
+ Return the fetched storage id for reuse by the write, when available.
1329
+ This catches sequential ID reuse. The REST read and write are separate
1330
+ requests, so it does not provide atomic protection against other writers.
1331
+ """
1332
+ if "alias" not in config:
1333
+ return None # Required-field validation supplies the actionable error.
1334
+ try:
1335
+ current = await self._client.get_automation_config(identifier)
1336
+ except HomeAssistantAPIError as exc:
1337
+ if exc.status_code == 404 and not identifier.startswith("automation."):
1338
+ return None # Preserve intentional creation with a caller-chosen ID.
1339
+ # Entity-ID resolution also maps lookup failures to 404. Never retry
1340
+ # those as creation: a recovered lookup could overwrite an unchecked target.
1341
+ raise
1342
+ if current.get("alias") != config["alias"]:
1343
+ raise_tool_error(
1344
+ create_error_response(
1345
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
1346
+ f"Automation {identifier!r} already exists as {current.get('alias')!r}. "
1347
+ f"This write would replace it with {config['alias']!r}. Nothing was written.",
1348
+ context={"identifier": identifier, "parameter": "config_hash"},
1349
+ suggestions=[
1350
+ "Omit identifier and remove config['id'] to create a separate automation.",
1351
+ (
1352
+ "For an intentional rename or replacement, call ha_config_get_automation "
1353
+ "for this identifier, inspect its config, and resubmit with its config_hash."
1354
+ ),
1355
+ ],
1356
+ )
1357
+ )
1358
+ raw_id = current.get("id")
1359
+ return str(raw_id) if raw_id is not None else None
1360
+
1312
1361
  async def _raise_automation_not_found(self, identifier: str) -> None:
1313
1362
  """Raise a structured RESOURCE_NOT_FOUND ToolError for a missing automation.
1314
1363
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2605
3
+ Version: 8.4.3.dev2608
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