ha-mcp-dev 7.12.0.dev1837__tar.gz → 7.12.0.dev1840__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.12.0.dev1837/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.0.dev1840}/PKG-INFO +1 -1
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/pyproject.toml +1 -1
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/registry.py +56 -18
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_dev.py +6 -2
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/LICENSE +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/README.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/setup.cfg +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/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.12.0.
|
|
7
|
+
version = "7.12.0.dev1840"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -143,7 +143,8 @@ class ToolsRegistry:
|
|
|
143
143
|
When ``func_name`` is given, uses it directly (explicit mode); otherwise scans
|
|
144
144
|
the module for an attribute matching the ``register_*_tools`` convention.
|
|
145
145
|
Returns True if registered, False if no register function was found.
|
|
146
|
-
Re-raises on import or registration failure
|
|
146
|
+
Re-raises on import or registration failure; ``register_all_tools``
|
|
147
|
+
contains that failure to the one module (see its docstring).
|
|
147
148
|
"""
|
|
148
149
|
import importlib
|
|
149
150
|
|
|
@@ -169,8 +170,8 @@ class ToolsRegistry:
|
|
|
169
170
|
logger.warning(f"Module {module_name} has no register_*_tools function")
|
|
170
171
|
return False
|
|
171
172
|
|
|
172
|
-
except Exception
|
|
173
|
-
logger.
|
|
173
|
+
except Exception:
|
|
174
|
+
logger.exception(f"Failed to register tools from {module_name}")
|
|
174
175
|
raise
|
|
175
176
|
|
|
176
177
|
def register_all_tools(self) -> None:
|
|
@@ -178,6 +179,14 @@ class ToolsRegistry:
|
|
|
178
179
|
|
|
179
180
|
Tool modules are imported and registered only when this method is called,
|
|
180
181
|
which happens after the MCP server is ready to accept connections.
|
|
182
|
+
|
|
183
|
+
A module that fails to import or register is SKIPPED (logged loudly),
|
|
184
|
+
not fatal: the in-process server auto-updates the ha-mcp package inside
|
|
185
|
+
a running Home Assistant, and a mixed old/new module generation — or a
|
|
186
|
+
module needing a newer custom component — previously took the whole
|
|
187
|
+
server down over one module (issues #1783/#1785). Only a TOTAL failure
|
|
188
|
+
(zero modules registered) still raises: a tool-less server "running"
|
|
189
|
+
would hide a genuinely broken install.
|
|
181
190
|
"""
|
|
182
191
|
if self._modules_registered:
|
|
183
192
|
logger.debug("Tools already registered, skipping")
|
|
@@ -189,23 +198,52 @@ class ToolsRegistry:
|
|
|
189
198
|
"device_tools": self.device_tools,
|
|
190
199
|
}
|
|
191
200
|
|
|
201
|
+
# tools_*.py modules by convention, then the explicit modules (those
|
|
202
|
+
# not following the convention) — each only if discovery included it
|
|
203
|
+
# (respects filtering).
|
|
204
|
+
worklist: list[tuple[str, str | None]] = [
|
|
205
|
+
(name, None)
|
|
206
|
+
for name in self._discovered_modules
|
|
207
|
+
if name not in EXPLICIT_MODULES
|
|
208
|
+
]
|
|
209
|
+
worklist += [
|
|
210
|
+
(name, func_name)
|
|
211
|
+
for name, func_name in EXPLICIT_MODULES.items()
|
|
212
|
+
if name in self._discovered_modules
|
|
213
|
+
]
|
|
214
|
+
|
|
192
215
|
registered_count = 0
|
|
216
|
+
failed: list[tuple[str, Exception]] = []
|
|
217
|
+
for module_name, func_name in worklist:
|
|
218
|
+
try:
|
|
219
|
+
if self._import_and_register_module(module_name, kwargs, func_name):
|
|
220
|
+
registered_count += 1
|
|
221
|
+
except Exception as e:
|
|
222
|
+
failed.append((module_name, e))
|
|
193
223
|
|
|
194
|
-
|
|
195
|
-
for module_name in self._discovered_modules:
|
|
196
|
-
# Skip explicit modules - handled separately
|
|
197
|
-
if module_name in EXPLICIT_MODULES:
|
|
198
|
-
continue
|
|
199
|
-
if self._import_and_register_module(module_name, kwargs):
|
|
200
|
-
registered_count += 1
|
|
201
|
-
|
|
202
|
-
# Register explicit modules (those not following tools_*.py convention)
|
|
203
|
-
# Only register if they were included in discovered modules (respects filtering)
|
|
204
|
-
for module_name, func_name in EXPLICIT_MODULES.items():
|
|
205
|
-
if module_name not in self._discovered_modules:
|
|
206
|
-
continue
|
|
207
|
-
if self._import_and_register_module(module_name, kwargs, func_name):
|
|
208
|
-
registered_count += 1
|
|
224
|
+
self._raise_or_log_registration_failures(failed, registered_count)
|
|
209
225
|
|
|
210
226
|
self._modules_registered = True
|
|
211
227
|
logger.info(f"Auto-discovery registered tools from {registered_count} modules")
|
|
228
|
+
|
|
229
|
+
@staticmethod
|
|
230
|
+
def _raise_or_log_registration_failures(
|
|
231
|
+
failed: list[tuple[str, Exception]], registered_count: int
|
|
232
|
+
) -> None:
|
|
233
|
+
"""Raise on a total registration failure, log a summary on a partial one."""
|
|
234
|
+
if not failed:
|
|
235
|
+
return
|
|
236
|
+
if registered_count == 0:
|
|
237
|
+
raise RuntimeError(
|
|
238
|
+
"No tool module could be registered "
|
|
239
|
+
f"({', '.join(name for name, _ in failed)} all failed); "
|
|
240
|
+
"the installed ha-mcp package is broken."
|
|
241
|
+
) from failed[0][1]
|
|
242
|
+
logger.error(
|
|
243
|
+
"Skipped %d tool module(s) that failed to register: %s. The "
|
|
244
|
+
"server is running without their tools. If this happened right "
|
|
245
|
+
"after a package update, restart Home Assistant so every "
|
|
246
|
+
"module loads from the same package version.",
|
|
247
|
+
len(failed),
|
|
248
|
+
", ".join(name for name, _ in failed),
|
|
249
|
+
)
|
|
@@ -67,11 +67,15 @@ def is_dev_mode_enabled() -> bool:
|
|
|
67
67
|
|
|
68
68
|
Reads through :func:`config.get_global_settings` so the same
|
|
69
69
|
env-var / override-file / default precedence path applies as
|
|
70
|
-
every other runtime-editable Settings field.
|
|
70
|
+
every other runtime-editable Settings field. ``getattr`` with a
|
|
71
|
+
False default, not attribute access: during an in-process package
|
|
72
|
+
update the cached settings singleton can predate this field
|
|
73
|
+
(issues #1783/#1785), and that stale read must mean "dev mode
|
|
74
|
+
off", never AttributeError.
|
|
71
75
|
"""
|
|
72
76
|
from ..config import get_global_settings
|
|
73
77
|
|
|
74
|
-
return bool(get_global_settings()
|
|
78
|
+
return bool(getattr(get_global_settings(), "enable_dev_mode", False))
|
|
75
79
|
|
|
76
80
|
|
|
77
81
|
def _spawn_background(coro: Any) -> None:
|
|
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.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/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.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/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
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/stdio_settings_sidecar.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/config_entry_flow.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
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/reference_validator.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_base.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_deep.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_fetch.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_blueprints.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_bug_report.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_categories.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_filesystem.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_integrations.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_mcp_component.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.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_yaml_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/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
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/operation_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/persistence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/requires.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|