ha-mcp-dev 7.6.0.dev630__tar.gz → 7.6.0.dev632__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 (126) hide show
  1. {ha_mcp_dev-7.6.0.dev630/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.6.0.dev632}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/fuzzy_search.py +34 -31
  4. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/LICENSE +0 -0
  6. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/README.md +0 -0
  8. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/__init__.py +0 -0
  18. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/rest_client.py +0 -0
  19. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/supervisor_client.py +0 -0
  20. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/websocket_client.py +0 -0
  21. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/websocket_listener.py +0 -0
  22. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/config.py +0 -0
  23. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/errors.py +0 -0
  24. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/__init__.py +0 -0
  25. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/approval_queue.py +0 -0
  26. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/evaluator.py +0 -0
  27. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/handlers.py +0 -0
  28. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/middleware.py +0 -0
  29. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/model.py +0 -0
  30. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/persistence.py +0 -0
  31. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/value_sources.py +0 -0
  32. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/py.typed +0 -0
  33. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  34. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  35. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  36. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  37. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  38. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  39. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  40. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  41. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  42. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  43. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  44. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  45. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  46. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  47. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  48. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  49. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  50. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  51. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  52. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  53. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  54. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  55. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/server.py +0 -0
  56. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/settings_ui.py +0 -0
  57. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/smoke_test.py +0 -0
  58. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  59. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/__init__.py +0 -0
  60. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/auto_backup.py +0 -0
  61. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/backup.py +0 -0
  62. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  63. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/device_control.py +0 -0
  64. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/enhanced.py +0 -0
  65. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/helpers.py +0 -0
  66. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/reference_validator.py +0 -0
  67. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/registry.py +0 -0
  68. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/smart_search.py +0 -0
  69. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_addons.py +0 -0
  70. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_areas.py +0 -0
  71. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  72. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  73. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_calendar.py +0 -0
  74. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_camera.py +0 -0
  75. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_categories.py +0 -0
  76. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_code.py +0 -0
  77. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  78. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  79. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  80. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  81. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  82. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  83. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_energy.py +0 -0
  84. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_entities.py +0 -0
  85. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  86. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_groups.py +0 -0
  87. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_hacs.py +0 -0
  88. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_history.py +0 -0
  89. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_integrations.py +0 -0
  90. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_labels.py +0 -0
  91. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  92. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_registry.py +0 -0
  93. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_resources.py +0 -0
  94. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_search.py +0 -0
  95. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_service.py +0 -0
  96. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_services.py +0 -0
  97. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_system.py +0 -0
  98. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_todo.py +0 -0
  99. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_traces.py +0 -0
  100. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_updates.py +0 -0
  101. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_utility.py +0 -0
  102. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  103. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  104. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_zones.py +0 -0
  105. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/util_helpers.py +0 -0
  106. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/validation_middleware.py +0 -0
  107. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/__init__.py +0 -0
  108. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/categorized_search.py +0 -0
  109. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  110. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/__init__.py +0 -0
  111. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/config_hash.py +0 -0
  112. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/data_paths.py +0 -0
  113. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/domain_handlers.py +0 -0
  114. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  115. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/operation_manager.py +0 -0
  116. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/python_sandbox.py +0 -0
  117. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/skill_loader.py +0 -0
  118. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/usage_logger.py +0 -0
  119. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  120. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  121. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  122. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  123. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  124. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/tests/__init__.py +0 -0
  125. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/tests/test_constants.py +0 -0
  126. {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/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.6.0.dev630
3
+ Version: 7.6.0.dev632
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.6.0.dev630"
7
+ version = "7.6.0.dev632"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -169,10 +169,13 @@ class FuzzyEntitySearcher:
169
169
  def __init__(self, threshold: int = 60):
170
170
  """Initialize with fuzzy matching threshold."""
171
171
  self.threshold = threshold
172
- self.entity_cache: dict[str, Any] = {}
173
172
 
174
173
  def search_entities(
175
- self, entities: list[dict[str, Any]], query: str, limit: int = 10, offset: int = 0
174
+ self,
175
+ entities: list[dict[str, Any]],
176
+ query: str,
177
+ limit: int = 10,
178
+ offset: int = 0,
176
179
  ) -> tuple[list[dict[str, Any]], int]:
177
180
  """Search entities using BM25 scoring with SequenceMatcher typo fallback.
178
181
 
@@ -197,7 +200,9 @@ class FuzzyEntitySearcher:
197
200
  # + entity registry aliases (when callers enrich entities with the
198
201
  # ``_aliases`` key — see smart_search.smart_entity_search).
199
202
  docs: list[list[str]] = []
200
- meta: list[tuple[str, str, str, dict[str, Any], str]] = [] # eid, name, domain, attrs, state
203
+ meta: list[
204
+ tuple[str, str, str, dict[str, Any], str]
205
+ ] = [] # eid, name, domain, attrs, state
201
206
  # Track which entities matched on alias (for `match_type="alias_match"`).
202
207
  alias_hit: list[set[str]] = []
203
208
  # Track ``hidden_by`` per entity so the score-penalty pass can
@@ -290,18 +295,18 @@ class FuzzyEntitySearcher:
290
295
  if hit_alias_tokens:
291
296
  match_type = "alias_match"
292
297
  else:
293
- match_type = self._get_match_type(
294
- eid, fname, domain, query_lower
295
- )
296
- matches.append({
297
- "entity_id": eid,
298
- "friendly_name": fname,
299
- "domain": domain,
300
- "state": state,
301
- "attributes": attrs,
302
- "score": score,
303
- "match_type": match_type,
304
- })
298
+ match_type = self._get_match_type(eid, fname, domain, query_lower)
299
+ matches.append(
300
+ {
301
+ "entity_id": eid,
302
+ "friendly_name": fname,
303
+ "domain": domain,
304
+ "state": state,
305
+ "attributes": attrs,
306
+ "score": score,
307
+ "match_type": match_type,
308
+ }
309
+ )
305
310
 
306
311
  # Tier-3 fallback: token-level SequenceMatcher only if BM25 scored
307
312
  # every document at zero. Firing the fallback when BM25 found valid
@@ -310,16 +315,14 @@ class FuzzyEntitySearcher:
310
315
  # exactly the noise floor the new absolute normalization is fixing.
311
316
  bm25_found_any = any(raw > 0 for raw in raw_scores)
312
317
  if not matches and not bm25_found_any:
313
- matches = self._typo_fallback(
314
- query_tokens, docs, meta, hidden_flags
315
- )
318
+ matches = self._typo_fallback(query_tokens, docs, meta, hidden_flags)
316
319
 
317
320
  # Tie-break on entity_id so paginated requests return stable
318
321
  # ordering when several entities share a score (common with the
319
322
  # hidden-penalty bands at 100/80 and BM25's coarse score buckets).
320
323
  matches.sort(key=lambda x: (-x["score"], x["entity_id"]))
321
324
  total_matches = len(matches)
322
- return matches[offset:offset + limit], total_matches
325
+ return matches[offset : offset + limit], total_matches
323
326
 
324
327
  # -- private helpers -----------------------------------------------------
325
328
 
@@ -376,22 +379,22 @@ class FuzzyEntitySearcher:
376
379
  continue
377
380
 
378
381
  eid, fname, domain, attrs, state = meta[i]
379
- entity_hidden = (
380
- hidden_flags[i] if hidden_flags is not None else None
381
- )
382
+ entity_hidden = hidden_flags[i] if hidden_flags is not None else None
382
383
  # Apply the hidden penalty after the threshold gate above
383
384
  # so borderline hidden matches still surface; the penalty
384
385
  # only re-ranks them.
385
386
  score = apply_hidden_penalty(best_token_score, entity_hidden)
386
- results.append({
387
- "entity_id": eid,
388
- "friendly_name": fname,
389
- "domain": domain,
390
- "state": state,
391
- "attributes": attrs,
392
- "score": score,
393
- "match_type": "typo_fallback",
394
- })
387
+ results.append(
388
+ {
389
+ "entity_id": eid,
390
+ "friendly_name": fname,
391
+ "domain": domain,
392
+ "state": state,
393
+ "attributes": attrs,
394
+ "score": score,
395
+ "match_type": "typo_fallback",
396
+ }
397
+ )
395
398
  return results
396
399
 
397
400
  def _calculate_entity_score(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.6.0.dev630
3
+ Version: 7.6.0.dev632
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