ha-mcp-dev 8.1.1.dev2286__tar.gz → 8.1.1.dev2289__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 (264) hide show
  1. {ha_mcp_dev-8.1.1.dev2286/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.1.1.dev2289}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/__main__.py +1 -8
  4. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/hacs_auto_refresh.py +45 -0
  5. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/server.py +2 -0
  6. ha_mcp_dev-8.1.1.dev2289/src/ha_mcp/settings_ui/locales/sv.json +846 -0
  7. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  8. ha_mcp_dev-8.1.1.dev2286/src/ha_mcp/settings_ui/locales/sv.json +0 -22
  9. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/LICENSE +0 -0
  10. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/MANIFEST.in +0 -0
  11. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/README.md +0 -0
  12. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/setup.cfg +0 -0
  13. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/__init__.py +0 -0
  14. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/__init__.py +0 -0
  16. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/requirements.txt +0 -0
  17. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  18. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  19. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  20. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  21. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  22. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  23. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  24. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  25. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  26. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  27. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  28. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  29. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  30. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  31. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  32. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  33. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  34. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  35. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  36. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  37. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  38. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  39. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  40. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  41. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  42. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  43. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  44. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  45. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  46. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  47. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  48. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  49. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  50. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  51. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  52. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  53. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  54. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  55. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  56. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  57. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  58. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  59. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  60. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  61. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  62. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  63. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  64. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  65. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  66. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  67. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  68. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  69. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  70. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  71. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  72. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  73. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/_version.py +0 -0
  74. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/__init__.py +0 -0
  75. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/consent_form.py +0 -0
  76. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/auth/provider.py +0 -0
  77. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/backup_manager.py +0 -0
  78. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/browser_landing.py +0 -0
  79. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/__init__.py +0 -0
  80. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/rest_client.py +0 -0
  81. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/supervisor_client.py +0 -0
  82. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/websocket_client.py +0 -0
  83. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/client/websocket_listener.py +0 -0
  84. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/config.py +0 -0
  85. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  86. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  87. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  88. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  89. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  90. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  91. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/errors.py +0 -0
  92. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/llm_exposure.py +0 -0
  93. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/__init__.py +0 -0
  94. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/approval_queue.py +0 -0
  95. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/editing.py +0 -0
  96. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/evaluator.py +0 -0
  97. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/handlers.py +0 -0
  98. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/middleware.py +0 -0
  99. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/model.py +0 -0
  100. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/persistence.py +0 -0
  101. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/policy/value_sources.py +0 -0
  102. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/py.typed +0 -0
  103. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/read_only.py +0 -0
  104. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/redaction.py +0 -0
  105. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  106. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  107. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  108. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  109. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  110. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  111. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  112. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  113. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  114. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  115. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  116. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  117. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  118. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  119. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  120. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  121. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  122. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  123. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  124. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  125. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  126. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  127. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  128. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  129. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  130. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/__init__.py +0 -0
  131. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  132. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  133. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  134. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  135. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  136. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  137. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  138. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  139. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  140. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_theme.py +0 -0
  141. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  142. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  143. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  144. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  145. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  146. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  147. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  148. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  149. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  150. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  151. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  152. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.css +0 -0
  153. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.html +0 -0
  154. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/settings_ui/settings.js +0 -0
  155. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/smoke_test.py +0 -0
  156. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  157. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/strict_bps.py +0 -0
  158. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/__init__.py +0 -0
  159. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/auto_backup.py +0 -0
  160. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/backup.py +0 -0
  161. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  162. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_result.py +0 -0
  163. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  164. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_api.py +0 -0
  165. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_config_reads.py +0 -0
  166. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_devices.py +0 -0
  167. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_registries.py +0 -0
  168. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  169. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  170. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  171. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  172. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  173. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/device_control.py +0 -0
  174. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/hacs_registration.py +0 -0
  175. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/helpers.py +0 -0
  176. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/__init__.py +0 -0
  177. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/base.py +0 -0
  178. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/matter.py +0 -0
  179. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/thread.py +0 -0
  180. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  181. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/radio/zwave.py +0 -0
  182. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/reference_validator.py +0 -0
  183. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/registry.py +0 -0
  184. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  185. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  186. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  187. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  188. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  189. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  190. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  191. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  192. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  193. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  194. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_addons.py +0 -0
  195. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_areas.py +0 -0
  196. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  197. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  198. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_calendar.py +0 -0
  199. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_camera.py +0 -0
  200. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_categories.py +0 -0
  201. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_code.py +0 -0
  202. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  203. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  204. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  205. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  206. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  207. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  208. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_dev.py +0 -0
  209. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_energy.py +0 -0
  210. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_entities.py +0 -0
  211. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  212. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_groups.py +0 -0
  213. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_hacs.py +0 -0
  214. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_history.py +0 -0
  215. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_integrations.py +0 -0
  216. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_labels.py +0 -0
  217. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_radio.py +0 -0
  218. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_registry.py +0 -0
  219. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_resources.py +0 -0
  220. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_search.py +0 -0
  221. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  222. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_service.py +0 -0
  223. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_services.py +0 -0
  224. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_system.py +0 -0
  225. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_themes.py +0 -0
  226. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_todo.py +0 -0
  227. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_traces.py +0 -0
  228. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_updates.py +0 -0
  229. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_utility.py +0 -0
  230. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  231. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  232. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  233. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/tools_zones.py +0 -0
  234. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/util_helpers.py +0 -0
  235. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/tools/validation_middleware.py +0 -0
  236. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/__init__.py +0 -0
  237. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/categorized_search.py +0 -0
  238. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  239. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/transport_security.py +0 -0
  240. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/update_check.py +0 -0
  241. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/__init__.py +0 -0
  242. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/config_hash.py +0 -0
  243. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/config_write_lock.py +0 -0
  244. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/data_paths.py +0 -0
  245. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/domain_handlers.py +0 -0
  246. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  247. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  248. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/operation_manager.py +0 -0
  249. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/python_sandbox.py +0 -0
  250. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/skill_loader.py +0 -0
  251. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/utils/usage_logger.py +0 -0
  252. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/__init__.py +0 -0
  253. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/enforcement.py +0 -0
  254. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/model.py +0 -0
  255. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/persistence.py +0 -0
  256. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp/visibility/resolver.py +0 -0
  257. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  258. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  259. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  260. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  261. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  262. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/tests/__init__.py +0 -0
  263. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/tests/test_constants.py +0 -0
  264. {ha_mcp_dev-8.1.1.dev2286 → ha_mcp_dev-8.1.1.dev2289}/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.1.1.dev2286
3
+ Version: 8.1.1.dev2289
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.1.1.dev2286"
7
+ version = "8.1.1.dev2289"
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
@@ -666,13 +666,6 @@ async def _run_with_shutdown(server_coro: Coroutine[Any, Any, Any]) -> None:
666
666
  server_task = asyncio.create_task(server_coro)
667
667
  shutdown_task = asyncio.create_task(_shutdown_event.wait())
668
668
 
669
- # Fire-and-forget: ask HACS to surface a paired component update after a
670
- # server update (advisory; see hacs_auto_refresh). Not in the wait set —
671
- # its completion must not stop the server.
672
- from ha_mcp.hacs_auto_refresh import maybe_refresh_hacs_after_update
673
-
674
- hacs_refresh_task = asyncio.create_task(maybe_refresh_hacs_after_update())
675
-
676
669
  try:
677
670
  done, pending = await asyncio.wait(
678
671
  [server_task, shutdown_task],
@@ -732,7 +725,7 @@ async def _run_with_shutdown(server_coro: Coroutine[Any, Any, Any]) -> None:
732
725
  logger.warning("Resource cleanup timed out")
733
726
 
734
727
  try:
735
- await _cancel_tasks(server_task, shutdown_task, hacs_refresh_task)
728
+ await _cancel_tasks(server_task, shutdown_task)
736
729
  except Exception as e:
737
730
  # Teardown must never mask the exception being propagated from the
738
731
  # try block (Python drops the original if finally raises).
@@ -25,6 +25,8 @@ import asyncio
25
25
  import hashlib
26
26
  import json
27
27
  import logging
28
+ from collections.abc import AsyncIterator
29
+ from contextlib import asynccontextmanager, suppress
28
30
  from pathlib import Path
29
31
  from typing import Any
30
32
 
@@ -222,8 +224,28 @@ async def maybe_refresh_hacs_after_update() -> None:
222
224
  info = await asyncio.to_thread(get_update_info)
223
225
  marker = await asyncio.to_thread(_read_marker, ha_url)
224
226
  if not _nudge_due(current, info, marker):
227
+ # DEBUG, not INFO: the not-due return is the per-conversation
228
+ # stdio hot path and must stay quiet at default levels. The line
229
+ # exists so a DEBUG-level launcher (the HAOS add-on lane) can
230
+ # prove scheduling even when a completed earlier pass makes every
231
+ # later boot legitimately not due.
232
+ logger.debug(
233
+ "HACS auto-refresh: pass not due (marker current for server %s)",
234
+ current,
235
+ )
225
236
  return
226
237
 
238
+ # The one unconditional line a due pass emits BEFORE any WebSocket
239
+ # work: it proves the launcher scheduled the nudge even where HACS
240
+ # is absent and the pass ends silently — the observable the HAOS
241
+ # add-on lane greps for, and the line whose absence exposed the
242
+ # launcher gap this module's lifespan wiring closed.
243
+ logger.info(
244
+ "HACS auto-refresh: startup pass due (server %s); "
245
+ "asking HACS for repository state",
246
+ current,
247
+ )
248
+
227
249
  result = await _refresh_with_retries()
228
250
  if result is None:
229
251
  logger.debug(
@@ -250,3 +272,26 @@ async def maybe_refresh_hacs_after_update() -> None:
250
272
  raise
251
273
  except Exception:
252
274
  logger.debug("HACS auto-refresh nudge skipped", exc_info=True)
275
+
276
+
277
+ @asynccontextmanager
278
+ async def hacs_refresh_lifespan(_server: Any) -> AsyncIterator[dict[str, Any]]:
279
+ """Schedule the startup nudge for the lifetime of any server run.
280
+
281
+ Attached as the FastMCP ``lifespan`` so it runs on EVERY launcher —
282
+ stdio, the HTTP CLI entry points, and the add-on's ``start.py``, which
283
+ calls ``mcp.run()`` directly and never passes through ``__main__``'s
284
+ ``_run_with_shutdown`` (the wiring this replaces; the add-on gap was
285
+ found live, not by CI, because the e2e suites launch via the CLI
286
+ entry points).
287
+ """
288
+ task = asyncio.create_task(maybe_refresh_hacs_after_update())
289
+ try:
290
+ yield {}
291
+ finally:
292
+ # The nudge may be mid-retry-sleep; a cancelled task must not
293
+ # stall shutdown. maybe_refresh_hacs_after_update re-raises
294
+ # CancelledError by design, so this await returns promptly.
295
+ task.cancel()
296
+ with suppress(asyncio.CancelledError):
297
+ await task
@@ -20,6 +20,7 @@ from pydantic import Field
20
20
 
21
21
  from .config import _PACKAGE_VERSION, get_global_settings
22
22
  from .errors import ErrorCode, create_error_response
23
+ from .hacs_auto_refresh import hacs_refresh_lifespan
23
24
  from .tools.helpers import raise_tool_error
24
25
  from .transforms import DEFAULT_PINNED_TOOLS
25
26
 
@@ -142,6 +143,7 @@ class HomeAssistantSmartMCPServer:
142
143
  version=server_version,
143
144
  icons=SERVER_ICONS,
144
145
  instructions=instructions,
146
+ lifespan=hacs_refresh_lifespan,
145
147
  )
146
148
 
147
149
  # Register all tools and expert prompts