ha-mcp-dev 8.2.0.dev2367__tar.gz → 8.3.0.dev2374__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.2.0.dev2367/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.3.0.dev2374}/PKG-INFO +1 -1
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/pyproject.toml +1 -1
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/__init__.py +24 -19
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/cs.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/de.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/eo.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/es.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/fr.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/it.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/nl.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/pl.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/ru.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/sv.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/zh-Hans.json +4 -2
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_search.py +11 -8
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/setup.cfg +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/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.
|
|
7
|
+
version = "8.3.0.dev2374"
|
|
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
|
|
@@ -20,7 +20,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
20
20
|
from starlette.requests import Request
|
|
21
21
|
from starlette.responses import HTMLResponse, JSONResponse, Response
|
|
22
22
|
|
|
23
|
-
from .._version import is_running_in_addon
|
|
23
|
+
from .._version import is_embedded, is_running_in_addon
|
|
24
24
|
from ..transforms import DEFAULT_PINNED_TOOLS
|
|
25
25
|
from ..utils.data_paths import get_data_dir
|
|
26
26
|
from ._handlers_advanced import build_advanced_handlers
|
|
@@ -524,11 +524,11 @@ def _ingress_only(handler: _SettingsRoute) -> _SettingsRoute:
|
|
|
524
524
|
|
|
525
525
|
|
|
526
526
|
# Mount prefix the settings UI is served under in long-lived HTTP transports
|
|
527
|
-
# (Docker / standalone ha-mcp-web
|
|
528
|
-
#
|
|
529
|
-
#
|
|
530
|
-
#
|
|
531
|
-
# ~/.ha-mcp/ui.url
|
|
527
|
+
# (Docker / standalone ha-mcp-web). Recorded by register_settings_routes so
|
|
528
|
+
# ha_get_overview can point users at the settings page in modes that have no
|
|
529
|
+
# managed UI entry point or stdio sidecar URL file to surface (issue #1458).
|
|
530
|
+
# Stays None in managed HA deployments and pure stdio mode, where the sidebar /
|
|
531
|
+
# ingress entry point or ~/.ha-mcp/ui.url already provides discovery.
|
|
532
532
|
_http_settings_prefix: str | None = None
|
|
533
533
|
|
|
534
534
|
|
|
@@ -539,8 +539,8 @@ def get_http_settings_prefix() -> str | None:
|
|
|
539
539
|
long-lived HTTP server *and* advertising is enabled. ``ha_get_overview``
|
|
540
540
|
reads it to hint at the settings page when there is no stdio sidecar URL to
|
|
541
541
|
hand the user. It is None when the mount is deliberately not advertised
|
|
542
|
-
(OAuth/OIDC dedicated-secret mode) — use
|
|
543
|
-
not this, to tell HTTP from the
|
|
542
|
+
(managed HA or OAuth/OIDC dedicated-secret mode) — use
|
|
543
|
+
:func:`is_http_settings_mounted`, not this, to tell HTTP from the sidecar.
|
|
544
544
|
"""
|
|
545
545
|
return _http_settings_prefix
|
|
546
546
|
|
|
@@ -594,12 +594,18 @@ def register_settings_routes(
|
|
|
594
594
|
non-add-on mode, the function logs a warning and registers
|
|
595
595
|
nothing rather than expose the routes publicly.
|
|
596
596
|
advertise_prefix: When True (default), record the secret-path mount in
|
|
597
|
-
``_http_settings_prefix``
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
597
|
+
``_http_settings_prefix`` for unmanaged HTTP deployments so
|
|
598
|
+
``ha_get_overview`` can hint at the settings URL. The managed app
|
|
599
|
+
(add-on) and embedded deployments never record it because Home Assistant
|
|
600
|
+
supplies their settings entry points. OAuth/OIDC callers pass False
|
|
601
|
+
because they use a dedicated settings secret.
|
|
602
602
|
"""
|
|
603
|
+
global _http_settings_mounted, _http_settings_prefix
|
|
604
|
+
|
|
605
|
+
# Never let a rejected or non-advertised registration inherit another
|
|
606
|
+
# server's credential-bearing hint.
|
|
607
|
+
_http_settings_prefix = None
|
|
608
|
+
|
|
603
609
|
handlers = build_settings_handlers(server)
|
|
604
610
|
secret_prefix = secret_path.rstrip("/") if secret_path else ""
|
|
605
611
|
if secret_prefix and ("{" in secret_prefix or "}" in secret_prefix):
|
|
@@ -627,7 +633,6 @@ def register_settings_routes(
|
|
|
627
633
|
# Past this point at least one HTTP mount happens (add-on root and/or the
|
|
628
634
|
# secret path). Record that so consumers can distinguish HTTP from the stdio
|
|
629
635
|
# sidecar even when the prefix itself is not advertised (advertise_prefix=False).
|
|
630
|
-
global _http_settings_mounted
|
|
631
636
|
_http_settings_mounted = True
|
|
632
637
|
|
|
633
638
|
# Every route this function mounts except the add-on-only root mount is defined
|
|
@@ -705,10 +710,10 @@ def register_settings_routes(
|
|
|
705
710
|
# need the same secret to reach the UI as they do for the MCP
|
|
706
711
|
# endpoint.
|
|
707
712
|
_mount(secret_prefix)
|
|
708
|
-
if advertise_prefix:
|
|
713
|
+
if advertise_prefix and not is_addon and not is_embedded():
|
|
709
714
|
# Record the mount so ha_get_overview can point users at the
|
|
710
|
-
# settings page in HTTP transports that have no stdio
|
|
711
|
-
# file (#1458).
|
|
712
|
-
#
|
|
713
|
-
|
|
715
|
+
# settings page in unmanaged HTTP transports that have no stdio
|
|
716
|
+
# sidecar URL file (#1458). The managed app (add-on) and embedded deployments
|
|
717
|
+
# already have Home Assistant settings entry points; OAuth/OIDC
|
|
718
|
+
# callers suppress their dedicated settings secret explicitly.
|
|
714
719
|
_http_settings_prefix = secret_prefix
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/cs.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Bez režimu vynucení (níže) jde o redukci šumu, nikoli o řízení přístupu: skrytá entita je stále vrácena přímým čtením jejího entity_id a stále se objevuje v obsahu automatizací, řídicích panelů a šablon. Nespoléhejte se na samotný filtr jako na bezpečnostní hranici.",
|
|
97
97
|
"visibility.enabled": "Povolit filtr viditelnosti entit",
|
|
98
98
|
"visibility.enforce.title": "Režim vynucení",
|
|
99
|
-
"visibility.enforce.help": "Rozšiřuje filtr z
|
|
100
|
-
"visibility.enforce.only_enforced": "
|
|
99
|
+
"visibility.enforce.help": "Rozšiřuje filtr z úklidu vyhledávání a přehledu na každé čtení nástroje kromě ha_report_issue ve výchozím nastavení. Přímé čtení skryté entity vrátí „nenalezeno“ a čtení obsahu, které by ji zobrazil, je odmítnuto. Výjimka pro nástroj hlášení se ovládá níže. Jedná se o snahu o skrytí před náhodným vystavením na základě nejlepších možností, nikoli o zabezpečenou bezpečnostní hranici.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Udělat skryté entity nečitelnými napříč čteními nástrojů (kromě hlášení problémů ve výchozím nastavení)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Dokud je toto vypnuto, ha_report_issue a veškerý jeho diagnostický výstup – včetně protokolů – zůstávají mimo režim vynucení při každém volání, a to i když jsou data o viditelnosti v pořádku nebo nedostupná. Zapněte toto nastavení pro prohledání a odmítnutí tohoto nástroje stejně jako u jiných čtení.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Použít režim vynucení na ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Skrýt podle kategorie",
|
|
102
104
|
"visibility.categories.help": "Home Assistant označuje automaticky generované entity jako diagnostické nebo konfigurační.",
|
|
103
105
|
"visibility.categories.legend": "Kategorie entit ke skrytí",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Ohne den Erzwingungsmodus (unten) ist dies Rauschreduzierung, keine Zugriffskontrolle: Eine versteckte Entität wird weiterhin durch ein direktes Lesen ihrer entity_id zurückgegeben und erscheint weiterhin in Automatisierungs-, Dashboard- und Template-Inhalten. Verlasse dich nicht allein auf den Filter als Sicherheitsgrenze.",
|
|
97
97
|
"visibility.enabled": "Entitäts-Sichtbarkeitsfilter aktivieren",
|
|
98
98
|
"visibility.enforce.title": "Erzwingungsmodus",
|
|
99
|
-
"visibility.enforce.help": "Erweitert den Filter
|
|
100
|
-
"visibility.enforce.only_enforced": "Versteckte Entitäten
|
|
99
|
+
"visibility.enforce.help": "Erweitert den Filter von der Übersicht und dem Aufräumen der Suche standardmäßig auf jeden Tool-Lesevorgang außer ha_report_issue. Ein direkter Lesevorgang einer ausgeblendeten Entität gibt „nicht gefunden“ zurück, und ein Inhaltslesevorgang, der eine solche anzeigen würde, wird verweigert. Die Ausnahme für das Berichts-Tool wird unten gesteuert. Best-Effort-Verbergen gegen zufällige Exposition, keine gehärtete Sicherheitsgrenze.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Versteckte Entitäten bei Tool-Lesevorgängen unlesbar machen (standardmäßig außer Fehlerberichten)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Solange dies deaktiviert ist, bleiben ha_report_issue und all seine Diagnoseausgaben – einschließlich Protokolle – bei jedem Aufruf außerhalb des Erzwingungsmodus, selbst wenn die Sichtbarkeitsdaten intakt oder nicht verfügbar sind. Aktiviere dies, um dieses Tool wie andere Lesevorgänge zu scannen und zu verweigern.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Erzwingungsmodus auf ha_report_issue anwenden",
|
|
101
103
|
"visibility.categories.title": "Nach Kategorie verstecken",
|
|
102
104
|
"visibility.categories.help": "Home Assistant markiert automatisch generierte Entitäten als Diagnose oder Konfiguration.",
|
|
103
105
|
"visibility.categories.legend": "Zu versteckende Entitätskategorien",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/eo.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Sen deviga reĝimo (malsupre), ĉi tio estas bruo-redukto, ne alirkontrolo: kaŝita ento estas ankoraŭ redonita per rekta legado de ĝia entity_id kaj ankoraŭ aperas en aŭtomatigo, panelo kaj ŝablona enhavo. Ne fidu nur je la filtrilo kiel sekureca limo.",
|
|
97
97
|
"visibility.enabled": "Ebligi filtrilon de enta videbleco",
|
|
98
98
|
"visibility.enforce.title": "Deviga reĝimo",
|
|
99
|
-
"visibility.enforce.help": "Etendas la filtrilon de
|
|
100
|
-
"visibility.enforce.only_enforced": "
|
|
99
|
+
"visibility.enforce.help": "Etendas la filtrilon de ordigado de serĉado kaj superrigardo al ĉiu illegado krom ha_report_issue defaŭlte. Rekta legado de kaŝita ento redonas “ne trovita”, kaj enhava legado kiu elmontrus tian enton estas rifuzita. La escepto de la raport-ilo estas regata sube. Plejforta kaŝado kontraŭ hazarda elmontro, ne fortika sekureca limo.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Maliberi legadon de kaŝitaj entoj tra ĉiuj illegadoj (krom problemnotoj defaŭlte)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Dum ĉi tio estas malŝaltita, ha_report_issue kaj ĉiuj ĝiaj diagnozaj eliraĵoj—inkluzive de protokoloj—restas ekster la deviga reĝimo je ĉiu voko, eĉ kiam videblecaj datumoj estas sanaj aŭ nehaveblaj. Ŝaltu ĝin por skani kaj rifuzi tiun ilon kiel aliajn legadojn.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Apliki devigan reĝimon al ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Kaŝi laŭ kategorio",
|
|
102
104
|
"visibility.categories.help": "Home Assistant etikedas aŭtomate generitajn entojn kiel diagnozajn aŭ agordajn.",
|
|
103
105
|
"visibility.categories.legend": "Entaj kategorioj por kaŝi",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/es.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Sin el modo de aplicación estricta (abajo), esto reduce ruido, no controla el acceso: una entidad oculta se sigue devolviendo en una lectura directa de su entity_id y sigue apareciendo en el contenido de automatizaciones, paneles y plantillas. No confíes en el filtro por sí solo como frontera de seguridad.",
|
|
97
97
|
"visibility.enabled": "Activar el filtro de visibilidad de entidades",
|
|
98
98
|
"visibility.enforce.title": "Modo de aplicación estricta",
|
|
99
|
-
"visibility.enforce.help": "
|
|
100
|
-
"visibility.enforce.only_enforced": "Hacer que las entidades ocultas no se puedan leer
|
|
99
|
+
"visibility.enforce.help": "Amplía el filtro de búsqueda y resumen para ocultar elementos en todas las lecturas de herramientas, excepto ha_report_issue de forma predeterminada. Una lectura directa de una entidad oculta devuelve \"no encontrado\", y se rechaza una lectura de contenido que muestre alguna. La excepción de la herramienta de informes se controla a continuación. Ocultación de mejor esfuerzo contra la exposición incidental, no es un límite de seguridad reforzado.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Hacer que las entidades ocultas no se puedan leer en las lecturas de herramientas (excepto en los informes de problemas de forma predeterminada)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Mientras esto esté desactivado, ha_report_issue y toda su salida de diagnóstico (incluidos los registros) quedan fuera del modo de aplicación en cada llamada, incluso cuando los datos de visibilidad son correctos o no están disponibles. Actívalo para escanear y rechazar esa herramienta como las demás lecturas.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Aplicar el modo de aplicación a ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Ocultar por categoría",
|
|
102
104
|
"visibility.categories.help": "Home Assistant etiqueta las entidades generadas automáticamente como de diagnóstico o de configuración.",
|
|
103
105
|
"visibility.categories.legend": "Categorías de entidad que ocultar",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/fr.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Sans le mode d'application (ci-dessous), il s'agit d'une réduction du bruit, pas d'un contrôle d'accès : une entité masquée est toujours renvoyée par une lecture directe de son entity_id et apparaît toujours dans le contenu des automatisations, tableaux de bord et modèles. Ne vous fiez pas uniquement au filtre comme barrière de sécurité.",
|
|
97
97
|
"visibility.enabled": "Activer le filtre de visibilité des entités",
|
|
98
98
|
"visibility.enforce.title": "Mode d'application",
|
|
99
|
-
"visibility.enforce.help": "Étend le filtre
|
|
100
|
-
"visibility.enforce.only_enforced": "Rendre les entités masquées illisibles
|
|
99
|
+
"visibility.enforce.help": "Étend par défaut le filtre de l'encombrement de la recherche et de la vue d'ensemble à toutes les lectures d'outils, à l'exception de ha_report_issue. La lecture directe d'une entité masquée renvoie \"introuvable\", et toute lecture de contenu qui en ferait apparaître une est refusée. L'exception pour l'outil de rapport est contrôlée ci-dessous. Il s'agit d'une dissimulation au mieux contre l'exposition accidentelle, et non d'une limite de sécurité renforcée.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Rendre les entités masquées illisibles lors des lectures d'outils (sauf les rapports de problèmes par défaut)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Lorsque cette option est désactivée, ha_report_issue et l'ensemble de ses sorties de diagnostic (y compris les journaux) restent en dehors du mode d'application à chaque appel, même lorsque les données de visibilité sont saines ou indisponibles. Activez-le pour analyser et refuser cet outil comme les autres lectures.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Appliquer le mode d'application à ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Masquer par catégorie",
|
|
102
104
|
"visibility.categories.help": "Home Assistant étiquette les entités générées automatiquement comme diagnostic ou configuration.",
|
|
103
105
|
"visibility.categories.legend": "Catégories d'entités à masquer",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/it.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Senza la modalità di applicazione rigorosa (qui sotto) questo riduce il rumore, non controlla l'accesso: un'entità nascosta viene comunque restituita da una lettura diretta del suo entity_id e compare ancora nei contenuti di automazioni, dashboard e template. Non considerare il filtro da solo come un confine di sicurezza.",
|
|
97
97
|
"visibility.enabled": "Attiva il filtro di visibilità delle entità",
|
|
98
98
|
"visibility.enforce.title": "Modalità di applicazione rigorosa",
|
|
99
|
-
"visibility.enforce.help": "Estende il filtro dalla
|
|
100
|
-
"visibility.enforce.only_enforced": "Rendi le entità nascoste illeggibili in
|
|
99
|
+
"visibility.enforce.help": "Estende il filtro dalla ricerca di pulizia e dalla panoramica a ogni lettura di strumenti, tranne ha_report_issue per impostazione predefinita. Una lettura diretta di un'entità nascosta restituisce \"non trovato\", e una lettura di contenuti che ne mostrerebbe una viene rifiutata. L'eccezione dello strumento di segnalazione è controllata di seguito. Copertura basata sul massimo sforzo contro l'esposizione accidentale, non un confine di sicurezza blindato.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Rendi le entità nascoste illeggibili in tutte le letture degli strumenti (tranne i rapporti di problemi per impostazione predefinita)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Mentre questo è disattivato, ha_report_issue e tutta la sua emissione diagnostica, inclusi i log, rimangono al di fuori della modalità di applicazione a ogni chiamata, anche quando i dati di visibilità sono integri o non disponibili. Attivalo per scansionare e rifiutare tale strumento come le altre letture.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Applica la modalità di applicazione a ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Nascondi per categoria",
|
|
102
104
|
"visibility.categories.help": "Home Assistant contrassegna le entità generate automaticamente come di diagnostica o di configurazione.",
|
|
103
105
|
"visibility.categories.legend": "Categorie di entità da nascondere",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/nl.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Zonder afdwingmodus (hieronder) is dit ruisonderdrukking, geen toegangscontrole: een verborgen entiteit wordt nog steeds geretourneerd door een directe uitlezing van zijn entity_id en verschijnt nog steeds in automatisering, dashboard en sjablooninhoud. Vertrouw niet alleen op het filter als een beveiligingsgrens.",
|
|
97
97
|
"visibility.enabled": "Schakel filter voor entiteitszichtbaarheid in",
|
|
98
98
|
"visibility.enforce.title": "Afdwingmodus",
|
|
99
|
-
"visibility.enforce.help": "Breidt het filter
|
|
100
|
-
"visibility.enforce.only_enforced": "Maak verborgen entiteiten onleesbaar
|
|
99
|
+
"visibility.enforce.help": "Breidt het filter van opschoning van zoekopdrachten en overzichten standaard uit naar elke tool-gelezen data behalve ha_report_issue. Een directe lezing van een verborgen entiteit retourneert \"niet gevonden\", en een inhoudsgelezen data die er een zou tonen, wordt geweigerd. De uitzondering voor het rapportageregelingsmiddel wordt hieronder beheerd. Dit is een inspanningsverplichting ter verberging tegen incidentele blootstelling, geen harde beveiligingsgrens.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Maak verborgen entiteiten onleesbaar bij alle tool-lezingen (standaard uitgezonderd foutmeldingen)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Terwijl dit is uitgeschakeld, blijven ha_report_issue en al zijn diagnostische uitvoer — inclusief logboeken — bij elke aanroep buiten de afdwingmodus, zelfs wanneer zichtbaarheidsgegevens gezond of niet beschikbaar zijn. Schakel dit in om dat hulpprogramma te scannen en te weigeren net als andere lezingen.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Pas afdwingmodus toe op ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Verbergen per categorie",
|
|
102
104
|
"visibility.categories.help": "Home Assistant tagt automatisch gegenereerde entiteiten als diagnostisch of configuratie.",
|
|
103
105
|
"visibility.categories.legend": "Entiteitscategorieën om te verbergen",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/pl.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Bez trybu wymuszenia (poniżej), jest to redukcja szumu, a nie kontrola dostępu: ukryta encja jest nadal zwracana przez bezpośredni odczyt jej entity_id i nadal pojawia się w automatyzacjach, panelach i zawartości szablonów. Nie polegaj wyłącznie na filtrze jako granicy bezpieczeństwa.",
|
|
97
97
|
"visibility.enabled": "Włącz filtr widoczności encji",
|
|
98
98
|
"visibility.enforce.title": "Tryb wymuszenia",
|
|
99
|
-
"visibility.enforce.help": "Rozszerza filtr z
|
|
100
|
-
"visibility.enforce.only_enforced": "
|
|
99
|
+
"visibility.enforce.help": "Rozszerza domyślnie filtr z ukrywania w wyszukiwaniu i przeglądzie na każdy odczyt narzędzia, z wyjątkiem ha_report_issue. Bezpośredni odczyt ukrytej encji zwraca „nie znaleziono”, a odczyt zawartości, który by ją ujawnił, jest odrzucany. Wyjątek dotyczący narzędzia raportowania jest kontrolowany poniżej. Ukrywanie w najlepszej wierze przed przypadkowym ujawnieniem, a nie twarda granica bezpieczeństwa.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Uczyń ukryte encje nieczytelnymi we wszystkich odczytach narzędzi (domyślnie z wyjątkiem raportów błędów)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Gdy ta opcja jest wyłączona, ha_report_issue oraz wszystkie jego dane diagnostyczne — w tym logi — pozostają poza trybem egzekwowania przy każdym wywołaniu, nawet gdy dane widoczności są poprawne lub niedostępne. Włącz tę opcję, aby skanować i odrzucać to narzędzie podobnie jak inne odczyty.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Zastosuj tryb egzekwowania do ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Ukryj według kategorii",
|
|
102
104
|
"visibility.categories.help": "Home Assistant oznacza automatycznie generowane encje jako diagnostyczne lub konfiguracyjne.",
|
|
103
105
|
"visibility.categories.legend": "Kategorie encji do ukrycia",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/ru.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Без режима принудительного скрытия (ниже) это уменьшение информационного шума, а не ограничение доступа: скрытая сущность всё ещё возвращается при прямом запросе по entity_id и остаётся видимой в автоматизациях, панелях и шаблонах. Не полагайтесь на один лишь фильтр как на средство безопасности.",
|
|
97
97
|
"visibility.enabled": "Включить фильтр видимости сущностей",
|
|
98
98
|
"visibility.enforce.title": "Режим принудительного скрытия",
|
|
99
|
-
"visibility.enforce.help": "Расширяет
|
|
100
|
-
"visibility.enforce.only_enforced": "Сделать скрытые сущности
|
|
99
|
+
"visibility.enforce.help": "Расширяет фильтр из поиска, загромождающего интерфейс, и обзора на чтение каждого инструмента, кроме ha_report_issue, по умолчанию. Прямое чтение скрытой сущности возвращает «не найдено», а чтение содержимого, которое должно её показать, отклоняется. Исключение для инструмента отчетов управляется ниже. Это скрытие на основе лучших усилий от случайного раскрытия, а не защищенный рубеж безопасности.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Сделать скрытые сущности недоступными для чтения во всех инструментах (кроме отчетов о проблемах по умолчанию)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Пока эта функция отключена, ha_report_issue и весь ее диагностический вывод, включая логи, не участвуют в режиме принудительного применения при каждом вызове, даже когда данные о видимости в норме или недоступны. Включите ее, чтобы сканировать и отклонять этот инструмент так же, как и другие запросы на чтение.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Применить режим принудительного применения к ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Скрывать по категории",
|
|
102
104
|
"visibility.categories.help": "Home Assistant помечает автоматически созданные сущности как диагностические или конфигурационные.",
|
|
103
105
|
"visibility.categories.legend": "Категории скрываемых сущностей",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/sv.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "Utan tvingande läge (nedan) är detta brusreducering, inte åtkomstkontroll: en dold entitet returneras fortfarande vid en direkt läsning av dess entity_id och visas fortfarande i innehåll för automatisering, instrumentpaneler och mallar. Förlita dig inte enbart på filtret som en säkerhetsgräns.",
|
|
97
97
|
"visibility.enabled": "Aktivera entitets synlighetsfilter",
|
|
98
98
|
"visibility.enforce.title": "Tvingande läge",
|
|
99
|
-
"visibility.enforce.help": "Utökar filtret från att rensa
|
|
100
|
-
"visibility.enforce.only_enforced": "Gör dolda entiteter oläsbara
|
|
99
|
+
"visibility.enforce.help": "Utökar filtret från att rensa sökningar och översikter till att som standard gälla alla verktygsläsningar förutom ha_report_issue. En direkt läsning av en dold entitet returnerar \"ej hittad\", och en innehållsläsning som skulle visa en sådan nekas. Undantaget för rapportverktyget styrs nedan. Bästa möjliga döljande mot oavsiktlig exponering, inte en härdad säkerhetsgräns.",
|
|
100
|
+
"visibility.enforce.only_enforced": "Gör dolda entiteter oläsbara vid alla verktygsläsandet (förutom felrapporter som standard)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "Medan detta är avstängt förblir ha_report_issue och all dess diagnostiska utdata – inklusive loggar – utanför tvingande läge vid varje anrop, även när synlighetsdata är felfri eller otillgänglig. Slå på det för att skanna och neka det verktyget liksom andra läsningar.",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "Tillämpa tvingande läge på ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "Dölj efter kategori",
|
|
102
104
|
"visibility.categories.help": "Home Assistant taggar automatiskt genererade entiteter som diagnostik eller konfiguration.",
|
|
103
105
|
"visibility.categories.legend": "Entitetskategorier att dölja",
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/settings_ui/locales/zh-Hans.json
RENAMED
|
@@ -96,8 +96,10 @@
|
|
|
96
96
|
"visibility.boundary": "在未启用下方的强制模式时,这只是降噪,而非访问控制:被隐藏的实体仍会在直接读取其 entity_id 时返回,并仍会出现在自动化、仪表盘和模板内容中。请勿仅依赖此过滤器作为安全边界。",
|
|
97
97
|
"visibility.enabled": "启用实体可见性过滤器",
|
|
98
98
|
"visibility.enforce.title": "强制模式",
|
|
99
|
-
"visibility.enforce.help": "
|
|
100
|
-
"visibility.enforce.only_enforced": "
|
|
99
|
+
"visibility.enforce.help": "默认将过滤范围从精简搜索和概览扩展到除 ha_report_issue 之外的所有工具读取。直接读取隐藏实体会返回“未找到”,而会暴露隐藏实体的正文读取则会被拒绝。报告工具的例外情况在下方控制。这是针对偶然暴露的尽力隐蔽,而非强固的安全边界。",
|
|
100
|
+
"visibility.enforce.only_enforced": "使隐藏实体在所有工具读取中均不可读(默认故障排除报告除外)",
|
|
101
|
+
"visibility.enforce.report_issue_help": "当此选项关闭时,ha_report_issue 及其所有诊断输出(包括日志)在每次调用时都不受强制模式约束,即使可见性数据正常或不可用。开启此选项以像其他读取一样扫描并拒绝该工具。",
|
|
102
|
+
"visibility.enforce.restrict_report_issue": "将强制模式应用于 ha_report_issue",
|
|
101
103
|
"visibility.categories.title": "按类别隐藏",
|
|
102
104
|
"visibility.categories.help": "Home Assistant 会将自动生成的实体标记为诊断或配置。",
|
|
103
105
|
"visibility.categories.legend": "要隐藏的实体类别",
|
|
@@ -3396,7 +3396,7 @@ class SearchTools:
|
|
|
3396
3396
|
"tool_discovery, settings_url, settings_url_hint, "
|
|
3397
3397
|
"read_only_mode, read_only_mode_hint, ha_mcp_update. Note: "
|
|
3398
3398
|
"``settings_url`` (stdio mode), ``settings_url_hint`` "
|
|
3399
|
-
"(HTTP/Docker
|
|
3399
|
+
"(standalone HTTP/Docker mode), the ``read_only_mode`` / "
|
|
3400
3400
|
"``read_only_mode_hint`` pair (only while Read Only Mode "
|
|
3401
3401
|
"is on), and ``ha_mcp_update`` (when an update check applies) "
|
|
3402
3402
|
"are emitted regardless of ``fields=`` projection so the "
|
|
@@ -3430,10 +3430,11 @@ class SearchTools:
|
|
|
3430
3430
|
minimize the response) but only when the sidecar URL file
|
|
3431
3431
|
actually exists.
|
|
3432
3432
|
|
|
3433
|
-
In HTTP / Docker
|
|
3434
|
-
|
|
3435
|
-
|
|
3436
|
-
|
|
3433
|
+
In standalone HTTP / Docker modes, when an HTTP settings prefix is
|
|
3434
|
+
advertised, there is no sidecar URL file and the server can't know its
|
|
3435
|
+
externally reachable host. The response instead carries a
|
|
3436
|
+
``settings_url_hint`` string telling the user where the page is mounted
|
|
3437
|
+
and how to find or construct the full URL.
|
|
3437
3438
|
Hand whichever of the two fields is present to the user.
|
|
3438
3439
|
|
|
3439
3440
|
The response also carries an ``ha_mcp_update`` object
|
|
@@ -3512,7 +3513,7 @@ class SearchTools:
|
|
|
3512
3513
|
if sidecar_url:
|
|
3513
3514
|
projected["settings_url"] = sidecar_url
|
|
3514
3515
|
else:
|
|
3515
|
-
# No stdio sidecar URL file. In HTTP / Docker
|
|
3516
|
+
# No stdio sidecar URL file. In standalone HTTP / Docker modes hint at
|
|
3516
3517
|
# the page (and startup-log URL) instead of guessing a wrong absolute URL
|
|
3517
3518
|
# when bound to 0.0.0.0 (issue #1458).
|
|
3518
3519
|
from ..settings_ui import get_http_settings_prefix
|
|
@@ -3524,8 +3525,10 @@ class SearchTools:
|
|
|
3524
3525
|
"The settings page (enable/disable/pin tools, feature "
|
|
3525
3526
|
"flags, advanced settings, backups, tool-approval) is "
|
|
3526
3527
|
f"served at '{settings_path}' on this MCP server. Find the "
|
|
3527
|
-
"full URL in the ha-mcp startup logs
|
|
3528
|
-
"
|
|
3528
|
+
"full URL in the ha-mcp startup logs. For a direct connection, "
|
|
3529
|
+
"use the MCP endpoint's scheme, host, and port with this "
|
|
3530
|
+
"settings path (replace the endpoint path rather than "
|
|
3531
|
+
"appending to it)."
|
|
3529
3532
|
)
|
|
3530
3533
|
|
|
3531
3534
|
# Surface Read Only Mode after projection so the flag survives any
|
|
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.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/VENDORED
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/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.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/client.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/frames.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/headers.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/http11.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/imports.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/auth.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/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.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/http.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/legacy/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/protocol.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/proxy.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/py.typed
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/streams.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/sync/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/messages.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/router.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/server.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/trio/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/typing.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/_vendor/websockets/utils.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/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
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/supervisor_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/client/websocket_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/content.py
RENAMED
|
File without changes
|
{ha_mcp_dev-8.2.0.dev2367 → ha_mcp_dev-8.3.0.dev2374}/src/ha_mcp/dashboard_screenshot/paths.py
RENAMED
|
File without changes
|