ha-mcp-dev 7.9.0.dev758__tar.gz → 7.9.0.dev759__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.9.0.dev758/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.9.0.dev759}/PKG-INFO +9 -2
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/README.md +8 -1
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/pyproject.toml +1 -1
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/rest_client.py +28 -8
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/backup.py +14 -2
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_utility.py +25 -2
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/kill_signal_diagnostics.py +11 -11
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759/src/ha_mcp_dev.egg-info}/PKG-INFO +9 -2
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/LICENSE +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/setup.cfg +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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.9.0.
|
|
3
|
+
Version: 7.9.0.dev759
|
|
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
|
|
@@ -462,7 +462,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
462
462
|
- **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
|
|
463
463
|
- **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
|
|
464
464
|
- **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
465
|
-
|
|
465
|
+
- **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
|
|
466
|
+
- **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
|
|
467
|
+
- **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
|
|
468
|
+
- **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
|
|
469
|
+
- **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
|
|
470
|
+
- **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
|
|
471
|
+
- **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
|
|
472
|
+
- **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
466
473
|
---
|
|
467
474
|
|
|
468
475
|
## 💬 Community
|
|
@@ -430,7 +430,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
430
430
|
- **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
|
|
431
431
|
- **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
|
|
432
432
|
- **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
433
|
-
|
|
433
|
+
- **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
|
|
434
|
+
- **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
|
|
435
|
+
- **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
|
|
436
|
+
- **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
|
|
437
|
+
- **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
|
|
438
|
+
- **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
|
|
439
|
+
- **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
|
|
440
|
+
- **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
434
441
|
---
|
|
435
442
|
|
|
436
443
|
## 💬 Community
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.9.0.
|
|
7
|
+
version = "7.9.0.dev759"
|
|
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"
|
|
@@ -606,7 +606,7 @@ class HomeAssistantClient:
|
|
|
606
606
|
self._supervised_detected = is_supervised
|
|
607
607
|
return is_supervised
|
|
608
608
|
|
|
609
|
-
async def get_addon_logs(self, slug: str) -> str:
|
|
609
|
+
async def get_addon_logs(self, slug: str, lines: int | None = None) -> str:
|
|
610
610
|
"""Fetch an add-on's container logs.
|
|
611
611
|
|
|
612
612
|
Branch on ``is_running_in_addon()`` (which keys off ``SUPERVISOR_TOKEN``
|
|
@@ -621,6 +621,15 @@ class HomeAssistantClient:
|
|
|
621
621
|
HA URL), falls back to the HA Core proxy path. That path requires an
|
|
622
622
|
admin LLA but works fine when not invoked from the add-on container.
|
|
623
623
|
|
|
624
|
+
``lines`` sets the journald window Supervisor serves via its
|
|
625
|
+
``?lines=`` query param (supervisor/api/host.py). Without it,
|
|
626
|
+
Supervisor returns only its default window (``DEFAULT_LINES = 100``
|
|
627
|
+
in supervisor/api/const.py) — which silently capped every larger
|
|
628
|
+
caller-side limit before this param existed. Both branches carry
|
|
629
|
+
it: the direct endpoint parses the query natively, and HA Core's
|
|
630
|
+
hassio proxy forwards ``request.query`` upstream
|
|
631
|
+
(homeassistant/components/hassio/http.py).
|
|
632
|
+
|
|
624
633
|
Both branches return ``text/plain`` log content.
|
|
625
634
|
|
|
626
635
|
Raises:
|
|
@@ -633,17 +642,18 @@ class HomeAssistantClient:
|
|
|
633
642
|
HomeAssistantConnectionError: Network, timeout, or transport error.
|
|
634
643
|
"""
|
|
635
644
|
if is_running_in_addon():
|
|
636
|
-
return await self._get_addon_logs_via_supervisor(slug)
|
|
645
|
+
return await self._get_addon_logs_via_supervisor(slug, lines=lines)
|
|
637
646
|
|
|
638
647
|
logger.debug(f"Fetching addon logs for slug={slug} via HA Core proxy")
|
|
639
648
|
response = await self._raw_request(
|
|
640
649
|
"GET",
|
|
641
650
|
f"/hassio/addons/{slug}/logs",
|
|
642
651
|
headers={"Accept": "text/plain"},
|
|
652
|
+
params={"lines": lines} if lines is not None else None,
|
|
643
653
|
)
|
|
644
654
|
return response.text
|
|
645
655
|
|
|
646
|
-
async def _supervisor_logs_get(self, path: str) -> str:
|
|
656
|
+
async def _supervisor_logs_get(self, path: str, lines: int | None = None) -> str:
|
|
647
657
|
"""Fetch ``text/plain`` logs from a Supervisor REST endpoint.
|
|
648
658
|
|
|
649
659
|
``path`` is everything between ``http://supervisor/`` and ``/logs``:
|
|
@@ -652,6 +662,9 @@ class HomeAssistantClient:
|
|
|
652
662
|
- ``"<service>"`` (where service ∈ {supervisor, host, core, dns, audio,
|
|
653
663
|
cli, multicast, observer}) for system-service logs
|
|
654
664
|
|
|
665
|
+
``lines`` maps to the endpoint's ``?lines=`` journald-window query
|
|
666
|
+
param; omitted → Supervisor's 100-line default window.
|
|
667
|
+
|
|
655
668
|
Bypasses ``HomeAssistantClient.httpx_client`` because the Supervisor
|
|
656
669
|
endpoint uses a different base URL (``http://supervisor``) and a
|
|
657
670
|
different token (``SUPERVISOR_TOKEN``) than HA Core REST. Both
|
|
@@ -681,9 +694,10 @@ class HomeAssistantClient:
|
|
|
681
694
|
|
|
682
695
|
relative_path = f"/{path}/logs"
|
|
683
696
|
logger.debug(
|
|
684
|
-
"Fetching %s%s via Supervisor direct",
|
|
697
|
+
"Fetching %s%s via Supervisor direct (lines=%s)",
|
|
685
698
|
get_supervisor_base_url(),
|
|
686
699
|
relative_path,
|
|
700
|
+
lines,
|
|
687
701
|
)
|
|
688
702
|
|
|
689
703
|
try:
|
|
@@ -694,6 +708,7 @@ class HomeAssistantClient:
|
|
|
694
708
|
response = await client.get(
|
|
695
709
|
relative_path,
|
|
696
710
|
headers={"Accept": "text/plain"},
|
|
711
|
+
params={"lines": lines} if lines is not None else None,
|
|
697
712
|
)
|
|
698
713
|
except httpx.TimeoutException as e:
|
|
699
714
|
raise HomeAssistantConnectionError(
|
|
@@ -753,7 +768,9 @@ class HomeAssistantClient:
|
|
|
753
768
|
)
|
|
754
769
|
return response.text
|
|
755
770
|
|
|
756
|
-
async def _get_addon_logs_via_supervisor(
|
|
771
|
+
async def _get_addon_logs_via_supervisor(
|
|
772
|
+
self, slug: str, lines: int | None = None
|
|
773
|
+
) -> str:
|
|
757
774
|
"""Fetch add-on container logs directly from Supervisor's REST API.
|
|
758
775
|
|
|
759
776
|
Distinct from ``tools_bug_report._fetch_addon_logs``: that helper is
|
|
@@ -766,9 +783,11 @@ class HomeAssistantClient:
|
|
|
766
783
|
Delegates to ``_supervisor_logs_get`` so error handling stays in
|
|
767
784
|
lockstep with ``_get_system_service_logs``.
|
|
768
785
|
"""
|
|
769
|
-
return await self._supervisor_logs_get(f"addons/{slug}")
|
|
786
|
+
return await self._supervisor_logs_get(f"addons/{slug}", lines=lines)
|
|
770
787
|
|
|
771
|
-
async def _get_system_service_logs(
|
|
788
|
+
async def _get_system_service_logs(
|
|
789
|
+
self, service: str, lines: int | None = None
|
|
790
|
+
) -> str:
|
|
772
791
|
"""Fetch HA system-service logs.
|
|
773
792
|
|
|
774
793
|
``service`` must be one of the eight Supervisor-managed services:
|
|
@@ -796,13 +815,14 @@ class HomeAssistantClient:
|
|
|
796
815
|
logs) call kept working through its own Core-proxy fallback.
|
|
797
816
|
"""
|
|
798
817
|
if is_running_in_addon():
|
|
799
|
-
return await self._supervisor_logs_get(service)
|
|
818
|
+
return await self._supervisor_logs_get(service, lines=lines)
|
|
800
819
|
|
|
801
820
|
logger.debug(f"Fetching {service} logs via HA Core proxy")
|
|
802
821
|
response = await self._raw_request(
|
|
803
822
|
"GET",
|
|
804
823
|
f"/hassio/{service}/logs",
|
|
805
824
|
headers={"Accept": "text/plain"},
|
|
825
|
+
params={"lines": lines} if lines is not None else None,
|
|
806
826
|
)
|
|
807
827
|
return response.text
|
|
808
828
|
|
|
@@ -329,11 +329,19 @@ async def _poll_backup_completion(
|
|
|
329
329
|
)
|
|
330
330
|
|
|
331
331
|
if event_state == "failed":
|
|
332
|
+
# Surface the failure event verbatim — HA's failed event
|
|
333
|
+
# carries the cause (e.g. another backup already in
|
|
334
|
+
# progress), and dropping it left CI failures reading
|
|
335
|
+
# "Backup creation failed: Backup creation failed" with
|
|
336
|
+
# nothing to diagnose.
|
|
332
337
|
raise_tool_error(
|
|
333
338
|
create_error_response(
|
|
334
339
|
ErrorCode.SERVICE_CALL_FAILED,
|
|
335
340
|
"Backup creation failed",
|
|
336
|
-
context={
|
|
341
|
+
context={
|
|
342
|
+
"backup_job_id": backup_job_id,
|
|
343
|
+
"last_action_event": last_event,
|
|
344
|
+
},
|
|
337
345
|
)
|
|
338
346
|
)
|
|
339
347
|
|
|
@@ -410,7 +418,11 @@ async def _poll_backup_completion(
|
|
|
410
418
|
create_error_response(
|
|
411
419
|
ErrorCode.SERVICE_CALL_FAILED,
|
|
412
420
|
"Backup creation failed (observed at post-timeout lookup)",
|
|
413
|
-
context={
|
|
421
|
+
context={
|
|
422
|
+
"backup_job_id": backup_job_id,
|
|
423
|
+
"name": name,
|
|
424
|
+
"last_action_event": last_event,
|
|
425
|
+
},
|
|
414
426
|
)
|
|
415
427
|
)
|
|
416
428
|
if state != "idle":
|
|
@@ -53,6 +53,11 @@ SYSTEM_SERVICE_SLUGS = frozenset(
|
|
|
53
53
|
|
|
54
54
|
DEFAULT_LIMIT = 50
|
|
55
55
|
DEFAULT_LOG_LIMIT = 100
|
|
56
|
+
# Journald window to request from Supervisor when a search filter is
|
|
57
|
+
# active: matches are found within the fetched window only, so a
|
|
58
|
+
# search over the caller's (often small) limit needs more history
|
|
59
|
+
# behind it than the limit itself.
|
|
60
|
+
SUPERVISOR_SEARCH_WINDOW_LINES = 2000
|
|
56
61
|
MAX_LIMIT = 500
|
|
57
62
|
|
|
58
63
|
# Regex to match log level at the start of a log line
|
|
@@ -752,8 +757,18 @@ class UtilityTools:
|
|
|
752
757
|
limit, default=DEFAULT_LOG_LIMIT, suggestion_example="100"
|
|
753
758
|
)
|
|
754
759
|
|
|
760
|
+
# Request a journald window sized to the caller's limit —
|
|
761
|
+
# Supervisor's /logs endpoints default to their last-100-lines
|
|
762
|
+
# window, which silently capped any larger limit before ?lines=
|
|
763
|
+
# was plumbed through (found via #1721's e2e).
|
|
764
|
+
fetch_lines = (
|
|
765
|
+
max(effective_limit, SUPERVISOR_SEARCH_WINDOW_LINES)
|
|
766
|
+
if search
|
|
767
|
+
else effective_limit
|
|
768
|
+
)
|
|
769
|
+
|
|
755
770
|
try:
|
|
756
|
-
log_text = await self._client.get_addon_logs(slug)
|
|
771
|
+
log_text = await self._client.get_addon_logs(slug, lines=fetch_lines)
|
|
757
772
|
|
|
758
773
|
lines = log_text.splitlines() if log_text else []
|
|
759
774
|
|
|
@@ -892,8 +907,16 @@ class UtilityTools:
|
|
|
892
907
|
limit, default=DEFAULT_LOG_LIMIT, suggestion_example="100"
|
|
893
908
|
)
|
|
894
909
|
|
|
910
|
+
fetch_lines = (
|
|
911
|
+
max(effective_limit, SUPERVISOR_SEARCH_WINDOW_LINES)
|
|
912
|
+
if search
|
|
913
|
+
else effective_limit
|
|
914
|
+
)
|
|
915
|
+
|
|
895
916
|
try:
|
|
896
|
-
log_text = await self._client._get_system_service_logs(
|
|
917
|
+
log_text = await self._client._get_system_service_logs(
|
|
918
|
+
service, lines=fetch_lines
|
|
919
|
+
)
|
|
897
920
|
|
|
898
921
|
lines = log_text.splitlines() if log_text else []
|
|
899
922
|
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Kill-signal diagnostics for the HA MCP add-on.
|
|
2
2
|
|
|
3
|
-
Opt-in (
|
|
3
|
+
Opt-in (armed when the addon's effective log level is DEBUG) signal handler
|
|
4
4
|
that, on SIGTERM/SIGINT/SIGHUP, captures and logs:
|
|
5
5
|
|
|
6
6
|
- Signal name + ``si_code`` (USER/KERNEL/QUEUE/TKILL/...).
|
|
@@ -244,7 +244,7 @@ def format_diagnostic_block(
|
|
|
244
244
|
|
|
245
245
|
lines = [
|
|
246
246
|
"=" * 80,
|
|
247
|
-
"
|
|
247
|
+
"KILL-SIGNAL DIAGNOSTICS",
|
|
248
248
|
"=" * 80,
|
|
249
249
|
f"Signal: {sig_name} ({signum})",
|
|
250
250
|
f"si_code: {code_name}",
|
|
@@ -356,7 +356,7 @@ def _make_handler() -> Any:
|
|
|
356
356
|
try:
|
|
357
357
|
os.write(
|
|
358
358
|
2,
|
|
359
|
-
f"
|
|
359
|
+
f"kill-signal diagnostics handler failed for signal {signum}: {exc!r}\n".encode(
|
|
360
360
|
"utf-8", errors="replace"
|
|
361
361
|
),
|
|
362
362
|
)
|
|
@@ -386,14 +386,14 @@ def install_kill_signal_diagnostics() -> bool:
|
|
|
386
386
|
|
|
387
387
|
if sys.platform != "linux":
|
|
388
388
|
logger.warning(
|
|
389
|
-
"
|
|
389
|
+
"kill-signal diagnostics are Linux-only; skipping signal handler install on %s",
|
|
390
390
|
sys.platform,
|
|
391
391
|
)
|
|
392
392
|
return False
|
|
393
393
|
|
|
394
394
|
if _handler_refs:
|
|
395
395
|
logger.warning(
|
|
396
|
-
"
|
|
396
|
+
"kill-signal diagnostics: install_kill_signal_diagnostics already called; skipping"
|
|
397
397
|
)
|
|
398
398
|
return True
|
|
399
399
|
|
|
@@ -401,7 +401,7 @@ def install_kill_signal_diagnostics() -> bool:
|
|
|
401
401
|
libc_path = ctypes.util.find_library("c")
|
|
402
402
|
if libc_path is None:
|
|
403
403
|
logger.warning(
|
|
404
|
-
"
|
|
404
|
+
"kill-signal diagnostics: libc not found; skipping signal handler install"
|
|
405
405
|
)
|
|
406
406
|
return False
|
|
407
407
|
|
|
@@ -441,7 +441,7 @@ def install_kill_signal_diagnostics() -> bool:
|
|
|
441
441
|
if rc != 0:
|
|
442
442
|
err = ctypes.get_errno()
|
|
443
443
|
logger.warning(
|
|
444
|
-
"
|
|
444
|
+
"kill-signal diagnostics: sigaction(%s) failed: errno=%d",
|
|
445
445
|
sig.name,
|
|
446
446
|
err,
|
|
447
447
|
)
|
|
@@ -449,7 +449,7 @@ def install_kill_signal_diagnostics() -> bool:
|
|
|
449
449
|
installed_for.append(sig.name)
|
|
450
450
|
except Exception as exc:
|
|
451
451
|
logger.warning(
|
|
452
|
-
"
|
|
452
|
+
"kill-signal diagnostics: install failed (%r); continuing without diagnostics",
|
|
453
453
|
exc,
|
|
454
454
|
)
|
|
455
455
|
_handler_refs.clear()
|
|
@@ -460,7 +460,7 @@ def install_kill_signal_diagnostics() -> bool:
|
|
|
460
460
|
if installed_for:
|
|
461
461
|
chained_signals = sorted(signal.Signals(s).name for s in _chained_handlers)
|
|
462
462
|
logger.info(
|
|
463
|
-
"
|
|
463
|
+
"kill-signal diagnostics installed for: %s "
|
|
464
464
|
"(chains to existing handlers for: %s)",
|
|
465
465
|
", ".join(installed_for),
|
|
466
466
|
", ".join(chained_signals) or "<none>",
|
|
@@ -502,13 +502,13 @@ def schedule_install_after_uvicorn(
|
|
|
502
502
|
current = signal.getsignal(signal.SIGTERM)
|
|
503
503
|
if callable(current) and current not in (signal.SIG_DFL, signal.SIG_IGN):
|
|
504
504
|
logger.debug(
|
|
505
|
-
"
|
|
505
|
+
"kill-signal diagnostics: detected uvicorn signal handler; installing on top"
|
|
506
506
|
)
|
|
507
507
|
install()
|
|
508
508
|
return
|
|
509
509
|
time.sleep(poll_interval_secs)
|
|
510
510
|
logger.info(
|
|
511
|
-
"
|
|
511
|
+
"kill-signal diagnostics: uvicorn handler not detected within %.1fs; installing anyway",
|
|
512
512
|
timeout_secs,
|
|
513
513
|
)
|
|
514
514
|
install()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 7.9.0.
|
|
3
|
+
Version: 7.9.0.dev759
|
|
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
|
|
@@ -462,7 +462,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
462
462
|
- **[@L1AD](https://github.com/L1AD)** — Filed #966 proposing tool security policies; pointed to PolicyLayer's MCP-security work as prior art that inspired the predicate DSL shape.
|
|
463
463
|
- **[@nightcityblade](https://github.com/nightcityblade)** — Updated stale Home Assistant Advanced Mode references after HA 2026.6 made formerly advanced options available by default (#1533).
|
|
464
464
|
- **[@emmelutzer](https://github.com/emmelutzer)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
465
|
-
|
|
465
|
+
- **[@pkkr](https://github.com/pkkr)** — `ha_knx_get_project` tool exposing KNX group addresses from an uploaded ETS project file.
|
|
466
|
+
- **[@cbowns](https://github.com/cbowns)** — Fixed inconsistent hyphen in setup.astro Codex CLI docs.
|
|
467
|
+
- **[@Shaan-alpha](https://github.com/Shaan-alpha)** — Extended `ha_restart` known-good error patterns to cover 502/503 responses from reverse proxies.
|
|
468
|
+
- **[@rebelancap](https://github.com/rebelancap)** — Fixed UTC-to-local timezone conversion in `add_timezone_metadata`.
|
|
469
|
+
- **[@saevras](https://github.com/saevras)** — Fixed blueprint import E2E test to use local URL instead of host-to-container networking.
|
|
470
|
+
- **[@jasonjhofmann](https://github.com/jasonjhofmann)** — Recurring calendar events via `rrule` support in `ha_config_set_calendar_event`.
|
|
471
|
+
- **[@vpciii](https://github.com/vpciii)** — Coerce JSON-encoded strings on dict/list tool params.
|
|
472
|
+
- **[@pburtchaell](https://github.com/pburtchaell)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
466
473
|
---
|
|
467
474
|
|
|
468
475
|
## 💬 Community
|
|
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.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/dashboard_screenshot/provision.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
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tool_search_hint_middleware.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
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/tools_dashboard_screenshot.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.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev758 → ha_mcp_dev-7.9.0.dev759}/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
|