ha-mcp-dev 7.5.0.dev533__tar.gz → 7.5.0.dev535__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.dev533/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev535}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/pyproject.toml +1 -1
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/helpers.py +13 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_automations.py +0 -3
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_dashboards.py +0 -11
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_scripts.py +19 -1
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/setup.cfg +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev535"
|
|
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"
|
|
@@ -396,6 +396,19 @@ def exception_to_structured_error(
|
|
|
396
396
|
|
|
397
397
|
error_response = _classify_exception(error, error_str, error_msg, context)
|
|
398
398
|
|
|
399
|
+
# Tracebacks are operationally valuable only for genuinely unclassified
|
|
400
|
+
# exceptions (programmer errors, library bugs) — every other branch in
|
|
401
|
+
# _classify_exception produces a structured signal that's sufficient on
|
|
402
|
+
# its own. Logging at exception level here gives operators line numbers
|
|
403
|
+
# for the bug class where ``str(error)`` is least informative, without
|
|
404
|
+
# re-introducing the duplicate ERROR-log noise that classified failures
|
|
405
|
+
# produced.
|
|
406
|
+
if (
|
|
407
|
+
isinstance(error_response.get("error"), dict)
|
|
408
|
+
and error_response["error"].get("code") == ErrorCode.INTERNAL_ERROR
|
|
409
|
+
):
|
|
410
|
+
logger.exception("Unclassified exception: %s", error_msg)
|
|
411
|
+
|
|
399
412
|
if suggestions and "error" in error_response and isinstance(error_response["error"], dict):
|
|
400
413
|
# Set both `suggestion` (singular, first item) and `suggestions`
|
|
401
414
|
# (plural, full list). create_error_response (errors.py) sets the
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
@@ -325,7 +325,6 @@ class AutomationConfigTools:
|
|
|
325
325
|
except ToolError:
|
|
326
326
|
raise
|
|
327
327
|
except Exception as e:
|
|
328
|
-
logger.error(f"Error getting automation: {e}")
|
|
329
328
|
exception_to_structured_error(
|
|
330
329
|
e,
|
|
331
330
|
context={"identifier": identifier, "action": "get"},
|
|
@@ -761,7 +760,6 @@ class AutomationConfigTools:
|
|
|
761
760
|
except ToolError:
|
|
762
761
|
raise
|
|
763
762
|
except Exception as e:
|
|
764
|
-
logger.error(f"Error upserting automation: {e}")
|
|
765
763
|
suggestions = [
|
|
766
764
|
"Check automation configuration format",
|
|
767
765
|
"Ensure required fields: alias, trigger, action",
|
|
@@ -1033,7 +1031,6 @@ class AutomationConfigTools:
|
|
|
1033
1031
|
except ToolError:
|
|
1034
1032
|
raise
|
|
1035
1033
|
except Exception as e:
|
|
1036
|
-
logger.error(f"Error deleting automation: {e}")
|
|
1037
1034
|
exception_to_structured_error(
|
|
1038
1035
|
e,
|
|
1039
1036
|
context={"identifier": identifier, "action": "delete"},
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
@@ -803,12 +803,6 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
|
|
|
803
803
|
raise
|
|
804
804
|
except Exception as e:
|
|
805
805
|
if search_mode:
|
|
806
|
-
logger.error(
|
|
807
|
-
f"Error finding card in dashboard: url_path={url_path}, "
|
|
808
|
-
f"entity_id={entity_id}, card_type={card_type}, heading={heading}, "
|
|
809
|
-
f"error={e}",
|
|
810
|
-
exc_info=True,
|
|
811
|
-
)
|
|
812
806
|
suggestions = [
|
|
813
807
|
"Check HA connection",
|
|
814
808
|
"Verify dashboard with ha_config_get_dashboard(list_only=True)",
|
|
@@ -821,7 +815,6 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
|
|
|
821
815
|
"heading": heading,
|
|
822
816
|
}
|
|
823
817
|
else:
|
|
824
|
-
logger.error(f"Error getting dashboard: {e}", exc_info=True)
|
|
825
818
|
suggestions = [
|
|
826
819
|
"Use ha_config_get_dashboard(list_only=True) to see available dashboards",
|
|
827
820
|
"Check if you have permission to access this dashboard",
|
|
@@ -1482,7 +1475,6 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
|
|
|
1482
1475
|
except ToolError:
|
|
1483
1476
|
raise
|
|
1484
1477
|
except Exception as e:
|
|
1485
|
-
logger.error(f"Error setting dashboard: {e}")
|
|
1486
1478
|
exception_to_structured_error(
|
|
1487
1479
|
e,
|
|
1488
1480
|
context={"action": "set", "url_path": url_path},
|
|
@@ -1564,8 +1556,6 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
|
|
|
1564
1556
|
else:
|
|
1565
1557
|
error_str = str(error_msg)
|
|
1566
1558
|
|
|
1567
|
-
logger.error(f"Error deleting dashboard: {error_str}")
|
|
1568
|
-
|
|
1569
1559
|
# If the error is "not found" / "doesn't exist", treat as success (idempotent)
|
|
1570
1560
|
if (
|
|
1571
1561
|
"unable to find" in error_str.lower()
|
|
@@ -1606,7 +1596,6 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
|
|
|
1606
1596
|
except ToolError:
|
|
1607
1597
|
raise
|
|
1608
1598
|
except Exception as e:
|
|
1609
|
-
logger.error(f"Error deleting dashboard: {e}")
|
|
1610
1599
|
exception_to_structured_error(
|
|
1611
1600
|
e,
|
|
1612
1601
|
context={"action": "delete", "url_path": url_path},
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
@@ -96,6 +96,8 @@ class ConfigScriptTools:
|
|
|
96
96
|
|
|
97
97
|
The returned `config_hash` is stable across consecutive reads of an unchanged config — `compute_config_hash` documents the underlying contract.
|
|
98
98
|
|
|
99
|
+
The returned `script_id` is the canonical storage key resolved by the REST client (matching what `ha_config_set_script` / `ha_config_remove_script` expect), falling back to the input identifier on the rare path where the REST envelope omits it.
|
|
100
|
+
|
|
99
101
|
EXAMPLES:
|
|
100
102
|
- Get script: ha_config_get_script("morning_routine")
|
|
101
103
|
- Get script: ha_config_get_script("backup_script")
|
|
@@ -128,10 +130,26 @@ class ConfigScriptTools:
|
|
|
128
130
|
if cat_id:
|
|
129
131
|
config_result["category"] = cat_id
|
|
130
132
|
|
|
133
|
+
# Issue #1334: return the canonical storage key from the
|
|
134
|
+
# rest_client envelope so callers can thread the result into
|
|
135
|
+
# subsequent ha_config_*_script calls without re-resolving.
|
|
136
|
+
# Falls back to the input when the rest_client response omits
|
|
137
|
+
# the key — a contract violation that we surface via warning
|
|
138
|
+
# rather than mask silently.
|
|
139
|
+
canonical_id = config_result.get("script_id")
|
|
140
|
+
if canonical_id is None:
|
|
141
|
+
logger.warning(
|
|
142
|
+
"get_script_config envelope missing 'script_id' for "
|
|
143
|
+
"input %r; falling back to caller input. This indicates "
|
|
144
|
+
"a rest_client contract violation.",
|
|
145
|
+
script_id,
|
|
146
|
+
)
|
|
147
|
+
canonical_id = script_id
|
|
148
|
+
|
|
131
149
|
return {
|
|
132
150
|
"success": True,
|
|
133
151
|
"action": "get",
|
|
134
|
-
"script_id":
|
|
152
|
+
"script_id": canonical_id,
|
|
135
153
|
"config": config_result,
|
|
136
154
|
"config_hash": config_hash_value,
|
|
137
155
|
}
|
|
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.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_entry_flow.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/tools/tools_config_helpers.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
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev533 → ha_mcp_dev-7.5.0.dev535}/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.dev533 → ha_mcp_dev-7.5.0.dev535}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev533 → ha_mcp_dev-7.5.0.dev535}/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
|