ha-mcp-dev 7.12.3.dev1885__tar.gz → 7.12.3.dev1888__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 (165) hide show
  1. {ha_mcp_dev-7.12.3.dev1885/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1888}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_config_helpers.py +110 -4
  4. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/LICENSE +0 -0
  6. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/README.md +0 -0
  8. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/browser_landing.py +0 -0
  18. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/client/__init__.py +0 -0
  19. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/client/rest_client.py +0 -0
  20. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/client/supervisor_client.py +0 -0
  21. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  25. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  26. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  27. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/errors.py +0 -0
  28. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/llm_exposure.py +0 -0
  29. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/__init__.py +0 -0
  30. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/approval_queue.py +0 -0
  31. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/evaluator.py +0 -0
  32. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/handlers.py +0 -0
  33. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/middleware.py +0 -0
  34. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/model.py +0 -0
  35. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/persistence.py +0 -0
  36. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/policy/value_sources.py +0 -0
  37. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/py.typed +0 -0
  38. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/read_only.py +0 -0
  39. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  40. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  41. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  42. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  43. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  44. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  45. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  46. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  47. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  48. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  49. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  50. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  51. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  52. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  53. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  54. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  55. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  56. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  57. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  58. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  59. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  60. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  61. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  62. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  63. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  64. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/server.py +0 -0
  65. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/settings_ui/__init__.py +0 -0
  66. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/settings_ui/settings.css +0 -0
  67. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/settings_ui/settings.html +0 -0
  68. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/settings_ui/settings.js +0 -0
  69. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/smoke_test.py +0 -0
  70. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  71. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/strict_bps.py +0 -0
  72. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/__init__.py +0 -0
  73. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/auto_backup.py +0 -0
  74. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/backup.py +0 -0
  75. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  76. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/component_api.py +0 -0
  77. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  78. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/device_control.py +0 -0
  79. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/enhanced.py +0 -0
  80. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/helpers.py +0 -0
  81. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/__init__.py +0 -0
  82. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/base.py +0 -0
  83. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/matter.py +0 -0
  84. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/thread.py +0 -0
  85. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  86. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/radio/zwave.py +0 -0
  87. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/reference_validator.py +0 -0
  88. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/registry.py +0 -0
  89. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  90. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  91. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  92. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  93. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  94. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  95. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  96. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  97. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  98. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  99. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_addons.py +0 -0
  100. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_areas.py +0 -0
  101. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  102. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  103. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_calendar.py +0 -0
  104. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_camera.py +0 -0
  105. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_categories.py +0 -0
  106. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_code.py +0 -0
  107. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  108. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  109. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  110. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  111. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  112. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_dev.py +0 -0
  113. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_energy.py +0 -0
  114. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_entities.py +0 -0
  115. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  116. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_groups.py +0 -0
  117. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_hacs.py +0 -0
  118. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_history.py +0 -0
  119. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_integrations.py +0 -0
  120. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_labels.py +0 -0
  121. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  122. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_radio.py +0 -0
  123. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_registry.py +0 -0
  124. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_resources.py +0 -0
  125. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_search.py +0 -0
  126. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_service.py +0 -0
  127. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_services.py +0 -0
  128. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_system.py +0 -0
  129. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_themes.py +0 -0
  130. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_todo.py +0 -0
  131. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_traces.py +0 -0
  132. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_updates.py +0 -0
  133. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_utility.py +0 -0
  134. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  135. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  136. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/tools_zones.py +0 -0
  137. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/util_helpers.py +0 -0
  138. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/tools/validation_middleware.py +0 -0
  139. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/transforms/__init__.py +0 -0
  140. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/transforms/categorized_search.py +0 -0
  141. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  142. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/transport_security.py +0 -0
  143. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/update_check.py +0 -0
  144. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/__init__.py +0 -0
  145. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/config_hash.py +0 -0
  146. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/data_paths.py +0 -0
  147. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/domain_handlers.py +0 -0
  148. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  149. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  150. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/operation_manager.py +0 -0
  151. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/python_sandbox.py +0 -0
  152. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/skill_loader.py +0 -0
  153. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/utils/usage_logger.py +0 -0
  154. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/visibility/__init__.py +0 -0
  155. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/visibility/model.py +0 -0
  156. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/visibility/persistence.py +0 -0
  157. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp/visibility/resolver.py +0 -0
  158. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  159. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  160. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  161. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  162. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  163. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/tests/__init__.py +0 -0
  164. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/tests/test_constants.py +0 -0
  165. {ha_mcp_dev-7.12.3.dev1885 → ha_mcp_dev-7.12.3.dev1888}/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.12.3.dev1885
3
+ Version: 7.12.3.dev1888
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.12.3.dev1885"
7
+ version = "7.12.3.dev1888"
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
@@ -1399,6 +1399,85 @@ async def _find_collision_in_simple_helpers(
1399
1399
  return None
1400
1400
 
1401
1401
 
1402
+ _REGISTRY_JOIN_STALE_WARNING = (
1403
+ "Could not read the entity registry, so a renamed helper's 'name' may be the "
1404
+ "creation-time name and no current 'entity_id' is shown; use ha_search to find "
1405
+ "the helper by name for the authoritative current values."
1406
+ )
1407
+
1408
+
1409
+ async def _enrich_helpers_with_current_registry(
1410
+ client: Any, helper_type: str, items: list[Any]
1411
+ ) -> list[str]:
1412
+ """Join the entity registry onto storage-collection helper records.
1413
+
1414
+ The ``{helper_type}/list`` response carries the immutable storage ``id``
1415
+ (the unique_id) and the creation-time ``name``; after a UI rename the
1416
+ current ``entity_id`` and display name live only in the entity registry, so
1417
+ the raw list goes stale (issue #1794). For each record matched by
1418
+ ``unique_id`` **and** ``platform == helper_type`` this adds the current
1419
+ ``entity_id``, moves the storage name to ``original_name``, and sets
1420
+ ``name`` to the current display name (registry ``name``, falling back to
1421
+ ``original_name``). ``items`` is mutated in place.
1422
+
1423
+ Storage types without a matching entity (e.g. ``tag``) and platform
1424
+ mismatches are left untouched. Returns a warnings list — non-empty only
1425
+ when the registry read failed, so the caller can flag the un-enriched
1426
+ result instead of silently returning stale values.
1427
+ """
1428
+ if not items:
1429
+ # Nothing to enrich — skip the full-registry fetch entirely.
1430
+ return []
1431
+ # Degrade-open: enrichment is cosmetic, so any failure — the registry read,
1432
+ # an unexpected registry shape (e.g. a non-hashable ``id`` breaking the
1433
+ # lookup), or a malformed response — flags the result rather than raising
1434
+ # out and letting the caller's handler turn a list call into a failure.
1435
+ # Mirrors _get_entities_for_config_entry, which reads the same endpoint.
1436
+ # send_websocket_message returns {"success": false, ...} instead of raising,
1437
+ # so the malformed-response check below is the branch production takes.
1438
+ try:
1439
+ reg_result = await client.send_websocket_message(
1440
+ {"type": "config/entity_registry/list"}
1441
+ )
1442
+ # A missing / non-list ``result`` (or a non-dict / unsuccessful response)
1443
+ # is a malformed read, not an empty registry — flag it rather than
1444
+ # silently returning un-enriched records. A present-but-empty ``[]`` is a
1445
+ # legitimate no-match and passes through below without a warning.
1446
+ if not (
1447
+ isinstance(reg_result, dict)
1448
+ and reg_result.get("success")
1449
+ and isinstance(reg_result.get("result"), list)
1450
+ ):
1451
+ logger.debug(
1452
+ "list_helpers registry enrichment: malformed registry response: %r",
1453
+ reg_result,
1454
+ )
1455
+ return [_REGISTRY_JOIN_STALE_WARNING]
1456
+ registry = reg_result["result"]
1457
+ reg_by_uid = {
1458
+ entry["unique_id"]: entry
1459
+ for entry in registry
1460
+ if isinstance(entry, dict)
1461
+ and entry.get("platform") == helper_type
1462
+ and entry.get("unique_id")
1463
+ }
1464
+ for item in items:
1465
+ if not isinstance(item, dict):
1466
+ continue
1467
+ entry = reg_by_uid.get(item.get("id"))
1468
+ if entry is None:
1469
+ continue
1470
+ item["entity_id"] = entry.get("entity_id")
1471
+ item["original_name"] = item.get("name")
1472
+ item["name"] = (
1473
+ entry.get("name") or entry.get("original_name") or item.get("name")
1474
+ )
1475
+ except Exception as e:
1476
+ logger.debug(f"list_helpers registry enrichment failed: {e}")
1477
+ return [_REGISTRY_JOIN_STALE_WARNING]
1478
+ return []
1479
+
1480
+
1402
1481
  async def _check_name_collision(
1403
1482
  client: Any,
1404
1483
  helper_type: str,
@@ -3391,6 +3470,14 @@ def _shape_collection_helper_record(rec: dict[str, Any]) -> dict[str, Any]:
3391
3470
  out["entity_id"] = entity_id
3392
3471
  name = rec.get("name")
3393
3472
  if name is not None:
3473
+ # The storage body's ``name`` is the creation-time name (a rename
3474
+ # updates the registry, not the body — #1794); preserve it as
3475
+ # ``original_name`` before the current display name overrides it, so a
3476
+ # component-served record carries the same additive shape as the legacy
3477
+ # join (both paths promise entity_id/original_name in the docstring).
3478
+ original_name = out.get("name")
3479
+ if original_name is not None:
3480
+ out["original_name"] = original_name
3394
3481
  out["name"] = name
3395
3482
  return out
3396
3483
 
@@ -3538,11 +3625,19 @@ class HelperConfigTools:
3538
3625
  List all Home Assistant helpers of a specific type with their configurations.
3539
3626
 
3540
3627
  Returns complete configuration for all helpers of the specified type including:
3541
- - ID (storage id), name, icon
3542
- - entity_id and current display name (where available)
3628
+ - id (immutable storage key), entity_id (current — address the helper by
3629
+ this, where available), name (current display name), original_name
3630
+ (creation-time name), icon
3543
3631
  - Type-specific settings (min/max for input_number, options for input_select, etc.)
3544
3632
  - Area and label assignments
3545
3633
 
3634
+ For a helper renamed in the UI, id/original_name keep the storage values while
3635
+ entity_id/name reflect the current entity registry (entity_id is the identifier
3636
+ ha_config_set_helper resolves against, so prefer it over id for a renamed helper).
3637
+ entity_id/original_name are present only for storage-collection helpers matched in
3638
+ the entity registry — types with no backing entity (e.g. tag), and every record when
3639
+ the registry read degrades, carry only id/name (a warning flags the degraded case).
3640
+
3546
3641
  SUPPORTED HELPER TYPES:
3547
3642
  - input_button: Virtual buttons for triggering automations
3548
3643
  - input_boolean: Toggle switches/checkboxes
@@ -3602,14 +3697,25 @@ class HelperConfigTools:
3602
3697
  {"type": f"{helper_type}/list"}
3603
3698
  )
3604
3699
  if result.get("success"):
3605
- items = result.get("result", [])
3606
- return {
3700
+ # Flatten first: person/list returns {"storage": [...],
3701
+ # "config": [...]} rather than a flat list, so a raw
3702
+ # result["result"] would be a dict here — breaking both the
3703
+ # count and the registry enrichment below (which iterates
3704
+ # records). _flatten_helper_list_result normalises both shapes.
3705
+ items = _flatten_helper_list_result(result)
3706
+ warnings = await _enrich_helpers_with_current_registry(
3707
+ self._client, helper_type, items
3708
+ )
3709
+ response: dict[str, Any] = {
3607
3710
  "success": True,
3608
3711
  "helper_type": helper_type,
3609
3712
  "count": len(items),
3610
3713
  "helpers": items,
3611
3714
  "message": f"Found {len(items)} {helper_type} helper(s)",
3612
3715
  }
3716
+ if warnings:
3717
+ response["warnings"] = warnings
3718
+ return response
3613
3719
  raise_tool_error(
3614
3720
  create_error_response(
3615
3721
  ErrorCode.SERVICE_CALL_FAILED,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.12.3.dev1885
3
+ Version: 7.12.3.dev1888
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