ha-mcp-dev 8.4.3.dev2563__tar.gz → 8.4.3.dev2572__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 (310) hide show
  1. {ha_mcp_dev-8.4.3.dev2563/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2572}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/config.py +10 -0
  4. ha_mcp_dev-8.4.3.dev2572/src/ha_mcp/ha_request_queue.py +145 -0
  5. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/middleware.py +2 -37
  6. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/read_only.py +1 -1
  7. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/server.py +9 -0
  8. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_advanced.py +12 -11
  9. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/cs.json +4 -0
  10. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/de.json +4 -0
  11. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/en.json +4 -0
  12. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/eo.json +4 -0
  13. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/es.json +4 -0
  14. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/fr.json +4 -0
  15. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/it.json +4 -0
  16. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/ko.json +4 -0
  17. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/nl.json +4 -0
  18. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/pl.json +4 -0
  19. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/ru.json +4 -0
  20. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/sv.json +4 -0
  21. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/zh-Hans.json +4 -0
  22. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/settings.js +2 -0
  23. ha_mcp_dev-8.4.3.dev2572/src/ha_mcp/tool_dispatch.py +39 -0
  24. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/visibility/enforcement.py +1 -1
  25. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  26. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp_dev.egg-info/SOURCES.txt +2 -0
  27. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/LICENSE +0 -0
  28. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/MANIFEST.in +0 -0
  29. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/README.md +0 -0
  30. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/setup.cfg +0 -0
  31. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/__init__.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/__main__.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_pypi_marker +0 -0
  34. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_rich_compat.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/__init__.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/requirements.txt +0 -0
  37. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  38. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  39. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  40. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  73. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/_version.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/auth/__init__.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/auth/consent_form.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/auth/oidc_compat.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/auth/provider.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/backup_manager.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/browser_landing.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/client/__init__.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/client/rest_client.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/client/supervisor_client.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/client/websocket_client.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/client/websocket_listener.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  108. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  109. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  110. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  111. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/errors.py +0 -0
  112. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  113. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/llm_exposure.py +0 -0
  114. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/log_filters.py +0 -0
  115. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/__init__.py +0 -0
  116. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/approval_queue.py +0 -0
  117. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/editing.py +0 -0
  118. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/evaluator.py +0 -0
  119. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/handlers.py +0 -0
  120. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/model.py +0 -0
  121. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/persistence.py +0 -0
  122. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/policy/value_sources.py +0 -0
  123. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/py.typed +0 -0
  124. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/redaction.py +0 -0
  125. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/renamed_tools.py +0 -0
  126. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  127. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  128. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  129. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  130. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  131. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  132. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  133. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  134. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  135. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  136. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  137. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  138. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  139. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  140. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  141. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  142. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  143. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  144. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  145. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  146. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  147. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  148. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  149. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  150. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  151. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  152. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  153. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  154. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  155. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  156. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  157. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  158. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  159. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  160. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  161. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  162. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  163. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  164. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  165. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  166. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  167. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/__init__.py +0 -0
  168. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  169. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  170. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  171. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  172. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  173. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  174. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  175. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  176. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  177. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_theme.py +0 -0
  178. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  179. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  180. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  181. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/settings.css +0 -0
  182. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/settings_ui/settings.html +0 -0
  183. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/smoke_test.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/strict_bps.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/__init__.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/auto_backup.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/backup.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/best_practice_result.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/blueprint_write.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/bulk_selector.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_api.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_config_entries.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_config_reads.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_devices.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_registries.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/device_control.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/hacs_registration.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/helpers.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/log_common.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/log_sources.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/__init__.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/base.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/matter.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/thread.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/radio/zwave.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/reference_validator.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/registry.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_addons.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_areas.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_calendar.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_camera.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_categories.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_code.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_dev.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_energy.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_entities.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_groups.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_hacs.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_history.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_integrations.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_labels.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_logs.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_radio.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_registry.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_resources.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_search.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_service.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_services.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_system.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_themes.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_todo.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_traces.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_updates.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_utility.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/tools_zones.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/util_helpers.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/tools/validation_middleware.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/transforms/__init__.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/transforms/categorized_search.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/transport_security.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/update_check.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/__init__.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/config_hash.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/config_write_lock.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/data_paths.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/domain_handlers.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/entity_membership.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/operation_manager.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/python_sandbox.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/skill_loader.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/utils/usage_logger.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/visibility/__init__.py +0 -0
  301. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/visibility/model.py +0 -0
  302. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/visibility/persistence.py +0 -0
  303. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp/visibility/resolver.py +0 -0
  304. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  305. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  306. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  307. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  308. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/tests/__init__.py +0 -0
  309. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/tests/test_constants.py +0 -0
  310. {ha_mcp_dev-8.4.3.dev2563 → ha_mcp_dev-8.4.3.dev2572}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2563
3
+ Version: 8.4.3.dev2572
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 = "8.4.3.dev2563"
7
+ version = "8.4.3.dev2572"
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
@@ -62,6 +62,10 @@ class Settings(BaseSettings):
62
62
  # Tool configuration
63
63
  fuzzy_threshold: int = Field(60, alias="FUZZY_THRESHOLD")
64
64
 
65
+ # Optional process-wide outer tool-call concurrency. Zero preserves the
66
+ # existing unlimited behavior; constrained installs can opt into queuing.
67
+ ha_tool_concurrency: int = Field(0, ge=0, le=32, alias="HA_TOOL_CONCURRENCY")
68
+
65
69
  # Smart-search config-fetch time budgets (seconds). Bound how long
66
70
  # ha_search spends fetching automation/script/scene
67
71
  # definitions during the per-id fallback before reporting a partial
@@ -890,6 +894,9 @@ ADVANCED_SETTINGS_FIELDS: tuple[AdvancedField, ...] = (
890
894
  True,
891
895
  ),
892
896
  # Operations.
897
+ AdvancedField(
898
+ "ha_tool_concurrency", "HA_TOOL_CONCURRENCY", int, "operations", True
899
+ ),
893
900
  AdvancedField("backup_hint", "BACKUP_HINT", str, "operations", True),
894
901
  AdvancedField("enable_websocket", "ENABLE_WEBSOCKET", bool, "operations", True),
895
902
  # Dashboard-screenshot engine URL (#1538): docker/.env users could set
@@ -1000,6 +1007,7 @@ _ADVANCED_SETTINGS_BOUNDS: dict[str, tuple[float, float]] = {
1000
1007
  "scene_config_time_budget": (1.0, 600.0),
1001
1008
  "individual_config_timeout": (1.0, 600.0),
1002
1009
  "individual_fetch_batch_size": (1, 100),
1010
+ "ha_tool_concurrency": (1, 32),
1003
1011
  "code_mode_max_duration": (1.0, 300.0),
1004
1012
  "code_mode_max_memory": (1_048_576, 268_435_456),
1005
1013
  "code_mode_max_recursion": (1, 10_000),
@@ -1015,6 +1023,7 @@ _ADVANCED_SETTINGS_BOUNDS: dict[str, tuple[float, float]] = {
1015
1023
  # emits min=sentinel so the number input can still express "off"; the
1016
1024
  # override-apply and UI-POST paths accept the sentinel OR the bounded range.
1017
1025
  _ADVANCED_SETTINGS_SENTINELS: dict[str, int] = {
1026
+ "ha_tool_concurrency": 0,
1018
1027
  "sidecar_pin_port": 0,
1019
1028
  }
1020
1029
 
@@ -1036,6 +1045,7 @@ _ADVANCED_SETTINGS_CHOICES: dict[str, tuple[str, ...]] = {
1036
1045
  # batches addon-origin writes and POSTs them via Supervisor.
1037
1046
  ADDON_SYNCED_ADVANCED_FIELDS: tuple[str, ...] = (
1038
1047
  "backup_hint",
1048
+ "ha_tool_concurrency",
1039
1049
  "verify_ssl",
1040
1050
  )
1041
1051
 
@@ -0,0 +1,145 @@
1
+ """Cross-session concurrency control for Home Assistant tool calls."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import logging
7
+ from contextvars import ContextVar
8
+ from typing import Any
9
+
10
+ from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
11
+
12
+ from .errors import create_timeout_error
13
+ from .tool_dispatch import (
14
+ CALL_PROXY_META_TOOLS,
15
+ LOCAL_ONLY_TOOLS,
16
+ OUTER_QUEUE_ORCHESTRATORS,
17
+ is_approval_management_call,
18
+ )
19
+ from .tools.helpers import raise_tool_error, safe_progress
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ _QUEUE_WAIT_TIMEOUT_SECONDS = 60.0
24
+ _QUEUE_WAIT_HEARTBEAT_SECONDS = 15.0
25
+ _QUEUE_WAIT_WARNING_SECONDS = 15.0
26
+
27
+
28
+ def _bypasses_outer_queue(name: str, args: dict[str, Any]) -> bool:
29
+ """Return whether an outer envelope must run without a queue slot.
30
+
31
+ Proxy and orchestration envelopes leave admission to their nested dispatches.
32
+ Local search does not contact Home Assistant. Approval-management actions
33
+ must remain available while all configured slots are occupied.
34
+ """
35
+ return (
36
+ name in CALL_PROXY_META_TOOLS
37
+ or name in LOCAL_ONLY_TOOLS
38
+ or name in OUTER_QUEUE_ORCHESTRATORS
39
+ or is_approval_management_call(name, args)
40
+ )
41
+
42
+
43
+ class HomeAssistantRequestQueueMiddleware(Middleware):
44
+ """Bound concurrent outer tool calls while allowing nested redispatch."""
45
+
46
+ def __init__(self, max_concurrency: int = 1) -> None:
47
+ if not 1 <= max_concurrency <= 32:
48
+ raise ValueError(
49
+ "ha_tool_concurrency middleware requires a value between 1 and 32; "
50
+ "0 is handled by not registering the middleware"
51
+ )
52
+ self._semaphore = asyncio.Semaphore(max_concurrency)
53
+ self._depth: ContextVar[int] = ContextVar(
54
+ f"ha_request_queue_depth_{id(self)}", default=0
55
+ )
56
+
57
+ async def _acquire_slot(self, context: MiddlewareContext, name: str) -> None:
58
+ """Acquire an outer-call slot with progress and a bounded wait."""
59
+ loop = asyncio.get_running_loop()
60
+ started = loop.time()
61
+ warned = False
62
+
63
+ if not self._semaphore.locked():
64
+ await self._semaphore.acquire()
65
+ logger.debug("HA tool queue: acquired slot tool=%s wait=0.000s", name)
66
+ return
67
+
68
+ logger.debug("HA tool queue: waiting for slot tool=%s", name)
69
+
70
+ while True:
71
+ elapsed = loop.time() - started
72
+ remaining = _QUEUE_WAIT_TIMEOUT_SECONDS - elapsed
73
+ if remaining <= 0:
74
+ logger.warning(
75
+ "HA tool queue: timed out waiting for slot tool=%s wait=%.1fs",
76
+ name,
77
+ elapsed,
78
+ )
79
+ raise_tool_error(
80
+ create_timeout_error(
81
+ "Home Assistant tool queue admission",
82
+ _QUEUE_WAIT_TIMEOUT_SECONDS,
83
+ details=(
84
+ f"Tool '{name}' did not start because all configured "
85
+ "Home Assistant tool slots remained busy."
86
+ ),
87
+ context={"tool": name, "phase": "queue_wait"},
88
+ )
89
+ )
90
+
91
+ ctx = getattr(context, "fastmcp_context", None)
92
+ await safe_progress(
93
+ ctx,
94
+ progress=0,
95
+ total=0,
96
+ message=f"Waiting for Home Assistant tool capacity: {name}",
97
+ )
98
+ try:
99
+ await asyncio.wait_for(
100
+ self._semaphore.acquire(),
101
+ timeout=min(_QUEUE_WAIT_HEARTBEAT_SECONDS, remaining),
102
+ )
103
+ except TimeoutError:
104
+ elapsed = loop.time() - started
105
+ if not warned and elapsed >= _QUEUE_WAIT_WARNING_SECONDS:
106
+ warned = True
107
+ logger.warning(
108
+ "HA tool queue: still waiting for slot tool=%s wait=%.1fs",
109
+ name,
110
+ elapsed,
111
+ )
112
+ continue
113
+
114
+ logger.debug(
115
+ "HA tool queue: acquired slot tool=%s wait=%.3fs",
116
+ name,
117
+ loop.time() - started,
118
+ )
119
+ return
120
+
121
+ async def on_call_tool(
122
+ self, context: MiddlewareContext, call_next: CallNext
123
+ ) -> Any:
124
+ if _bypasses_outer_queue(context.message.name, context.message.arguments or {}):
125
+ return await call_next(context)
126
+
127
+ depth = self._depth.get()
128
+ if depth:
129
+ token = self._depth.set(depth + 1)
130
+ try:
131
+ return await call_next(context)
132
+ finally:
133
+ self._depth.reset(token)
134
+
135
+ name = context.message.name
136
+ await self._acquire_slot(context, name)
137
+ try:
138
+ token = self._depth.set(1)
139
+ try:
140
+ return await call_next(context)
141
+ finally:
142
+ self._depth.reset(token)
143
+ finally:
144
+ self._semaphore.release()
145
+ logger.debug("HA tool queue: released slot tool=%s", name)
@@ -13,6 +13,7 @@ from fastmcp.server.middleware.middleware import CallNext, Middleware, Middlewar
13
13
 
14
14
  from ..errors import ErrorCode, create_error_response
15
15
  from ..renamed_tools import current_tool_name
16
+ from ..tool_dispatch import CALL_PROXY_META_TOOLS, is_approval_management_call
16
17
  from ..tools.helpers import raise_tool_error, safe_progress
17
18
  from .approval_queue import ApprovalQueue, PendingApproval, compute_args_hash
18
19
  from .evaluator import (
@@ -26,48 +27,12 @@ from .model import Policy, Rule
26
27
 
27
28
  logger = logging.getLogger(__name__)
28
29
 
29
- # Dispatching call proxies are a strict subset of the ungated tool-search
30
- # meta-tools. Only these three execute their envelope's ``name``; search merely
31
- # returns catalog metadata and must not be unwrapped by other middleware.
32
- # Gating a call proxy directly would be wrong: rule predicates target the real
33
- # tool's args (for example args.domain), while the proxy receives a wrapped
34
- # {"name": "...", "arguments": {...}} envelope. Its dispatch re-enters the
35
- # middleware chain with the real name and args, so the inner call is gated there.
36
- CALL_PROXY_META_TOOLS = frozenset(
37
- {
38
- "ha_call_read_tool",
39
- "ha_call_write_tool",
40
- "ha_call_delete_tool",
41
- }
42
- )
43
- # Policy itself also leaves catalog search ungated; unlike the call proxies it
44
- # never dispatches a tool named in client-supplied arguments.
45
30
  PROXY_META_TOOLS = CALL_PROXY_META_TOOLS | {"ha_search_tools"}
46
31
 
47
- # ha_dev_manage_server actions that MANAGE the approval queue itself.
48
- # Gating these deadlocks by construction: with a wildcard (or
49
- # ha_dev_manage_server) rule in place, an MCP-only "approve" call would
50
- # itself require approval — creating a second pending entry instead of
51
- # deciding the first, so nothing can ever be approved through the tool.
52
- # Only the queue-management actions are exempt; update_source / restart
53
- # remain gateable like any other high-stakes action. The exemption is not
54
- # a free self-approval: approve/deny separately require the
55
- # dev_tools_security_policy_access setting (off by default, issue #2141).
56
- _APPROVAL_MANAGEMENT_TOOL = "ha_dev_manage_server"
57
- _APPROVAL_MANAGEMENT_ACTIONS = frozenset({"list_pending", "approve", "deny"})
58
-
59
-
60
- def _is_approval_management(name: str, args: dict[str, Any]) -> bool:
61
- """True for dev-tool calls that manage the approval queue itself."""
62
- return (
63
- name == _APPROVAL_MANAGEMENT_TOOL
64
- and args.get("action") in _APPROVAL_MANAGEMENT_ACTIONS
65
- )
66
-
67
32
 
68
33
  def _passes_ungated(name: str, args: dict[str, Any]) -> bool:
69
34
  """Calls that must bypass gating: proxy meta-tools + queue management."""
70
- return name in PROXY_META_TOOLS or _is_approval_management(name, args)
35
+ return name in PROXY_META_TOOLS or is_approval_management_call(name, args)
71
36
 
72
37
 
73
38
  class PolicyMiddleware(Middleware):
@@ -39,8 +39,8 @@ from fastmcp.tools import Tool
39
39
 
40
40
  from .config import get_global_settings
41
41
  from .errors import ErrorCode, create_error_response
42
- from .policy.middleware import CALL_PROXY_META_TOOLS
43
42
  from .renamed_tools import current_tool_name
43
+ from .tool_dispatch import CALL_PROXY_META_TOOLS
44
44
  from .tools.helpers import raise_tool_error
45
45
 
46
46
  if TYPE_CHECKING:
@@ -289,6 +289,15 @@ class HomeAssistantSmartMCPServer:
289
289
  # wraps the final tool surface (including the search proxies).
290
290
  self._apply_tool_security_policies()
291
291
 
292
+ # Constrained installs can opt into cross-session tool queuing. This
293
+ # sits after approval gates so a call awaiting approval holds no slot.
294
+ if self.settings.ha_tool_concurrency:
295
+ from .ha_request_queue import HomeAssistantRequestQueueMiddleware
296
+
297
+ self.mcp.add_middleware(
298
+ HomeAssistantRequestQueueMiddleware(self.settings.ha_tool_concurrency)
299
+ )
300
+
292
301
  # Known-secret-value scrub (#2157) — registered just before the
293
302
  # visibility outbound half so that half stays innermost (its scan
294
303
  # must see truly raw output; a secret value could embed a hidden
@@ -3,7 +3,8 @@
3
3
  Factory returning the ``get_advanced_settings`` / ``save_advanced_settings``
4
4
  handlers over the ``ADVANCED_SETTINGS_FIELDS`` registry. Most advanced
5
5
  fields write to the shared ``feature_flags.json`` override file;
6
- ``ADDON_SYNCED_ADVANCED_FIELDS`` (``backup_hint``, ``verify_ssl``) route
6
+ ``ADDON_SYNCED_ADVANCED_FIELDS`` (``backup_hint``, ``ha_tool_concurrency``,
7
+ ``verify_ssl``) route
7
8
  through the Supervisor add-on options in add-on mode instead.
8
9
 
9
10
  Handlers are module-level (own C901 budget); ``build_advanced_handlers``
@@ -131,10 +132,10 @@ async def _get_advanced_settings(
131
132
  Mirrors ``_get_feature_flags`` / ``_get_backup_config`` but for the
132
133
  ``ADVANCED_SETTINGS_FIELDS`` registry. Most advanced fields write to
133
134
  ``feature_flags.json`` via the shared override file in either deployment
134
- mode. ``ADDON_SYNCED_ADVANCED_FIELDS`` (``backup_hint``, ``verify_ssl``)
135
- are an exception: in addon mode they have ``origin="addon"`` (editable)
136
- and saves route through Supervisor so the add-on Configuration tab and
137
- the web UI share state.
135
+ mode. ``ADDON_SYNCED_ADVANCED_FIELDS`` (``backup_hint``,
136
+ ``ha_tool_concurrency``, ``verify_ssl``) are an exception: in addon mode
137
+ they have ``origin="addon"`` (editable) and saves route through Supervisor
138
+ so the add-on Configuration tab and the web UI share state.
138
139
  """
139
140
  from ha_mcp.settings_ui import is_http_settings_mounted
140
141
 
@@ -327,7 +328,7 @@ def _validate_one_advanced_field(
327
328
  status_code=409,
328
329
  ),
329
330
  )
330
- # Addon-synced fields (e.g. backup_hint, verify_ssl) are editable in
331
+ # Addon-synced fields (backup_hint, ha_tool_concurrency, verify_ssl) are editable in
331
332
  # addon mode even though their env vars are set — start.py rewrites them
332
333
  # from /data/options.json on every boot, so route the write through
333
334
  # Supervisor instead of the override file.
@@ -525,11 +526,11 @@ async def _save_advanced_settings(
525
526
  ) -> JSONResponse:
526
527
  """Persist UI-edited advanced settings.
527
528
 
528
- Addon-synced fields (``backup_hint``, ``verify_ssl``) in add-on mode
529
- route through Supervisor; everything else atomically merges into the
530
- shared ``feature_flags.json`` override file. Either sink responds with
531
- ``restart_required=True`` (most advanced fields gate one-time startup
532
- paths).
529
+ Addon-synced fields (``backup_hint``, ``ha_tool_concurrency``,
530
+ ``verify_ssl``) in add-on mode route through Supervisor; everything else
531
+ atomically merges into the shared ``feature_flags.json`` override file.
532
+ Either sink responds with ``restart_required=True`` (most advanced fields
533
+ gate one-time startup paths).
533
534
  """
534
535
  from ..config import ADVANCED_SETTINGS_FIELDS
535
536
 
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Časový limit pro každé načtení konfigurace automatizace/skriptu/scény. Rozsah 1–600. Vyžadován restart.",
405
405
  "advanced.individual_fetch_batch_size.label": "Velikost dávky načítání konfigurace",
406
406
  "advanced.individual_fetch_batch_size.help": "Souběžné načítání konfigurací podle ID. Snižte směrem k 1 na sériových HA serverech. Rozsah 1–100. Vyžadován restart.",
407
+ "advanced.ha_tool_concurrency.label": "Souběžnost nástrojů Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Volitelný limit pro vnější volání nástrojů Home Assistant napříč všemi relacemi. Vnitřní souběžnost REST, WebSocket a distribuce pro jednotlivé nástroje zůstává nezměněna. Hodnota 0 zachovává neomezené chování. Volání čekající na kapacitu selže po 60 sekundách. Rozsah 0–32. Vyžadován restart.",
407
409
  "advanced.backup_hint.label": "Úroveň nápovědy k zálohování",
408
410
  "advanced.backup_hint.help": "Určuje, jak silně je LLM vyzváno k vytvoření úplného snímku HA před rizikovými zápisy.",
409
411
  "advanced.backup_hint.choices.strong": "Silná",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Nástroje zde uvedené jsou uzamčeny jako připnuté — zobrazují se v horní části karty Nástroje a nelze je odepnout z webového uživatelského rozhraní Nastavení, aniž byste nejprve zrušili toto nastavení. Užitečné v kombinaci s vyhledáváním nástrojů. Názvy nástrojů oddělené čárkami.",
469
471
  "addon.verify_ssl.name": "Ověřit certifikát TLS",
470
472
  "addon.verify_ssl.description": "Ověřit TLS certifikát serveru Home Assistant. Aplikace (doplněk) se připojuje přes proxy Supervisor, takže to obvykle nemá žádný vliv a mělo by to zůstat zapnuté. Zakazujte pouze v případě, že jste přenastavili aplikaci (doplněk) tak, aby komunikovala s HA přes veřejný HTTPS hostname s The self-signed certifikátem nebo neshodou hostname. Vypnutí oslabuje zabezpečení přenosu – nechte zapnuté, pokud víte, že to potřebujete. Vyžaduje restart, aby se projevilo.",
473
+ "addon.ha_tool_concurrency.name": "Souběžnost nástrojů Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Volitelný limit pro vnější volání nástrojů Home Assistant napříč všemi relacemi. Vnitřní souběžnost REST, WebSocket a distribuce pro jednotlivé nástroje zůstává nezměněna. Hodnota 0 zachovává neomezené chování. Volání čekající na kapacitu selže po 60 sekundách.",
471
475
  "addon_stable.enable_tool_search.description": "Nahradit úplný katalog nástrojů vyhledáváním. Snižuje klidový kontext přibližně o 90 %, na asi 5 tisíc tokenů. ⚠️ NEZAPÍNEJTE toto v klientech s vlastním vestavěným vyhledáváním nástrojů / odloženými nástroji (claude.ai, Claude Desktop, Claude Code) – obě vrstvy vyhledávání se střetávají a vestavěné vyhledávání nástrojů v klientovi je zde lepší volbou; nechte to vypnuté. Zda jsou nástroje odloženy, závisí na kombinaci vašeho klienta a modelu: použijte toto, když vaše nastavení načítá celý katalog předem – modely bez nativních odložených nástrojů (např. Gemini, lokální modely kompatibilní s OpenAI, Claude Haiku), klienti, kteří vkládají všechna schémata nástrojů bez ohledu na model (např. GitHub Copilot CLI), nebo menší kontextová okna. Některé modely Codex a ChatGPT také obsahují odložené nástroje – ověřte si funkce přímo u svého klienta/modelu, abyste to nenechávali zbytečně zapnuté. Nástroje se vyhledávají přes ha_search_tools a spouštějí se přes kategorizované proxy (read/write/delete). Vyžaduje restart aplikace (doplněku), aby se projevila změna – poté znovu připojte nebo obnovte MCP server ve svém AI klientovi, aby se znovu načetl seznam nástrojů. Samotný restart aplikace (doplněku) NEAKTUALIZUJE mezipaměť seznamu nástrojů klienta; toto platí po změně jakéhokoli nastavení zde."
472
476
  },
473
477
  "tools": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Timeout für jeden Automatisierungs-/Skript-/Szenen-Konfigurations-Abruf. Bereich 1-600. Neustart erforderlich.",
405
405
  "advanced.individual_fetch_batch_size.label": "Konfigurations-Abruf-Batch-Größe",
406
406
  "advanced.individual_fetch_batch_size.help": "Gleichzeitige Pro-ID-Konfigurations-Abrufe. Senke auf 1 bei seriellen HA-Servern. Bereich 1-100. Neustart erforderlich.",
407
+ "advanced.ha_tool_concurrency.label": "Home-Assistant-Tool-Gleichzeitigkeit",
408
+ "advanced.ha_tool_concurrency.help": "Optionales Limit für äußere Home-Assistant-Tool-Aufrufe über alle Sitzungen hinweg. Interne REST-, WebSocket- und tool-spezifische Fan-Out-Gleichzeitigkeit bleibt unverändert. 0 behält das unbegrenzte Verhalten bei. Ein auf Kapazität wartender Aufruf schlägt nach 60 Sekunden fehl. Bereich 0–32. Neustart erforderlich.",
407
409
  "advanced.backup_hint.label": "Backup-Hinweis-Level",
408
410
  "advanced.backup_hint.help": "Steuert, wie stark das LLM aufgefordert wird, einen vollständigen HA-Snapshot vor riskanten Schreibvorgängen zu erstellen.",
409
411
  "advanced.backup_hint.choices.strong": "Stark",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Hier aufgelistete Tools sind gesperrt angeheftet – sie erscheinen oben im Tools-Tab und können nicht vom Web-Settings-UI entfernt werden, ohne diese Option zuerst zu entfernen. Nützlich in Kombination mit Tool Search. Kommagetrennte Tool-Namen.",
469
471
  "addon.verify_ssl.name": "TLS-Zertifikat verifizieren",
470
472
  "addon.verify_ssl.description": "Überprüfe das TLS-Zertifikat des Home Assistant-Servers. Die App (das Add-on) verbindet sich über den Supervisor-Proxy, daher hat dies normalerweise keine Auswirkungen und sollte aktiviert bleiben. Deaktiviere es nur, wenn du die App (das Add-on) so rekonfiguriert hast, dass sie über einen öffentlichen HTTPS-Hostnamen mit einem selbstsignierten Zertifikat oder einem Hostnamen-Mismatch mit HA kommuniziert. Das Deaktivieren schwächt die Transportsicherheit — lasse es eingeschaltet, es sei denn, du weißt, dass du es brauchst. Erfordert einen Neustart, um wirksam zu werden.",
473
+ "addon.ha_tool_concurrency.name": "Home-Assistant-Tool-Gleichzeitigkeit",
474
+ "addon.ha_tool_concurrency.description": "Optionales Limit für äußere Home-Assistant-Tool-Aufrufe über alle Sitzungen hinweg. Interne REST-, WebSocket- und tool-spezifische Fan-Out-Gleichzeitigkeit bleibt unverändert. 0 behält das unbegrenzte Verhalten bei. Ein auf Kapazität wartender Aufruf schlägt nach 60 Sekunden fehl.",
471
475
  "addon_stable.enable_tool_search.description": "Ersetze den vollständigen Tool-Katalog durch eine suchend basierte Erkennung. Reduziert den Leerlaufkontext um etwa 90 % auf ca. 5K Token. ⚠️ Aktiviere dies NICHT in Clients mit eigener integrierter Tool-Suche / verzögerten Tools (claude.ai, Claude Desktop, Claude Code) — die beiden Suchschichten kollidieren, und die integrierte Tool-Suche des Clients ist dort die bessere Wahl; lasse dies ausgeschaltet. Ob Tools verzögert werden, hängt von deiner Client- und Modellkombination ab: Verwende dies, wenn dein Setup den vollständigen Katalog im Voraus lädt — Modelle ohne native verzögerte Tools (z. B. Gemini, OpenAI-kompatible lokale Modelle, Claude Haiku), Clients, die alle Tool-Schemas unabhängig vom Modell einbetten (z. B. GitHub Copilot CLI), oder kleinere Kontextfenster. Einige Codex-Modelle und ChatGPT beinhalten ebenfalls verzögerte Tools — überprüfe deinen Client bzw. dein Modell direkt, um dessen Funktionen zu bestätigen, damit du dies nicht unnötig aktiviert lässt. Tools werden über ha_search_tools gefunden und über kategorisierte Proxys (lesen/schreiben/löschen) ausgeführt. Erfordert einen App-(Add-on-)Neustart, um wirksam zu werden — verbinde dich danach neu oder aktualisiere den MCP-Server in deinem KI-Client, damit dieser die Tool-Liste neu lädt. Das alleinige Neustarten der App (des Add-ons) aktualisiert die zwischengespeicherte Tool-Liste eines Clients NICHT; dies gilt nach jeder Änderung einer Einstellung hier."
472
476
  },
473
477
  "tool_groups": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Timeout for each automation/script/scene config fetch. Range 1–600. Restart required.",
405
405
  "advanced.individual_fetch_batch_size.label": "Config fetch batch size",
406
406
  "advanced.individual_fetch_batch_size.help": "Concurrent per-ID config fetches. Lower toward 1 on serial HA servers. Range 1–100. Restart required.",
407
+ "advanced.ha_tool_concurrency.label": "Home Assistant tool concurrency",
408
+ "advanced.ha_tool_concurrency.help": "Optional limit on outer Home Assistant tool calls across all sessions. Internal REST, WebSocket, and per-tool fan-out concurrency is unchanged. 0 keeps unlimited behavior. A call waiting for capacity fails after 60 seconds. Range 0–32. Restart required.",
407
409
  "advanced.backup_hint.label": "Backup-hint level",
408
410
  "advanced.backup_hint.help": "Controls how strongly the LLM is prompted to take a full HA snapshot before risky writes.",
409
411
  "advanced.backup_hint.choices.strong": "Strong",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Tools listed here are locked pinned — they appear at the top of the Tools tab and cannot be unpinned from the web Settings UI without unsetting this option first. Useful in combination with Tool Search. Comma-separated tool names.",
469
471
  "addon.verify_ssl.name": "Verify TLS certificate",
470
472
  "addon.verify_ssl.description": "Verify the Home Assistant server's TLS certificate. The app (add-on) connects via the Supervisor proxy, so this normally has no effect and should stay enabled. Disable only if you've reconfigured the app (add-on) to talk to HA over a public HTTPS hostname with a self-signed certificate or hostname mismatch. Disabling weakens transport security — leave on unless you know you need it. Requires restart to take effect.",
473
+ "addon.ha_tool_concurrency.name": "Home Assistant tool concurrency",
474
+ "addon.ha_tool_concurrency.description": "Optional limit on outer Home Assistant tool calls across all sessions. Internal REST, WebSocket, and per-tool fan-out concurrency is unchanged. 0 keeps unlimited behavior. A call waiting for capacity fails after 60 seconds.",
471
475
  "addon_stable.enable_tool_search.description": "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 an app (add-on) restart to take effect — then reconnect or refresh the MCP server in your AI client so it reloads the tool list. Restarting the app (add-on) alone does NOT refresh a client's cached tool list; this applies after changing any setting here."
472
476
  },
473
477
  "tool_groups": {},
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Limtempo por ĉiu akirado de aŭtomatiga/skripta/scena agordo. Gamo 1–600. Restartigo necesas.",
405
405
  "advanced.individual_fetch_batch_size.label": "Grandeco de agorda akira aro",
406
406
  "advanced.individual_fetch_batch_size.help": "Samtempaj agordaj akiroj por ĉiu ID. Malaltigu al 1 ĉe seriaj HA-serviloj. Gamo 1–100. Restartigo necesas.",
407
+ "advanced.ha_tool_concurrency.label": "Konkureco de hejmaŭtomatigaj iloj de Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Laŭvola limo pri eksteraj vokoj al Home Assistant-iloj tra ĉiuj sesioj. Interna REST-, WebSocket-, kaj perila disbranĉiĝa konkureco restas neŝanĝita. 0 tenas la senliman konduton. Voko atendanta je kapablo malsukcesas post 60 sekundoj. Intervalo 0–32. Postiĝas restartigo.",
407
409
  "advanced.backup_hint.label": "Nivelo de rezerva sugesto",
408
410
  "advanced.backup_hint.help": "Regulas kiom forte la LLM estas instigita fari plenan HA-momentfoton antaŭ riskaj skriboj.",
409
411
  "advanced.backup_hint.choices.strong": "Forta",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Iloj listigitaj ĉi tie estas ŝlositaj fiksitaj — ili aperas ĉe la supro de la langeto 'Iloj' kaj ne povas esti malfiksitaj de la reta Agorda UI sen unue malaktivigi ĉi tiun opcion. Utila kombine kun 'Ilo-Serĉo'. Ilnomoj disigitaj per komoj.",
469
471
  "addon.verify_ssl.name": "Kontroli TLS-atestilon",
470
472
  "addon.verify_ssl.description": "Kontrolu la TLS-atestilon de la servilo Home Assistant. La programo (aldonaĵo) konektiĝas per la provkuratora prokurservilo (Supervisor proxy), do ĉi tio kutime havas neniun efikon kaj devas resti ebligita. Malŝaltu nur se vi reagordis la programon (aldonaĵo) por komuniki kun HA per publika HTTPS-gastnomo kun memsubskribita atestilo aŭ malkongruo de gastnomo. Malŝalto malfortigas transportan sekurecon — lasu ebligita krom se vi scias, ke vi bezonas tion. Postulas restartigon por ekvalidi.",
473
+ "addon.ha_tool_concurrency.name": "Konkureco de hejmaŭtomatigaj iloj de Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Laŭvola limo pri eksteraj vokoj al Home Assistant-iloj tra ĉiuj sesioj. Interna REST-, WebSocket-, kaj perila disbranĉiĝa konkureco restas neŝanĝita. 0 tenas la senliman konduton. Voko atendanta je kapablo malsukcesas post 60 sekundoj.",
471
475
  "addon_stable.enable_tool_search.description": "Anstataŭigu la plenan il-katalogon per serĉ-bazita malkovro. Reduktas senchovan kuntekston je ĉirkaŭ 90%, ĝis proksimume 5K tokenoj. ⚠️ NE ebligu ĉi tion en klientoj kun propra enkonstruita il-serĉo / prokrastitaj iloj (claude.ai, Claude Desktop, Claude Code) — la du serĉ-tavoloj konfliktas, kaj la enkonstruita il-serĉo de la kliento estas la pli bona elekto tie; lasu ĉi tion malŝaltita. Ĉu iloj estas prokrastitaj dependas de via kliento kaj modelo-kombinaĵo: uzu ĉi tion kiam via agordo ŝarĝas la plenan katalogon frue — modeloj sen denaskaj prokrastitaj iloj (ekz. Gemini, OpenAI-kongruaj lokaj modeloj, Claude Haiku), klientoj kiuj enlinias ĉiujn il-skemojn sendepende de modelo (ekz. GitHub Copilot CLI), aŭ pli malgrandaj kuntekstaj fenestroj. Kelkaj Codex-modeloj kaj ChatGPT ankaŭ inkluzivas prokrastitajn ilojn — kontrolu rekte vian klienton/modelon por konfirmi ties funkciojn, por ke vi ne lasu ĉi tion ebligita senbezone. Iloj estas trovitaj per ha_search_tools kaj ekzekutitaj per kategoriigitaj prokurserviloj (legado/skribado/forigo). Postulas restartigon de la programo (aldonaĵo) por ekvalidi — tiam reKonekti aŭ aktualigi la MCP-servilon en via AI-kliento por ke ĝi reŝarĝu la il-liston. Restartigi la programon (aldonaĵo) sole NE aktualigas la kaŝmemoritan il-liston de kliento; ĉi tio aplikiĝas post ŝanĝo de iu ajn agordo ĉi tie."
472
476
  },
473
477
  "tools": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Tiempo de espera de cada obtención de configuración de automatización, script o escena. Rango 1–600. Hay que reiniciar.",
405
405
  "advanced.individual_fetch_batch_size.label": "Tamaño del lote de obtención de configuraciones",
406
406
  "advanced.individual_fetch_batch_size.help": "Obtenciones de configuración por ID en paralelo. Bájalo hacia 1 en servidores HA que responden en serie. Rango 1–100. Hay que reiniciar.",
407
+ "advanced.ha_tool_concurrency.label": "Concurrencia de herramientas de Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Límite opcional en las llamadas externas a herramientas de Home Assistant en todas las sesiones. La concurrencia interna de REST, WebSocket y de distribución por herramienta no se modifica. 0 mantiene el comportamiento ilimitado. Una llamada que espera capacidad falla después de 60 segundos. Rango de 0 a 32. Requiere reinicio.",
407
409
  "advanced.backup_hint.label": "Nivel de la indicación de copia de seguridad",
408
410
  "advanced.backup_hint.help": "Controla con cuánta insistencia se pide al LLM que haga una instantánea completa de HA antes de escrituras arriesgadas.",
409
411
  "advanced.backup_hint.choices.strong": "Fuerte",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Las herramientas indicadas aquí quedan fijadas de forma bloqueada: aparecen en la parte superior de la pestaña Herramientas y no se pueden desfijar desde la interfaz web de ajustes sin quitar antes esta opción. Resulta útil en combinación con la búsqueda de herramientas. Nombres de herramientas separados por comas.",
469
471
  "addon.verify_ssl.name": "Verificar el certificado TLS",
470
472
  "addon.verify_ssl.description": "Verifica el certificado TLS del servidor de Home Assistant. La app (add-on) se conecta a través del proxy del Supervisor, por lo que normalmente esto no tiene efecto y debe permanecer habilitado. Desactívalo solo si has reconfigurado la app (add-on) para comunicarse con HA a través de un nombre de host HTTPS público con un certificado autofirmado o un error de coincidencia en el nombre de host. Desactivarlo debilita la seguridad del transporte; déjalo activado a menos que sepas que lo necesitas. Requiere reiniciar para aplicar los cambios.",
473
+ "addon.ha_tool_concurrency.name": "Concurrencia de herramientas de Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Límite opcional en las llamadas externas a herramientas de Home Assistant en todas las sesiones. La concurrencia interna de REST, WebSocket y de distribución por herramienta no se modifica. 0 mantiene el comportamiento ilimitado. Una llamada que espera capacidad falla después de 60 segundos.",
471
475
  "addon_stable.enable_tool_search.description": "Reemplaza el catálogo completo de herramientas por un descubrimiento basado en búsquedas. Reduce el contexto inactivo en aproximadamente un 90 %, a unos 5K tokens. ⚠️ NO habilites esto en clientes que tengan su propia búsqueda de herramientas integrada / herramientas diferidas (claude.ai, Claude Desktop, Claude Code); ambas capas de búsqueda entran en conflicto y la búsqueda de herramientas integrada del cliente es la mejor opción en ese caso; déjalo desactivado. El hecho de que las herramientas se diferieran depende de tu combinación de cliente y modelo: úsalo cuando tu configuración cargue el catálogo completo de entrada (modelos sin herramientas diferidas nativas, por ejemplo, Gemini, modelos locales compatibles con OpenAI, Claude Haiku), clientes que insertan todos los esquemas de herramientas sin importar el modelo (por ejemplo, GitHub Copilot CLI), o ventanas de contexto más pequeñas. Algunos modelos de Codex y ChatGPT también incluyen herramientas diferidas; comprueba directamente tu cliente/modelo para confirmar sus características y no dejar esto habilitado innecesariamente. Las herramientas se encuentran mediante ha_search_tools y se ejecutan a través de proxies categorizados (lectura/escritura/eliminación). Requiere reiniciar la app (add-on) para que surta efecto; a continuación, reconecta o actualiza el servidor MCP en tu cliente de IA para que recargue la lista de herramientas. Reiniciar solo la app (add-on) NO actualiza la lista de herramientas almacenada en caché del cliente; esto se aplica después de cambiar cualquier configuración aquí."
472
476
  },
473
477
  "tool_groups": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Délai d'attente pour chaque récupération de configuration d'automatisation/script/scène. Plage 1–600. Redémarrage requis.",
405
405
  "advanced.individual_fetch_batch_size.label": "Taille du lot de récupération de configuration",
406
406
  "advanced.individual_fetch_batch_size.help": "Récupérations simultanées de configuration par ID. Diminue vers 1 sur les serveurs HA série. Plage 1–100. Redémarrage requis.",
407
+ "advanced.ha_tool_concurrency.label": "Concurrence des outils Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Limite optionnelle sur les appels d'outils Home Assistant externes pour toutes les sessions. La concurrence interne pour REST, WebSocket et par outil reste inchangée. 0 conserve un comportement illimité. Un appel en attente de capacité échoue après 60 secondes. Plage de 0 à 32. Redémarrage requis.",
407
409
  "advanced.backup_hint.label": "Niveau d'indication de sauvegarde",
408
410
  "advanced.backup_hint.help": "Contrôle la force avec laquelle le LLM est invité à effectuer un instantané HA complet avant les écritures risquées.",
409
411
  "advanced.backup_hint.choices.strong": "Fort",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Les outils listés ici sont verrouillés épinglés — ils apparaissent en haut de l'onglet Outils et ne peuvent pas être retirés de l'interface Web des paramètres sans d'abord supprimer cette option. Utile en combinaison avec la recherche d'outils. Noms d'outils séparés par des virgules.",
469
471
  "addon.verify_ssl.name": "Vérifier le certificat TLS",
470
472
  "addon.verify_ssl.description": "Vérifier le certificat TLS du serveur Home Assistant. L'application (add-on) se connecte via le proxy du Supervisor, cela n'a donc normalement aucun effet et doit rester activé. Désactivez uniquement si vous avez reconfiguré l'application (add-on) pour communiquer avec HA via un nom d'hôte HTTPS public avec un certificat auto-signé ou une non-correspondance de nom d'hôte. La désactivation affaiblit la sécurité du transport — laissez activé sauf si vous savez que vous en avez besoin. Nécessite un redémarrage pour prendre effet.",
473
+ "addon.ha_tool_concurrency.name": "Concurrence des outils Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Limite optionnelle sur les appels d'outils Home Assistant externes pour toutes les sessions. La concurrence interne pour REST, WebSocket et par outil reste inchangée. 0 conserve un comportement illimité. Un appel en attente de capacité échoue après 60 secondes.",
471
475
  "addon_stable.enable_tool_search.description": "Remplacer le catalogue complet d'outils par une découverte basée sur la recherche. Réduit le contexte inactif d'environ 90 %, à environ 5K jetons. ⚠️ N'activez PAS cette option dans les clients disposant de leur propre recherche d'outils intégrée / d'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 constitue le meilleur choix dans ce cas ; laissez cette option désactivée. Le fait que les outils soient différés dépend de votre association client et modèle : utilisez cette option lorsque votre configuration charge le catalogue complet au départ — modèles sans outils différés natifs (par 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 (par ex. GitHub Copilot CLI), ou fenêtres de contexte plus petites. Certains modèles Codex et ChatGPT incluent également des outils différés — vérifiez directement votre client/modèle pour confirmer ses fonctionnalités afin de ne pas laisser cette option activée 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 de l'application (add-on) pour prendre effet — puis reconnectez ou actualisez le serveur MCP dans votre client IA afin qu'il recharge la liste des outils. Le seul redémarrage de l'application (add-on) ne met PAS à jour la liste des outils mise en cache par un client ; cela s'applique après la modification de n'importe quel paramètre ici."
472
476
  },
473
477
  "tool_groups": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Timeout di ogni recupero di configurazione di automazione, script o scena. Intervallo 1–600. È necessario il riavvio.",
405
405
  "advanced.individual_fetch_batch_size.label": "Dimensione del lotto di recupero delle configurazioni",
406
406
  "advanced.individual_fetch_batch_size.help": "Recuperi di configurazione per singolo ID eseguiti in parallelo. Avvicinati a 1 sui server HA che lavorano in sequenza. Intervallo 1–100. È necessario il riavvio.",
407
+ "advanced.ha_tool_concurrency.label": "Concorrenza degli strumenti di Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Limite opzionale sulle chiamate esterne agli strumenti di Home Assistant in tutte le sessioni. La concorrenza interna di REST, WebSocket e fan-out per strumento rimane invariata. 0 mantiene il comportamento illimitato. Una chiamata in attesa di capacità fallisce dopo 60 secondi. Intervallo 0–32. Riavvio necessario.",
407
409
  "advanced.backup_hint.label": "Livello del suggerimento di backup",
408
410
  "advanced.backup_hint.help": "Controlla con quanta insistenza l'LLM viene invitato a creare uno snapshot completo di HA prima delle scritture rischiose.",
409
411
  "advanced.backup_hint.choices.strong": "Forte",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Gli strumenti elencati qui restano fissati in modo bloccato: compaiono in cima alla scheda Strumenti e non possono essere sganciati dall'interfaccia web delle impostazioni senza prima togliere questa opzione. Utile in combinazione con la ricerca degli strumenti. Nomi degli strumenti separati da virgole.",
469
471
  "addon.verify_ssl.name": "Verifica il certificato TLS",
470
472
  "addon.verify_ssl.description": "Verifica il certificato TLS del server Home Assistant. L'app (componente aggiuntivo) si connette tramite il proxy Supervisor, quindi questo normalmente non ha effetto e dovrebbe rimanere abilitato. Disabilita solo se hai riconfigurato l'app (componente aggiuntivo) per comunicare con HA su un nome host HTTPS pubblico con un certificato autofirmato o una discrepanza del nome host. La disabilitazione indebolisce la sicurezza del trasporto: lasciala attiva a meno che tu non sappia di averne bisogno. Richiede il riavvio per avere effetto.",
473
+ "addon.ha_tool_concurrency.name": "Concorrenza degli strumenti di Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Limite opzionale sulle chiamate esterne agli strumenti di Home Assistant in tutte le sessioni. La concorrenza interna di REST, WebSocket e fan-out per strumento rimane invariata. 0 mantiene il comportamento illimitato. Una chiamata in attesa di capacità fallisce dopo 60 secondi.",
471
475
  "addon_stable.enable_tool_search.description": "Sostituisci il catalogo completo degli strumenti con la scoperta basata sulla ricerca. Riduce il contesto inattivo di circa il 90%, a circa 5K token. ⚠️ NON abilitare questa opzione nei client con ricerca di strumenti integrata / strumenti differiti (claude.ai, Claude Desktop, Claude Code) — i due livelli di ricerca entrano in conflitto e la ricerca di strumenti integrata del client è la scelta migliore in quel caso; lasciala disattivata. Se gli strumenti siano differiti dipende dalla combinazione di client e modello: usalo quando la tua configurazione carica l'intero catalogo in anticipo — modelli senza strumenti differiti nativi (es. Gemini, modelli locali compatibili con OpenAI, Claude Haiku), client che inseriscono tutti gli schemi di strumenti indipendentemente dal modello (es. GitHub Copilot CLI), o finestre di contesto più piccole. Alcuni modelli Codex e ChatGPT includono anch'essi strumenti differiti — verifica direttamente il tuo client/modello per confermare le sue funzionalità in modo da non lasciare questa opzione abilitata inutilmente. Gli strumenti vengono trovati tramite ha_search_tools ed eseguiti tramite proxy categorizzati (lettura/scrittura/eliminazione). Richiede il riavvio dell'app (componente aggiuntivo) per avere effetto — quindi riconnettiti o aggiorna il server MCP nel tuo client di IA in modo che ricarichi l'elenco degli strumenti. Il solo riavvio dell'app (componente aggiuntivo) NON aggiorna l'elenco degli strumenti memorizzato nella cache di un client; questo si applica dopo aver modificato qualsiasi impostazione qui."
472
476
  },
473
477
  "tool_groups": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "자동화/스크립트/장면 설정을 각각 가져올 때의 제한 시간입니다. 범위 1~600. 다시 시작해야 합니다.",
405
405
  "advanced.individual_fetch_batch_size.label": "설정 조회 배치 크기",
406
406
  "advanced.individual_fetch_batch_size.help": "ID별 설정 조회를 동시에 몇 건까지 할지 정합니다. 직렬 처리에 가까운 HA 서버에서는 1에 가깝게 낮추세요. 범위 1~100. 다시 시작해야 합니다.",
407
+ "advanced.ha_tool_concurrency.label": "Home Assistant 도구 동시성",
408
+ "advanced.ha_tool_concurrency.help": "모든 세션에 걸친 외부 Home Assistant 도구 호출에 대한 선택적 제한입니다. 내부 REST, WebSocket 및 도구별 팬아웃 동시성은 변경되지 않습니다. 0은 무제한 동작을 유지합니다. 용량을 기다리는 호출은 60초 후에 실패합니다. 범위는 0~32입니다. 다시 시작이 필요합니다.",
407
409
  "advanced.backup_hint.label": "백업 권유 강도",
408
410
  "advanced.backup_hint.help": "위험한 쓰기 작업 전에 HA 전체 스냅숏을 만들도록 LLM에 얼마나 강하게 권유할지 정합니다.",
409
411
  "advanced.backup_hint.choices.strong": "강하게",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "여기에 나열한 도구는 고정 상태로 잠깁니다. 도구 탭 맨 위에 표시되며, 이 옵션을 먼저 해제하지 않으면 웹 설정 UI에서 고정을 해제할 수 없습니다. 도구 검색과 함께 쓰면 유용합니다. 도구 이름을 쉼표로 구분해 입력하세요.",
469
471
  "addon.verify_ssl.name": "TLS 인증서 검증",
470
472
  "addon.verify_ssl.description": "Home Assistant 서버의 TLS 인증서를 검증합니다. 앱(애드온)은 Supervisor 프록시를 통해 연결하므로 보통 아무 영향이 없으며 켜 두는 것이 좋습니다. 자체 서명 인증서나 호스트 이름이 일치하지 않는 공개 HTTPS 호스트 이름으로 HA에 접속하도록 앱(애드온)을 다시 구성한 경우에만 끄세요. 끄면 전송 구간 보안이 약해지므로, 반드시 필요한 경우가 아니면 켜 두세요. 적용하려면 다시 시작해야 합니다.",
473
+ "addon.ha_tool_concurrency.name": "Home Assistant 도구 동시성",
474
+ "addon.ha_tool_concurrency.description": "모든 세션에 걸친 외부 Home Assistant 도구 호출에 대한 선택적 제한입니다. 내부 REST, WebSocket 및 도구별 팬아웃 동시성은 변경되지 않습니다. 0은 무제한 동작을 유지합니다. 용량을 기다리는 호출은 60초 후에 실패합니다.",
471
475
  "addon_stable.enable_tool_search.description": "전체 도구 카탈로그 대신 검색 기반 탐색을 사용합니다. 대기 상태 컨텍스트를 약 90% 줄여 약 5K 토큰 수준으로 낮춥니다. ⚠️ 자체 도구 검색이나 지연 로딩 도구 기능을 갖춘 클라이언트(claude.ai, Claude Desktop, Claude Code)에서는 켜지 마세요. 두 검색 계층이 충돌하며, 그런 환경에서는 클라이언트 내장 도구 검색이 더 낫습니다. 도구가 지연 로딩되는지는 클라이언트와 모델 조합에 따라 다릅니다. 전체 카탈로그를 처음부터 모두 불러오는 환경(네이티브 지연 로딩 도구가 없는 모델(예: Gemini, OpenAI 호환 로컬 모델, Claude Haiku), 모델과 무관하게 모든 도구 스키마를 인라인으로 넣는 클라이언트(예: GitHub Copilot CLI), 컨텍스트 창이 작은 경우)에서 사용하세요. 일부 Codex 모델과 ChatGPT도 지연 로딩 도구를 지원하므로, 불필요하게 켜 두지 않도록 사용 중인 클라이언트/모델의 기능을 직접 확인하세요. 도구는 ha_search_tools로 찾고 범주별 프록시(읽기/쓰기/삭제)를 통해 실행됩니다. 적용하려면 앱(애드온)을 다시 시작한 뒤, AI 클라이언트에서 MCP 서버에 다시 연결하거나 새로 고쳐 도구 목록을 다시 불러오게 하세요. 앱(애드온)만 다시 시작해서는 클라이언트에 캐시된 도구 목록이 갱신되지 않으며, 이는 여기의 어떤 설정을 바꾸든 마찬가지입니다."
472
476
  },
473
477
  "tool_groups": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Time-out voor elke automatisering/script/scène configuratie-ophalen. Bereik 1–600. Herstart vereist.",
405
405
  "advanced.individual_fetch_batch_size.label": "Batchgrootte voor configuratie-ophalen",
406
406
  "advanced.individual_fetch_batch_size.help": "Gelijktijdige configuratie-ophalingen per ID. Verlaag naar 1 op seriële HA-servers. Bereik 1–100. Herstart vereist.",
407
+ "advanced.ha_tool_concurrency.label": "Home Assistant-toolgelijktijdigheid",
408
+ "advanced.ha_tool_concurrency.help": "Optionele limiet voor uiterste Home Assistant-toolaanroepen over alle sessies. Interne REST-, WebSocket- en per-tool fan-out gelijktijdigheid blijft ongewijzigd. 0 behoudt onbeperkt gedrag. Een aanroep die wacht op capaciteit mislukt na 60 seconden. Bereik 0–32. Herstart vereist.",
407
409
  "advanced.backup_hint.label": "Back-up hintniveau",
408
410
  "advanced.backup_hint.help": "Bepaalt hoe sterk de LLM wordt aangemoedigd om een volledige HA-snapshot te maken vóór risicovolle schrijfbewerkingen.",
409
411
  "advanced.backup_hint.choices.strong": "Sterk",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Tools die hier worden vermeld, zijn vastgezet — ze verschijnen bovenaan het tabblad 'Tools' en kunnen niet worden losgemaakt vanuit de webinstellingen-UI zonder eerst deze optie ongedaan te maken. Handig in combinatie met Tool Search. Door komma's gescheiden toolnamen.",
469
471
  "addon.verify_ssl.name": "TLS-certificaat verifiëren",
470
472
  "addon.verify_ssl.description": "Verifieer het TLS-certificaat van de Home Assistant-server. De app (add-on) maakt verbinding via de Supervisor-proxy, dus dit heeft normaal gesproken geen effect en moet ingeschakeld blijven. Schakel dit alleen uit als je de app (add-on) zo hebt geconfigureerd dat deze via een openbare HTTPS-hostnaam met een zelfondertekend certificaat of een niet-overeenkomende hostnaam met HA communiceert. Uitschakelen verzwakt de transportbeveiliging — laat ingeschakeld tenzij je zeker weet dat je het nodig hebt. Vereist een herstart om van kracht te worden.",
473
+ "addon.ha_tool_concurrency.name": "Home Assistant tool concurrency",
474
+ "addon.ha_tool_concurrency.description": "Optionele limiet voor uiterste Home Assistant-toolaanroepen over alle sessies. Interne REST-, WebSocket- en per-tool fan-out gelijktijdigheid blijft ongewijzigd. 0 behoudt onbeperkt gedrag. Een aanroep die wacht op capaciteit mislukt na 60 seconden.",
471
475
  "addon_stable.enable_tool_search.description": "Vervang de volledige toolcatalogus door zoekgebaseerde ontdekking. Vermindert inactieve context met ongeveer 90%, tot ongeveer 5K tokens. ⚠️ Schakel dit NIET in bij clients met een ingebouwde toolzoekfunctie / uitgestelde tools (claude.ai, Claude Desktop, Claude Code) — de twee zoeklagen conflicteren en de ingebouwde toolzoekfunctie van de client heeft daar de voorkeur; laat dit uitgeschakeld. Of tools worden uitgesteld hangt af van je client- en modelcombinatie: gebruik dit wanneer je opstelling de volledige catalogus vooraf laadt — modellen zonder native uitgestelde tools (bijv. Gemini, OpenAI-compatibele lokale modellen, Claude Haiku), clients die alle toolschema's inline opnemen ongeacht het model (bijv. GitHub Copilot CLI), of kleinere contextvensters. Sommige Codex-modellen en ChatGPT bevatten ook uitgestelde tools — controleer je client/model direct om de functies te bevestigen zodat je dit niet onnodig ingeschakeld laat. Tools worden gevonden via ha_search_tools en uitgevoerd via gecategoriseerde proxy's (lezen/schrijven/verwijderen). Vereist een herstart van de app (add-on) om van kracht te worden — maak daarna opnieuw verbinding of vernieuw de MCP-server in je AI-client zodat deze de toollijst opnieuw laadt. Alleen de app (add-on) herstarten vernieuwt de gecached toollijst van een client NIET; dit is van toepassing na het wijzigen van een instelling hier."
472
476
  },
473
477
  "tools": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Limit czasu dla każdego pobierania konfiguracji automatyzacji/skryptu/sceny. Zakres 1–600. Wymagany restart.",
405
405
  "advanced.individual_fetch_batch_size.label": "Rozmiar partii pobierania konfiguracji",
406
406
  "advanced.individual_fetch_batch_size.help": "Równoczesne pobieranie konfiguracji dla każdego ID. Zmniejsz do 1 na szeregowych serwerach HA. Zakres 1–100. Wymagany restart.",
407
+ "advanced.ha_tool_concurrency.label": "Współbieżność narzędzi Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Opcjonalny limit zewnętrznych wywołań narzędzi Home Assistant we wszystkich sesjach. Wewnętrzna współbieżność REST, WebSocket oraz rozgałęziania dla poszczególnych narzędzi pozostaje bez zmian. Wartość 0 zachowuje zachowanie bez limitu. Wywołanie oczekujące na wolne zasoby kończy się niepowodzeniem po 60 sekundach. Zakres 0–32. Wymagany restart.",
407
409
  "advanced.backup_hint.label": "Poziom podpowiedzi o kopii zapasowej",
408
410
  "advanced.backup_hint.help": "Kontroluje, jak silnie LLM jest zachęcany do wykonania pełnej migawki HA przed ryzykownymi zapisami.",
409
411
  "advanced.backup_hint.choices.strong": "Silny",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Narzędzia wymienione tutaj są zablokowane jako przypięte — pojawiają się na górze zakładki „Narzędzia” i nie można ich odpiąć z interfejsu ustawień sieciowych bez wcześniejszego usunięcia tej opcji. Przydatne w połączeniu z wyszukiwaniem narzędzi. Nazwy narzędzi oddzielone przecinkami.",
469
471
  "addon.verify_ssl.name": "Weryfikuj certyfikat TLS",
470
472
  "addon.verify_ssl.description": "Zweryfikuj certyfikat TLS serwera Home Assistant. Aplikacja (dodatek) łączy się przez proxy Supervisora, więc zazwyczaj nie ma to wpływu i powinno pozostać włączone. Wyłącz tylko wtedy, gdy skonfigurowano aplikację (dodatek) tak, aby komunikowała się z HA przez publiczną nazwę hosta HTTPS z certyfikatem z podpisem własnym lub niedopasowaniem nazwy hosta. Wyłączenie osłabia bezpieczeństwo transportu — pozostaw włączone, chyba że wiesz, że tego potrzebujesz. Wymaga ponownego uruchomienia, aby zaczęło obowiązywać.",
473
+ "addon.ha_tool_concurrency.name": "Współbieżność narzędzi Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Opcjonalny limit zewnętrznych wywołań narzędzi Home Assistant we wszystkich sesjach. Wewnętrzna współbieżność REST, WebSocket oraz rozgałęziania dla poszczególnych narzędzi pozostaje bez zmian. Wartość 0 zachowuje zachowanie bez limitu. Wywołanie oczekujące na wolne zasoby kończy się niepowodzeniem po 60 sekundach.",
471
475
  "addon_stable.enable_tool_search.description": "Zastąp pełny katalog narzędzi wyszukiwaniem. Zmniejsza bezczynny kontekst o około 90%, do około 5K tokenów. ⚠️ NIE włączaj tego w klientach z własnym wbudowanym wyszukiwaniem narzędzi / odroczonymi narzędziami (claude.ai, Claude Desktop, Claude Code) — obie warstwy wyszukiwania będą w konflikcie, a wbudowane wyszukiwanie narzędzi klienta jest w tym przypadku lepszym wyborem; pozostaw to wyłączone. To, czy narzędzia są odraczane, zależy od kombinacji klienta i modelu: użyj tego, gdy konfiguracja ładowała pełny katalog na początku — modele bez natywnych odroczonych narzędzi (np. Gemini, modele lokalne kompatybilne z OpenAI, Claude Haiku), klienci, którzy wstawiają wszystkie schematy narzędzi niezależnie od modelu (np. GitHub Copilot CLI), lub mniejsze okna kontekstu. Niektóre modele Codex i ChatGPT również zawierają odroczone narzędzia — sprawdź bezpośrednio swojego klienta/model, aby potwierdzić jego funkcje, aby nie pozostawiać tego włączonego niepotrzebnie. Narzędzia są wyszukiwane przez ha_search_tools i wykonywane za pośrednictwem skategoryzowanych serwerów proxy (odczyt/zapis/usuwanie). Wymaga ponownego uruchomienia aplikacji (dodatku), aby zaczęło obowiązywać — następnie połącz się ponownie lub odśwież serwer MCP w kliencie AI, aby załadował listę narzędzi ponownie. Samo ponowne uruchomienie aplikacji (dodatku) NIE odświeża listy narzędzi w pamięci podręcznej klienta; dotyczy to zmiany dowolnego ustawienia tutaj."
472
476
  },
473
477
  "tools": {
@@ -404,6 +404,8 @@
404
404
  "advanced.individual_config_timeout.help": "Тайм-аут каждой загрузки автоматизации, скрипта или сцены. 1–600. Нужен перезапуск.",
405
405
  "advanced.individual_fetch_batch_size.label": "Размер пакета загрузки конфигураций",
406
406
  "advanced.individual_fetch_batch_size.help": "Число параллельных загрузок. Для последовательных серверов HA снижайте к 1. 1–100. Нужен перезапуск.",
407
+ "advanced.ha_tool_concurrency.label": "Параллелизм инструментов Home Assistant",
408
+ "advanced.ha_tool_concurrency.help": "Необязательный лимит внешних вызовов инструментов Home Assistant во всех сеансах. Внутренний параллелизм REST, WebSocket и вентирования по инструментам остается неизменным. 0 сохраняет неограниченное поведение. Вызов, ожидающий свободных ресурсов, завершается ошибкой через 60 секунд. Диапазон 0–32. Требуется перезапуск.",
407
409
  "advanced.backup_hint.label": "Уровень напоминания о резервной копии",
408
410
  "advanced.backup_hint.help": "Настраивает, насколько настойчиво LLM предлагает полный снимок HA перед рискованной записью.",
409
411
  "advanced.backup_hint.choices.strong": "Настойчивое",
@@ -468,6 +470,8 @@
468
470
  "addon.pinned_tools.description": "Перечисленные здесь инструменты принудительно закрепляются: они отображаются в верхней части вкладки «Инструменты», и их нельзя открепить в веб-интерфейсе настроек, не очистив сначала этот параметр. Полезно вместе с поиском инструментов. Укажите имена инструментов через запятую.",
469
471
  "addon.verify_ssl.name": "Проверять сертификат TLS",
470
472
  "addon.verify_ssl.description": "Проверять TLS-сертификат сервера Home Assistant. Приложение (аддон) подключается через прокси Supervisor, поэтому обычно это не оказывает влияния и должно быть включено. Отключайте только в случае перенастройки приложения (аддона) для связи с HA по публичному HTTPS-имени хоста с самоподписанным сертификатом или несовпадением имени хоста. Отключение снижает безопасность передачи данных — оставляйте включенным, только если это необходимо. Требуется перезапуск для применения.",
473
+ "addon.ha_tool_concurrency.name": "Параллелизм инструментов Home Assistant",
474
+ "addon.ha_tool_concurrency.description": "Необязательный лимит внешних вызовов инструментов Home Assistant во всех сеансах. Внутренний параллелизм REST, WebSocket и вентирования по инструментам остается неизменным. 0 сохраняет неограниченное поведение. Вызов, ожидающий свободных ресурсов, завершается ошибкой через 60 секунд.",
471
475
  "addon_stable.enable_tool_search.description": "Заменить полный каталог инструментов поисковым обнаружением. Снижает объем неиспользуемого контекста примерно на 90%, до примерно 5K токенов. ⚠️ НЕ включайте эту функцию в клиентах со встроенным поиском инструментов / отложенными инструментами (claude.ai, Claude Desktop, Claude Code) — два слоя поиска конфликтуют, и встроенный поиск инструментов клиента в данном случае является лучшим выбором; оставьте ее выключенной. Зависят ли инструменты от отложенного выполнения, определяется комбинацией клиента и модели: используйте этот параметр, когда ваша установка загружает полный каталог заранее — для моделей без нативных отложенных инструментов (например, Gemini, локальные модели с поддержкой OpenAI, Claude Haiku), клиентов, которые передают все схемы инструментов независимо от модели (например, GitHub Copilot CLI), или меньших окон контекста. Некоторые модели Codex и ChatGPT также включают отложенные инструменты — проверьте свой клиент/модель напрямую, чтобы подтвердить поддерживаемые функции и не оставлять этот параметр включенным без необходимости. Инструменты находятся через ha_search_tools и выполняются через категоризированные прокси (чтение/запись/удаление). Требуется перезапуск приложения (аддона) для применения — после этого переподключите или обновите MCP-сервер в вашем ИИ-клиенте, чтобы он перезагрузил список инструментов. Перезапуск только приложения (аддона) НЕ обновляет закэшированный список инструментов клиента; это применяется после изменения любого параметра здесь."
472
476
  },
473
477
  "tool_groups": {