ha-mcp-dev 7.14.2.dev2167__tar.gz → 7.14.2.dev2171__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 (192) hide show
  1. {ha_mcp_dev-7.14.2.dev2167/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2171}/PKG-INFO +5 -5
  2. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/README.md +4 -4
  3. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/__init__.py +18 -13
  5. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/de.json +3 -1
  6. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/en.json +3 -1
  7. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/es.json +3 -1
  8. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/fr.json +3 -1
  9. ha_mcp_dev-7.14.2.dev2171/src/ha_mcp/settings_ui/locales/it.json +810 -0
  10. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/ru.json +3 -1
  11. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/zh-Hans.json +10 -8
  12. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/settings.js +45 -6
  13. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171/src/ha_mcp_dev.egg-info}/PKG-INFO +5 -5
  14. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  15. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/LICENSE +0 -0
  16. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/MANIFEST.in +0 -0
  17. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/setup.cfg +0 -0
  18. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/__init__.py +0 -0
  19. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/__main__.py +0 -0
  20. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/_pypi_marker +0 -0
  21. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/_version.py +0 -0
  22. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/auth/__init__.py +0 -0
  23. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/auth/consent_form.py +0 -0
  24. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/auth/provider.py +0 -0
  25. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/backup_manager.py +0 -0
  26. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/browser_landing.py +0 -0
  27. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/client/__init__.py +0 -0
  28. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/client/rest_client.py +0 -0
  29. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/client/supervisor_client.py +0 -0
  30. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/client/websocket_client.py +0 -0
  31. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/client/websocket_listener.py +0 -0
  32. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/config.py +0 -0
  33. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  34. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  35. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  36. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  37. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  38. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  39. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/errors.py +0 -0
  40. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/llm_exposure.py +0 -0
  41. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/__init__.py +0 -0
  42. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/approval_queue.py +0 -0
  43. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/evaluator.py +0 -0
  44. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/handlers.py +0 -0
  45. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/middleware.py +0 -0
  46. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/model.py +0 -0
  47. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/persistence.py +0 -0
  48. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/policy/value_sources.py +0 -0
  49. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/py.typed +0 -0
  50. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/read_only.py +0 -0
  51. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  52. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  53. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  54. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  55. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  56. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  57. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  58. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  59. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  60. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  61. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  62. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  63. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  64. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  65. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  66. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  67. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  68. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  69. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  70. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  71. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  72. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  73. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  74. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  75. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  76. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/server.py +0 -0
  77. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  78. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  79. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  80. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  81. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  82. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  83. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  84. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  85. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  86. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_theme.py +0 -0
  87. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  88. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  89. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/settings.css +0 -0
  90. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/settings_ui/settings.html +0 -0
  91. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/smoke_test.py +0 -0
  92. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  93. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/strict_bps.py +0 -0
  94. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/__init__.py +0 -0
  95. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/auto_backup.py +0 -0
  96. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/backup.py +0 -0
  97. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  98. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/component_api.py +0 -0
  99. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/component_config_reads.py +0 -0
  100. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/component_devices.py +0 -0
  101. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/component_registries.py +0 -0
  102. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  103. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  104. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/device_control.py +0 -0
  105. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/helpers.py +0 -0
  106. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/__init__.py +0 -0
  107. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/base.py +0 -0
  108. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/matter.py +0 -0
  109. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/thread.py +0 -0
  110. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  111. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/radio/zwave.py +0 -0
  112. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/reference_validator.py +0 -0
  113. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/registry.py +0 -0
  114. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  115. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  116. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  117. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  118. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  119. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  120. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  121. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  122. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  123. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  124. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_addons.py +0 -0
  125. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_areas.py +0 -0
  126. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  127. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  128. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_calendar.py +0 -0
  129. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_camera.py +0 -0
  130. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_categories.py +0 -0
  131. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_code.py +0 -0
  132. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  133. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  134. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  135. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  136. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  137. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  138. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_dev.py +0 -0
  139. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_energy.py +0 -0
  140. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_entities.py +0 -0
  141. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  142. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_groups.py +0 -0
  143. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_hacs.py +0 -0
  144. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_history.py +0 -0
  145. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_integrations.py +0 -0
  146. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_labels.py +0 -0
  147. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_radio.py +0 -0
  148. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_registry.py +0 -0
  149. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_resources.py +0 -0
  150. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_search.py +0 -0
  151. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_service.py +0 -0
  152. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_services.py +0 -0
  153. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_system.py +0 -0
  154. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_themes.py +0 -0
  155. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_todo.py +0 -0
  156. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_traces.py +0 -0
  157. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_updates.py +0 -0
  158. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_utility.py +0 -0
  159. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  160. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  161. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  162. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/tools_zones.py +0 -0
  163. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/util_helpers.py +0 -0
  164. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/tools/validation_middleware.py +0 -0
  165. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/transforms/__init__.py +0 -0
  166. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/transforms/categorized_search.py +0 -0
  167. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  168. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/transport_security.py +0 -0
  169. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/update_check.py +0 -0
  170. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/__init__.py +0 -0
  171. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/config_hash.py +0 -0
  172. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/config_write_lock.py +0 -0
  173. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/data_paths.py +0 -0
  174. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/domain_handlers.py +0 -0
  175. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  176. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  177. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/operation_manager.py +0 -0
  178. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/python_sandbox.py +0 -0
  179. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/skill_loader.py +0 -0
  180. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/utils/usage_logger.py +0 -0
  181. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/visibility/__init__.py +0 -0
  182. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/visibility/enforcement.py +0 -0
  183. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/visibility/model.py +0 -0
  184. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/visibility/persistence.py +0 -0
  185. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp/visibility/resolver.py +0 -0
  186. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  187. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  188. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  189. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  190. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/tests/__init__.py +0 -0
  191. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/tests/test_constants.py +0 -0
  192. {ha_mcp_dev-7.14.2.dev2167 → ha_mcp_dev-7.14.2.dev2171}/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.dev2167
3
+ Version: 7.14.2.dev2171
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
@@ -357,9 +357,9 @@ Skills can still be installed manually for clients that prefer local skill files
357
357
 
358
358
  ## 🔍 Tool Discovery for AI Agents
359
359
 
360
- By default, the full tool catalog (~84 tools) is listed to the client through the standard MCP `tools/list` response. Clients with deferred / on-demand tool loading (Claude Sonnet, Claude Opus) handle that fine — tools are pulled into context only when needed, so idle context cost is near-zero.
360
+ By default, the full tool catalog (~84 tools) is listed to the client through the standard MCP `tools/list` response. Clients with deferred / on-demand tool loading (claude.ai, Claude Desktop, Claude Code) handle that fine — tools are pulled into context only when needed, so idle context cost is near-zero.
361
361
 
362
- For models *without* deferred tool support — Claude Haiku, Gemini, ChatGPT OpenAI-compatible local models, smaller open-weights models — listing the full tool catalog up front adds a lot of idle context and can overwhelm smaller models. To address that, the server ships with a **search-based discovery mode** built on top of FastMCP's BM25 search transform.
362
+ For setups *without* deferred tool support — models like Claude Haiku, Gemini, OpenAI-compatible local models and smaller open-weights models, or clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI) — listing the full tool catalog up front adds a lot of idle context and can overwhelm smaller models. To address that, the server ships with a **search-based discovery mode** built on top of FastMCP's BM25 search transform.
363
363
 
364
364
  ### Smaller or local LLMs (Ollama, etc.)
365
365
 
@@ -389,11 +389,11 @@ The proxy split lets MCP clients apply different permission policies per categor
389
389
 
390
390
  ### When to enable
391
391
 
392
- - **Claude Haiku, OpenAI-compatible local models, Gemini, ChatGPT or any model without native deferred tool support** — large idle-context savings.
392
+ - **Claude Haiku, OpenAI-compatible local models, Gemini, or any model without native deferred tool support** — large idle-context savings. The same applies to clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI, even when running Claude Sonnet/Opus).
393
393
  - MCP clients that cap total tool count (some cap at 100) — surfaces a minimal set (~10 tools) instead of 84.
394
394
  - **Cost-sensitive deployments** — fewer idle tokens per turn.
395
395
 
396
- Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
396
+ Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, Claude Code); the full catalog has no idle cost there, direct calls skip the search step, and the client's built-in tool search is the better choice — there is no benefit to running ha-mcp's on top of it. Whether tools are deferred depends on the client and model combination: the same model can behave differently per client — GitHub Copilot CLI running Claude Sonnet/Opus inlines the full catalog and still benefits from tool search here. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily.
397
397
 
398
398
  > 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, newly enabled tools won't appear in the client at all, and tools the server no longer exposes still show as available but return `Unknown tool` when called. ChatGPT sometimes keeps serving the stale list even after the connector is removed and re-added under the same name — if tools are still missing after re-adding, delete the connector and create a new one with a **different name**.
399
399
 
@@ -324,9 +324,9 @@ Skills can still be installed manually for clients that prefer local skill files
324
324
 
325
325
  ## 🔍 Tool Discovery for AI Agents
326
326
 
327
- By default, the full tool catalog (~84 tools) is listed to the client through the standard MCP `tools/list` response. Clients with deferred / on-demand tool loading (Claude Sonnet, Claude Opus) handle that fine — tools are pulled into context only when needed, so idle context cost is near-zero.
327
+ By default, the full tool catalog (~84 tools) is listed to the client through the standard MCP `tools/list` response. Clients with deferred / on-demand tool loading (claude.ai, Claude Desktop, Claude Code) handle that fine — tools are pulled into context only when needed, so idle context cost is near-zero.
328
328
 
329
- For models *without* deferred tool support — Claude Haiku, Gemini, ChatGPT OpenAI-compatible local models, smaller open-weights models — listing the full tool catalog up front adds a lot of idle context and can overwhelm smaller models. To address that, the server ships with a **search-based discovery mode** built on top of FastMCP's BM25 search transform.
329
+ For setups *without* deferred tool support — models like Claude Haiku, Gemini, OpenAI-compatible local models and smaller open-weights models, or clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI) — listing the full tool catalog up front adds a lot of idle context and can overwhelm smaller models. To address that, the server ships with a **search-based discovery mode** built on top of FastMCP's BM25 search transform.
330
330
 
331
331
  ### Smaller or local LLMs (Ollama, etc.)
332
332
 
@@ -356,11 +356,11 @@ The proxy split lets MCP clients apply different permission policies per categor
356
356
 
357
357
  ### When to enable
358
358
 
359
- - **Claude Haiku, OpenAI-compatible local models, Gemini, ChatGPT or any model without native deferred tool support** — large idle-context savings.
359
+ - **Claude Haiku, OpenAI-compatible local models, Gemini, or any model without native deferred tool support** — large idle-context savings. The same applies to clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI, even when running Claude Sonnet/Opus).
360
360
  - MCP clients that cap total tool count (some cap at 100) — surfaces a minimal set (~10 tools) instead of 84.
361
361
  - **Cost-sensitive deployments** — fewer idle tokens per turn.
362
362
 
363
- Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
363
+ Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, Claude Code); the full catalog has no idle cost there, direct calls skip the search step, and the client's built-in tool search is the better choice — there is no benefit to running ha-mcp's on top of it. Whether tools are deferred depends on the client and model combination: the same model can behave differently per client — GitHub Copilot CLI running Claude Sonnet/Opus inlines the full catalog and still benefits from tool search here. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily.
364
364
 
365
365
  > 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, newly enabled tools won't appear in the client at all, and tools the server no longer exposes still show as available but return `Unknown tool` when called. ChatGPT sometimes keeps serving the stale list even after the connector is removed and re-added under the same name — if tools are still missing after re-adding, delete the connector and create a new one with a **different name**.
366
366
 
@@ -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.dev2167"
7
+ version = "7.14.2.dev2171"
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
@@ -188,6 +188,23 @@ _SETTINGS_HTML = _settings_html_template.replace(
188
188
  ).replace("__HA_MCP_JS__", _SETTINGS_JS)
189
189
 
190
190
 
191
+ # Body of the 503 the five live-approval routes — pending, approve, deny,
192
+ # tool-schema and value-source — answer with whenever these stub handlers are
193
+ # in use: the stdio sidecar, but equally a main server with no approval queue
194
+ # (feature off, or the policy package failed to import). Config GET/PUT are
195
+ # served for real even then. Module-level so the guard on the settings-UI copy
196
+ # pins the string the server actually sends, rather than a hand-copied
197
+ # paraphrase that drifts away from it.
198
+ POLICY_UNAVAILABLE_MESSAGE = (
199
+ "Tool security policies live approvals are not active. "
200
+ "Either the feature is turned off in App (add-on) config, the "
201
+ "settings UI is running in stdio-sidecar mode, or the "
202
+ "policy package failed to import at startup. Check the "
203
+ "App (add-on) log for ImportError / RuntimeError details if you "
204
+ "expected gating to be on."
205
+ )
206
+
207
+
191
208
  def _build_stub_policy_handlers(*, data_dir: Path) -> dict[str, Any]:
192
209
  """Sidecar variant of the tool security policies handlers.
193
210
 
@@ -243,19 +260,7 @@ def _build_stub_policy_handlers(*, data_dir: Path) -> dict[str, Any]:
243
260
  # Either way, point users at the addon log for the real reason
244
261
  # (a startup ImportError on the policy package surfaces here as
245
262
  # the same 503 with a "ModuleNotFoundError" in the log).
246
- return JSONResponse(
247
- {
248
- "error": (
249
- "Tool security policies live approvals are not active. "
250
- "Either the feature is turned off in App (add-on) config, the "
251
- "settings UI is running in stdio-sidecar mode, or the "
252
- "policy package failed to import at startup. Check the "
253
- "App (add-on) log for ImportError / RuntimeError details if you "
254
- "expected gating to be on."
255
- )
256
- },
257
- status_code=503,
258
- )
263
+ return JSONResponse({"error": POLICY_UNAVAILABLE_MESSAGE}, status_code=503)
259
264
 
260
265
  return {
261
266
  "policy_get_config": get_config,
@@ -110,7 +110,7 @@
110
110
  "visibility.assist.help": "Verstecke Entitäten, die nicht für den Assist-Sprachassistenten (Konversation) von Home Assistant freigegeben sind – entsprechend der Liste Einstellungen > Sprachassistenten > Freigeben. Fügt zwei WebSocket-Lesevorgänge pro Suche hinzu, während es aktiviert ist.",
111
111
  "visibility.assist.only_exposed": "Nur für Assist freigegebene Entitäten anzeigen",
112
112
  "features.enable_tool_search.label": "Tool-Suche aktivieren",
113
- "features.enable_tool_search.help": "Ersetzt den vollständigen Tool-Katalog durch suchbasierte Entdeckung. Reduziert den Leerlauf-Kontext von ~46K auf ~5K Tokens. ⚠️ Aktiviere dies NICHT, wenn du Claude im Sonnet- oder Opus-Modus verwendest – diese Modelle haben ihre eigene integrierte Tool-Suche / aufgeschobene Tools, die mit unserer kollidiert. Um die Tool-Suche von ha-mcp mit Claude zu verwenden, deaktiviere zuerst Claudes integrierte Tool-Suche; lasse dies andernfalls ausgeschaltet. Verwende dies nur mit LLMs, denen native aufgeschobene Tools fehlen (z. B. Claude Haiku, lokale OpenAI-kompatible Modelle) oder mit kleineren Kontextfenstern. Tools werden über ha_search_tools gefunden und über kategorisierte Proxys (read/write/delete) ausgeführt. Erfordert Neustart, um wirksam zu werden.",
113
+ "features.enable_tool_search.help": "Ersetzt den vollständigen Tool-Katalog durch suchbasierte Entdeckung. Reduziert den Leerlauf-Kontext um rund 90 % auf etwa 5K Tokens. ⚠️ Aktiviere dies NICHT in Clients mit eigener integrierter Tool-Suche / aufgeschobenen Tools (claude.ai, Claude Desktop, Claude Code) – die beiden Suchebenen kollidieren, und die integrierte Tool-Suche des Clients ist dort die bessere Wahl; lasse dies ausgeschaltet. Ob Tools aufgeschoben werden, hängt von der Kombination aus Client und Modell ab: Verwende dies, wenn dein Setup den vollständigen Katalog von Anfang an lädt – Modelle ohne native aufgeschobene Tools (z. B. Gemini, lokale OpenAI-kompatible Modelle, Claude Haiku), Clients, die alle Tool-Schemata unabhängig vom Modell direkt einbetten (z. B. GitHub Copilot CLI), oder kleinere Kontextfenster. Auch einige Codex-Modelle und ChatGPT haben aufgeschobene Tools – prüfe direkt bei deinem Client/Modell, welche Features er hat, damit du dies nicht unnötig aktiviert lässt. Tools werden über ha_search_tools gefunden und über kategorisierte Proxys (read/write/delete) ausgeführt. Erfordert Neustart, um wirksam zu werden.",
114
114
  "features.tool_search_max_results.label": "Max. Tool-Suchergebnisse",
115
115
  "features.tool_search_max_results.help": "Maximale Anzahl von Tools, die von ha_search_tools zurückgegeben werden, wenn die Tool-Suche aktiviert ist. Niedrigere Werte (2-3) sparen Kontext-Tokens, können aber relevante Tools übersehen. Bereich: 2-10. Erfordert Neustart.",
116
116
  "features.enable_tool_security_policies.label": "Tool-Sicherheitsrichtlinien aktivieren (erweitert)",
@@ -353,6 +353,8 @@
353
353
  "policies.pending.unavailable": "Live-Genehmigungen nicht verfügbar. Überprüfe das Add-on-Protokoll.",
354
354
  "policies.pending.expires": "Läuft ab: {time}",
355
355
  "policies.pending.already_decided": "Diese Genehmigung war bereits {decision}, möglicherweise von einem anderen Tab oder einer anderen Sitzung.",
356
+ "policies.pending.decision.approved": "genehmigt",
357
+ "policies.pending.decision.denied": "abgelehnt",
356
358
  "policies.pending.invalid_token": "Dieses Genehmigungs-Token ist nicht mehr gültig (bereits verbraucht oder abgelaufen).",
357
359
  "policies.pending.action_failed": "Genehmigungs-Aktion fehlgeschlagen: {detail}",
358
360
  "visibility.errors.reach_server": "Server konnte nicht erreicht werden: {message}",
@@ -110,7 +110,7 @@
110
110
  "visibility.assist.help": "Hide entities not exposed to Home Assistant's Assist (“conversation”) voice assistant, mirroring the Settings > Voice assistants > Expose list. Adds two websocket reads per search while enabled.",
111
111
  "visibility.assist.only_exposed": "Only show entities exposed to Assist",
112
112
  "features.enable_tool_search.label": "Enable tool search",
113
- "features.enable_tool_search.help": "Replace the full tool catalog with search-based discovery. Reduces idle context from ~46K to ~5K tokens. ⚠️ Do NOT enable this if you use Claude in Sonnet or Opus modes — those models have their own built-in tool search / deferred tools, which conflicts with ours. To use ha-mcp's tool search with Claude, disable Claude's built-in tool search first; otherwise leave this off. Use this only with LLMs that lack native deferred tools (e.g. Claude Haiku, local OpenAI-compatible models) or with smaller context windows. Tools are found via ha_search_tools and executed via categorized proxies (read/write/delete). Requires restart to take effect.",
113
+ "features.enable_tool_search.help": "Replace the full tool catalog with search-based discovery. Reduces idle context by roughly 90%, to about 5K tokens. ⚠️ Do NOT enable this in clients with their own built-in tool search / deferred tools (claude.ai, Claude Desktop, Claude Code) — the two search layers conflict, and the client's built-in tool search is the better choice there; leave this off. Whether tools are deferred depends on your client and model combination: use this when your setup loads the full catalog up front — models without native deferred tools (e.g. Gemini, OpenAI-compatible local models, Claude Haiku), clients that inline all tool schemas regardless of model (e.g. GitHub Copilot CLI), or smaller context windows. Some Codex models and ChatGPT include deferred tools too — check your client/model directly to confirm its features so you don't leave this enabled unnecessarily. Tools are found via ha_search_tools and executed via categorized proxies (read/write/delete). Requires restart to take effect.",
114
114
  "features.tool_search_max_results.label": "Tool search max results",
115
115
  "features.tool_search_max_results.help": "Maximum number of tools returned by ha_search_tools when tool search is enabled. Lower values (2-3) save context tokens but may miss relevant tools. Range: 2-10. Requires restart.",
116
116
  "features.enable_tool_security_policies.label": "Enable Tool Security Policies (advanced)",
@@ -353,6 +353,8 @@
353
353
  "policies.pending.unavailable": "Live approvals unavailable. Check the App (add-on) log.",
354
354
  "policies.pending.expires": "Expires: {time}",
355
355
  "policies.pending.already_decided": "This approval was already {decision}, possibly by another tab or session.",
356
+ "policies.pending.decision.approved": "approved",
357
+ "policies.pending.decision.denied": "denied",
356
358
  "policies.pending.invalid_token": "This approval token is no longer valid (already consumed or expired).",
357
359
  "policies.pending.action_failed": "Approval action failed: {detail}",
358
360
  "visibility.errors.reach_server": "Could not reach the server: {message}",
@@ -110,7 +110,7 @@
110
110
  "visibility.assist.help": "Oculta las entidades no expuestas al asistente de voz Assist («conversation») de Home Assistant, replicando la lista de Ajustes > Asistentes de voz > Exponer. Añade dos lecturas por websocket en cada búsqueda mientras está activado.",
111
111
  "visibility.assist.only_exposed": "Mostrar solo las entidades expuestas a Assist",
112
112
  "features.enable_tool_search.label": "Activar la búsqueda de herramientas",
113
- "features.enable_tool_search.help": "Sustituye el catálogo completo de herramientas por un descubrimiento basado en búsqueda. Reduce el contexto en reposo de unos 46K a unos 5K tokens. ⚠️ NO actives esto si usas Claude en modo Sonnet u Opus: esos modelos tienen su propia búsqueda de herramientas / herramientas diferidas integrada, que entra en conflicto con la nuestra. Para usar la búsqueda de herramientas de ha-mcp con Claude, desactiva primero la búsqueda integrada de Claude; si no, deja esto desactivado. Úsalo solo con LLM que carezcan de herramientas diferidas nativas (p. ej. Claude Haiku, modelos locales compatibles con OpenAI) o con ventanas de contexto más pequeñas. Las herramientas se localizan mediante ha_search_tools y se ejecutan a través de proxies por categoría (lectura/escritura/borrado). Requiere reiniciar para que surta efecto.",
113
+ "features.enable_tool_search.help": "Sustituye el catálogo completo de herramientas por un descubrimiento basado en búsqueda. Reduce el contexto en reposo en torno a un 90 %, hasta unos 5K tokens. ⚠️ NO actives esto en clientes con su propia búsqueda de herramientas / herramientas diferidas integrada (claude.ai, Claude Desktop, Claude Code): las dos capas de búsqueda entran en conflicto y la búsqueda integrada del cliente es allí la mejor opción; deja esto desactivado. Que las herramientas se difieran depende de la combinación de cliente y modelo: usa esto cuando tu configuración carga el catálogo completo de entrada — modelos sin herramientas diferidas nativas (p. ej. Gemini, modelos locales compatibles con OpenAI, Claude Haiku), clientes que insertan todos los esquemas de herramientas sea cual sea el modelo (p. ej. GitHub Copilot CLI) o ventanas de contexto más pequeñas. Algunos modelos Codex y ChatGPT también incluyen herramientas diferidas: comprueba directamente con tu cliente/modelo qué características tiene para no dejar esto activado innecesariamente. Las herramientas se localizan mediante ha_search_tools y se ejecutan a través de proxies por categoría (lectura/escritura/borrado). Requiere reiniciar para que surta efecto.",
114
114
  "features.tool_search_max_results.label": "Máximo de resultados de la búsqueda de herramientas",
115
115
  "features.tool_search_max_results.help": "Número máximo de herramientas que devuelve ha_search_tools cuando la búsqueda de herramientas está activada. Los valores bajos (2-3) ahorran tokens de contexto pero pueden dejar fuera herramientas relevantes. Rango: 2-10. Requiere reiniciar.",
116
116
  "features.enable_tool_security_policies.label": "Activar las políticas de seguridad de herramientas (avanzado)",
@@ -353,6 +353,8 @@
353
353
  "policies.pending.unavailable": "Las aprobaciones en vivo no están disponibles. Revisa el registro de la app (complemento).",
354
354
  "policies.pending.expires": "Caduca: {time}",
355
355
  "policies.pending.already_decided": "Esta aprobación ya estaba {decision}, posiblemente desde otra pestaña o sesión.",
356
+ "policies.pending.decision.approved": "aprobada",
357
+ "policies.pending.decision.denied": "denegada",
356
358
  "policies.pending.invalid_token": "Este token de aprobación ya no es válido (ya se ha consumido o ha caducado).",
357
359
  "policies.pending.action_failed": "Ha fallado la acción de aprobación: {detail}",
358
360
  "visibility.errors.reach_server": "No se ha podido contactar con el servidor: {message}",
@@ -110,7 +110,7 @@
110
110
  "visibility.assist.help": "Masque les entités non exposées à l'assistant vocal Assist (« conversation ») de Home Assistant, en miroir de la liste Paramètres > Assistants vocaux > Exposer. Ajoute deux lectures websocket par recherche lorsqu'il est activé.",
111
111
  "visibility.assist.only_exposed": "Afficher uniquement les entités exposées à Assist",
112
112
  "features.enable_tool_search.label": "Activer la recherche d'outils",
113
- "features.enable_tool_search.help": "Remplace le catalogue complet d'outils par une découverte basée sur la recherche. Réduit le contexte inactif d'environ 46K à 5K tokens. ⚠️ N'active PAS ceci si tu utilises Claude en modes Sonnet ou Opus — ces modèles ont leur propre recherche d'outils intégrée / outils différés, qui entre en conflit avec la nôtre. Pour utiliser la recherche d'outils de ha-mcp avec Claude, désactive d'abord la recherche d'outils intégrée de Claude ; sinon, laisse ceci désactivé. Utilise ceci uniquement avec des LLM qui n'ont pas d'outils différés natifs (p. ex. Claude Haiku, modèles locaux compatibles OpenAI) ou avec des fenêtres de contexte plus petites. Les outils sont trouvés via ha_search_tools et exécutés via des proxys catégorisés (lecture/écriture/suppression). Nécessite un redémarrage pour prendre effet.",
113
+ "features.enable_tool_search.help": "Remplace le catalogue complet d'outils par une découverte basée sur la recherche. Réduit le contexte inactif d'environ 90 %, à près de 5K tokens. ⚠️ N'active PAS ceci dans les clients qui ont leur propre recherche d'outils intégrée / outils différés (claude.ai, Claude Desktop, Claude Code) — les deux couches de recherche entrent en conflit, et la recherche d'outils intégrée du client y est le meilleur choix ; laisse ceci désactivé. Le report des outils dépend de la combinaison client/modèle : utilise ceci lorsque ta configuration charge le catalogue complet d'emblée — modèles sans outils différés natifs (p. ex. Gemini, modèles locaux compatibles OpenAI, Claude Haiku), clients qui intègrent tous les schémas d'outils quel que soit le modèle (p. ex. GitHub Copilot CLI), ou fenêtres de contexte plus petites. Certains modèles Codex et ChatGPT incluent aussi des outils différés — vérifie directement auprès de ton client/modèle quelles fonctionnalités il possède pour ne pas laisser ceci activé inutilement. Les outils sont trouvés via ha_search_tools et exécutés via des proxys catégorisés (lecture/écriture/suppression). Nécessite un redémarrage pour prendre effet.",
114
114
  "features.tool_search_max_results.label": "Résultats max. de la recherche d'outils",
115
115
  "features.tool_search_max_results.help": "Nombre maximum d'outils renvoyés par ha_search_tools lorsque la recherche d'outils est activée. Des valeurs plus basses (2-3) économisent des tokens de contexte mais peuvent manquer des outils pertinents. Plage : 2-10. Nécessite un redémarrage.",
116
116
  "features.enable_tool_security_policies.label": "Activer les politiques de sécurité des outils (avancé)",
@@ -353,6 +353,8 @@
353
353
  "policies.pending.unavailable": "Approbations en direct indisponibles. Vérifie le journal de l'App (add-on).",
354
354
  "policies.pending.expires": "Expire : {time}",
355
355
  "policies.pending.already_decided": "Cette approbation était déjà {decision}, peut-être par un autre onglet ou une autre session.",
356
+ "policies.pending.decision.approved": "approuvée",
357
+ "policies.pending.decision.denied": "refusée",
356
358
  "policies.pending.invalid_token": "Ce jeton d'approbation n'est plus valide (déjà consommé ou expiré).",
357
359
  "policies.pending.action_failed": "L'action d'approbation a échoué : {detail}",
358
360
  "visibility.errors.reach_server": "Impossible d'atteindre le serveur : {message}",