ha-mcp-dev 7.14.2.dev2128__tar.gz → 7.14.2.dev2129__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 (190) hide show
  1. {ha_mcp_dev-7.14.2.dev2128/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2129}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/pyproject.toml +8 -1
  3. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/__main__.py +30 -8
  4. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/usage_logger.py +26 -0
  5. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  6. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/LICENSE +0 -0
  7. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/README.md +0 -0
  9. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/browser_landing.py +0 -0
  18. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/client/__init__.py +0 -0
  19. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/client/rest_client.py +0 -0
  20. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/client/supervisor_client.py +0 -0
  21. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  25. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  26. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  27. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  28. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  29. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  30. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/errors.py +0 -0
  31. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/llm_exposure.py +0 -0
  32. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/__init__.py +0 -0
  33. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/approval_queue.py +0 -0
  34. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/evaluator.py +0 -0
  35. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/handlers.py +0 -0
  36. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/middleware.py +0 -0
  37. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/model.py +0 -0
  38. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/persistence.py +0 -0
  39. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/policy/value_sources.py +0 -0
  40. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/py.typed +0 -0
  41. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/read_only.py +0 -0
  42. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  43. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  44. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  45. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  46. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  47. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  48. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  49. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  50. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  51. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  52. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  53. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  54. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  55. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  56. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  57. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  58. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  59. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  60. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  61. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  62. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  63. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  64. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  65. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  66. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  67. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/server.py +0 -0
  68. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/__init__.py +0 -0
  69. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  70. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  71. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  72. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  73. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  74. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  75. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  76. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  77. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  78. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_theme.py +0 -0
  79. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  80. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  81. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  82. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  83. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  84. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  85. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/settings.css +0 -0
  86. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/settings.html +0 -0
  87. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/settings_ui/settings.js +0 -0
  88. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/smoke_test.py +0 -0
  89. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  90. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/strict_bps.py +0 -0
  91. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/__init__.py +0 -0
  92. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/auto_backup.py +0 -0
  93. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/backup.py +0 -0
  94. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  95. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/component_api.py +0 -0
  96. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/component_config_reads.py +0 -0
  97. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/component_devices.py +0 -0
  98. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/component_registries.py +0 -0
  99. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  100. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  101. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/device_control.py +0 -0
  102. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/enhanced.py +0 -0
  103. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/helpers.py +0 -0
  104. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/__init__.py +0 -0
  105. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/base.py +0 -0
  106. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/matter.py +0 -0
  107. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/thread.py +0 -0
  108. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  109. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/radio/zwave.py +0 -0
  110. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/reference_validator.py +0 -0
  111. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/registry.py +0 -0
  112. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  113. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  114. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  115. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  116. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  117. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  118. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  119. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  120. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  121. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  122. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_addons.py +0 -0
  123. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_areas.py +0 -0
  124. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  125. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  126. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_calendar.py +0 -0
  127. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_camera.py +0 -0
  128. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_categories.py +0 -0
  129. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_code.py +0 -0
  130. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  131. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  132. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  133. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  134. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  135. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  136. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_dev.py +0 -0
  137. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_energy.py +0 -0
  138. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_entities.py +0 -0
  139. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  140. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_groups.py +0 -0
  141. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_hacs.py +0 -0
  142. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_history.py +0 -0
  143. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_integrations.py +0 -0
  144. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_labels.py +0 -0
  145. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_radio.py +0 -0
  146. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_registry.py +0 -0
  147. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_resources.py +0 -0
  148. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_search.py +0 -0
  149. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_service.py +0 -0
  150. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_services.py +0 -0
  151. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_system.py +0 -0
  152. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_themes.py +0 -0
  153. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_todo.py +0 -0
  154. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_traces.py +0 -0
  155. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_updates.py +0 -0
  156. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_utility.py +0 -0
  157. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  158. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  159. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  160. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/tools_zones.py +0 -0
  161. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/util_helpers.py +0 -0
  162. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/tools/validation_middleware.py +0 -0
  163. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/transforms/__init__.py +0 -0
  164. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/transforms/categorized_search.py +0 -0
  165. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  166. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/transport_security.py +0 -0
  167. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/update_check.py +0 -0
  168. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/__init__.py +0 -0
  169. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/config_hash.py +0 -0
  170. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/config_write_lock.py +0 -0
  171. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/data_paths.py +0 -0
  172. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/domain_handlers.py +0 -0
  173. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  174. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  175. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/operation_manager.py +0 -0
  176. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/python_sandbox.py +0 -0
  177. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/utils/skill_loader.py +0 -0
  178. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/visibility/__init__.py +0 -0
  179. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/visibility/enforcement.py +0 -0
  180. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/visibility/model.py +0 -0
  181. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/visibility/persistence.py +0 -0
  182. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp/visibility/resolver.py +0 -0
  183. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  184. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  185. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  186. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  187. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  188. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/tests/__init__.py +0 -0
  189. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/tests/test_constants.py +0 -0
  190. {ha_mcp_dev-7.14.2.dev2128 → ha_mcp_dev-7.14.2.dev2129}/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: 7.14.2.dev2128
3
+ Version: 7.14.2.dev2129
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 = "7.14.2.dev2128"
7
+ version = "7.14.2.dev2129"
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
@@ -199,6 +199,13 @@ asyncio_mode = "auto"
199
199
 
200
200
  [dependency-groups]
201
201
  dev = [
202
+ # Real aiohttp so tests can pin the ClientTimeout defaults the custom
203
+ # component's relay and the webhook-proxy addon rely on (both are stubbed
204
+ # in unit tests; nothing else would catch stub drift). NOT a runtime
205
+ # dependency — src/ never imports aiohttp; HA core provides it in-process.
206
+ # Floor = the aiohttp HA core 2026.6 pins (2026.7 pins 3.14.1, 2026.8.dev
207
+ # pins 3.14.3), so the version tested here is one a supported HA runs.
208
+ "aiohttp>=3.13.5",
202
209
  "build>=1.2.2",
203
210
  "docker>=7.1.0",
204
211
  "httpx2>=2.4.0",
@@ -478,14 +478,36 @@ class ProbeAccessLogFilter(logging.Filter):
478
478
  return not (status == 405 and path == self._mcp_path)
479
479
 
480
480
 
481
- def _setup_logging(log_level_str: str, force: bool = False) -> None:
482
- """Configure root logger with consistent timestamp format."""
483
- logging.basicConfig(
484
- level=getattr(logging, log_level_str),
485
- format="%(asctime)s %(name)s %(levelname)s: %(message)s",
486
- datefmt=_LOG_DATE_FORMAT,
487
- force=force,
488
- )
481
+ def _setup_logging(log_level_str: str, force: bool = True) -> None:
482
+ """Configure root logger with consistent timestamp format.
483
+
484
+ ``force`` defaults to True so the reconfiguration is deterministic: with
485
+ ANY root handler present, ``basicConfig`` is a silent no-op — neither the
486
+ console handler nor the level is applied. Since
487
+ ``preserve_startup_collector`` detaches the collector before
488
+ ``basicConfig`` runs, the default guards against FOREIGN root handlers —
489
+ a test runner's or a dependency's. At the two call sites that use the
490
+ default (``main`` and ``_setup_standard_mode``) the only root handler
491
+ attached anywhere in ``src/`` is the collector, which the wrapper detaches
492
+ first — so today the default is defensive rather than load-bearing. The
493
+ OAuth/OIDC entry points pass ``force=True`` explicitly and never exercise
494
+ the default.
495
+
496
+ The historical standard-mode bug was ``usage_logger``'s
497
+ ``StartupLogCollector`` (attached to root at import time) triggering that
498
+ same no-op; the wrapper now detaches it for the duration — keeping it out
499
+ of the sweep ``force`` performs (which removes *and closes* every root
500
+ handler) so ``ha_report_issue`` keeps its startup diagnostics.
501
+ """
502
+ from ha_mcp.utils.usage_logger import preserve_startup_collector
503
+
504
+ with preserve_startup_collector():
505
+ logging.basicConfig(
506
+ level=getattr(logging, log_level_str),
507
+ format="%(asctime)s %(name)s %(levelname)s: %(message)s",
508
+ datefmt=_LOG_DATE_FORMAT,
509
+ force=force,
510
+ )
489
511
  logging.getLogger("mcp.server.streamable_http").addFilter(
490
512
  StatelessSessionLogFilter()
491
513
  )
@@ -7,6 +7,8 @@ import logging
7
7
  import threading
8
8
  import time
9
9
  from collections import deque
10
+ from collections.abc import Iterator
11
+ from contextlib import contextmanager
10
12
  from dataclasses import asdict, dataclass
11
13
  from datetime import UTC, datetime
12
14
  from pathlib import Path
@@ -94,6 +96,30 @@ def get_startup_logs() -> list[dict[str, Any]]:
94
96
  return _startup_collector.get_logs()
95
97
 
96
98
 
99
+ @contextmanager
100
+ def preserve_startup_collector() -> Iterator[None]:
101
+ """Keep the startup collector attached across a logging reconfiguration.
102
+
103
+ ``logging.basicConfig(force=True)`` removes *and closes* every handler on
104
+ the root logger. The collector is attached there at import time and is the
105
+ source of ``ha_report_issue``'s startup diagnostics, so it is detached for
106
+ the duration of the block — leaving nothing for the sweep to close — and
107
+ re-attached afterwards.
108
+ """
109
+ collector = _startup_collector
110
+ root = logging.getLogger()
111
+ if collector is None or collector not in root.handlers:
112
+ yield
113
+ return
114
+
115
+ root.removeHandler(collector)
116
+ try:
117
+ yield
118
+ finally:
119
+ if collector not in root.handlers:
120
+ root.addHandler(collector)
121
+
122
+
97
123
  # Parameter keys whose values are masked before a tool call is recorded to the
98
124
  # in-memory ring buffer or persisted to disk. Tool kwargs can carry secrets
99
125
  # (alarm/lock ``code``, tokens, passwords); these must never reach the usage
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.14.2.dev2128
3
+ Version: 7.14.2.dev2129
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