ha-mcp-dev 7.14.2.dev2188__tar.gz → 7.14.2.dev2193__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.dev2188/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2193}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/client/websocket_listener.py +0 -2
  4. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/README.md +33 -40
  5. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/de.json +250 -229
  6. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/en.json +24 -3
  7. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/es.json +250 -229
  8. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/fr.json +250 -229
  9. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/it.json +250 -229
  10. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/ru.json +372 -90
  11. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/locales/zh-Hans.json +249 -228
  12. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/settings.js +22 -23
  13. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/device_control.py +99 -32
  14. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_service.py +6 -4
  15. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/util_helpers.py +2 -31
  16. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/domain_handlers.py +36 -17
  17. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/operation_manager.py +20 -12
  18. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  19. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/LICENSE +0 -0
  20. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/MANIFEST.in +0 -0
  21. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/README.md +0 -0
  22. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/setup.cfg +0 -0
  23. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/__init__.py +0 -0
  24. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/__main__.py +0 -0
  25. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/_pypi_marker +0 -0
  26. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/_version.py +0 -0
  27. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/auth/__init__.py +0 -0
  28. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/auth/consent_form.py +0 -0
  29. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/auth/provider.py +0 -0
  30. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/backup_manager.py +0 -0
  31. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/browser_landing.py +0 -0
  32. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/client/__init__.py +0 -0
  33. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/client/rest_client.py +0 -0
  34. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/client/supervisor_client.py +0 -0
  35. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/client/websocket_client.py +0 -0
  36. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/config.py +0 -0
  37. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  38. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  39. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  40. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  41. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  42. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  43. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/errors.py +0 -0
  44. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/llm_exposure.py +0 -0
  45. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/__init__.py +0 -0
  46. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/approval_queue.py +0 -0
  47. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/evaluator.py +0 -0
  48. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/handlers.py +0 -0
  49. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/middleware.py +0 -0
  50. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/model.py +0 -0
  51. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/persistence.py +0 -0
  52. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/policy/value_sources.py +0 -0
  53. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/py.typed +0 -0
  54. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/read_only.py +0 -0
  55. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  56. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  57. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  58. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  59. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  60. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  61. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  62. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  63. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  64. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  65. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  66. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  67. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  68. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  69. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  70. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  71. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  72. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  73. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  74. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  75. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  76. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  77. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  78. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  79. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  80. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/server.py +0 -0
  81. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/__init__.py +0 -0
  82. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  83. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  84. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  85. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  86. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  87. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  88. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  89. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  90. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  91. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_theme.py +0 -0
  92. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  93. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/settings.css +0 -0
  94. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/settings_ui/settings.html +0 -0
  95. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/smoke_test.py +0 -0
  96. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  97. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/strict_bps.py +0 -0
  98. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/__init__.py +0 -0
  99. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/auto_backup.py +0 -0
  100. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/backup.py +0 -0
  101. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  102. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/component_api.py +0 -0
  103. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/component_config_reads.py +0 -0
  104. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/component_devices.py +0 -0
  105. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/component_registries.py +0 -0
  106. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  107. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  108. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/helpers.py +0 -0
  109. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/__init__.py +0 -0
  110. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/base.py +0 -0
  111. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/matter.py +0 -0
  112. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/thread.py +0 -0
  113. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  114. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/radio/zwave.py +0 -0
  115. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/reference_validator.py +0 -0
  116. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/registry.py +0 -0
  117. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  118. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  119. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  120. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  121. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  122. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  123. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  124. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  125. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  126. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  127. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_addons.py +0 -0
  128. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_areas.py +0 -0
  129. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  130. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  131. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_calendar.py +0 -0
  132. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_camera.py +0 -0
  133. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_categories.py +0 -0
  134. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_code.py +0 -0
  135. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  136. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  137. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  138. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  139. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  140. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  141. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_dev.py +0 -0
  142. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_energy.py +0 -0
  143. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_entities.py +0 -0
  144. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  145. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_groups.py +0 -0
  146. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_hacs.py +0 -0
  147. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_history.py +0 -0
  148. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_integrations.py +0 -0
  149. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_labels.py +0 -0
  150. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_radio.py +0 -0
  151. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_registry.py +0 -0
  152. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_resources.py +0 -0
  153. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_search.py +0 -0
  154. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_services.py +0 -0
  155. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_system.py +0 -0
  156. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_themes.py +0 -0
  157. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_todo.py +0 -0
  158. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_traces.py +0 -0
  159. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_updates.py +0 -0
  160. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_utility.py +0 -0
  161. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  162. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  163. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  164. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/tools_zones.py +0 -0
  165. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/tools/validation_middleware.py +0 -0
  166. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/transforms/__init__.py +0 -0
  167. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/transforms/categorized_search.py +0 -0
  168. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  169. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/transport_security.py +0 -0
  170. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/update_check.py +0 -0
  171. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/__init__.py +0 -0
  172. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/config_hash.py +0 -0
  173. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/config_write_lock.py +0 -0
  174. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/data_paths.py +0 -0
  175. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  176. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  177. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/python_sandbox.py +0 -0
  178. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/skill_loader.py +0 -0
  179. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/utils/usage_logger.py +0 -0
  180. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/visibility/__init__.py +0 -0
  181. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/visibility/enforcement.py +0 -0
  182. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/visibility/model.py +0 -0
  183. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/visibility/persistence.py +0 -0
  184. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp/visibility/resolver.py +0 -0
  185. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  186. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  187. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  188. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  189. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  190. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/tests/__init__.py +0 -0
  191. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/tests/test_constants.py +0 -0
  192. {ha_mcp_dev-7.14.2.dev2188 → ha_mcp_dev-7.14.2.dev2193}/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.dev2188
3
+ Version: 7.14.2.dev2193
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.14.2.dev2188"
7
+ version = "7.14.2.dev2193"
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
@@ -9,7 +9,6 @@ import asyncio
9
9
  import logging
10
10
  from typing import Any
11
11
 
12
- from ..config import get_global_settings
13
12
  from ..utils.operation_manager import get_operation_manager, update_pending_operations
14
13
  from .websocket_client import HomeAssistantWebSocketClient, get_websocket_client
15
14
 
@@ -21,7 +20,6 @@ class WebSocketListenerService:
21
20
 
22
21
  def __init__(self) -> None:
23
22
  """Initialize the WebSocket listener service."""
24
- self.settings = get_global_settings()
25
23
  self.operation_manager = get_operation_manager()
26
24
  self.websocket_client: HomeAssistantWebSocketClient | None = None
27
25
  self.listener_task: asyncio.Task | None = None
@@ -4,42 +4,35 @@ The settings page discovers every `*.json` catalog in this directory. No Python
4
4
  or JavaScript registration is required, and no packaging file needs editing —
5
5
  the wheel, sdist and binary declarations all match this directory by pattern.
6
6
 
7
+ **This directory is the canonical translation store.** Besides the settings
8
+ UI's own strings, each catalog carries the add-on option strings under
9
+ `addon.<key>.*` (with `features.<key>.*` for options the settings UI also
10
+ shows, and `addon_stable.<key>.*` for flavor-specific wording). Both add-on
11
+ flavors' `translations/*.yaml` and the `FEATURE_META` block in `settings.js`
12
+ are generated from these catalogs by `scripts/generate_locales.py` — never
13
+ edit those by hand. Wherever one English string reaches the reader from more
14
+ than one surface, the translation is stored once here and projected, so
15
+ cross-surface wording cannot drift.
16
+
7
17
  ## Adding a language
8
18
 
9
19
  A language ships on **all four** translated surfaces or not at all, and one
10
20
  Home Assistant language code names every file:
11
21
 
12
- - `src/ha_mcp/settings_ui/locales/<code>.json` (this directory)
13
- - `custom_components/ha_mcp_tools/translations/<code>.json`
14
- - `homeassistant-addon/translations/<code>.yaml`
15
- - `homeassistant-addon-dev/translations/<code>.yaml`
22
+ - `src/ha_mcp/settings_ui/locales/<code>.json` (this directory; authored)
23
+ - `custom_components/ha_mcp_tools/translations/<code>.json` (authored)
24
+ - `homeassistant-addon/translations/<code>.yaml` (generated)
25
+ - `homeassistant-addon-dev/translations/<code>.yaml` (generated)
16
26
 
17
- Adding only this catalog fails `test_every_locale_ships_on_every_surface`. Also
27
+ Add the two authored catalogs — this one may start as a `meta`-only stub
28
+ (`native_name`, `dir`) — then run `python scripts/generate_locales.py` and let
29
+ `scripts/translate_locales.py` (or the `locale-sync.yml` workflow on the PR)
30
+ machine-fill every string; review its output like any other diff. Also
18
31
  add the new code to the locale list in the repository-root `AGENTS.md`
19
32
  § Translations — that list is pinned by
20
- `test_agents_md_lists_every_shipped_locale`.
21
-
22
- Only the first of those four files is described below, and the other three
23
- carry content rules of their own: the component catalog needs every `en.json`
24
- key with identical `{placeholders}` and no extra ones, and each add-on YAML
25
- needs a `name` and a `description` for every `schema:` key of *that* flavor's
26
- `config.yaml`, with nothing left behind for a key the schema no longer
27
- declares. The two flavors declare different schemas, so neither YAML is a copy
28
- of the other. The repository-root `AGENTS.md` § Translations states all of
29
- this; a contributor who writes only this catalog goes red on the other three.
30
-
31
- **Start from a translated catalog, not from `en.json`.** English for the tool
32
- titles and descriptions comes from the tool definitions at runtime, so `en.json`
33
- ships `tools` and `tool_groups` empty; a copy of it is missing both sections
34
- that this catalog is required to carry.
35
-
36
- **Read the other surfaces before you word a switch.** Wherever the same English
37
- text is shipped from more than one catalog, your wording has to be byte-identical
38
- in all of them. That is not only the add-on-options-versus-settings-UI axis: the
39
- two add-on flavors describe most of the same options, so a good part of the
40
- pinned parity is stable-against-dev, with no settings-UI text involved at all.
41
- Translating one surface at a time is exactly how one option ends up with two
42
- different sentences.
33
+ `test_agents_md_lists_every_shipped_locale`. The engine reads the target
34
+ language from `meta.native_name`, so any language an LLM can write — natural
35
+ or constructed needs no pipeline change.
43
36
 
44
37
  ## Catalog sections
45
38
 
@@ -80,17 +73,17 @@ import, so the failure names the file but arrives as a broken test module:
80
73
  - `tool_groups` and `tools` name exactly the renderable groups and tools — a
81
74
  tool added to the codebase turns every locale red in the PR that adds it.
82
75
  - At most 5% of this catalog's `messages`, and 5% of its `tools` texts, may be
83
- byte-identical to English or missing outright. Both add-on flavors are held to
84
- the same 5%; the component catalogs allow 15%, because they carry product
85
- names as keys of their own. A single tool whose `title` *and* `description` are
86
- both still English fails by name however small the share.
87
- - One wording per English string across surfaces, wherever the same English text
88
- is shipped from more than one catalog. The failure names every group that
89
- disagrees. Where a group has a settings UI member, that is the wording the
90
- other surfaces follow today; a group carried only by the two add-on flavors
91
- has no such member, so there pick one wording and use it in both.
76
+ byte-identical to English or missing outright; the component catalogs allow
77
+ 15%, because they carry product names as keys of their own. A single tool
78
+ whose `title` *and* `description` are both still English fails by name
79
+ however small the share.
80
+ - The generated files (both add-on YAMLs, `FEATURE_META`) are byte-exact
81
+ generator output (`test_derived_catalogs_match_the_canonical_store`); run
82
+ `python scripts/generate_locales.py` after touching any `addon.*`,
83
+ `addon_stable.*` or `features.*` key.
92
84
  - The English each translation was written against is hashed in
93
85
  `tests/src/unit/locale_source_baseline.json`, so a later edit to an English
94
- string turns the locales red rather than leaving them silently stale. Adding a
95
- language does not change any English source, so no baseline regeneration is
96
- needed for it.
86
+ string turns the locales red rather than leaving them silently stale
87
+ `scripts/translate_locales.py` retranslates exactly those keys and repins
88
+ the baseline. Adding a language does not change any English source, so no
89
+ baseline regeneration is needed for it.