ha-mcp-dev 8.3.0.dev2418__tar.gz → 8.3.0.dev2422__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 (279) hide show
  1. {ha_mcp_dev-8.3.0.dev2418/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.3.0.dev2422}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/pyproject.toml +3 -2
  3. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/rest_client.py +42 -40
  4. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/supervisor_client.py +13 -22
  5. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/websocket_client.py +13 -5
  6. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow.py +17 -2
  7. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_form.py +441 -29
  8. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_walker.py +55 -7
  9. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_reconfigure.py +8 -1
  10. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_addons.py +824 -452
  11. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_helpers.py +12 -1
  12. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_dev.py +48 -29
  13. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_integrations.py +14 -2
  14. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  15. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/LICENSE +0 -0
  16. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/MANIFEST.in +0 -0
  17. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/README.md +0 -0
  18. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/setup.cfg +0 -0
  19. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/__init__.py +0 -0
  20. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/__main__.py +0 -0
  21. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_pypi_marker +0 -0
  22. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_rich_compat.py +0 -0
  23. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/__init__.py +0 -0
  24. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/requirements.txt +0 -0
  25. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  26. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  27. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  28. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  29. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  30. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  31. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  32. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  33. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  34. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  35. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  36. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  37. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  38. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  39. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  40. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  41. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  42. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  43. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  44. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  45. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  46. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  47. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  48. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  49. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  50. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  51. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  52. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  53. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  54. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  55. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  56. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  57. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  58. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  59. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  60. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  61. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  62. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  63. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  64. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  65. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  66. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  67. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  68. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  69. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  70. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  71. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  72. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  73. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  74. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  75. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  76. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  77. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  78. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  79. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  80. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  81. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/_version.py +0 -0
  82. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/__init__.py +0 -0
  83. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/consent_form.py +0 -0
  84. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/oidc_compat.py +0 -0
  85. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/auth/provider.py +0 -0
  86. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/backup_manager.py +0 -0
  87. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/browser_landing.py +0 -0
  88. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/__init__.py +0 -0
  89. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/client/websocket_listener.py +0 -0
  90. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/config.py +0 -0
  91. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  92. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  93. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  94. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  95. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  96. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  97. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/errors.py +0 -0
  98. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  99. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/llm_exposure.py +0 -0
  100. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/__init__.py +0 -0
  101. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/approval_queue.py +0 -0
  102. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/editing.py +0 -0
  103. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/evaluator.py +0 -0
  104. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/handlers.py +0 -0
  105. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/middleware.py +0 -0
  106. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/model.py +0 -0
  107. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/persistence.py +0 -0
  108. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/policy/value_sources.py +0 -0
  109. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/py.typed +0 -0
  110. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/read_only.py +0 -0
  111. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/redaction.py +0 -0
  112. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/renamed_tools.py +0 -0
  113. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  114. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  115. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  116. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  117. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  118. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  119. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  120. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  121. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  122. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  123. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  124. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  125. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  126. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  127. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  128. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  129. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  130. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  131. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  132. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  133. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  134. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  135. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  136. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  137. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  138. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/server.py +0 -0
  139. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/__init__.py +0 -0
  140. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  141. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  142. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  143. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  144. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  145. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  146. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  147. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  148. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  149. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_theme.py +0 -0
  150. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  151. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  152. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  153. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  154. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  155. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  156. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  157. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  158. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  159. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  160. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  161. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  162. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  163. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  164. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  165. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.css +0 -0
  166. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.html +0 -0
  167. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/settings_ui/settings.js +0 -0
  168. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/smoke_test.py +0 -0
  169. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  170. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/strict_bps.py +0 -0
  171. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/__init__.py +0 -0
  172. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/auto_backup.py +0 -0
  173. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/backup.py +0 -0
  174. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  175. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_result.py +0 -0
  176. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  177. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/bulk_selector.py +0 -0
  178. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_api.py +0 -0
  179. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_config_entries.py +0 -0
  180. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_config_reads.py +0 -0
  181. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_devices.py +0 -0
  182. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_registries.py +0 -0
  183. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  184. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  185. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  186. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  187. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/device_control.py +0 -0
  188. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  189. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/hacs_registration.py +0 -0
  190. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/helpers.py +0 -0
  191. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  192. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/__init__.py +0 -0
  193. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/base.py +0 -0
  194. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/matter.py +0 -0
  195. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/thread.py +0 -0
  196. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  197. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/radio/zwave.py +0 -0
  198. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/reference_validator.py +0 -0
  199. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/registry.py +0 -0
  200. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  201. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  202. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  203. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  204. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  205. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  206. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  207. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  208. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  209. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  210. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  211. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_areas.py +0 -0
  212. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  213. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  214. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  215. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_calendar.py +0 -0
  216. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_camera.py +0 -0
  217. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_categories.py +0 -0
  218. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_code.py +0 -0
  219. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  220. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  221. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  222. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  223. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  224. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_energy.py +0 -0
  225. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_entities.py +0 -0
  226. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  227. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_groups.py +0 -0
  228. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_hacs.py +0 -0
  229. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_history.py +0 -0
  230. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_labels.py +0 -0
  231. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_radio.py +0 -0
  232. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_registry.py +0 -0
  233. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_resources.py +0 -0
  234. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_search.py +0 -0
  235. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  236. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_service.py +0 -0
  237. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_services.py +0 -0
  238. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_system.py +0 -0
  239. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_themes.py +0 -0
  240. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_todo.py +0 -0
  241. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_traces.py +0 -0
  242. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_updates.py +0 -0
  243. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_utility.py +0 -0
  244. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  245. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  246. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  247. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/tools_zones.py +0 -0
  248. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/util_helpers.py +0 -0
  249. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/tools/validation_middleware.py +0 -0
  250. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/__init__.py +0 -0
  251. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/categorized_search.py +0 -0
  252. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  253. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/transport_security.py +0 -0
  254. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/update_check.py +0 -0
  255. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/__init__.py +0 -0
  256. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/config_hash.py +0 -0
  257. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/config_write_lock.py +0 -0
  258. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/data_paths.py +0 -0
  259. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/domain_handlers.py +0 -0
  260. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/entity_membership.py +0 -0
  261. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  262. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  263. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/operation_manager.py +0 -0
  264. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/python_sandbox.py +0 -0
  265. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/skill_loader.py +0 -0
  266. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/utils/usage_logger.py +0 -0
  267. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/__init__.py +0 -0
  268. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/enforcement.py +0 -0
  269. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/model.py +0 -0
  270. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/persistence.py +0 -0
  271. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp/visibility/resolver.py +0 -0
  272. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  273. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  274. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  275. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  276. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  277. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/tests/__init__.py +0 -0
  278. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/tests/test_constants.py +0 -0
  279. {ha_mcp_dev-8.3.0.dev2418 → ha_mcp_dev-8.3.0.dev2422}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.3.0.dev2418
3
+ Version: 8.3.0.dev2422
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.3.0.dev2418"
7
+ version = "8.3.0.dev2422"
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
@@ -256,8 +256,9 @@ markers = [
256
256
  "error_handling: error handling and edge case tests",
257
257
  "cleanup: tests that create entities needing cleanup",
258
258
  "performance: performance measurement and regression tests",
259
- "external_only: skips on HAOS inaddon tier (server runs in a separate addon container, so in-process env monkeypatching doesn't reach it)",
259
+ "external_only: in-process-server tiers only; skips inaddon, stdio, container-embedded, and HAOS-embedded servers",
260
260
  "inaddon_only: only runs on HAOS inaddon tier",
261
+ "beta_haos_only: beta HAOS image lanes with Supervisor/Core version expectations configured",
261
262
  ]
262
263
  asyncio_mode = "auto"
263
264
 
@@ -704,8 +704,9 @@ class HomeAssistantClient:
704
704
  async def get_addon_logs(self, slug: str, lines: int | None = None) -> str:
705
705
  """Fetch an add-on's container logs.
706
706
 
707
- Branch on ``is_running_in_addon()`` (which keys off ``SUPERVISOR_TOKEN``
708
- in env): inside the add-on container goes directly to the Supervisor
707
+ Branch on ``is_running_in_addon()``, which requires a truthy
708
+ ``SUPERVISOR_TOKEN`` and excludes ``HA_MCP_EMBEDDED``: inside the app
709
+ (add-on) container goes directly to the Supervisor
709
710
  REST API at ``http://supervisor/addons/{slug}/logs`` with the
710
711
  Supervisor token. The HA Core proxy at
711
712
  ``/api/hassio/addons/{slug}/logs`` rejects this token+path combination
@@ -730,8 +731,9 @@ class HomeAssistantClient:
730
731
  Raises:
731
732
  HomeAssistantAuthError: 401 response, or ``SUPERVISOR_TOKEN`` empty
732
733
  at call time on the addon branch.
733
- HomeAssistantAPIError: 403 (role too low — addon needs hassio_role
734
- ``manager``), 404 (unknown slug), or other non-2xx. The
734
+ HomeAssistantAPIError: 403 (unrecognized token, missing
735
+ ``hassio_api``, or insufficient ``hassio_role``), 404
736
+ (unknown slug), or other non-2xx. The
735
737
  ``status_code`` attribute lets callers map to specific
736
738
  suggestions.
737
739
  HomeAssistantConnectionError: Network, timeout, or transport error.
@@ -775,25 +777,28 @@ class HomeAssistantClient:
775
777
 
776
778
  ``path`` is everything between ``http://supervisor/`` and ``/logs``:
777
779
 
778
- - ``"addons/<slug>"`` for add-on container logs
780
+ - ``"addons/<slug>"`` for app (add-on) container logs
779
781
  - ``"<service>"`` (where service ∈ {supervisor, host, core, dns, audio,
780
782
  cli, multicast, observer}) for system-service logs
781
783
 
782
784
  ``lines`` maps to the endpoint's ``?lines=`` journald-window query
783
785
  param; omitted → Supervisor's 100-line default window.
784
786
 
785
- Bypasses ``HomeAssistantClient.httpx_client`` because the Supervisor
786
- endpoint uses a different base URL (``http://supervisor``) and a
787
- different token (``SUPERVISOR_TOKEN``) than HA Core REST. Both
788
- endpoints require the addon's ``hassio_role`` to be ``manager`` (not
789
- ``default``); a ``default`` role gets a 403 here — see #1116.
787
+ Bypasses ``HomeAssistantClient.httpx_client`` because that client targets
788
+ Home Assistant Core through ``http://supervisor/core/api``, while logs
789
+ belong to Supervisor at ``http://supervisor``. Both clients use the same
790
+ ``SUPERVISOR_TOKEN``; the Core proxy requires ``homeassistant_api``, while
791
+ system-service and arbitrary app-log paths require ``hassio_api`` and
792
+ ``hassio_role: manager``. The recognized-app-token exception is
793
+ ``/addons/self/logs``.
790
794
 
791
795
  Raises:
792
796
  HomeAssistantAuthError: ``SUPERVISOR_TOKEN`` absent at call time,
793
797
  or 401 from Supervisor.
794
- HomeAssistantAPIError: 403 (role too low — distinct branch with
795
- role hint), 404, other 4xx/5xx. Tries to parse Supervisor's
796
- ``{"result":"error","message":"..."}`` JSON envelope before
798
+ HomeAssistantAPIError: 403 (unrecognized token, missing
799
+ ``hassio_api``, or insufficient role), 404, other 4xx/5xx.
800
+ Parses Supervisor's ``{"result":"error","message":"..."}``
801
+ JSON envelope before
797
802
  falling back to text body / reason phrase / placeholder.
798
803
  HomeAssistantConnectionError: Timeout or transport error, with
799
804
  distinct messages so callers can tell them apart.
@@ -839,18 +844,19 @@ class HomeAssistantClient:
839
844
  if response.status_code == 401:
840
845
  raise HomeAssistantAuthError(f"Invalid Supervisor token for /{path}/logs")
841
846
  if response.status_code == 403:
842
- # Distinct from 401: token is valid but addon's hassio_role isn't
843
- # high enough. Most-likely cause for this exact endpoint at the
844
- # time #1116 surfaced (default → manager bump in addon config.yaml
845
- # is the same-PR companion fix).
847
+ # Supervisor uses 403 for an unrecognized app token, missing
848
+ # hassio_api permission, or a hassio_role that cannot access this
849
+ # endpoint. The default-to-manager role bump fixed #1116, but it is
850
+ # not the only possible cause.
846
851
  logger.warning(
847
- "Supervisor returned 403 for /%s/logs — addon hassio_role may "
848
- "be too low (need 'manager')",
852
+ "Supervisor returned 403 for /%s/logs — check token, hassio_api, "
853
+ "and hassio_role (need 'manager')",
849
854
  path,
850
855
  )
851
856
  raise HomeAssistantAPIError(
852
- f"Supervisor forbids /{path}/logs (403) — addon's hassio_role "
853
- "may be 'default'; need 'manager' or higher",
857
+ f"Supervisor forbids /{path}/logs (403) — token may be unrecognized, "
858
+ "app may lack hassio_api, or hassio_role may not allow this endpoint "
859
+ "(manager required)",
854
860
  status_code=403,
855
861
  response_data={"path": path},
856
862
  )
@@ -873,14 +879,15 @@ class HomeAssistantClient:
873
879
  async def _get_addon_logs_via_supervisor(
874
880
  self, slug: str, lines: int | None = None
875
881
  ) -> str:
876
- """Fetch add-on container logs directly from Supervisor's REST API.
882
+ """Fetch app (add-on) container logs directly from Supervisor REST.
877
883
 
878
- Distinct from ``tools_bug_report._fetch_addon_logs``: that helper is
879
- hardcoded to ``/addons/self/logs`` and silently swallows failures
880
- (it's an aux-data fetch for bug reports, fine to skip on error). This
881
- helper takes arbitrary slugs and surfaces failures as exceptions
882
- because callers (``ha_get_logs(source="supervisor", slug=...)``) need
883
- them. Both endpoints require ``hassio_role: manager``.
884
+ Distinct from ``tools_bug_report._fetch_addon_logs``: that auxiliary
885
+ helper uses the app self-service path ``/addons/self/logs`` and may skip
886
+ failures. This helper takes arbitrary slugs and surfaces failures because
887
+ callers (``ha_get_logs(source="supervisor", slug=...)``) need them.
888
+ Arbitrary app-log slugs require a recognized app token with ``hassio_api``
889
+ and ``hassio_role: manager``; ``/addons/self/logs`` bypasses the role and
890
+ API-permission checks but still requires a recognized app token.
884
891
 
885
892
  Delegates to ``_supervisor_logs_get`` so error handling stays in
886
893
  lockstep with ``_get_system_service_logs``.
@@ -895,26 +902,21 @@ class HomeAssistantClient:
895
902
  ``service`` must be one of the eight Supervisor-managed services:
896
903
  ``supervisor``, ``host``, ``core``, ``dns``, ``audio``, ``cli``,
897
904
  ``multicast``, ``observer``. Caller is responsible for validating
898
- ``service`` against the allowed set; this helper does no validation
899
- and will raise ``HomeAssistantAPIError`` on any unknown path (404).
905
+ ``service``; this helper performs no validation, and unsupported paths
906
+ are rejected by the selected direct-Supervisor or Core-proxy route.
900
907
 
901
908
  Branch on ``is_running_in_addon()`` — mirror of ``get_addon_logs``:
902
- inside the addon container goes directly to Supervisor at
909
+ inside the app (add-on) container goes directly to Supervisor at
903
910
  ``http://supervisor/{service}/logs`` with the Supervisor token
904
- (``hassio_role: manager`` required). On non-addon installs (Docker
911
+ (``hassio_api`` and ``hassio_role: manager`` required). On non-app
912
+ installs (Docker
905
913
  without Supervisor, pyinstaller, pip pointing at a normal HA URL),
906
914
  falls back to the HA Core proxy at ``/api/hassio/{service}/logs``.
907
915
 
908
- All seven slugs are whitelisted in HA Core's hassio proxy
916
+ All eight service slugs are whitelisted in HA Core's hassio proxy
909
917
  (``homeassistant/components/hassio/http.py`` — ``PATHS_ADMIN``), so
910
918
  an admin LLA is sufficient to reach any of them from outside the
911
- addon.
912
-
913
- Closes #1260: pre-fix this method had only the addon-direct branch,
914
- so non-addon installs (the Docker image, uvx ha-mcp, etc.) hit the
915
- ``SUPERVISOR_TOKEN``-absent fail-fast in ``_supervisor_logs_get`` for
916
- every service, while the sibling ``source="supervisor"`` (addon
917
- logs) call kept working through its own Core-proxy fallback.
919
+ app.
918
920
  """
919
921
  if is_running_in_addon():
920
922
  return await self._supervisor_logs_get(service, lines=lines)
@@ -1,20 +1,14 @@
1
1
  """Shared factory for direct-Supervisor httpx clients.
2
2
 
3
- Three call sites in the codebase talk directly to the Home Assistant
4
- Supervisor REST API at ``http://supervisor`` rather than through
5
- ``HomeAssistantClient.httpx_client`` (which is bound to HA Core, not the
6
- Supervisor — different base URL, different token, different role gate):
3
+ Several code paths call the Home Assistant Supervisor REST API directly with
4
+ a short-lived client configured for the Supervisor base URL and
5
+ ``SUPERVISOR_TOKEN``. Callers cover log collection, app (add-on) management
6
+ and restart, backup operations, and screenshot-engine discovery.
7
7
 
8
- - :meth:`ha_mcp.client.rest_client.HomeAssistantClient._supervisor_logs_get`
9
- — fetches addon and system-service logs
10
- - :func:`ha_mcp.tools.tools_bug_report._fetch_addon_logs` — bundles ha-mcp's
11
- own addon logs into a bug-report payload
12
- - :func:`ha_mcp.settings_ui._handlers_server._restart_addon` — POSTs
13
- ``/addons/self/restart`` from the settings UI
14
-
15
- All three share the same boilerplate (base URL, ``Authorization: Bearer
16
- ${SUPERVISOR_TOKEN}`` header), so this module supplies a single factory and
17
- keeps the three sites consistent.
8
+ These calls cannot use ``HomeAssistantClient.httpx_client``, which targets
9
+ Home Assistant Core rather than Supervisor. In app mode it carries the same
10
+ token value, but requests use a different base URL and authorization surface.
11
+ This module centralizes the direct transport setup.
18
12
  """
19
13
 
20
14
  from __future__ import annotations
@@ -56,14 +50,11 @@ def make_supervisor_httpx_client(
56
50
 
57
51
  Raises:
58
52
  RuntimeError: ``SUPERVISOR_TOKEN`` is unset or empty in the
59
- environment. Each call site has its own absent-token policy
60
- (a rich :class:`HomeAssistantAuthError`, a silent ``""``
61
- return, or a 400 ``JSONResponse``) that does not share a
62
- common shape, so the factory cannot translate. Detecting the
63
- absence at construction time prevents a malformed
64
- ``Authorization: Bearer `` header from being read as a token
65
- rejection by Supervisor, which would mask the missing-env-var
66
- root cause.
53
+ environment. Callers must either gate construction on token
54
+ presence or translate this exception for their response surface.
55
+ Detecting it here prevents a malformed
56
+ ``Authorization: Bearer `` header from masking the missing
57
+ environment variable as a token rejection from Supervisor.
67
58
 
68
59
  Note:
69
60
  ``SUPERVISOR_TOKEN`` is read from env at construction time and
@@ -46,6 +46,13 @@ logger = logging.getLogger(__name__)
46
46
  # overflowed the previous 20MB cap (#1721).
47
47
  MAX_WS_MESSAGE_BYTES = 64 * 1024 * 1024
48
48
 
49
+ # How long :meth:`HomeAssistantWebSocketClient.send_command` waits for a reply
50
+ # when the caller names no ``_wait_timeout``. Named rather than inlined because
51
+ # callers that schedule retries have to budget around it: a caller whose retry
52
+ # delay assumes a fast failure will start its next attempt one whole timeout
53
+ # later than it planned when the command hangs instead.
54
+ DEFAULT_COMMAND_WAIT_TIMEOUT = 30.0
55
+
49
56
 
50
57
  def _extract_ws_error(error: Any) -> tuple[str, str | None]:
51
58
  """Split an HA WebSocket ``error`` payload into ``(message, code)``.
@@ -621,10 +628,11 @@ class HomeAssistantWebSocketClient:
621
628
  Args:
622
629
  command_type: Type of command to send
623
630
  _wait_timeout: Seconds to wait for the response (consumed from
624
- ``kwargs``, not forwarded to Home Assistant). Defaults to 30s,
625
- which suits fast commands; long-running ones (e.g. a
626
- ``supervisor/api`` add-on install) must raise this so the
627
- client doesn't give up before Home Assistant replies.
631
+ ``kwargs``, not forwarded to Home Assistant). Defaults to
632
+ ``DEFAULT_COMMAND_WAIT_TIMEOUT``, which suits fast commands;
633
+ long-running ones (e.g. a ``supervisor/api`` add-on install)
634
+ must raise this so the client doesn't give up before Home
635
+ Assistant replies.
628
636
  **kwargs: Command parameters (merged into the outgoing message)
629
637
 
630
638
  Returns:
@@ -644,7 +652,7 @@ class HomeAssistantWebSocketClient:
644
652
  # break that call shape under mypy. The leading underscore keeps it out
645
653
  # of the HA message namespace — HA WebSocket fields never start with
646
654
  # one — so it can never shadow a real command field when popped.
647
- wait_timeout: float = kwargs.pop("_wait_timeout", 30.0)
655
+ wait_timeout: float = kwargs.pop("_wait_timeout", DEFAULT_COMMAND_WAIT_TIMEOUT)
648
656
 
649
657
  message_id = self.get_next_message_id()
650
658
  message = {"id": message_id, "type": command_type, **kwargs}
@@ -168,8 +168,10 @@ async def set_config_subentry(
168
168
 
169
169
  The reconfigure branch fails when the flow leaves any supplied config key
170
170
  unconsumed, where it previously returned success plus a warning — see
171
- :func:`_handle_config_subentry_flow_steps` for why. The create branch is
172
- unchanged.
171
+ :func:`_handle_config_subentry_flow_steps` for why. It also walks with
172
+ ``keep_current_values`` (issue #2254), so a partial patch keeps the
173
+ subentry fields it does not name instead of resetting them. The create
174
+ branch is unchanged on both counts.
173
175
  """
174
176
  _reject_redaction_sentinels(config_dict)
175
177
  flow_result = await client.start_config_subentry_flow(
@@ -205,6 +207,7 @@ async def set_config_subentry(
205
207
  flow_result,
206
208
  config_dict,
207
209
  is_reconfigure=subentry_id is not None,
210
+ keep_current_values=subentry_id is not None,
208
211
  )
209
212
  except asyncio.CancelledError:
210
213
  await _abort_subentry_flow_best_effort(client, flow_id)
@@ -289,6 +292,17 @@ async def update_config_entry_options(
289
292
  ``ha_set_integration`` path passes ``None`` to accept any domain). Starts
290
293
  an options flow, walks the flow steps, and returns the result. Aborts the
291
294
  flow on error. ``noun`` only affects response wording.
295
+
296
+ This edits an existing entry, so the walk runs with
297
+ ``keep_current_values``: every field an options step declares that
298
+ ``config_dict`` does not name is submitted with the value the step itself
299
+ carries, exactly as the HA UI's "Configure" dialog posts back the boxes
300
+ nobody touched. Before issue #2254 those keys were dropped and voluptuous
301
+ substituted each field's static default, so a one-key patch silently reset
302
+ the rest of the entry's options. A key the caller sets to ``None`` is the
303
+ opposite request and is honoured as a clear, which for a field carrying a
304
+ schema default means submitting the ``None`` for Home Assistant to
305
+ validate rather than omitting it into that default.
292
306
  """
293
307
  _reject_redaction_sentinels(config_dict)
294
308
  config_entry = await client.get_config_entry(entry_id)
@@ -332,6 +346,7 @@ async def update_config_entry_options(
332
346
  config_dict,
333
347
  submit_fn=client.submit_options_flow_step,
334
348
  helper_type=expected_domain,
349
+ keep_current_values=True,
335
350
  )
336
351
  except Exception:
337
352
  try: