ha-mcp-dev 7.9.0.dev757__tar.gz → 7.9.0.dev759__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 (154) hide show
  1. {ha_mcp_dev-7.9.0.dev757/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.9.0.dev759}/PKG-INFO +9 -2
  2. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/README.md +8 -1
  3. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/rest_client.py +28 -8
  5. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/backup.py +14 -2
  6. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_utility.py +25 -2
  7. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/kill_signal_diagnostics.py +11 -11
  8. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759/src/ha_mcp_dev.egg-info}/PKG-INFO +9 -2
  9. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/LICENSE +0 -0
  10. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/MANIFEST.in +0 -0
  11. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/setup.cfg +0 -0
  12. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/__init__.py +0 -0
  13. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/_version.py +0 -0
  16. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/__init__.py +0 -0
  17. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/consent_form.py +0 -0
  18. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/provider.py +0 -0
  19. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/backup_manager.py +0 -0
  20. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/__init__.py +0 -0
  21. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/supervisor_client.py +0 -0
  22. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/websocket_client.py +0 -0
  23. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/websocket_listener.py +0 -0
  24. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/config.py +0 -0
  25. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  26. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  27. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  28. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/errors.py +0 -0
  29. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/__init__.py +0 -0
  30. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/approval_queue.py +0 -0
  31. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/evaluator.py +0 -0
  32. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/handlers.py +0 -0
  33. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/middleware.py +0 -0
  34. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/model.py +0 -0
  35. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/persistence.py +0 -0
  36. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/value_sources.py +0 -0
  37. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/py.typed +0 -0
  38. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/read_only.py +0 -0
  39. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  40. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  41. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  42. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  43. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  44. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  45. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  46. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  47. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  48. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  49. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  50. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  51. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  52. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  53. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  54. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  55. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  56. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  57. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  58. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  59. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  60. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  61. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  62. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  63. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/server.py +0 -0
  64. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/__init__.py +0 -0
  65. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.css +0 -0
  66. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.html +0 -0
  67. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.js +0 -0
  68. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/smoke_test.py +0 -0
  69. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  70. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/__init__.py +0 -0
  71. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/auto_backup.py +0 -0
  72. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  73. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  74. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/device_control.py +0 -0
  75. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/enhanced.py +0 -0
  76. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/helpers.py +0 -0
  77. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/__init__.py +0 -0
  78. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/base.py +0 -0
  79. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/matter.py +0 -0
  80. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/thread.py +0 -0
  81. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  82. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/zwave.py +0 -0
  83. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/reference_validator.py +0 -0
  84. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/registry.py +0 -0
  85. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  86. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  87. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  88. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  89. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  90. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  91. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  92. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  93. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  94. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  95. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_addons.py +0 -0
  96. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_areas.py +0 -0
  97. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  98. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  99. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_calendar.py +0 -0
  100. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_camera.py +0 -0
  101. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_categories.py +0 -0
  102. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_code.py +0 -0
  103. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  104. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  105. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  106. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  107. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  108. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  109. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_energy.py +0 -0
  110. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_entities.py +0 -0
  111. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  112. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_groups.py +0 -0
  113. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_hacs.py +0 -0
  114. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_history.py +0 -0
  115. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_integrations.py +0 -0
  116. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_labels.py +0 -0
  117. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  118. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_radio.py +0 -0
  119. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_registry.py +0 -0
  120. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_resources.py +0 -0
  121. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_search.py +0 -0
  122. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_service.py +0 -0
  123. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_services.py +0 -0
  124. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_system.py +0 -0
  125. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_themes.py +0 -0
  126. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_todo.py +0 -0
  127. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_traces.py +0 -0
  128. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_updates.py +0 -0
  129. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  130. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  131. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_zones.py +0 -0
  132. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/util_helpers.py +0 -0
  133. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/validation_middleware.py +0 -0
  134. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/__init__.py +0 -0
  135. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/categorized_search.py +0 -0
  136. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  137. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/update_check.py +0 -0
  138. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/__init__.py +0 -0
  139. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/config_hash.py +0 -0
  140. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/data_paths.py +0 -0
  141. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/domain_handlers.py +0 -0
  142. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  143. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/operation_manager.py +0 -0
  144. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/python_sandbox.py +0 -0
  145. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/skill_loader.py +0 -0
  146. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/usage_logger.py +0 -0
  147. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  148. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  149. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  150. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  151. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  152. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/tests/__init__.py +0 -0
  153. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/tests/test_constants.py +0 -0
  154. {ha_mcp_dev-7.9.0.dev757 → ha_mcp_dev-7.9.0.dev759}/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.9.0.dev757
3
+ Version: 7.9.0.dev759
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
@@ -462,7 +462,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
462
462
  - **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
463
463
  - **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
464
464
  - **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
465
-
465
+ - **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
466
+ - **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
467
+ - **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
468
+ - **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
469
+ - **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
470
+ - **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
471
+ - **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
472
+ - **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
466
473
  ---
467
474
 
468
475
  ## 💬 Community
@@ -430,7 +430,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
430
430
  - **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
431
431
  - **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
432
432
  - **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
433
-
433
+ - **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
434
+ - **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
435
+ - **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
436
+ - **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
437
+ - **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
438
+ - **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
439
+ - **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
440
+ - **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
434
441
  ---
435
442
 
436
443
  ## 💬 Community
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.9.0.dev757"
7
+ version = "7.9.0.dev759"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -606,7 +606,7 @@ class HomeAssistantClient:
606
606
  self._supervised_detected = is_supervised
607
607
  return is_supervised
608
608
 
609
- async def get_addon_logs(self, slug: str) -> str:
609
+ async def get_addon_logs(self, slug: str, lines: int | None = None) -> str:
610
610
  """Fetch an add-on's container logs.
611
611
 
612
612
  Branch on ``is_running_in_addon()`` (which keys off ``SUPERVISOR_TOKEN``
@@ -621,6 +621,15 @@ class HomeAssistantClient:
621
621
  HA URL), falls back to the HA Core proxy path. That path requires an
622
622
  admin LLA but works fine when not invoked from the add-on container.
623
623
 
624
+ ``lines`` sets the journald window Supervisor serves via its
625
+ ``?lines=`` query param (supervisor/api/host.py). Without it,
626
+ Supervisor returns only its default window (``DEFAULT_LINES = 100``
627
+ in supervisor/api/const.py) — which silently capped every larger
628
+ caller-side limit before this param existed. Both branches carry
629
+ it: the direct endpoint parses the query natively, and HA Core's
630
+ hassio proxy forwards ``request.query`` upstream
631
+ (homeassistant/components/hassio/http.py).
632
+
624
633
  Both branches return ``text/plain`` log content.
625
634
 
626
635
  Raises:
@@ -633,17 +642,18 @@ class HomeAssistantClient:
633
642
  HomeAssistantConnectionError: Network, timeout, or transport error.
634
643
  """
635
644
  if is_running_in_addon():
636
- return await self._get_addon_logs_via_supervisor(slug)
645
+ return await self._get_addon_logs_via_supervisor(slug, lines=lines)
637
646
 
638
647
  logger.debug(f"Fetching addon logs for slug={slug} via HA Core proxy")
639
648
  response = await self._raw_request(
640
649
  "GET",
641
650
  f"/hassio/addons/{slug}/logs",
642
651
  headers={"Accept": "text/plain"},
652
+ params={"lines": lines} if lines is not None else None,
643
653
  )
644
654
  return response.text
645
655
 
646
- async def _supervisor_logs_get(self, path: str) -> str:
656
+ async def _supervisor_logs_get(self, path: str, lines: int | None = None) -> str:
647
657
  """Fetch ``text/plain`` logs from a Supervisor REST endpoint.
648
658
 
649
659
  ``path`` is everything between ``http://supervisor/`` and ``/logs``:
@@ -652,6 +662,9 @@ class HomeAssistantClient:
652
662
  - ``"<service>"`` (where service ∈ {supervisor, host, core, dns, audio,
653
663
  cli, multicast, observer}) for system-service logs
654
664
 
665
+ ``lines`` maps to the endpoint's ``?lines=`` journald-window query
666
+ param; omitted → Supervisor's 100-line default window.
667
+
655
668
  Bypasses ``HomeAssistantClient.httpx_client`` because the Supervisor
656
669
  endpoint uses a different base URL (``http://supervisor``) and a
657
670
  different token (``SUPERVISOR_TOKEN``) than HA Core REST. Both
@@ -681,9 +694,10 @@ class HomeAssistantClient:
681
694
 
682
695
  relative_path = f"/{path}/logs"
683
696
  logger.debug(
684
- "Fetching %s%s via Supervisor direct",
697
+ "Fetching %s%s via Supervisor direct (lines=%s)",
685
698
  get_supervisor_base_url(),
686
699
  relative_path,
700
+ lines,
687
701
  )
688
702
 
689
703
  try:
@@ -694,6 +708,7 @@ class HomeAssistantClient:
694
708
  response = await client.get(
695
709
  relative_path,
696
710
  headers={"Accept": "text/plain"},
711
+ params={"lines": lines} if lines is not None else None,
697
712
  )
698
713
  except httpx.TimeoutException as e:
699
714
  raise HomeAssistantConnectionError(
@@ -753,7 +768,9 @@ class HomeAssistantClient:
753
768
  )
754
769
  return response.text
755
770
 
756
- async def _get_addon_logs_via_supervisor(self, slug: str) -> str:
771
+ async def _get_addon_logs_via_supervisor(
772
+ self, slug: str, lines: int | None = None
773
+ ) -> str:
757
774
  """Fetch add-on container logs directly from Supervisor's REST API.
758
775
 
759
776
  Distinct from ``tools_bug_report._fetch_addon_logs``: that helper is
@@ -766,9 +783,11 @@ class HomeAssistantClient:
766
783
  Delegates to ``_supervisor_logs_get`` so error handling stays in
767
784
  lockstep with ``_get_system_service_logs``.
768
785
  """
769
- return await self._supervisor_logs_get(f"addons/{slug}")
786
+ return await self._supervisor_logs_get(f"addons/{slug}", lines=lines)
770
787
 
771
- async def _get_system_service_logs(self, service: str) -> str:
788
+ async def _get_system_service_logs(
789
+ self, service: str, lines: int | None = None
790
+ ) -> str:
772
791
  """Fetch HA system-service logs.
773
792
 
774
793
  ``service`` must be one of the eight Supervisor-managed services:
@@ -796,13 +815,14 @@ class HomeAssistantClient:
796
815
  logs) call kept working through its own Core-proxy fallback.
797
816
  """
798
817
  if is_running_in_addon():
799
- return await self._supervisor_logs_get(service)
818
+ return await self._supervisor_logs_get(service, lines=lines)
800
819
 
801
820
  logger.debug(f"Fetching {service} logs via HA Core proxy")
802
821
  response = await self._raw_request(
803
822
  "GET",
804
823
  f"/hassio/{service}/logs",
805
824
  headers={"Accept": "text/plain"},
825
+ params={"lines": lines} if lines is not None else None,
806
826
  )
807
827
  return response.text
808
828
 
@@ -329,11 +329,19 @@ async def _poll_backup_completion(
329
329
  )
330
330
 
331
331
  if event_state == "failed":
332
+ # Surface the failure event verbatim — HA's failed event
333
+ # carries the cause (e.g. another backup already in
334
+ # progress), and dropping it left CI failures reading
335
+ # "Backup creation failed: Backup creation failed" with
336
+ # nothing to diagnose.
332
337
  raise_tool_error(
333
338
  create_error_response(
334
339
  ErrorCode.SERVICE_CALL_FAILED,
335
340
  "Backup creation failed",
336
- context={"backup_job_id": backup_job_id},
341
+ context={
342
+ "backup_job_id": backup_job_id,
343
+ "last_action_event": last_event,
344
+ },
337
345
  )
338
346
  )
339
347
 
@@ -410,7 +418,11 @@ async def _poll_backup_completion(
410
418
  create_error_response(
411
419
  ErrorCode.SERVICE_CALL_FAILED,
412
420
  "Backup creation failed (observed at post-timeout lookup)",
413
- context={"backup_job_id": backup_job_id, "name": name},
421
+ context={
422
+ "backup_job_id": backup_job_id,
423
+ "name": name,
424
+ "last_action_event": last_event,
425
+ },
414
426
  )
415
427
  )
416
428
  if state != "idle":
@@ -53,6 +53,11 @@ SYSTEM_SERVICE_SLUGS = frozenset(
53
53
 
54
54
  DEFAULT_LIMIT = 50
55
55
  DEFAULT_LOG_LIMIT = 100
56
+ # Journald window to request from Supervisor when a search filter is
57
+ # active: matches are found within the fetched window only, so a
58
+ # search over the caller's (often small) limit needs more history
59
+ # behind it than the limit itself.
60
+ SUPERVISOR_SEARCH_WINDOW_LINES = 2000
56
61
  MAX_LIMIT = 500
57
62
 
58
63
  # Regex to match log level at the start of a log line
@@ -752,8 +757,18 @@ class UtilityTools:
752
757
  limit, default=DEFAULT_LOG_LIMIT, suggestion_example="100"
753
758
  )
754
759
 
760
+ # Request a journald window sized to the caller's limit —
761
+ # Supervisor's /logs endpoints default to their last-100-lines
762
+ # window, which silently capped any larger limit before ?lines=
763
+ # was plumbed through (found via #1721's e2e).
764
+ fetch_lines = (
765
+ max(effective_limit, SUPERVISOR_SEARCH_WINDOW_LINES)
766
+ if search
767
+ else effective_limit
768
+ )
769
+
755
770
  try:
756
- log_text = await self._client.get_addon_logs(slug)
771
+ log_text = await self._client.get_addon_logs(slug, lines=fetch_lines)
757
772
 
758
773
  lines = log_text.splitlines() if log_text else []
759
774
 
@@ -892,8 +907,16 @@ class UtilityTools:
892
907
  limit, default=DEFAULT_LOG_LIMIT, suggestion_example="100"
893
908
  )
894
909
 
910
+ fetch_lines = (
911
+ max(effective_limit, SUPERVISOR_SEARCH_WINDOW_LINES)
912
+ if search
913
+ else effective_limit
914
+ )
915
+
895
916
  try:
896
- log_text = await self._client._get_system_service_logs(service)
917
+ log_text = await self._client._get_system_service_logs(
918
+ service, lines=fetch_lines
919
+ )
897
920
 
898
921
  lines = log_text.splitlines() if log_text else []
899
922
 
@@ -1,6 +1,6 @@
1
1
  """Kill-signal diagnostics for the HA MCP add-on.
2
2
 
3
- Opt-in (gated by the "Advanced debug logging" addon toggle) signal handler
3
+ Opt-in (armed when the addon's effective log level is DEBUG) signal handler
4
4
  that, on SIGTERM/SIGINT/SIGHUP, captures and logs:
5
5
 
6
6
  - Signal name + ``si_code`` (USER/KERNEL/QUEUE/TKILL/...).
@@ -244,7 +244,7 @@ def format_diagnostic_block(
244
244
 
245
245
  lines = [
246
246
  "=" * 80,
247
- "ADVANCED DEBUG LOGGING — kill-signal diagnostics",
247
+ "KILL-SIGNAL DIAGNOSTICS",
248
248
  "=" * 80,
249
249
  f"Signal: {sig_name} ({signum})",
250
250
  f"si_code: {code_name}",
@@ -356,7 +356,7 @@ def _make_handler() -> Any:
356
356
  try:
357
357
  os.write(
358
358
  2,
359
- f"advanced_debug_logging handler failed for signal {signum}: {exc!r}\n".encode(
359
+ f"kill-signal diagnostics handler failed for signal {signum}: {exc!r}\n".encode(
360
360
  "utf-8", errors="replace"
361
361
  ),
362
362
  )
@@ -386,14 +386,14 @@ def install_kill_signal_diagnostics() -> bool:
386
386
 
387
387
  if sys.platform != "linux":
388
388
  logger.warning(
389
- "advanced_debug_logging is Linux-only; skipping signal handler install on %s",
389
+ "kill-signal diagnostics are Linux-only; skipping signal handler install on %s",
390
390
  sys.platform,
391
391
  )
392
392
  return False
393
393
 
394
394
  if _handler_refs:
395
395
  logger.warning(
396
- "advanced_debug_logging: install_kill_signal_diagnostics already called; skipping"
396
+ "kill-signal diagnostics: install_kill_signal_diagnostics already called; skipping"
397
397
  )
398
398
  return True
399
399
 
@@ -401,7 +401,7 @@ def install_kill_signal_diagnostics() -> bool:
401
401
  libc_path = ctypes.util.find_library("c")
402
402
  if libc_path is None:
403
403
  logger.warning(
404
- "advanced_debug_logging: libc not found; skipping signal handler install"
404
+ "kill-signal diagnostics: libc not found; skipping signal handler install"
405
405
  )
406
406
  return False
407
407
 
@@ -441,7 +441,7 @@ def install_kill_signal_diagnostics() -> bool:
441
441
  if rc != 0:
442
442
  err = ctypes.get_errno()
443
443
  logger.warning(
444
- "advanced_debug_logging: sigaction(%s) failed: errno=%d",
444
+ "kill-signal diagnostics: sigaction(%s) failed: errno=%d",
445
445
  sig.name,
446
446
  err,
447
447
  )
@@ -449,7 +449,7 @@ def install_kill_signal_diagnostics() -> bool:
449
449
  installed_for.append(sig.name)
450
450
  except Exception as exc:
451
451
  logger.warning(
452
- "advanced_debug_logging: install failed (%r); continuing without diagnostics",
452
+ "kill-signal diagnostics: install failed (%r); continuing without diagnostics",
453
453
  exc,
454
454
  )
455
455
  _handler_refs.clear()
@@ -460,7 +460,7 @@ def install_kill_signal_diagnostics() -> bool:
460
460
  if installed_for:
461
461
  chained_signals = sorted(signal.Signals(s).name for s in _chained_handlers)
462
462
  logger.info(
463
- "advanced_debug_logging enabled — kill-signal diagnostics installed for: %s "
463
+ "kill-signal diagnostics installed for: %s "
464
464
  "(chains to existing handlers for: %s)",
465
465
  ", ".join(installed_for),
466
466
  ", ".join(chained_signals) or "<none>",
@@ -502,13 +502,13 @@ def schedule_install_after_uvicorn(
502
502
  current = signal.getsignal(signal.SIGTERM)
503
503
  if callable(current) and current not in (signal.SIG_DFL, signal.SIG_IGN):
504
504
  logger.debug(
505
- "advanced_debug_logging: detected uvicorn signal handler; installing on top"
505
+ "kill-signal diagnostics: detected uvicorn signal handler; installing on top"
506
506
  )
507
507
  install()
508
508
  return
509
509
  time.sleep(poll_interval_secs)
510
510
  logger.info(
511
- "advanced_debug_logging: uvicorn handler not detected within %.1fs; installing anyway",
511
+ "kill-signal diagnostics: uvicorn handler not detected within %.1fs; installing anyway",
512
512
  timeout_secs,
513
513
  )
514
514
  install()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.9.0.dev757
3
+ Version: 7.9.0.dev759
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
@@ -462,7 +462,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
462
462
  - **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
463
463
  - **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
464
464
  - **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
465
-
465
+ - **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
466
+ - **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
467
+ - **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
468
+ - **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
469
+ - **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
470
+ - **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
471
+ - **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
472
+ - **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
466
473
  ---
467
474
 
468
475
  ## 💬 Community