ha-mcp-dev 8.4.0.dev2496__tar.gz → 8.4.0.dev2499__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 (304) hide show
  1. {ha_mcp_dev-8.4.0.dev2496/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.0.dev2499}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/__main__.py +1 -1
  4. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/server.py +1 -1
  5. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/README.md +92 -8
  6. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/best_practice_result.py +3 -2
  7. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/bulk_selector.py +2 -2
  8. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/error_log_parsing.py +3 -2
  9. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/log_common.py +4 -4
  10. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/log_sources.py +2 -1
  11. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/log_sources_supervisor.py +2 -1
  12. ha_mcp_dev-8.4.0.dev2499/src/ha_mcp/tools/radio/__init__.py +7 -0
  13. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_config_dashboards.py +3 -3
  14. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_logs.py +2 -1
  15. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_service.py +4 -4
  16. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_system.py +1 -1
  17. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_utility.py +2 -1
  18. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/util_helpers.py +2 -2
  19. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  20. ha_mcp_dev-8.4.0.dev2496/src/ha_mcp/tools/radio/__init__.py +0 -6
  21. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/LICENSE +0 -0
  22. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/MANIFEST.in +0 -0
  23. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/README.md +0 -0
  24. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/setup.cfg +0 -0
  25. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/__init__.py +0 -0
  26. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_pypi_marker +0 -0
  27. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_rich_compat.py +0 -0
  28. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/__init__.py +0 -0
  29. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/requirements.txt +0 -0
  30. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  31. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  32. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  33. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  34. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  35. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  36. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  37. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  38. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  39. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  40. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  41. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  42. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  43. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  44. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  45. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  46. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  47. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  48. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  49. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  50. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  51. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  52. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  53. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  54. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  55. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  56. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  57. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  58. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  59. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  60. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  61. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  62. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  63. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  64. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  65. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  66. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  67. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  68. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  69. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  70. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  71. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  72. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  73. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  74. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  75. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  76. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  77. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  78. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  79. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  80. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  81. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  82. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  83. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  84. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  85. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  86. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/_version.py +0 -0
  87. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/auth/__init__.py +0 -0
  88. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/auth/consent_form.py +0 -0
  89. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/auth/oidc_compat.py +0 -0
  90. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/auth/provider.py +0 -0
  91. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/backup_manager.py +0 -0
  92. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/browser_landing.py +0 -0
  93. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/client/__init__.py +0 -0
  94. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/client/rest_client.py +0 -0
  95. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/client/supervisor_client.py +0 -0
  96. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/client/websocket_client.py +0 -0
  97. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/client/websocket_listener.py +0 -0
  98. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/config.py +0 -0
  99. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  100. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  101. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  102. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  103. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  104. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  105. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/errors.py +0 -0
  106. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  107. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/llm_exposure.py +0 -0
  108. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/log_filters.py +0 -0
  109. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/__init__.py +0 -0
  110. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/approval_queue.py +0 -0
  111. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/editing.py +0 -0
  112. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/evaluator.py +0 -0
  113. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/handlers.py +0 -0
  114. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/middleware.py +0 -0
  115. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/model.py +0 -0
  116. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/persistence.py +0 -0
  117. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/policy/value_sources.py +0 -0
  118. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/py.typed +0 -0
  119. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/read_only.py +0 -0
  120. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/redaction.py +0 -0
  121. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/renamed_tools.py +0 -0
  122. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  123. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  124. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  125. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  126. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  127. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  128. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  129. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  130. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  131. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  132. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  134. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  135. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  136. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  137. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  138. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  139. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  140. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  141. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  142. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  143. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  144. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  145. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  146. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  147. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  148. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  149. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  150. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  151. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  152. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  153. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  154. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  155. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  156. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  157. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  158. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  159. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  160. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  161. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  162. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  163. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/__init__.py +0 -0
  164. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  165. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  166. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  167. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  168. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  169. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  170. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  171. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  172. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  173. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  174. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_theme.py +0 -0
  175. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  176. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  177. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  178. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  179. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  180. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  181. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  182. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  183. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  184. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  185. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  186. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  187. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  188. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  189. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  190. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/settings.css +0 -0
  191. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/settings.html +0 -0
  192. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/settings_ui/settings.js +0 -0
  193. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/smoke_test.py +0 -0
  194. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  195. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/strict_bps.py +0 -0
  196. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/__init__.py +0 -0
  197. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/auto_backup.py +0 -0
  198. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/backup.py +0 -0
  199. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  200. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  201. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_api.py +0 -0
  202. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_config_entries.py +0 -0
  203. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_config_reads.py +0 -0
  204. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_devices.py +0 -0
  205. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_registries.py +0 -0
  206. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  207. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  208. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  209. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  210. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  211. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  212. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  213. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  214. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/device_control.py +0 -0
  215. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/hacs_registration.py +0 -0
  216. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/helpers.py +0 -0
  217. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  218. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/radio/base.py +0 -0
  219. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/radio/matter.py +0 -0
  220. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/radio/thread.py +0 -0
  221. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  222. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/radio/zwave.py +0 -0
  223. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/reference_validator.py +0 -0
  224. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/registry.py +0 -0
  225. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  226. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  227. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  228. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  229. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  230. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  231. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  232. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  233. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  234. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  235. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  236. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  237. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_addons.py +0 -0
  238. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_areas.py +0 -0
  239. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  240. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  241. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  242. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_calendar.py +0 -0
  243. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_camera.py +0 -0
  244. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_categories.py +0 -0
  245. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_code.py +0 -0
  246. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  247. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  248. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  249. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  250. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  251. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_dev.py +0 -0
  252. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_energy.py +0 -0
  253. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_entities.py +0 -0
  254. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  255. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_groups.py +0 -0
  256. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_hacs.py +0 -0
  257. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_history.py +0 -0
  258. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_integrations.py +0 -0
  259. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_labels.py +0 -0
  260. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_radio.py +0 -0
  261. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_registry.py +0 -0
  262. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_resources.py +0 -0
  263. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_search.py +0 -0
  264. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  265. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_services.py +0 -0
  266. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_themes.py +0 -0
  267. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_todo.py +0 -0
  268. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_traces.py +0 -0
  269. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_updates.py +0 -0
  270. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  271. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  272. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  273. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/tools_zones.py +0 -0
  274. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/tools/validation_middleware.py +0 -0
  275. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/transforms/__init__.py +0 -0
  276. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/transforms/categorized_search.py +0 -0
  277. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  278. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/transport_security.py +0 -0
  279. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/update_check.py +0 -0
  280. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/__init__.py +0 -0
  281. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/config_hash.py +0 -0
  282. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/config_write_lock.py +0 -0
  283. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/data_paths.py +0 -0
  284. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/domain_handlers.py +0 -0
  285. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/entity_membership.py +0 -0
  286. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  287. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  288. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/operation_manager.py +0 -0
  289. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/python_sandbox.py +0 -0
  290. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/skill_loader.py +0 -0
  291. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/utils/usage_logger.py +0 -0
  292. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/visibility/__init__.py +0 -0
  293. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/visibility/enforcement.py +0 -0
  294. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/visibility/model.py +0 -0
  295. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/visibility/persistence.py +0 -0
  296. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp/visibility/resolver.py +0 -0
  297. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  298. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  299. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  300. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  301. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  302. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/tests/__init__.py +0 -0
  303. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/tests/test_constants.py +0 -0
  304. {ha_mcp_dev-8.4.0.dev2496 → ha_mcp_dev-8.4.0.dev2499}/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.0.dev2496
3
+ Version: 8.4.0.dev2499
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.0.dev2496"
7
+ version = "8.4.0.dev2499"
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
@@ -1040,7 +1040,7 @@ def _is_running_in_container() -> bool:
1040
1040
  so the bind host alone can't tell a loopback-only deployment from a
1041
1041
  LAN-reachable one — the default-path warning would be a false positive
1042
1042
  for every container. Container deployments are hardened through the
1043
- published guidance instead (AGENTS.md -> Docker; the add-on
1043
+ published guidance instead (docs/agents/development.md -> Docker; the add-on
1044
1044
  auto-generates a secret path).
1045
1045
  """
1046
1046
  # Docker writes /.dockerenv; Podman writes /run/.containerenv.
@@ -1719,7 +1719,7 @@ class HomeAssistantSmartMCPServer:
1719
1719
  predicates honest. Tier 2/3 in degraded mode raise so the
1720
1720
  caller gets a clear error instead of a confusing empty result.
1721
1721
  Tool-level failures raise ``ToolError`` (via
1722
- ``raise_tool_error``) per AGENTS.md, so clients see
1722
+ ``raise_tool_error``) per .gemini/styleguide.md, so clients see
1723
1723
  ``isError=true`` rather than a success payload with an
1724
1724
  embedded error.
1725
1725
  """
@@ -16,14 +16,18 @@ cross-surface wording cannot drift.
16
16
 
17
17
  ## Adding a language
18
18
 
19
- A language ships on **all four** translated surfaces or not at all, and one
20
- Home Assistant language code names every file:
19
+ A language ships on **all four** translated surfaces or not at all, with one
20
+ Home Assistant language code used across every corresponding file:
21
21
 
22
22
  - `src/ha_mcp/settings_ui/locales/<code>.json` (this directory; authored)
23
23
  - `custom_components/ha_mcp_tools/translations/<code>.json` (authored)
24
24
  - `homeassistant-addon/translations/<code>.yaml` (generated)
25
25
  - `homeassistant-addon-dev/translations/<code>.yaml` (generated)
26
26
 
27
+ <!-- Keep the following marker line intact; locale parity tests parse it. -->
28
+ The current code set `cs`, `de`, `eo`, `es`, `fr`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tlh`, and `zh-Hans` names every file:
29
+ the parity test keeps this documentation aligned with the shipped catalogs.
30
+
27
31
  Klingon (`tlh`) is the one best-effort exception. Its catalogs may be edited
28
32
  manually and still ship, but the automatic translation planner never queues
29
33
  them. Missing strings use English fallback; invalid or stale Klingon catalogs
@@ -57,10 +61,9 @@ surface resting on a single anchor loses its register in exactly that run —
57
61
  `test_component_samples_survive_their_own_anchor_being_queued` pins the
58
62
  survival. To fill them in your own PR instead, run
59
63
  `scripts/translate_locales.py` yourself and review its output like any
60
- other diff. Also add the new code to the locale list in the repository-root
61
- `AGENTS.md`
62
- § Translations — that list is pinned by
63
- `test_agents_md_lists_every_shipped_locale`. The engine reads the target
64
+ other diff. Also add the new code to the current code set near the top of this
65
+ guide; `test_locale_readme_lists_every_shipped_locale` pins that list to the
66
+ shipped catalogs. The engine reads the target
64
67
  language from `meta.native_name`, so any language an LLM can write — natural
65
68
  or constructed — needs no pipeline change.
66
69
 
@@ -109,6 +112,10 @@ In PR CI (ungated — `tests/src/unit/test_locale_parity.py` unless another file
109
112
  is named):
110
113
 
111
114
  - Every surface carries the same set of language codes.
115
+ - Settings UI `messages` may omit keys because English is the per-key
116
+ fallback, but a locale may not carry a key absent from `en.json`: nothing
117
+ can render it. `tool_groups` and `tools` must instead match the renderable
118
+ keys exactly.
112
119
  - Every decided `Decision` outcome (all but `pending`) and every
113
120
  `PredicateOp` operator has a word in every catalog, non-blank — and in every
114
121
  catalog but `en.json` not still spelled the way the backend does
@@ -148,9 +155,14 @@ In the post-merge `locale-sync.yml` workflow only (the same files, gated behind
148
155
  these, and the daily sync owes them afterwards):
149
156
 
150
157
  - `tool_groups` and `tools` name exactly the renderable groups and tools.
158
+ The check parses the registered tool set from source rather than trusting
159
+ generated `tools.json`, so a broken generator cannot validate its own stale
160
+ output.
151
161
  - At most 5% of this catalog's `messages`, and 5% of its `tools` texts, may be
152
- byte-identical to English or missing outright; the component catalogs allow
153
- 15%, because they carry product names as keys of their own. A single tool
162
+ byte-identical to English or missing outright. The 5% ceiling also applies
163
+ independently to each generated app projection computed from the canonical
164
+ store. Component catalogs allow 15%, because they carry product names as
165
+ keys of their own. A single tool
154
166
  whose `title` *and* `description` are both still English fails by name
155
167
  however small the share.
156
168
  - The English each translation was written against is hashed in
@@ -159,3 +171,75 @@ these, and the daily sync owes them afterwards):
159
171
  `scripts/translate_locales.py` retranslates exactly those keys and repins
160
172
  the baseline. Adding a language does not change any English source, so no
161
173
  baseline regeneration is needed for it.
174
+ `test_locale_sync_gate_shape.py` pins this gated workflow wiring. A successful
175
+ `locale-sync.yml` run pushes the regenerated catalogs straight to `master`
176
+ with the release App credential and can include everything merged since the
177
+ previous run.
178
+
179
+ ## English changes and retranslation
180
+
181
+ An English change is a one-place edit:
182
+
183
+ - Settings messages: `en.json` `messages`.
184
+ - Tool title or summary: the tool definition; English `tools` is intentionally
185
+ empty in `en.json`.
186
+ - Component config flow: `strings.json` plus component `en.json`.
187
+
188
+ After a canonical app-option or feature string changes, run
189
+ `python scripts/generate_locales.py` so the generated projections match. A
190
+ pull request does not owe machine translations. The daily post-merge
191
+ `locale-sync.yml` compares English-source hashes in
192
+ `tests/src/unit/locale_source_baseline.json`, translates changed or missing
193
+ keys through the configured Gemini-compatible endpoint, validates placeholders
194
+ and markup, regenerates projections, and repins the baseline.
195
+
196
+ To supply a human translation in the same pull request, edit the authored
197
+ catalogs and run `python scripts/update_locale_baseline.py`. The baseline is
198
+ what tells the next sync that the translation covers the current English;
199
+ without that repin, the sync will correctly treat the value as stale and
200
+ replace it. Running `scripts/translate_locales.py` locally also repins after
201
+ its machine-generated pass.
202
+
203
+ A locale pull request that remained open while its English source changed needs
204
+ special review. Compare its affected values with that surface's current English
205
+ before merging. An old translated value can still have the right key and a
206
+ translated-looking value, so ordinary parity and untranslated-share checks
207
+ cannot detect the stale meaning. Repinning is not a repair because it blesses
208
+ the stale value; delete or update the value so the planner queues the correct
209
+ work. Issue #1993 is the precedent: an English policy changed from ALL-match
210
+ to ANY-match while one locale still asserted the opposite. Numbers and
211
+ code-like identifiers are the cheap signal because rewording often moves one;
212
+ `test_translations_keep_english_numbers_and_identifiers` checks them across
213
+ all three authored surfaces, but cannot replace semantic review.
214
+
215
+ Tool docstring summaries are English translation sources. Editing a summary
216
+ queues its translated title/description in every locale. `Field(description=)`
217
+ text is not in this baseline. For a feature-gated tool, the user-facing
218
+ `FEATURE_GATED_TOOLS` stub is the translation source; changing only the
219
+ parsed docstring holds that key stale until a human confirms the stub remains
220
+ accurate and runs `python scripts/update_locale_baseline.py`.
221
+
222
+ ## Sync failures and recovery
223
+
224
+ The translation workflow uses conservative pacing and retries transient 429,
225
+ 5xx, and timeout failures with backoff. A repeatedly failing request records
226
+ its strings as failed and continues; two dead batches stop the run before it
227
+ burns the remaining quota.
228
+
229
+ A partial run commits completed translations plus
230
+ `tests/src/unit/locale_sync_progress.json`. Rerun the workflow or wait for the
231
+ next daily run; it resumes from that file. Only a fully successful run repins
232
+ the baseline and removes progress, so incomplete translation work remains
233
+ visible as a red sync.
234
+
235
+ When the engine is unavailable, a human may translate the dry-run list, run
236
+ `python scripts/generate_locales.py` and
237
+ `python scripts/update_locale_baseline.py`, and open a normal pull request.
238
+ Human edits win because the machine touches only missing or stale strings. The
239
+ provider boundary is `_call_gemini`, configured by `GEMINI_API_URL`,
240
+ `GEMINI_MODEL`, and `GEMINI_API_KEY`.
241
+
242
+ The Webhook Proxy app and its bundled integration remain English-only by
243
+ decision. Their tests intentionally reject an accidental partial catalog.
244
+ Any other new catalog directory fails until it is translated across every
245
+ required surface or explicitly added to the English-only decision.
@@ -1,8 +1,9 @@
1
1
  """Warning accumulator and skill-reference routing for the best-practice checks.
2
2
 
3
3
  Split out of :mod:`best_practice_checker` so a check module can emit a warning
4
- without importing the checker back (AGENTS.md - Module Size). Nothing here
5
- inspects a config; it only carries warnings and builds the ' See ...' suffix.
4
+ without importing the checker back (see `.gemini/styleguide.md` § Tool
5
+ Consolidation and Module Size). Nothing here inspects a config; it only carries
6
+ warnings and builds the ' See ...' suffix.
6
7
  """
7
8
 
8
9
  _SKILL_URI_PREFIX = "skill://home-assistant-best-practices/references"
@@ -837,8 +837,8 @@ async def resolve_bulk_selector(
837
837
  hidden_count = len(directly_hidden | hidden_selected | excluded_and_hidden)
838
838
  warnings: list[str] = list(visibility_warnings)
839
839
  if hidden_count:
840
- # AGENTS.md "Return Values": a degraded result belongs in the
841
- # top-level warnings list, not just a bare count the caller has no
840
+ # .gemini/styleguide.md "Tool Tags and Return Values": a degraded
841
+ # result belongs in top-level warnings, not a bare count the caller has no
842
842
  # actionable text for. `counts.hidden` alone cannot tell a user
843
843
  # "three entities you wanted controlled were skipped" from "your
844
844
  # exclusion was redundant" -- this at least names that something
@@ -10,8 +10,9 @@ It also owns the window/pagination unit the two response paths share: how
10
10
  large a window one fetch asks for, and how the response describes where that
11
11
  window sat and how to read further back.
12
12
 
13
- Split out of ``tools_utility`` under AGENTS.md § Module Size: neither the
14
- parsing nor the window arithmetic touches the client or the tool plumbing.
13
+ Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
14
+ Consolidation and Module Size: neither parsing nor window arithmetic touches
15
+ the client or tool plumbing.
15
16
  """
16
17
 
17
18
  import re
@@ -1,10 +1,10 @@
1
1
  """Shared plumbing for the ``ha_get_logs`` log sources.
2
2
 
3
3
  Constants, parameter coercion and the cross-source warning rules that every
4
- source uses, with no dependency on any particular one of them. Split out of
5
- ``tools_utility`` under AGENTS.md § Module Size; the per-source fetchers live in
6
- ``log_sources`` and ``log_sources_supervisor``, and the tool surface in
7
- ``tools_logs``.
4
+ source uses, with no dependency on any particular one. Split from
5
+ ``tools_utility`` under `.gemini/styleguide.md` § Tool Consolidation and
6
+ Module Size; per-source fetchers live in ``log_sources`` and
7
+ ``log_sources_supervisor``, and the tool surface in ``tools_logs``.
8
8
  """
9
9
 
10
10
  import re
@@ -6,7 +6,8 @@ alone: every fetcher here is a thin shell around one client call, and the
6
6
  dispatch, validation and tool registration they share live with the host class.
7
7
  The Supervisor-backed sources are in ``log_sources_supervisor``.
8
8
 
9
- Split out of ``tools_utility`` under AGENTS.md § Module Size.
9
+ Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
10
+ Consolidation and Module Size.
10
11
  """
11
12
 
12
13
  import logging
@@ -5,7 +5,8 @@ Separate from ``log_sources`` because these two reach Home Assistant through
5
5
  Supervisor rather than Core, and carry the whole token/role error vocabulary
6
6
  that follows from it. Mixed into ``LogTools`` (``tools_logs``).
7
7
 
8
- Split out of ``tools_utility`` under AGENTS.md § Module Size.
8
+ Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
9
+ Consolidation and Module Size.
9
10
  """
10
11
 
11
12
  from typing import Any, Literal, NoReturn
@@ -0,0 +1,7 @@
1
+ """Per-radio handler modules for the ``ha_manage_radio`` tool.
2
+
3
+ Each radio (Z-Wave, Zigbee/ZHA, Matter, Thread) gets its own handler module so
4
+ no single file spans every protocol (see `.gemini/styleguide.md` § Tool
5
+ Consolidation and Module Size). The ``tools_radio`` module wires them
6
+ together behind one MCP tool.
7
+ """
@@ -2200,9 +2200,9 @@ class DashboardConfigTools:
2200
2200
 
2201
2201
  config_hash: str | None = compute_config_hash(config)
2202
2202
 
2203
- # Warn-don't-truncate (AGENTS.md Return Values): the walker covers
2204
- # cards / card / custom_fields / states containers and stops at
2205
- # the depth bound, so neither a depth-truncated search nor a
2203
+ # Warn-don't-truncate (.gemini/styleguide.md Tool Tags and Return
2204
+ # Values): the walker covers cards / card / custom_fields / states and
2205
+ # stops at the depth bound, so neither a depth-truncated search nor a
2206
2206
  # search over a dashboard carrying a non-traversed child-bearing
2207
2207
  # shape may read as an authoritative complete result. Disclosure
2208
2208
  # keys off the *presence* of such a shape (collected during the
@@ -5,7 +5,8 @@ registration. The sources themselves are mixed in from ``log_sources`` (Core)
5
5
  and ``log_sources_supervisor`` (Supervisor), their shared plumbing lives in
6
6
  ``log_common``, and the error-log window arithmetic in ``error_log_parsing``.
7
7
 
8
- Split out of ``tools_utility`` under AGENTS.md § Module Size.
8
+ Split out of ``tools_utility`` under `.gemini/styleguide.md` § Tool
9
+ Consolidation and Module Size.
9
10
  """
10
11
 
11
12
  from typing import Annotated, Any, Literal
@@ -564,8 +564,8 @@ def _attach_resolution_to_response(
564
564
  """Attach ``resolution.summary()`` to a response, surfacing its warnings
565
565
  at the top level.
566
566
 
567
- Per AGENTS.md "Return Values", ``warnings`` is always a top-level
568
- ``list[str]``, never nested inside another field.
567
+ Per .gemini/styleguide.md "Tool Tags and Return Values", ``warnings``
568
+ is always a top-level ``list[str]``, never nested inside another field.
569
569
  ``resolution.summary()`` nests its own warnings (e.g. "N entities were
570
570
  hidden") under ``resolution`` for internal cohesion, so this pops them
571
571
  back out. ``response`` may already carry dispatch-time warnings (e.g.
@@ -2296,8 +2296,8 @@ class ServiceTools:
2296
2296
  """Resolve one structural selector and, unless ``dry_run``, dispatch it.
2297
2297
 
2298
2298
  Split out of ``ha_bulk_control`` to keep that tool's own McCabe
2299
- complexity under the repo's C901 threshold (AGENTS.md — no per-file
2300
- exemptions).
2299
+ complexity under the repo's C901 threshold
2300
+ (docs/agents/development.md — no per-file exemptions).
2301
2301
  """
2302
2302
  if action is None:
2303
2303
  raise_tool_error(
@@ -1970,7 +1970,7 @@ class SystemTools:
1970
1970
  # A ToolError (incl. one re-raised by _reraise_if_fatal) carries the
1971
1971
  # MCP isError contract — let it reach ha_get_system_health's own
1972
1972
  # ``except ToolError: raise`` instead of being demoted to a section
1973
- # error string here (AGENTS.md error-handling guard pattern).
1973
+ # error string here (.gemini/styleguide.md structured-error guard pattern).
1974
1974
  raise
1975
1975
  except Exception as e:
1976
1976
  _reraise_if_fatal(e)
@@ -2,7 +2,8 @@
2
2
  Utility tools for Home Assistant MCP server.
3
3
 
4
4
  Template evaluation. The log tools that used to share this module are in
5
- ``tools_logs`` and its helper modules, split out under AGENTS.md § Module Size.
5
+ ``tools_logs`` and its helpers, split out under `.gemini/styleguide.md` §
6
+ Tool Consolidation and Module Size.
6
7
  """
7
8
 
8
9
  import logging
@@ -1628,8 +1628,8 @@ async def apply_entity_category(
1628
1628
 
1629
1629
  Updates result_dict in-place: sets ``'category'`` on success, or appends
1630
1630
  to the top-level ``'warnings'`` list on failure. The list shape mirrors
1631
- the canonical response contract documented in ``AGENTS.md`` →
1632
- *Writing MCP Tools → Return Values*.
1631
+ the canonical response contract documented in ``.gemini/styleguide.md`` →
1632
+ *Tool Tags and Return Values*.
1633
1633
 
1634
1634
  Args:
1635
1635
  client: HomeAssistantClient instance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.0.dev2496
3
+ Version: 8.4.0.dev2499
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
@@ -1,6 +0,0 @@
1
- """Per-radio handler modules for the ``ha_manage_radio`` tool.
2
-
3
- Each radio (Z-Wave, Zigbee/ZHA, Matter, Thread) gets its own handler module so
4
- no single file spans every protocol (keeps modules focused per AGENTS.md). The
5
- ``tools_radio`` module wires them together behind one MCP tool.
6
- """