ha-mcp-dev 8.1.1.dev2294__tar.gz → 8.2.0.dev2305__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.1.1.dev2294/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.2.0.dev2305}/PKG-INFO +2 -2
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/pyproject.toml +2 -2
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/__init__.py +4 -0
- ha_mcp_dev-8.2.0.dev2305/src/ha_mcp/_rich_compat.py +109 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_dev.py +24 -4
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -2
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/requires.txt +1 -1
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/setup.cfg +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/tests/test_env_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.2.0.dev2305
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -19,7 +19,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
19
19
|
Requires-Python: <3.15,>=3.13
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: fastmcp==3.4.
|
|
22
|
+
Requires-Dist: fastmcp==3.4.6
|
|
23
23
|
Requires-Dist: httpx[socks]==0.28.1
|
|
24
24
|
Requires-Dist: pydantic==2.13.4
|
|
25
25
|
Requires-Dist: python-dotenv==1.2.2
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.
|
|
7
|
+
version = "8.2.0.dev2305"
|
|
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
|
|
@@ -28,7 +28,7 @@ classifiers = [
|
|
|
28
28
|
]
|
|
29
29
|
|
|
30
30
|
dependencies = [
|
|
31
|
-
"fastmcp==3.4.
|
|
31
|
+
"fastmcp==3.4.6",
|
|
32
32
|
"httpx[socks]==0.28.1",
|
|
33
33
|
"pydantic==2.13.4",
|
|
34
34
|
"python-dotenv==1.2.2",
|
|
@@ -5,6 +5,10 @@ A Model Context Protocol server that provides complete control over Home Assista
|
|
|
5
5
|
through REST API and WebSocket integration.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
# Must be imported before anything that reaches fastmcp (``.auth`` below does),
|
|
9
|
+
# because fastmcp configures rich logging at import time and dies on a rich
|
|
10
|
+
# older than 13.9.4. Importing this module applies the shim. See #2186.
|
|
11
|
+
from . import _rich_compat as _rich_compat
|
|
8
12
|
from ._version import get_version
|
|
9
13
|
|
|
10
14
|
__version__ = get_version()
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Tolerate a ``rich`` older than fastmcp's logging setup expects (#2186).
|
|
2
|
+
|
|
3
|
+
``fastmcp/__init__.py`` calls ``configure_logging()`` at import time, which
|
|
4
|
+
builds a ``rich.logging.RichHandler`` with ``tracebacks_max_frames`` and
|
|
5
|
+
``tracebacks_suppress`` unconditionally — no version guard, no ``try``. Both
|
|
6
|
+
keywords require ``rich>=13.9.4`` (``fastmcp-slim``'s declared floor), so an
|
|
7
|
+
environment holding an older ``rich`` cannot ``import fastmcp`` at all::
|
|
8
|
+
|
|
9
|
+
TypeError: RichHandler.__init__() got an unexpected keyword argument
|
|
10
|
+
'tracebacks_max_frames'
|
|
11
|
+
|
|
12
|
+
Since ``ha_mcp/__init__.py`` imports ``.auth`` -> ``fastmcp``, that takes the
|
|
13
|
+
whole package down before any of our code runs. It is not hypothetical: the
|
|
14
|
+
official Home Assistant container ships ``rich 10.16.2`` (held below 11 by
|
|
15
|
+
``surepy``'s ``rich>=10.1.0,<11.0.0``) and ``rich`` is absent from HA's
|
|
16
|
+
``package_constraints.txt``, so whether installing ``ha-mcp`` pulls ``rich``
|
|
17
|
+
forward is left entirely to the resolver — it usually does, and when it does
|
|
18
|
+
not the integration cannot start.
|
|
19
|
+
|
|
20
|
+
The declared dependency floor is correct upstream and this module does not
|
|
21
|
+
second-guess it: it only intervenes when the *installed* ``RichHandler``
|
|
22
|
+
genuinely cannot accept a keyword, dropping the unsupported ones so logging
|
|
23
|
+
setup degrades instead of aborting the import. On ``rich>=13.9.4`` it is a
|
|
24
|
+
no-op. Handlers still attach and still render; such installs lose only
|
|
25
|
+
traceback frame-limiting and framework-frame suppression, which beats not
|
|
26
|
+
importing.
|
|
27
|
+
|
|
28
|
+
Remove this once the upstream fix is released and ha-mcp's floor excludes the
|
|
29
|
+
affected fastmcp versions.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import functools
|
|
35
|
+
import inspect
|
|
36
|
+
import logging
|
|
37
|
+
from typing import Any
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
# Marker set on our wrapper so repeated calls do not stack wrappers.
|
|
42
|
+
_PATCH_MARKER = "_ha_mcp_filters_unsupported_kwargs"
|
|
43
|
+
|
|
44
|
+
# Present only on rich>=13.9.4; its absence is what makes fastmcp's call fatal.
|
|
45
|
+
_PROBE_KWARG = "tracebacks_max_frames"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def ensure_rich_handler_compat() -> bool:
|
|
49
|
+
"""Make ``RichHandler`` ignore keywords the installed ``rich`` lacks.
|
|
50
|
+
|
|
51
|
+
Returns ``True`` when a shim is in place (freshly applied or already
|
|
52
|
+
applied), ``False`` when none is needed or none could be applied — an
|
|
53
|
+
unimportable ``rich``, an uninspectable ``__init__``, or a signature that
|
|
54
|
+
already absorbs ``**kwargs``.
|
|
55
|
+
"""
|
|
56
|
+
try:
|
|
57
|
+
from rich.logging import RichHandler
|
|
58
|
+
except Exception: # pragma: no cover - rich absent or broken
|
|
59
|
+
# fastmcp depends on rich, so this means the import would fail anyway
|
|
60
|
+
# for reasons this shim cannot address.
|
|
61
|
+
logger.debug("rich.logging unavailable; skipping RichHandler shim")
|
|
62
|
+
return False
|
|
63
|
+
|
|
64
|
+
original_init = RichHandler.__init__
|
|
65
|
+
if getattr(original_init, _PATCH_MARKER, False):
|
|
66
|
+
return True
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
parameters = inspect.signature(original_init).parameters
|
|
70
|
+
except (TypeError, ValueError): # pragma: no cover - exotic rich build
|
|
71
|
+
logger.debug("RichHandler.__init__ is not introspectable; skipping shim")
|
|
72
|
+
return False
|
|
73
|
+
|
|
74
|
+
if any(p.kind is inspect.Parameter.VAR_KEYWORD for p in parameters.values()):
|
|
75
|
+
# Already tolerant of anything fastmcp passes.
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
if _PROBE_KWARG in parameters:
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
supported = frozenset(parameters)
|
|
82
|
+
|
|
83
|
+
@functools.wraps(original_init)
|
|
84
|
+
def _init(self: Any, *args: Any, **kwargs: Any) -> Any:
|
|
85
|
+
dropped = kwargs.keys() - supported
|
|
86
|
+
if dropped:
|
|
87
|
+
logger.debug(
|
|
88
|
+
"Dropping RichHandler kwargs this rich does not accept: %s",
|
|
89
|
+
", ".join(sorted(dropped)),
|
|
90
|
+
)
|
|
91
|
+
return original_init(
|
|
92
|
+
self, *args, **{k: v for k, v in kwargs.items() if k in supported}
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
setattr(_init, _PATCH_MARKER, True)
|
|
96
|
+
RichHandler.__init__ = _init # type: ignore[method-assign]
|
|
97
|
+
|
|
98
|
+
logger.debug(
|
|
99
|
+
"Installed RichHandler compatibility shim: rich is older than "
|
|
100
|
+
"fastmcp expects, so tracebacks lose frame-limiting and "
|
|
101
|
+
"framework-frame suppression. Upgrade to rich>=13.9.4 to restore them."
|
|
102
|
+
)
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# Applied as an import side effect: ``ha_mcp/__init__.py`` imports this module
|
|
107
|
+
# ahead of anything that reaches fastmcp, and that is the only window in which
|
|
108
|
+
# the shim can do any good.
|
|
109
|
+
ensure_rich_handler_compat()
|
|
@@ -16,6 +16,7 @@ import logging
|
|
|
16
16
|
import sys
|
|
17
17
|
from typing import Annotated, Any, Literal
|
|
18
18
|
|
|
19
|
+
import httpx
|
|
19
20
|
from fastmcp.exceptions import ToolError
|
|
20
21
|
from fastmcp.tools import tool
|
|
21
22
|
from pydantic import Field
|
|
@@ -479,17 +480,36 @@ def schedule_deferred_entry_reload(client: Any, entry_id: str) -> None:
|
|
|
479
480
|
very worker answering the current request, so it must not run until the
|
|
480
481
|
response has flushed. Failures can only be logged — there is no caller
|
|
481
482
|
left to answer.
|
|
483
|
+
|
|
484
|
+
Uses the ``homeassistant.reload_config_entry`` service, NOT
|
|
485
|
+
``POST /config/config_entries/entry/{id}/reload``: only the services
|
|
486
|
+
handler shields the call. HA runs aiohttp with
|
|
487
|
+
``handler_cancellation=True``, and the reload kills the client sending
|
|
488
|
+
this request, so on the unshielded route it cancelled itself mid-unload
|
|
489
|
+
and stranded the entry in ``UNLOAD_IN_PROGRESS`` until HA restarted.
|
|
482
490
|
"""
|
|
483
491
|
|
|
484
492
|
async def _reload() -> None:
|
|
485
493
|
await asyncio.sleep(_SELF_ACTION_FLUSH_DELAY_S)
|
|
486
494
|
try:
|
|
487
|
-
await client.
|
|
488
|
-
"
|
|
495
|
+
await client.call_service(
|
|
496
|
+
"homeassistant", "reload_config_entry", {"entry_id": entry_id}
|
|
489
497
|
)
|
|
490
498
|
logger.info("Deferred reload of entry %s requested", entry_id)
|
|
491
|
-
except Exception:
|
|
492
|
-
|
|
499
|
+
except Exception as exc:
|
|
500
|
+
# A lost reply means the request reached HA and the shielded reload
|
|
501
|
+
# then killed this client — the expected end of a self-restart, not
|
|
502
|
+
# a failure. A connect error or timeout may never have dispatched,
|
|
503
|
+
# so those stay loud. WARNING, not INFO: HA surfaces this package
|
|
504
|
+
# at WARNING and above, so INFO here would log nothing at all.
|
|
505
|
+
if isinstance(exc.__cause__, httpx.ReadError | httpx.RemoteProtocolError):
|
|
506
|
+
logger.warning(
|
|
507
|
+
"Deferred reload of entry %s dispatched; it tore down this "
|
|
508
|
+
"connection before the reply arrived (expected)",
|
|
509
|
+
entry_id,
|
|
510
|
+
)
|
|
511
|
+
else:
|
|
512
|
+
logger.exception("Deferred config-entry reload failed")
|
|
493
513
|
|
|
494
514
|
_spawn_background(_reload())
|
|
495
515
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.2.0.dev2305
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -19,7 +19,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
19
19
|
Requires-Python: <3.15,>=3.13
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: fastmcp==3.4.
|
|
22
|
+
Requires-Dist: fastmcp==3.4.6
|
|
23
23
|
Requires-Dist: httpx[socks]==0.28.1
|
|
24
24
|
Requires-Dist: pydantic==2.13.4
|
|
25
25
|
Requires-Dist: python-dotenv==1.2.2
|
|
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.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/VENDORED
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/__main__.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.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/frames.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/headers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/http11.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/imports.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/auth.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/http.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/legacy/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/protocol.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/proxy.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/py.typed
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/streams.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/sync/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/trio/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/typing.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/_vendor/websockets/version.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.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/content.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/paths.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/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
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_advanced.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_backups.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_fs.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_theme.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_handlers_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/_persistence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/README.md
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/en.json
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/es.json
RENAMED
|
File without changes
|
{ha_mcp_dev-8.1.1.dev2294 → ha_mcp_dev-8.2.0.dev2305}/src/ha_mcp/settings_ui/locales/fr.json
RENAMED
|
File without changes
|