ha-mcp-dev 8.0.0.dev2233__tar.gz → 8.0.0.dev2238__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-8.0.0.dev2233/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.0.0.dev2238}/PKG-INFO +1 -1
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/pyproject.toml +1 -1
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/__main__.py +36 -1
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/__init__.py +9 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/de.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/es.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/fr.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/it.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/ru.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/zh-Hans.json +2 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_code.py +14 -2
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/transport_security.py +6 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/LICENSE +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/README.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/setup.cfg +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/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 = "8.0.0.
|
|
7
|
+
version = "8.0.0.dev2238"
|
|
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
|
|
@@ -609,6 +609,25 @@ async def _cleanup_resources() -> None:
|
|
|
609
609
|
logger.info("Server resources cleaned up")
|
|
610
610
|
|
|
611
611
|
|
|
612
|
+
def _log_cleanup_result(task: "asyncio.Future[None]") -> None:
|
|
613
|
+
"""Consume the cleanup task's outcome so a failure is never silent.
|
|
614
|
+
|
|
615
|
+
``asyncio.wait`` does not retrieve results, and the timeout path
|
|
616
|
+
deliberately abandons rather than awaits (see the ``finally`` block), so
|
|
617
|
+
without this nothing observes ``cleanup_task``. An exception left
|
|
618
|
+
unretrieved this close to loop teardown surfaces only as a GC-time "Task
|
|
619
|
+
exception was never retrieved" error, which is unstructured and not
|
|
620
|
+
guaranteed to be emitted before exit. Mirrors what ``_cancel_tasks`` does
|
|
621
|
+
for the tasks it reaps. Cancellation is the expected abandoned-timeout
|
|
622
|
+
outcome and stays silent.
|
|
623
|
+
"""
|
|
624
|
+
if task.cancelled():
|
|
625
|
+
return
|
|
626
|
+
exc = task.exception()
|
|
627
|
+
if exc is not None:
|
|
628
|
+
logger.warning(f"Resource cleanup raised: {exc!r}")
|
|
629
|
+
|
|
630
|
+
|
|
612
631
|
async def _cancel_tasks(*tasks: asyncio.Task) -> None:
|
|
613
632
|
"""Cancel tasks and wait for completion, bounding the wait.
|
|
614
633
|
|
|
@@ -697,6 +716,7 @@ async def _run_with_shutdown(server_coro: Coroutine[Any, Any, Any]) -> None:
|
|
|
697
716
|
# guard), so a hung close handshake could block shutdown past the
|
|
698
717
|
# budget. A straggler is left to the runner's own task sweep.
|
|
699
718
|
cleanup_task = asyncio.ensure_future(_cleanup_resources())
|
|
719
|
+
cleanup_task.add_done_callback(_log_cleanup_result)
|
|
700
720
|
_done, cleanup_pending = await asyncio.wait(
|
|
701
721
|
{cleanup_task}, timeout=SHUTDOWN_TIMEOUT_SECONDS
|
|
702
722
|
)
|
|
@@ -1004,6 +1024,19 @@ def _get_http_runtime(default_port: int = 8086) -> tuple[str, int, str]:
|
|
|
1004
1024
|
``run_async``, any ``FASTMCP_HOST`` value in the environment is
|
|
1005
1025
|
ignored — ``MCP_HOST`` is the only env var that affects bind host
|
|
1006
1026
|
for ha-mcp's CLI entry points.
|
|
1027
|
+
|
|
1028
|
+
The ``0.0.0.0`` default is deliberate and documented: SECURITY.md
|
|
1029
|
+
§ "Local network is the trusted zone for standard mode" states that the
|
|
1030
|
+
HTTP entrypoints bind to all interfaces so LAN peers can reach them, and
|
|
1031
|
+
its Scope section excludes "LAN-peer access to standard-mode HTTP
|
|
1032
|
+
endpoints".
|
|
1033
|
+
|
|
1034
|
+
The default ``/mcp`` path is *not* blessed the same way once the bind
|
|
1035
|
+
leaves loopback. That combination is what ``_warn_if_default_path_exposed``
|
|
1036
|
+
warns about, and SECURITY.md's Scope classes it under "a misconfigured
|
|
1037
|
+
deployment" — meaning such reports are declined, not that the
|
|
1038
|
+
configuration is endorsed. Operators on a non-loopback bind are still
|
|
1039
|
+
expected to set a high-entropy ``MCP_SECRET_PATH``.
|
|
1007
1040
|
"""
|
|
1008
1041
|
|
|
1009
1042
|
host = os.getenv("MCP_HOST", "0.0.0.0")
|
|
@@ -1020,7 +1053,9 @@ def _get_http_runtime(default_port: int = 8086) -> tuple[str, int, str]:
|
|
|
1020
1053
|
# Default ``MCP_SECRET_PATH`` value, shared by ``_get_http_runtime`` (the
|
|
1021
1054
|
# read-from-env fallback) and ``_warn_if_default_path_exposed`` (the
|
|
1022
1055
|
# hardening-nudge predicate). Single source of truth so the two sites
|
|
1023
|
-
# can't drift.
|
|
1056
|
+
# can't drift. Safe on a loopback bind; on a non-loopback bind it is the
|
|
1057
|
+
# misconfiguration ``_warn_if_default_path_exposed`` flags, which SECURITY.md
|
|
1058
|
+
# declines to action without endorsing — see ``_get_http_runtime`` above.
|
|
1024
1059
|
DEFAULT_MCP_PATH = "/mcp"
|
|
1025
1060
|
|
|
1026
1061
|
# Hostname literals (not IP addresses) treated as loopback by
|
|
@@ -566,6 +566,15 @@ def register_settings_routes(
|
|
|
566
566
|
and serve the "Open Web UI" button. Stdio transports use a separate
|
|
567
567
|
side-process sidecar instead — see :mod:`ha_mcp.stdio_settings_sidecar`.
|
|
568
568
|
|
|
569
|
+
The ``RequireAuthMiddleware`` bypass is the documented posture, not an
|
|
570
|
+
oversight: SECURITY.md § "OAuth Mode — Beta Warning" states that the
|
|
571
|
+
settings UI "is **not** gated by the OAuth token", and its Scope section
|
|
572
|
+
excludes "The web settings UI not being gated by the OAuth/OIDC token".
|
|
573
|
+
OAuth and OIDC modes compensate by passing a *dedicated* secret path here
|
|
574
|
+
rather than the client-known MCP path (GHSA-mx64-982r-65vg); standard mode
|
|
575
|
+
and the add-on pass the MCP secret path, which already gates the whole
|
|
576
|
+
tool surface.
|
|
577
|
+
|
|
569
578
|
Args:
|
|
570
579
|
mcp: The FastMCP instance to register routes on.
|
|
571
580
|
server: The HomeAssistantSmartMCPServer wrapping ``mcp``.
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "Keine ausstehenden Genehmigungen.",
|
|
64
64
|
"policies.rules.title": "Gegated Tools",
|
|
65
65
|
"policies.rules.empty": "Derzeit keine Tools sicherheitsgegated. Aktiviere das Tool-Gating pro Tool im Tab <a href=\"#\" data-panel-link=\"tools\">Tools</a>.",
|
|
66
|
-
"accessibility.intro": "Diese Einstellungen werden sofort angewendet und
|
|
66
|
+
"accessibility.intro": "Diese Einstellungen werden sofort angewendet und werden in diesem Browser und auf dem Server gespeichert, sodass sie Neustarts in jedem Modus überleben (einschließlich stdio, wo die Einstellungsseite gelegentlich auf einen neuen Port verschoben werden kann). Die Dokumentationsseite bietet dieselben Steuerelemente in ihrer Navigationsleiste; sie hat keinen Server und speichert pro Browser.",
|
|
67
67
|
"accessibility.storage_blocked": "Dein Browser blockiert den Site-Speicher; Auswahlen gelten nur für diese Sitzung.",
|
|
68
68
|
"accessibility.theme.title": "Design",
|
|
69
69
|
"accessibility.theme.help": "Ein-Klick-Farbschemata. Automatisch, die Standardeinstellung, folgt deiner OS-Präferenz und wechselt live, wenn sie sich ändert.",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "Zusätzliche YAML-Schreib-Keys",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "Kommagetrennte Top-Level-Keys, die ha_config_set_yaml zusätzlich zu den eingebauten schreiben darf – für YAML-first-Integrationen auf dieser Installation (z. B. alert2). Keys, die die Vertrauensgrenze von Home Assistant selbst verändern, lassen sich nie hinzufügen und werden ignoriert. Erfordert Custom Component 1.2.4 oder neuer.",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "Einstellungs-UI-Sidecar-Port",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0 wählt
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 wählt beim ersten Start einen freien Port und behält ihn für spätere Neustarts bei; 1024–65535 fixiert einen bevorzugten Port (greift auf einen freien zurück, falls belegt). Neustart erforderlich.",
|
|
424
424
|
"advanced.enable_dev_mode.label": "Entwicklermodus",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ Registriert versteckte Tools, die Einstellungen ändern und den laufenden Server ersetzen können. Nur für Entwicklung und Tests. Neustart erforderlich.",
|
|
426
426
|
"addon.backup_hint.name": "Full-HA Snapshot-Vorschlagsebene (LLM-seitig)",
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/es.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "No hay aprobaciones pendientes.",
|
|
64
64
|
"policies.rules.title": "Herramientas controladas",
|
|
65
65
|
"policies.rules.empty": "Ahora mismo no hay ninguna herramienta bajo control de seguridad. Activa el control por herramienta desde la pestaña <a href=\"#\" data-panel-link=\"tools\">Herramientas</a>.",
|
|
66
|
-
"accessibility.intro": "
|
|
66
|
+
"accessibility.intro": "Estas configuraciones se aplican inmediatamente y se guardan en este navegador y en el servidor, por lo que sobreviven a los reinicios en todos los modos (incluido stdio, donde la página de configuración puede ocasionalmente moverse a un nuevo puerto). El sitio de documentación ofrece los mismos controles en su barra de navegación; no tiene servidor y guarda por navegador.",
|
|
67
67
|
"accessibility.storage_blocked": "Tu navegador está bloqueando el almacenamiento del sitio; las opciones se aplican solo a esta sesión.",
|
|
68
68
|
"accessibility.theme.title": "Tema",
|
|
69
69
|
"accessibility.theme.help": "Combinaciones de color de un clic. Automático, el valor predeterminado, sigue la preferencia de tu sistema operativo y cambia en caliente cuando esta cambia.",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "Claves YAML de escritura adicionales",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "Claves de primer nivel separadas por comas que ha_config_set_yaml puede escribir además de las integradas, para integraciones basadas en YAML de esta instalación (p. ej. alert2). Las claves que redefinen la propia frontera de confianza de Home Assistant no se pueden añadir nunca y se ignoran. Requiere el componente personalizado 1.2.4 o posterior.",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "Puerto del sidecar de la interfaz de ajustes",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0 elige un puerto libre en
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 elige un puerto libre en el primer inicio y lo mantiene para reinicios posteriores; 1024–65535 fija un puerto preferido (recurre a uno libre si está ocupado). Se requiere reiniciar.",
|
|
424
424
|
"advanced.enable_dev_mode.label": "Modo de desarrollo",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ Registra herramientas ocultas que pueden cambiar los ajustes y sustituir el servidor en ejecución. Solo para desarrollo y pruebas. Hay que reiniciar.",
|
|
426
426
|
"addon.backup_hint.name": "Nivel de sugerencia de instantánea completa de HA (para el LLM)",
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/fr.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "Aucune approbation en attente.",
|
|
64
64
|
"policies.rules.title": "Outils contrôlés",
|
|
65
65
|
"policies.rules.empty": "Aucun outil actuellement soumis à un contrôle de sécurité. Activez le contrôle par outil depuis l'onglet <a href=\"#\" data-panel-link=\"tools\">Outils</a>.",
|
|
66
|
-
"accessibility.intro": "Ces paramètres s'appliquent immédiatement et sont enregistrés dans ce navigateur et sur le serveur, ils survivent
|
|
66
|
+
"accessibility.intro": "Ces paramètres s'appliquent immédiatement et sont enregistrés dans ce navigateur et sur le serveur, afin qu'ils survivent aux redémarrages dans tous les modes (y compris stdio, où la page des paramètres peut occasionnellement se déplacer vers un nouveau port). Le site de documentation offre les mêmes contrôles dans sa barre de navigation ; il n'a pas de serveur et enregistre par navigateur.",
|
|
67
67
|
"accessibility.storage_blocked": "Votre navigateur bloque le stockage du site ; les choix s'appliquent uniquement pour cette session.",
|
|
68
68
|
"accessibility.theme.title": "Thème",
|
|
69
69
|
"accessibility.theme.help": "Schémas de couleurs en un clic. Auto, le réglage par défaut, suit les préférences de votre OS et bascule en direct lorsqu'elles changent.",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "Clés d'écriture YAML supplémentaires",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "Clés de premier niveau séparées par des virgules que ha_config_set_yaml peut écrire en plus des clés intégrées, pour les intégrations YAML-first sur cette installation (p. ex. alert2). Les clés qui redéfinissent la propre frontière de confiance de Home Assistant ne peuvent jamais être ajoutées et sont ignorées. Nécessite le composant personnalisé 1.2.4 ou plus récent.",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "Port du sidecar de l'interface des paramètres",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0 choisit un port libre
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 choisit un port libre au premier démarrage et le conserve pour les redémarrages ultérieurs ; 1024–65535 fixe un port préféré (revient à un port libre s'il est déjà pris). Redémarrage requis.",
|
|
424
424
|
"advanced.enable_dev_mode.label": "Mode développeur",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ Enregistre des outils cachés qui peuvent modifier les paramètres et remplacer le serveur en cours d'exécution. Développement et tests uniquement. Redémarrage requis.",
|
|
426
426
|
"addon.backup_hint.name": "Niveau d'indication d'instantané HA complet (côté LLM)",
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/it.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "Nessuna approvazione in sospeso.",
|
|
64
64
|
"policies.rules.title": "Strumenti controllati",
|
|
65
65
|
"policies.rules.empty": "Al momento nessuno strumento è sottoposto a controllo di sicurezza. Attiva il controllo per singolo strumento dalla scheda <a href=\"#\" data-panel-link=\"tools\">Strumenti</a>.",
|
|
66
|
-
"accessibility.intro": "Queste impostazioni si applicano
|
|
66
|
+
"accessibility.intro": "Queste impostazioni si applicano immediatamente e vengono salvate in questo browser e sul server, in modo che sopravvivano ai riavvii in ogni modalità (inclusa stdio, dove la pagina delle impostazioni può occasionalmente spostarsi su una nuova porta). Il sito della documentazione offre gli stessi controlli nella sua barra di navigazione; non ha un server e salva per browser.",
|
|
67
67
|
"accessibility.storage_blocked": "Il tuo browser sta bloccando l'archiviazione del sito; le scelte valgono solo per questa sessione.",
|
|
68
68
|
"accessibility.theme.title": "Tema",
|
|
69
69
|
"accessibility.theme.help": "Combinazioni di colori con un clic. Automatico, l'impostazione predefinita, segue la preferenza del sistema operativo e cambia in tempo reale quando questa cambia.",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "Chiavi YAML scrivibili aggiuntive",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "Chiavi di primo livello separate da virgole che ha_config_set_yaml può scrivere oltre a quelle integrate, per le integrazioni di questa installazione che si configurano soprattutto in YAML (per esempio alert2). Le chiavi che ridefiniscono il confine di fiducia di Home Assistant non possono mai essere aggiunte e vengono ignorate. Richiede il componente personalizzato 1.2.4 o successivo.",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "Porta del sidecar dell'interfaccia delle impostazioni",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 seleziona una porta libera al primo avvio e la mantiene per i riavvii successivi; 1024–65535 blocca una porta preferita (ricade su una libera se occupata). Riavvio richiesto.",
|
|
424
424
|
"advanced.enable_dev_mode.label": "Modalità sviluppatore",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ Registra strumenti nascosti in grado di modificare le impostazioni e di sostituire il server in esecuzione. Solo per sviluppo e collaudo. È necessario il riavvio.",
|
|
426
426
|
"addon.backup_hint.name": "Livello del suggerimento di snapshot completo di HA (rivolto all'LLM)",
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/ru.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "Нет запросов, ожидающих подтверждения.",
|
|
64
64
|
"policies.rules.title": "Защищённые инструменты",
|
|
65
65
|
"policies.rules.empty": "Сейчас ни один инструмент не защищён политикой. Включите защиту нужного инструмента на вкладке <a href=\"#\" data-panel-link=\"tools\">Инструменты</a>.",
|
|
66
|
-
"accessibility.intro": "Эти настройки применяются
|
|
66
|
+
"accessibility.intro": "Эти настройки применяются немедленно и сохраняются в этом браузере и на сервере, поэтому они сохраняются при перезапусках в любом режиме (включая stdio, где страница настроек может иногда перемещаться на новый порт). Сайт документации предлагает те же элементы управления в своей панели навигации; он не имеет сервера и сохраняет настройки для каждого браузера.",
|
|
67
67
|
"accessibility.storage_blocked": "Браузер блокирует локальное хранилище; выбранные параметры действуют только в текущем сеансе.",
|
|
68
68
|
"accessibility.theme.title": "Тема",
|
|
69
69
|
"accessibility.theme.help": "Готовые цветовые схемы. Режим «Автоматически» по умолчанию следует системной теме и переключается вместе с ней.",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "Дополнительные YAML-ключи для записи",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "Список верхнеуровневых ключей через запятую, которые ha_config_set_yaml может записывать вдобавок к встроенным – для YAML-ориентированных интеграций на этой установке (например, alert2). Ключи, меняющие саму границу доверия Home Assistant, добавить нельзя, они игнорируются. Требуется пользовательский компонент 1.2.4 или новее.",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "Порт sidecar интерфейса настроек",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0 выбирает свободный порт при
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 выбирает свободный порт при первом запуске и сохраняет его для последующих перезапусков; 1024–65535 закрепляет предпочтительный порт (переключается на свободный, если занят). Требуется перезапуск.",
|
|
424
424
|
"advanced.enable_dev_mode.label": "Режим разработчика",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ Регистрирует скрытые инструменты, способные менять настройки и заменять запущенную версию сервера. Только для разработки и тестов. Нужен перезапуск.",
|
|
426
426
|
"addon.backup_hint.name": "Уровень рекомендации полного снимка HA (для LLM)",
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/zh-Hans.json
RENAMED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"policies.pending.empty": "暂无待审批项。",
|
|
64
64
|
"policies.rules.title": "已门控工具",
|
|
65
65
|
"policies.rules.empty": "当前没有工具被安全门控。请从<a href=\"#\" data-panel-link=\"tools\">工具</a>选项卡启用逐工具门控。",
|
|
66
|
-
"accessibility.intro": "
|
|
66
|
+
"accessibility.intro": "这些设置立即生效,并保存在此浏览器和服务器上,因此它们在所有模式下(包括 stdio,在 stdio 模式下,设置页面有时可能会移动到新的端口)重启后仍然有效。文档站点在其导航栏中提供相同的控件;它没有服务器,并且按浏览器保存。",
|
|
67
67
|
"accessibility.storage_blocked": "您的浏览器正在阻止站点存储;选择仅对本次会话生效。",
|
|
68
68
|
"accessibility.theme.title": "主题",
|
|
69
69
|
"accessibility.theme.help": "一键配色方案。默认为自动,跟随您的系统偏好并在其变化时实时切换。",
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"advanced.extra_yaml_write_keys.label": "额外的 YAML 可写键",
|
|
421
421
|
"advanced.extra_yaml_write_keys.help": "以逗号分隔的顶层键:除内置键外,ha_config_set_yaml 还可写入这些键,适用于本安装中以 YAML 为主的集成(例如 alert2)。重新定义 Home Assistant 自身信任边界的键始终无法添加,会被忽略。需要自定义组件 1.2.4 或更高版本。",
|
|
422
422
|
"advanced.sidecar_pin_port.label": "设置界面旁路服务端口",
|
|
423
|
-
"advanced.sidecar_pin_port.help": "0
|
|
423
|
+
"advanced.sidecar_pin_port.help": "0 会在首次启动时选择一个空闲端口,并在后续重启中保留该端口;1024–65535 会固定一个首选端口(如果被占用,则回退到空闲端口)。需要重启。",
|
|
424
424
|
"advanced.enable_dev_mode.label": "开发者模式",
|
|
425
425
|
"advanced.enable_dev_mode.help": "⚠ 注册可更改设置并替换运行中服务器的隐藏工具。仅用于开发和测试。需重启。",
|
|
426
426
|
"addon.backup_hint.name": "完整 HA 快照建议级别(面向 LLM)",
|
|
@@ -53,8 +53,20 @@ logger = logging.getLogger(__name__)
|
|
|
53
53
|
# boundary.
|
|
54
54
|
#
|
|
55
55
|
# WARNING: This is shared across all clients in the same server process.
|
|
56
|
-
#
|
|
57
|
-
#
|
|
56
|
+
# One client's saved tools are listable and runnable by every other client,
|
|
57
|
+
# and ``save_as`` overwrites by name without an ownership check. OAuth is the
|
|
58
|
+
# only mode with distinct per-user credentials for that to cross; standard,
|
|
59
|
+
# OIDC and add-on modes are single-tenant already (SECURITY.md § "Standard
|
|
60
|
+
# mode is single-tenant"), so every caller there shares one HA token anyway.
|
|
61
|
+
#
|
|
62
|
+
# That exposure is accepted design, not a pending TODO — SECURITY.md § Scope
|
|
63
|
+
# excludes "Saved custom tools (code mode, off by default) visible to other
|
|
64
|
+
# clients of the same server process", on the grounds that they are shared
|
|
65
|
+
# scaffolding rather than per-user data, that ``run_saved`` executes with the
|
|
66
|
+
# caller's own HA token (granting no access the caller lacks), and that any
|
|
67
|
+
# client which can reach ha-mcp is a trusted principal (SECURITY.md § "MCP
|
|
68
|
+
# clients are trusted principals"). Scoping per session/user would be a
|
|
69
|
+
# feature, not a security fix.
|
|
58
70
|
_saved_tools: dict[str, dict[str, str]] = {}
|
|
59
71
|
|
|
60
72
|
# Tools that sandbox code must not call. Includes ``ha_manage_custom_tool``
|
|
@@ -23,6 +23,12 @@ exactly the pre-3.4.3 behaviour without giving up the protection that matters.
|
|
|
23
23
|
Operators who front ha-mcp differently can re-enable the guard (and pin their
|
|
24
24
|
own allow-lists) via ``FASTMCP_HTTP_HOST_ORIGIN_PROTECTION=true`` plus
|
|
25
25
|
``FASTMCP_HTTP_ALLOWED_HOSTS`` / ``FASTMCP_HTTP_ALLOWED_ORIGINS``.
|
|
26
|
+
|
|
27
|
+
Turning the guard off is the documented posture, not an oversight: it has its
|
|
28
|
+
own SECURITY.md section, § "Host/Origin validation (DNS-rebinding guard) is off
|
|
29
|
+
by default", and the Scope section there excludes "DNS rebinding against the
|
|
30
|
+
HTTP entrypoints" on the grounds that URL-path secrecy is the boundary and the
|
|
31
|
+
local network is already the trusted zone.
|
|
26
32
|
"""
|
|
27
33
|
|
|
28
34
|
from __future__ import annotations
|
|
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-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/content.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/paths.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/dashboard_screenshot/theme_guard.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
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_advanced.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_backups.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_fs.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_theme.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_handlers_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/_persistence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/README.md
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/settings_ui/locales/en.json
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-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_result.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/best_practice_variables.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_config_reads.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_registries.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/component_registry_lookup.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_form.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_menu.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/config_entry_flow_walker.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-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/reference_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_base.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_deep.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_fetch.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/smart_search/_scoring.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-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/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
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_integrations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/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-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp/utils/kill_signal_diagnostics.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
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-8.0.0.dev2233 → ha_mcp_dev-8.0.0.dev2238}/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
|