ha-mcp-dev 7.14.2.dev2083__tar.gz → 7.14.2.dev2089__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.14.2.dev2083/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2089}/PKG-INFO +1 -1
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/pyproject.toml +1 -1
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/capture.py +19 -12
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/theme_guard.py +6 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/read_only.py +0 -12
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_i18n.py +9 -1
- ha_mcp_dev-7.14.2.dev2089/src/ha_mcp/settings_ui/locales/zh-Hans.json +806 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_config_dashboards.py +1 -1
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_dashboard_screenshot.py +1 -1
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/LICENSE +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/setup.cfg +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/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.14.2.
|
|
7
|
+
version = "7.14.2.dev2089"
|
|
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
|
{ha_mcp_dev-7.14.2.dev2083 → ha_mcp_dev-7.14.2.dev2089}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
@@ -855,11 +855,15 @@ async def capture_dashboard_images(
|
|
|
855
855
|
preset's native orientation. ``full_page`` is a compatibility alias for
|
|
856
856
|
requesting the engine's native ``WIDTHxauto`` viewport.
|
|
857
857
|
|
|
858
|
-
The batch
|
|
859
|
-
user's saved frontend theme
|
|
860
|
-
|
|
861
|
-
``
|
|
862
|
-
|
|
858
|
+
The batch used to be bracketed by a :class:`ThemeGuard` that restored the
|
|
859
|
+
engine user's saved frontend theme when a cold render changed it (issue
|
|
860
|
+
#1909). That bracket is currently disabled (#1991): upstream Puppet no
|
|
861
|
+
longer dispatches ``settheme`` on cold renders, so there is nothing to undo.
|
|
862
|
+
The guard construction and the ``client`` / ``capture_warnings`` plumbing
|
|
863
|
+
are retained so the bracket can be re-enabled by uncommenting the
|
|
864
|
+
snapshot/restore calls if a future engine regression reintroduces the write;
|
|
865
|
+
while disabled ``capture_warnings`` simply stays empty and never affects the
|
|
866
|
+
captures themselves.
|
|
863
867
|
"""
|
|
864
868
|
path = _validate_dashboard_path(dashboard_path)
|
|
865
869
|
options = validate_capture_parameters(
|
|
@@ -884,13 +888,16 @@ async def capture_dashboard_images(
|
|
|
884
888
|
mime_type = _MIME_TYPES[options.image_format]
|
|
885
889
|
captures: list[DashboardImageCapture] = []
|
|
886
890
|
|
|
887
|
-
#
|
|
888
|
-
#
|
|
889
|
-
#
|
|
890
|
-
#
|
|
891
|
-
#
|
|
891
|
+
# ThemeGuard bracket — currently DISABLED (#1991). Stock Puppet used to
|
|
892
|
+
# dispatch a theme write into the authenticated frontend on cold renders,
|
|
893
|
+
# which Home Assistant persisted to the engine user's real profile (#1909);
|
|
894
|
+
# ha-mcp snapshotted before and restored after to undo it. Upstream Puppet
|
|
895
|
+
# has since fixed the cold-render settheme dispatch, so the bracket is no
|
|
896
|
+
# longer needed. The guard is still constructed (and the snapshot/restore
|
|
897
|
+
# calls kept below, commented out) so it can be re-enabled by uncommenting
|
|
898
|
+
# if a future engine regression reintroduces the write.
|
|
892
899
|
guard = ThemeGuard.for_capture(engine_target.addon_credential, client)
|
|
893
|
-
await guard.take_snapshot()
|
|
900
|
+
# await guard.take_snapshot()
|
|
894
901
|
batch_error: ToolError | None = None
|
|
895
902
|
try:
|
|
896
903
|
async with httpx.AsyncClient(
|
|
@@ -970,7 +977,7 @@ async def capture_dashboard_images(
|
|
|
970
977
|
# and its outcome can be attached to the error payload below.
|
|
971
978
|
batch_error = exc
|
|
972
979
|
finally:
|
|
973
|
-
await guard.restore()
|
|
980
|
+
# await guard.restore() # ThemeGuard bracket disabled (#1991) — see above.
|
|
974
981
|
if capture_warnings is not None:
|
|
975
982
|
capture_warnings.extend(guard.warnings)
|
|
976
983
|
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
"""Snapshot and restore the engine user's saved frontend theme (issue #1909).
|
|
2
2
|
|
|
3
|
+
NOTE: This guard is currently disabled at its call site (``capture.py``)
|
|
4
|
+
because upstream Puppet fixed the cold-render ``settheme`` dispatch that made
|
|
5
|
+
the bracket necessary (#1991). The code here is retained unchanged so the
|
|
6
|
+
bracket can be re-enabled by uncommenting the snapshot/restore calls in
|
|
7
|
+
``capture.py`` if a future engine regression reintroduces the write.
|
|
8
|
+
|
|
3
9
|
Stock Puppet dispatches Home Assistant's ``settheme`` event on every
|
|
4
10
|
cold-browser render — its ``dark`` query flag is presence-based, so "not
|
|
5
11
|
requested" reaches the frontend as an explicit "light". Home Assistant
|
|
@@ -143,14 +143,6 @@ def _updates_write(args: dict[str, Any]) -> str | None:
|
|
|
143
143
|
return f"action={action!r}"
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
def _dashboard_get_write(args: dict[str, Any]) -> str | None:
|
|
147
|
-
"""Allow config/list/search reads; fail closed on a screenshot render."""
|
|
148
|
-
include_screenshot = args.get("include_screenshot")
|
|
149
|
-
if include_screenshot is None or include_screenshot is False:
|
|
150
|
-
return None
|
|
151
|
-
return "dashboard screenshot render (Puppet persists theme/dark preferences)"
|
|
152
|
-
|
|
153
|
-
|
|
154
146
|
def _radio_write(args: dict[str, Any]) -> str | None:
|
|
155
147
|
action = args.get("action")
|
|
156
148
|
# Reads (allowed): per-node diagnostics, the integration/network summary,
|
|
@@ -191,10 +183,6 @@ def _radio_write(args: dict[str, Any]) -> str | None:
|
|
|
191
183
|
# against the real registered catalog at PR time, so the two sets
|
|
192
184
|
# cannot drift apart silently.
|
|
193
185
|
READ_ONLY_EXEMPT_TOOLS: dict[str, ReadOnlyExemption] = {
|
|
194
|
-
"ha_config_get_dashboard": ReadOnlyExemption(
|
|
195
|
-
_dashboard_get_write,
|
|
196
|
-
"dashboard config, list, and search reads with include_screenshot=false",
|
|
197
|
-
),
|
|
198
186
|
"ha_manage_backup": ReadOnlyExemption(
|
|
199
187
|
_backup_write,
|
|
200
188
|
"listing, viewing, and diffing per-edit backups (scope='edits', "
|
|
@@ -201,7 +201,15 @@ def normalize_locale(
|
|
|
201
201
|
if candidate in catalogs:
|
|
202
202
|
return candidate
|
|
203
203
|
base = candidate.split("-", 1)[0]
|
|
204
|
-
|
|
204
|
+
if base in catalogs:
|
|
205
|
+
return base
|
|
206
|
+
if base == "zh" and "zh-hans" in catalogs:
|
|
207
|
+
# Map bare "zh" and simplified Chinese region tags (zh-CN, zh-SG) to
|
|
208
|
+
# zh-hans. Do NOT map zh-TW, zh-HK, etc. — those would need a zh-Hant
|
|
209
|
+
# catalog to be registered.
|
|
210
|
+
if candidate == "zh" or candidate.split("-", 1)[-1] in ("cn", "sg"):
|
|
211
|
+
return "zh-hans"
|
|
212
|
+
return None
|
|
205
213
|
|
|
206
214
|
|
|
207
215
|
def _accept_language_candidates(header: str | None) -> list[str]:
|