ha-mcp-dev 7.5.0.dev542__tar.gz → 7.5.0.dev544__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.dev542/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev544}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/pyproject.toml +1 -1
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/client/rest_client.py +97 -14
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/setup.cfg +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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.dev544"
|
|
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"
|
|
@@ -136,6 +136,13 @@ class HomeAssistantClient:
|
|
|
136
136
|
verify=self.verify_ssl,
|
|
137
137
|
)
|
|
138
138
|
|
|
139
|
+
# Lazy-populated by ``_is_supervised_install``. ``None`` means
|
|
140
|
+
# "not probed yet"; ``True`` is cached for the session lifetime
|
|
141
|
+
# (HAOS-ness can't change at runtime). ``False`` is NOT cached so a
|
|
142
|
+
# transient probe failure on the first call doesn't permanently
|
|
143
|
+
# disable the supervised branch — subsequent calls re-probe.
|
|
144
|
+
self._supervised_detected: bool | None = None
|
|
145
|
+
|
|
139
146
|
logger.info(f"Initialized Home Assistant client for {self.base_url}")
|
|
140
147
|
|
|
141
148
|
async def __aenter__(self) -> "HomeAssistantClient":
|
|
@@ -455,17 +462,30 @@ class HomeAssistantClient:
|
|
|
455
462
|
async def get_error_log(self) -> str:
|
|
456
463
|
"""Get Home Assistant error log.
|
|
457
464
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
465
|
+
Three-way branch depending on how this client reaches HA:
|
|
466
|
+
|
|
467
|
+
- **Addon context** (``is_running_in_addon()`` True — i.e.
|
|
468
|
+
``SUPERVISOR_TOKEN`` is set, meaning this process is the
|
|
469
|
+
ha-mcp add-on container talking to the Supervisor sibling):
|
|
470
|
+
go direct to Supervisor REST at
|
|
471
|
+
``http://supervisor/core/logs``.
|
|
472
|
+
- **External client → HAOS/Supervised** (``is_running_in_addon()``
|
|
473
|
+
False AND ``hassio`` is listed in HA's loaded components): use
|
|
474
|
+
the HA Core hassio proxy at ``/api/hassio/core/logs`` with the
|
|
475
|
+
user LLA. ``/api/error_log`` is unregistered by design on
|
|
476
|
+
Supervised installs — HA Core's ``bootstrap.py:646-671`` sets
|
|
477
|
+
``err_log_path = None`` when ``SUPERVISOR`` is in the env, so
|
|
478
|
+
``hass.data[DATA_LOGGING]`` is never populated and the
|
|
479
|
+
``APIErrorLog`` view (``api/__init__.py:89-90``) never registers.
|
|
480
|
+
The hassio proxy reaches the same underlying log stream.
|
|
481
|
+
- **External client → Container/pip HA** (neither of the above):
|
|
482
|
+
keep the historical ``/api/error_log`` proxy path.
|
|
483
|
+
|
|
484
|
+
The middle branch was discovered by the HAOS E2E tier (#1326): the
|
|
485
|
+
test harness runs ha-mcp externally against a booted HAOS, hits
|
|
486
|
+
the unregistered endpoint, and the old binary branch surfaced as
|
|
487
|
+
a confusing 404. Verified end-to-end with the user's real HAOS
|
|
488
|
+
and against HA Core source.
|
|
469
489
|
|
|
470
490
|
Raises:
|
|
471
491
|
HomeAssistantAuthError: 401, or empty ``SUPERVISOR_TOKEN`` on
|
|
@@ -479,9 +499,72 @@ class HomeAssistantClient:
|
|
|
479
499
|
logger.debug("Fetching error log via Supervisor direct (core service)")
|
|
480
500
|
return await self._supervisor_logs_get("core")
|
|
481
501
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
502
|
+
if await self._is_supervised_install():
|
|
503
|
+
logger.debug(
|
|
504
|
+
"Fetching error log via HA Core /hassio/core/logs proxy (supervised)"
|
|
505
|
+
)
|
|
506
|
+
raw_response = await self._raw_request(
|
|
507
|
+
"GET",
|
|
508
|
+
"/hassio/core/logs?lines=20000",
|
|
509
|
+
headers={"Accept": "text/plain"},
|
|
510
|
+
)
|
|
511
|
+
return raw_response.text
|
|
512
|
+
|
|
513
|
+
logger.debug("Fetching error log via HA Core proxy (Container/pip)")
|
|
514
|
+
raw_response = await self._raw_request(
|
|
515
|
+
"GET", "/error_log", headers={"Accept": "text/plain"}
|
|
516
|
+
)
|
|
517
|
+
return raw_response.text
|
|
518
|
+
|
|
519
|
+
async def _is_supervised_install(self) -> bool:
|
|
520
|
+
"""Detect whether the target HA is a Supervised / HAOS install.
|
|
521
|
+
|
|
522
|
+
Probes ``/api/config`` once per client instance and returns
|
|
523
|
+
``"hassio" in components``. Cached for the session lifetime on
|
|
524
|
+
BOTH definite outcomes (True or False), since a successful
|
|
525
|
+
``/api/config`` response with or without ``hassio`` is a
|
|
526
|
+
definitive signal — HA's loaded-components set doesn't change
|
|
527
|
+
between Supervised and Container at runtime.
|
|
528
|
+
|
|
529
|
+
Cache is NOT poisoned on probe failure: a transient network
|
|
530
|
+
glitch or HTTP error returns False without setting the cache,
|
|
531
|
+
so the next call re-probes. This is the only path that
|
|
532
|
+
intentionally fails open — caller proceeds on the historical
|
|
533
|
+
Container branch (which on HAOS will also fail, but with a
|
|
534
|
+
clearer 404 than a probe-side exception would surface).
|
|
535
|
+
|
|
536
|
+
Auth / connection / HTTP errors are caught explicitly; runtime
|
|
537
|
+
bugs (TypeError, AttributeError) and BaseException derivatives
|
|
538
|
+
(KeyboardInterrupt, CancelledError) deliberately propagate so
|
|
539
|
+
they're not silenced as "not supervised".
|
|
540
|
+
"""
|
|
541
|
+
if self._supervised_detected is not None:
|
|
542
|
+
return self._supervised_detected
|
|
543
|
+
try:
|
|
544
|
+
config = await self._request("GET", "/config")
|
|
545
|
+
except (
|
|
546
|
+
HomeAssistantAuthError,
|
|
547
|
+
HomeAssistantAPIError,
|
|
548
|
+
HomeAssistantConnectionError,
|
|
549
|
+
httpx.HTTPError,
|
|
550
|
+
TimeoutError,
|
|
551
|
+
) as exc:
|
|
552
|
+
# Fail-open on transport / HTTP-layer failures only. Note:
|
|
553
|
+
# a 401 here likely means the LLA is bad and the /error_log
|
|
554
|
+
# fallback will also 401 — the user gets a clearer auth error
|
|
555
|
+
# from that path than a swallowed probe error would surface.
|
|
556
|
+
# Logged at WARNING so it's visible at default log levels
|
|
557
|
+
# without spamming on every call (probe runs at most once
|
|
558
|
+
# per session per outcome).
|
|
559
|
+
logger.warning(
|
|
560
|
+
"Supervised-install probe failed (fail-open to non-supervised): %r",
|
|
561
|
+
exc,
|
|
562
|
+
)
|
|
563
|
+
return False
|
|
564
|
+
components = config.get("components", []) if isinstance(config, dict) else []
|
|
565
|
+
is_supervised = isinstance(components, list) and "hassio" in components
|
|
566
|
+
self._supervised_detected = is_supervised
|
|
567
|
+
return is_supervised
|
|
485
568
|
|
|
486
569
|
async def get_addon_logs(self, slug: str) -> str:
|
|
487
570
|
"""Fetch an add-on's container logs.
|
|
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.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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.dev542 → ha_mcp_dev-7.5.0.dev544}/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.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_entry_flow.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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.dev542 → ha_mcp_dev-7.5.0.dev544}/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.dev542 → ha_mcp_dev-7.5.0.dev544}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.5.0.dev542 → ha_mcp_dev-7.5.0.dev544}/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
|