ha-mcp-dev 8.1.1.dev2294__tar.gz → 8.2.0.dev2305__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.dev2294/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.2.0.dev2305}/PKG-INFO +2 -2
  2. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/pyproject.toml +2 -2
  3. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/__init__.py +4 -0
  4. ha_mcp_dev-8.2.0.dev2305/src/ha_mcp/_rich_compat.py +109 -0
  5. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_dev.py +24 -4
  6. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -2
  7. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  8. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/requires.txt +1 -1
  9. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/LICENSE +0 -0
  10. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/MANIFEST.in +0 -0
  11. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/README.md +0 -0
  12. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/setup.cfg +0 -0
  13. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/__init__.py +0 -0
  16. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/requirements.txt +0 -0
  17. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  18. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  19. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  20. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  21. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  22. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  23. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  24. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  25. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  26. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  27. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  28. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  29. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  30. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  31. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  32. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  33. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  34. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  35. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  36. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  37. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  38. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  39. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  40. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  41. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  42. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  43. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  44. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  45. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  46. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  47. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  48. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  49. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  50. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  51. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  52. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  53. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  54. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  55. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  56. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  57. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  58. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  59. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  60. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  61. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  62. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  63. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  64. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  65. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  66. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  67. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  68. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  69. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  70. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  71. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  72. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  73. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_version.py +0 -0
  74. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/__init__.py +0 -0
  75. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/consent_form.py +0 -0
  76. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/provider.py +0 -0
  77. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/backup_manager.py +0 -0
  78. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/browser_landing.py +0 -0
  79. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/__init__.py +0 -0
  80. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/rest_client.py +0 -0
  81. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/supervisor_client.py +0 -0
  82. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/websocket_client.py +0 -0
  83. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/websocket_listener.py +0 -0
  84. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/config.py +0 -0
  85. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  86. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  87. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  88. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  89. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  90. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  91. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/errors.py +0 -0
  92. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  93. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/llm_exposure.py +0 -0
  94. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/__init__.py +0 -0
  95. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/approval_queue.py +0 -0
  96. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/editing.py +0 -0
  97. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/evaluator.py +0 -0
  98. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/handlers.py +0 -0
  99. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/middleware.py +0 -0
  100. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/model.py +0 -0
  101. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/persistence.py +0 -0
  102. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/value_sources.py +0 -0
  103. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/py.typed +0 -0
  104. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/read_only.py +0 -0
  105. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/redaction.py +0 -0
  106. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  107. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  108. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  109. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  110. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  111. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  112. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  113. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  114. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  115. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  116. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  117. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  118. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  119. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  120. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  121. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  122. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  123. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  124. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  125. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  126. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  127. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  128. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  129. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  130. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  131. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/server.py +0 -0
  132. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/__init__.py +0 -0
  133. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  134. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  135. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  136. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  137. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  138. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  139. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  140. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  141. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  142. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_theme.py +0 -0
  143. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  144. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  145. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  146. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  147. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  148. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  149. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  150. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  151. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  152. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  153. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  154. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  155. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.css +0 -0
  156. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.html +0 -0
  157. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.js +0 -0
  158. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/smoke_test.py +0 -0
  159. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  160. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/strict_bps.py +0 -0
  161. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/__init__.py +0 -0
  162. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/auto_backup.py +0 -0
  163. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/backup.py +0 -0
  164. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  165. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_result.py +0 -0
  166. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  167. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_api.py +0 -0
  168. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_config_reads.py +0 -0
  169. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_devices.py +0 -0
  170. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_registries.py +0 -0
  171. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  172. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  173. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  174. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  175. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  176. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/device_control.py +0 -0
  177. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/hacs_registration.py +0 -0
  178. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/helpers.py +0 -0
  179. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/__init__.py +0 -0
  180. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/base.py +0 -0
  181. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/matter.py +0 -0
  182. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/thread.py +0 -0
  183. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  184. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/zwave.py +0 -0
  185. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/reference_validator.py +0 -0
  186. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/registry.py +0 -0
  187. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  188. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  189. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  190. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  191. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  192. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  193. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  194. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  195. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  196. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  197. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_addons.py +0 -0
  198. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_areas.py +0 -0
  199. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  200. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  201. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_calendar.py +0 -0
  202. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_camera.py +0 -0
  203. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_categories.py +0 -0
  204. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_code.py +0 -0
  205. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  206. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  207. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  208. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  209. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  210. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  211. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_energy.py +0 -0
  212. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_entities.py +0 -0
  213. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  214. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_groups.py +0 -0
  215. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_hacs.py +0 -0
  216. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_history.py +0 -0
  217. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_integrations.py +0 -0
  218. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_labels.py +0 -0
  219. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_radio.py +0 -0
  220. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_registry.py +0 -0
  221. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_resources.py +0 -0
  222. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_search.py +0 -0
  223. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  224. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_service.py +0 -0
  225. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_services.py +0 -0
  226. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_system.py +0 -0
  227. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_themes.py +0 -0
  228. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_todo.py +0 -0
  229. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_traces.py +0 -0
  230. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_updates.py +0 -0
  231. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_utility.py +0 -0
  232. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  233. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  234. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  235. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_zones.py +0 -0
  236. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/util_helpers.py +0 -0
  237. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/validation_middleware.py +0 -0
  238. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/__init__.py +0 -0
  239. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/categorized_search.py +0 -0
  240. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  241. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transport_security.py +0 -0
  242. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/update_check.py +0 -0
  243. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/__init__.py +0 -0
  244. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/config_hash.py +0 -0
  245. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/config_write_lock.py +0 -0
  246. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/data_paths.py +0 -0
  247. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/domain_handlers.py +0 -0
  248. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  249. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  250. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/operation_manager.py +0 -0
  251. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/python_sandbox.py +0 -0
  252. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/skill_loader.py +0 -0
  253. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/usage_logger.py +0 -0
  254. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/__init__.py +0 -0
  255. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/enforcement.py +0 -0
  256. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/model.py +0 -0
  257. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/persistence.py +0 -0
  258. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/resolver.py +0 -0
  259. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  260. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  261. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  262. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/tests/__init__.py +0 -0
  263. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/tests/test_constants.py +0 -0
  264. {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/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.dev2294
3
+ Version: 8.2.0.dev2305
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
@@ -19,7 +19,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Requires-Python: <3.15,>=3.13
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
- Requires-Dist: fastmcp==3.4.5
22
+ Requires-Dist: fastmcp==3.4.6
23
23
  Requires-Dist: httpx[socks]==0.28.1
24
24
  Requires-Dist: pydantic==2.13.4
25
25
  Requires-Dist: python-dotenv==1.2.2
@@ -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.dev2294"
7
+ version = "8.2.0.dev2305"
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
@@ -28,7 +28,7 @@ classifiers = [
28
28
  ]
29
29
 
30
30
  dependencies = [
31
- "fastmcp==3.4.5",
31
+ "fastmcp==3.4.6",
32
32
  "httpx[socks]==0.28.1",
33
33
  "pydantic==2.13.4",
34
34
  "python-dotenv==1.2.2",
@@ -5,6 +5,10 @@ A Model Context Protocol server that provides complete control over Home Assista
5
5
  through REST API and WebSocket integration.
6
6
  """
7
7
 
8
+ # Must be imported before anything that reaches fastmcp (``.auth`` below does),
9
+ # because fastmcp configures rich logging at import time and dies on a rich
10
+ # older than 13.9.4. Importing this module applies the shim. See #2186.
11
+ from . import _rich_compat as _rich_compat
8
12
  from ._version import get_version
9
13
 
10
14
  __version__ = get_version()
@@ -0,0 +1,109 @@
1
+ """Tolerate a ``rich`` older than fastmcp's logging setup expects (#2186).
2
+
3
+ ``fastmcp/__init__.py`` calls ``configure_logging()`` at import time, which
4
+ builds a ``rich.logging.RichHandler`` with ``tracebacks_max_frames`` and
5
+ ``tracebacks_suppress`` unconditionally — no version guard, no ``try``. Both
6
+ keywords require ``rich>=13.9.4`` (``fastmcp-slim``'s declared floor), so an
7
+ environment holding an older ``rich`` cannot ``import fastmcp`` at all::
8
+
9
+ TypeError: RichHandler.__init__() got an unexpected keyword argument
10
+ 'tracebacks_max_frames'
11
+
12
+ Since ``ha_mcp/__init__.py`` imports ``.auth`` -> ``fastmcp``, that takes the
13
+ whole package down before any of our code runs. It is not hypothetical: the
14
+ official Home Assistant container ships ``rich 10.16.2`` (held below 11 by
15
+ ``surepy``'s ``rich>=10.1.0,<11.0.0``) and ``rich`` is absent from HA's
16
+ ``package_constraints.txt``, so whether installing ``ha-mcp`` pulls ``rich``
17
+ forward is left entirely to the resolver — it usually does, and when it does
18
+ not the integration cannot start.
19
+
20
+ The declared dependency floor is correct upstream and this module does not
21
+ second-guess it: it only intervenes when the *installed* ``RichHandler``
22
+ genuinely cannot accept a keyword, dropping the unsupported ones so logging
23
+ setup degrades instead of aborting the import. On ``rich>=13.9.4`` it is a
24
+ no-op. Handlers still attach and still render; such installs lose only
25
+ traceback frame-limiting and framework-frame suppression, which beats not
26
+ importing.
27
+
28
+ Remove this once the upstream fix is released and ha-mcp's floor excludes the
29
+ affected fastmcp versions.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import functools
35
+ import inspect
36
+ import logging
37
+ from typing import Any
38
+
39
+ logger = logging.getLogger(__name__)
40
+
41
+ # Marker set on our wrapper so repeated calls do not stack wrappers.
42
+ _PATCH_MARKER = "_ha_mcp_filters_unsupported_kwargs"
43
+
44
+ # Present only on rich>=13.9.4; its absence is what makes fastmcp's call fatal.
45
+ _PROBE_KWARG = "tracebacks_max_frames"
46
+
47
+
48
+ def ensure_rich_handler_compat() -> bool:
49
+ """Make ``RichHandler`` ignore keywords the installed ``rich`` lacks.
50
+
51
+ Returns ``True`` when a shim is in place (freshly applied or already
52
+ applied), ``False`` when none is needed or none could be applied — an
53
+ unimportable ``rich``, an uninspectable ``__init__``, or a signature that
54
+ already absorbs ``**kwargs``.
55
+ """
56
+ try:
57
+ from rich.logging import RichHandler
58
+ except Exception: # pragma: no cover - rich absent or broken
59
+ # fastmcp depends on rich, so this means the import would fail anyway
60
+ # for reasons this shim cannot address.
61
+ logger.debug("rich.logging unavailable; skipping RichHandler shim")
62
+ return False
63
+
64
+ original_init = RichHandler.__init__
65
+ if getattr(original_init, _PATCH_MARKER, False):
66
+ return True
67
+
68
+ try:
69
+ parameters = inspect.signature(original_init).parameters
70
+ except (TypeError, ValueError): # pragma: no cover - exotic rich build
71
+ logger.debug("RichHandler.__init__ is not introspectable; skipping shim")
72
+ return False
73
+
74
+ if any(p.kind is inspect.Parameter.VAR_KEYWORD for p in parameters.values()):
75
+ # Already tolerant of anything fastmcp passes.
76
+ return False
77
+
78
+ if _PROBE_KWARG in parameters:
79
+ return False
80
+
81
+ supported = frozenset(parameters)
82
+
83
+ @functools.wraps(original_init)
84
+ def _init(self: Any, *args: Any, **kwargs: Any) -> Any:
85
+ dropped = kwargs.keys() - supported
86
+ if dropped:
87
+ logger.debug(
88
+ "Dropping RichHandler kwargs this rich does not accept: %s",
89
+ ", ".join(sorted(dropped)),
90
+ )
91
+ return original_init(
92
+ self, *args, **{k: v for k, v in kwargs.items() if k in supported}
93
+ )
94
+
95
+ setattr(_init, _PATCH_MARKER, True)
96
+ RichHandler.__init__ = _init # type: ignore[method-assign]
97
+
98
+ logger.debug(
99
+ "Installed RichHandler compatibility shim: rich is older than "
100
+ "fastmcp expects, so tracebacks lose frame-limiting and "
101
+ "framework-frame suppression. Upgrade to rich>=13.9.4 to restore them."
102
+ )
103
+ return True
104
+
105
+
106
+ # Applied as an import side effect: ``ha_mcp/__init__.py`` imports this module
107
+ # ahead of anything that reaches fastmcp, and that is the only window in which
108
+ # the shim can do any good.
109
+ ensure_rich_handler_compat()
@@ -16,6 +16,7 @@ import logging
16
16
  import sys
17
17
  from typing import Annotated, Any, Literal
18
18
 
19
+ import httpx
19
20
  from fastmcp.exceptions import ToolError
20
21
  from fastmcp.tools import tool
21
22
  from pydantic import Field
@@ -479,17 +480,36 @@ def schedule_deferred_entry_reload(client: Any, entry_id: str) -> None:
479
480
  very worker answering the current request, so it must not run until the
480
481
  response has flushed. Failures can only be logged — there is no caller
481
482
  left to answer.
483
+
484
+ Uses the ``homeassistant.reload_config_entry`` service, NOT
485
+ ``POST /config/config_entries/entry/{id}/reload``: only the services
486
+ handler shields the call. HA runs aiohttp with
487
+ ``handler_cancellation=True``, and the reload kills the client sending
488
+ this request, so on the unshielded route it cancelled itself mid-unload
489
+ and stranded the entry in ``UNLOAD_IN_PROGRESS`` until HA restarted.
482
490
  """
483
491
 
484
492
  async def _reload() -> None:
485
493
  await asyncio.sleep(_SELF_ACTION_FLUSH_DELAY_S)
486
494
  try:
487
- await client._request(
488
- "POST", f"/config/config_entries/entry/{entry_id}/reload"
495
+ await client.call_service(
496
+ "homeassistant", "reload_config_entry", {"entry_id": entry_id}
489
497
  )
490
498
  logger.info("Deferred reload of entry %s requested", entry_id)
491
- except Exception:
492
- logger.exception("Deferred config-entry reload failed")
499
+ except Exception as exc:
500
+ # A lost reply means the request reached HA and the shielded reload
501
+ # then killed this client — the expected end of a self-restart, not
502
+ # a failure. A connect error or timeout may never have dispatched,
503
+ # so those stay loud. WARNING, not INFO: HA surfaces this package
504
+ # at WARNING and above, so INFO here would log nothing at all.
505
+ if isinstance(exc.__cause__, httpx.ReadError | httpx.RemoteProtocolError):
506
+ logger.warning(
507
+ "Deferred reload of entry %s dispatched; it tore down this "
508
+ "connection before the reply arrived (expected)",
509
+ entry_id,
510
+ )
511
+ else:
512
+ logger.exception("Deferred config-entry reload failed")
493
513
 
494
514
  _spawn_background(_reload())
495
515
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.1.1.dev2294
3
+ Version: 8.2.0.dev2305
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
@@ -19,7 +19,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Requires-Python: <3.15,>=3.13
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
- Requires-Dist: fastmcp==3.4.5
22
+ Requires-Dist: fastmcp==3.4.6
23
23
  Requires-Dist: httpx[socks]==0.28.1
24
24
  Requires-Dist: pydantic==2.13.4
25
25
  Requires-Dist: python-dotenv==1.2.2
@@ -5,6 +5,7 @@ pyproject.toml
5
5
  src/ha_mcp/__init__.py
6
6
  src/ha_mcp/__main__.py
7
7
  src/ha_mcp/_pypi_marker
8
+ src/ha_mcp/_rich_compat.py
8
9
  src/ha_mcp/_version.py
9
10
  src/ha_mcp/backup_manager.py
10
11
  src/ha_mcp/browser_landing.py
@@ -1,4 +1,4 @@
1
- fastmcp==3.4.5
1
+ fastmcp==3.4.6
2
2
  httpx[socks]==0.28.1
3
3
  pydantic==2.13.4
4
4
  python-dotenv==1.2.2