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.
- {ha_mcp_dev-7.6.0.dev630/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.6.0.dev632}/PKG-INFO +1 -1
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/pyproject.toml +1 -1
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/fuzzy_search.py +34 -31
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/README.md +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/setup.cfg +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/py.typed +0 -0
- {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
- {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
- {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
- {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
- {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
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {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
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {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
- {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
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {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
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/tests/test_env_manager.py +0 -0
|
@@ -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.
|
|
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,
|
|
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[
|
|
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
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_entry_flow.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/transforms/lite_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.6.0.dev630 → ha_mcp_dev-7.6.0.dev632}/src/ha_mcp_dev.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|