ha-mcp-dev 7.5.0.dev537__tar.gz → 7.5.0.dev539__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.5.0.dev537/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev539}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/pyproject.toml +1 -1
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/helpers.py +10 -1
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_system.py +81 -12
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/setup.cfg +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/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.5.0.
|
|
7
|
+
version = "7.5.0.dev539"
|
|
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"
|
|
@@ -284,7 +284,16 @@ def _classify_by_message(
|
|
|
284
284
|
# heterogeneous vol.Invalid vocabulary without relying on an
|
|
285
285
|
# error code (always unknown_error from the bridge).
|
|
286
286
|
result = create_validation_error(error_msg, context=context)
|
|
287
|
-
elif
|
|
287
|
+
elif (
|
|
288
|
+
"not found" in error_str
|
|
289
|
+
or "404" in error_str
|
|
290
|
+
or "unknown config specified" in error_str
|
|
291
|
+
):
|
|
292
|
+
# ``unknown config specified`` is HA Core's WS-bridge phrasing for
|
|
293
|
+
# missing-dashboard 404s (lovelace/config with an unknown url_path).
|
|
294
|
+
# The string contains neither ``not found`` nor ``404``, so it would
|
|
295
|
+
# otherwise fall through to the ``command failed:`` SERVICE_CALL_FAILED
|
|
296
|
+
# fallback below and the agent would lose the not-found signal.
|
|
288
297
|
entity_id = context.get("entity_id") if context else None
|
|
289
298
|
if entity_id:
|
|
290
299
|
result = create_entity_not_found_error(entity_id, details=error_msg)
|
|
@@ -7,7 +7,9 @@ This module provides tools for Home Assistant system administration including:
|
|
|
7
7
|
- System health monitoring
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
+
import asyncio
|
|
10
11
|
import logging
|
|
12
|
+
from collections.abc import Coroutine
|
|
11
13
|
from typing import Any
|
|
12
14
|
|
|
13
15
|
from fastmcp.exceptions import ToolError
|
|
@@ -376,22 +378,89 @@ class SystemTools:
|
|
|
376
378
|
if unknown:
|
|
377
379
|
result["warning"] = f"Unknown include sections ignored: {', '.join(sorted(unknown))}"
|
|
378
380
|
|
|
379
|
-
# Fetch optional sections
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
381
|
+
# Fetch optional sections concurrently. The ws_client serialises
|
|
382
|
+
# outgoing writes via its internal `_send_lock`, but per-message
|
|
383
|
+
# futures keyed by message_id let response waits overlap — so this
|
|
384
|
+
# gives request pipelining instead of head-of-line blocking.
|
|
385
|
+
#
|
|
386
|
+
# Each ``_fetch_*`` helper already returns an embeddable sub-dict
|
|
387
|
+
# with an ``error`` field on backend failure (it never raises);
|
|
388
|
+
# ``return_exceptions=True`` is belt-and-suspenders against a future
|
|
389
|
+
# helper edit that lets an exception escape.
|
|
386
390
|
zha_full = "zha_network_full" in includes
|
|
387
391
|
zha_summary = "zha_network" in includes
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
392
|
+
want_repairs = "repairs" in includes
|
|
393
|
+
want_zha = zha_full or zha_summary
|
|
394
|
+
want_zwave = "zwave_network" in includes
|
|
395
|
+
|
|
396
|
+
sections: list[tuple[str, Coroutine[Any, Any, dict[str, Any]]]] = []
|
|
397
|
+
if want_repairs:
|
|
398
|
+
sections.append(
|
|
399
|
+
(
|
|
400
|
+
"repairs",
|
|
401
|
+
self._fetch_repairs(
|
|
402
|
+
ws_client,
|
|
403
|
+
include_dismissed=include_dismissed_repairs_bool,
|
|
404
|
+
),
|
|
405
|
+
)
|
|
406
|
+
)
|
|
407
|
+
if want_zha:
|
|
408
|
+
sections.append(
|
|
409
|
+
("zha_network", self._fetch_zha_network(ws_client, full=zha_full))
|
|
410
|
+
)
|
|
411
|
+
if want_zwave:
|
|
412
|
+
sections.append(
|
|
413
|
+
("zwave_network", self._fetch_zwave_network(ws_client))
|
|
391
414
|
)
|
|
392
415
|
|
|
393
|
-
if
|
|
394
|
-
|
|
416
|
+
if sections:
|
|
417
|
+
gathered = await asyncio.gather(
|
|
418
|
+
*[coro for _, coro in sections], return_exceptions=True
|
|
419
|
+
)
|
|
420
|
+
# Pre-pass: re-raise anything that must unwind the request
|
|
421
|
+
# rather than land as an embedded section error. ``gather``
|
|
422
|
+
# with ``return_exceptions=True`` returns ``CancelledError``
|
|
423
|
+
# (and any other ``BaseException``) as a result element
|
|
424
|
+
# instead of propagating, and a ``ToolError`` raised from
|
|
425
|
+
# inside a helper would otherwise be silently demoted to
|
|
426
|
+
# ``{"error": "ToolError: …"}`` and break the MCP
|
|
427
|
+
# ``isError=true`` contract for the whole tool.
|
|
428
|
+
for section_result in gathered:
|
|
429
|
+
if isinstance(section_result, asyncio.CancelledError):
|
|
430
|
+
raise section_result
|
|
431
|
+
if isinstance(section_result, ToolError):
|
|
432
|
+
raise section_result
|
|
433
|
+
if isinstance(section_result, BaseException) and not isinstance(
|
|
434
|
+
section_result, Exception
|
|
435
|
+
):
|
|
436
|
+
# ``KeyboardInterrupt`` / ``SystemExit`` — never demote
|
|
437
|
+
# these to a section-level error string.
|
|
438
|
+
raise section_result
|
|
439
|
+
for (section_name, _), section_result in zip(
|
|
440
|
+
sections, gathered, strict=True
|
|
441
|
+
):
|
|
442
|
+
if isinstance(section_result, Exception):
|
|
443
|
+
# Last-resort fallback: emit a minimal ``{error: ...}``
|
|
444
|
+
# dict so an unexpected exception attributes to its
|
|
445
|
+
# section instead of bubbling out and dropping siblings.
|
|
446
|
+
# The helpers themselves return richer
|
|
447
|
+
# ``{<key>: <baseline>, ..., error: ...}`` shapes on
|
|
448
|
+
# their own (caught) failures; this branch is the
|
|
449
|
+
# belt-and-suspenders path that fires only on a
|
|
450
|
+
# helper-edit regression that lets an exception escape.
|
|
451
|
+
logger.warning(
|
|
452
|
+
"Concurrent fetch for section %r raised: %s: %s",
|
|
453
|
+
section_name,
|
|
454
|
+
type(section_result).__name__,
|
|
455
|
+
section_result,
|
|
456
|
+
)
|
|
457
|
+
result[section_name] = {
|
|
458
|
+
"error": (
|
|
459
|
+
f"{type(section_result).__name__}: {section_result}"
|
|
460
|
+
)
|
|
461
|
+
}
|
|
462
|
+
else:
|
|
463
|
+
result[section_name] = section_result
|
|
395
464
|
|
|
396
465
|
return result
|
|
397
466
|
|
|
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.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/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
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/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
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_entry_flow.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/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
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/transforms/lite_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev537 → ha_mcp_dev-7.5.0.dev539}/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
|