ha-mcp-dev 7.12.3.dev1909__tar.gz → 7.12.3.dev1912__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.
Files changed (165) hide show
  1. {ha_mcp_dev-7.12.3.dev1909/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1912}/PKG-INFO +2 -2
  2. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/pyproject.toml +2 -2
  3. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/settings_ui/__init__.py +6 -0
  4. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/settings_ui/settings.js +35 -9
  5. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -2
  6. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp_dev.egg-info/requires.txt +1 -1
  7. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/LICENSE +0 -0
  8. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/MANIFEST.in +0 -0
  9. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/README.md +0 -0
  10. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/setup.cfg +0 -0
  11. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/__init__.py +0 -0
  12. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/__main__.py +0 -0
  13. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/_pypi_marker +0 -0
  14. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/_version.py +0 -0
  15. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/auth/__init__.py +0 -0
  16. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/auth/consent_form.py +0 -0
  17. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/auth/provider.py +0 -0
  18. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/backup_manager.py +0 -0
  19. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/browser_landing.py +0 -0
  20. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/client/__init__.py +0 -0
  21. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/client/rest_client.py +0 -0
  22. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/client/supervisor_client.py +0 -0
  23. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/client/websocket_client.py +0 -0
  24. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/client/websocket_listener.py +0 -0
  25. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/config.py +0 -0
  26. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  27. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  28. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  29. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/errors.py +0 -0
  30. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/llm_exposure.py +0 -0
  31. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/__init__.py +0 -0
  32. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/approval_queue.py +0 -0
  33. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/evaluator.py +0 -0
  34. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/handlers.py +0 -0
  35. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/middleware.py +0 -0
  36. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/model.py +0 -0
  37. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/persistence.py +0 -0
  38. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/policy/value_sources.py +0 -0
  39. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/py.typed +0 -0
  40. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/read_only.py +0 -0
  41. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  42. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  43. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  44. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  45. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  46. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  47. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  48. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  49. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  50. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  51. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  52. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  53. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  54. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  55. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  56. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  57. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  58. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  59. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  60. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  61. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  62. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  63. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  64. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  65. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  66. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/server.py +0 -0
  67. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/settings_ui/settings.css +0 -0
  68. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/settings_ui/settings.html +0 -0
  69. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/smoke_test.py +0 -0
  70. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  71. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/strict_bps.py +0 -0
  72. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/__init__.py +0 -0
  73. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/auto_backup.py +0 -0
  74. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/backup.py +0 -0
  75. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  76. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/component_api.py +0 -0
  77. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  78. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/device_control.py +0 -0
  79. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/enhanced.py +0 -0
  80. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/helpers.py +0 -0
  81. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/__init__.py +0 -0
  82. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/base.py +0 -0
  83. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/matter.py +0 -0
  84. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/thread.py +0 -0
  85. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  86. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/radio/zwave.py +0 -0
  87. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/reference_validator.py +0 -0
  88. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/registry.py +0 -0
  89. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  90. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  91. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  92. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  93. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  94. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  95. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  96. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  97. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  98. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  99. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_addons.py +0 -0
  100. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_areas.py +0 -0
  101. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  102. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  103. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_calendar.py +0 -0
  104. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_camera.py +0 -0
  105. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_categories.py +0 -0
  106. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_code.py +0 -0
  107. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  108. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  109. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  110. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  111. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  112. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  113. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_dev.py +0 -0
  114. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_energy.py +0 -0
  115. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_entities.py +0 -0
  116. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  117. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_groups.py +0 -0
  118. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_hacs.py +0 -0
  119. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_history.py +0 -0
  120. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_integrations.py +0 -0
  121. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_labels.py +0 -0
  122. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  123. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_radio.py +0 -0
  124. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_registry.py +0 -0
  125. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_resources.py +0 -0
  126. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_search.py +0 -0
  127. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_service.py +0 -0
  128. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_services.py +0 -0
  129. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_system.py +0 -0
  130. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_themes.py +0 -0
  131. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_todo.py +0 -0
  132. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_traces.py +0 -0
  133. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_updates.py +0 -0
  134. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_utility.py +0 -0
  135. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  136. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  137. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/tools_zones.py +0 -0
  138. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/util_helpers.py +0 -0
  139. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/tools/validation_middleware.py +0 -0
  140. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/transforms/__init__.py +0 -0
  141. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/transforms/categorized_search.py +0 -0
  142. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  143. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/transport_security.py +0 -0
  144. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/update_check.py +0 -0
  145. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/__init__.py +0 -0
  146. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/config_hash.py +0 -0
  147. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/data_paths.py +0 -0
  148. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/domain_handlers.py +0 -0
  149. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  150. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  151. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/operation_manager.py +0 -0
  152. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/python_sandbox.py +0 -0
  153. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/skill_loader.py +0 -0
  154. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/utils/usage_logger.py +0 -0
  155. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/visibility/__init__.py +0 -0
  156. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/visibility/model.py +0 -0
  157. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/visibility/persistence.py +0 -0
  158. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp/visibility/resolver.py +0 -0
  159. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  160. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  161. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  162. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  163. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/tests/__init__.py +0 -0
  164. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/tests/test_constants.py +0 -0
  165. {ha_mcp_dev-7.12.3.dev1909 → ha_mcp_dev-7.12.3.dev1912}/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: 7.12.3.dev1909
3
+ Version: 7.12.3.dev1912
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.3
22
+ Requires-Dist: fastmcp==3.4.4
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 = "7.12.3.dev1909"
7
+ version = "7.12.3.dev1912"
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.3",
31
+ "fastmcp==3.4.4",
32
32
  "httpx[socks]==0.28.1",
33
33
  "pydantic==2.13.4",
34
34
  "python-dotenv==1.2.2",
@@ -1446,6 +1446,12 @@ def build_settings_handlers(
1446
1446
  "read_only_exempt": sorted(READ_ONLY_EXEMPT_TOOLS),
1447
1447
  "llm_api": llm_effective,
1448
1448
  "llm_api_overrides": llm_overrides,
1449
+ # LLM API exposure is registered by the ha_mcp_tools custom
1450
+ # component (in-process/embedded server). On the add-on,
1451
+ # Docker, or standalone server nothing consumes it, so the UI
1452
+ # hides the per-tool "LLM API" toggle rather than showing a
1453
+ # no-op control.
1454
+ "llm_api_available": is_embedded(),
1449
1455
  }
1450
1456
  )
1451
1457
 
@@ -33,6 +33,12 @@ let toolEnvPinned = {};
33
33
  // never flipped keep tracking their defaults across releases.
34
34
  let toolLlm = {};
35
35
  let toolLlmOverrides = {};
36
+ // True only on the in-process custom-component (embedded) server, which
37
+ // registers the LLM API exposure surface. On the add-on / Docker / standalone
38
+ // server nothing consumes it, so the per-tool "LLM API" toggle is hidden
39
+ // rather than shown as a no-op. Set from data.llm_api_available (see
40
+ // settings_ui/__init__.py).
41
+ let llmApiAvailable = false;
36
42
  let saveTimer = null;
37
43
  let openGroups = new Set();
38
44
 
@@ -169,6 +175,7 @@ async function loadTools() {
169
175
  toolEnvPinned = data.env_pinned || {};
170
176
  toolLlm = data.llm_api || {};
171
177
  toolLlmOverrides = data.llm_api_overrides || {};
178
+ llmApiAvailable = !!data.llm_api_available;
172
179
  READ_ONLY_EXEMPT = new Set(data.read_only_exempt || []);
173
180
  // Load policy state before the first render so the "security gated"
174
181
  // toggle reflects current policy.rules. loadPolicyState() never throws
@@ -598,6 +605,19 @@ function render() {
598
605
  return MANDATORY.includes(t.name) || (!t.disabled_by && s !== 'disabled');
599
606
  }).length;
600
607
 
608
+ // Master-switch checked state. Normally it mirrors "any toggleable tool
609
+ // enabled" — it is a bulk control over the tools the user can actually
610
+ // flip. But when a group has NO toggleable tools (all mandatory /
611
+ // env-pinned / feature-gated), the switch is disabled and purely reflects
612
+ // status: show it ON only when the group is FULLY enabled (every tool on),
613
+ // matching the "N/N enabled" count. anyEnabled can't be reused here — it is
614
+ // always false over an empty toggleable set. So an all-mandatory group
615
+ // (e.g. Search & Discovery) reads as ON, while a partially-enabled locked
616
+ // group (e.g. a mandatory tool beside an env-pinned-off one) reads as OFF
617
+ // rather than contradicting its own "1/N enabled" count.
618
+ const masterChecked =
619
+ toggleable.length === 0 ? groupEnabled === tools.length : anyEnabled;
620
+
601
621
  const header = document.createElement('div');
602
622
  header.className = 'group-header';
603
623
  header.innerHTML = `<div class="group-header-left">` +
@@ -606,7 +626,7 @@ function render() {
606
626
  `<span class="group-count">${groupEnabled}/${tools.length} enabled</span>` +
607
627
  `</div>` +
608
628
  `<label class="switch group-master" title="Enable/disable all tools in this group">` +
609
- `<input type="checkbox" name="tool-group:${escapeHtml(tag)}" ${anyEnabled ? 'checked' : ''} ${toggleable.length === 0 ? 'disabled' : ''}>` +
629
+ `<input type="checkbox" name="tool-group:${escapeHtml(tag)}" ${masterChecked ? 'checked' : ''} ${toggleable.length === 0 ? 'disabled' : ''}>` +
610
630
  `<span class="slider"></span>` +
611
631
  `</label>`;
612
632
 
@@ -717,6 +737,19 @@ function render() {
717
737
  : (roExemptActive
718
738
  ? '<div class="feature-locked-note">Read Only Mode: write operations of this tool are blocked; read operations stay available.</div>'
719
739
  : '');
740
+ // LLM API exposure column — rendered only on the embedded custom-component
741
+ // server (see llmApiAvailable); dropped elsewhere rather than shown as a
742
+ // no-op. Built here as a fragment, matching the *Note consts above.
743
+ const llmToggleHtml = llmApiAvailable
744
+ ? `<div class="toggle-group ${isEnabled ? '' : 'disabled-toggle'}" ` +
745
+ `title="Offer this tool to Home Assistant conversation agents through the LLM API. Applies on the agent's next message - no restart. A tool disabled above is unavailable to agents regardless.">` +
746
+ `<label class="switch"><input type="checkbox" name="tool:${escapeHtml(t.name)}:llm" data-tool="${escapeHtml(t.name)}" data-field="llm" ` +
747
+ `aria-label="${escapeHtml(title)} exposed to the conversation-agent LLM API" ` +
748
+ `${(toolLlm[t.name] !== false) ? 'checked' : ''} ${isEnabled ? '' : 'disabled'}>` +
749
+ `<span class="slider"></span></label>` +
750
+ `<span>LLM API</span>` +
751
+ `</div>`
752
+ : '';
720
753
 
721
754
  div.innerHTML = `<div class="tool-info">` +
722
755
  `<div class="tool-name">${escapeHtml(title)}${badges}</div>` +
@@ -750,14 +783,7 @@ function render() {
750
783
  `<span class="slider"></span></label>` +
751
784
  `<span>security gated</span>` +
752
785
  `</div>` +
753
- `<div class="toggle-group ${isEnabled ? '' : 'disabled-toggle'}" ` +
754
- `title="Offer this tool to Home Assistant conversation agents through the LLM API. Applies on the agent's next message - no restart. A tool disabled above is unavailable to agents regardless.">` +
755
- `<label class="switch"><input type="checkbox" name="tool:${escapeHtml(t.name)}:llm" data-tool="${escapeHtml(t.name)}" data-field="llm" ` +
756
- `aria-label="${escapeHtml(title)} exposed to the conversation-agent LLM API" ` +
757
- `${(toolLlm[t.name] !== false) ? 'checked' : ''} ${isEnabled ? '' : 'disabled'}>` +
758
- `<span class="slider"></span></label>` +
759
- `<span>LLM API</span>` +
760
- `</div>` +
786
+ llmToggleHtml +
761
787
  `</div>`;
762
788
 
763
789
  const inputs = div.querySelectorAll('input[type="checkbox"]');
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.12.3.dev1909
3
+ Version: 7.12.3.dev1912
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.3
22
+ Requires-Dist: fastmcp==3.4.4
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
@@ -1,4 +1,4 @@
1
- fastmcp==3.4.3
1
+ fastmcp==3.4.4
2
2
  httpx[socks]==0.28.1
3
3
  pydantic==2.13.4
4
4
  python-dotenv==1.2.2