ha-mcp-dev 8.4.3.dev2557__tar.gz → 8.4.3.dev2561__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 (309) hide show
  1. {ha_mcp_dev-8.4.3.dev2557/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2561}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/requirements.txt +1 -1
  4. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +16 -16
  5. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/VENDORED +1 -1
  6. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/client.py +24 -62
  7. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +4 -1
  8. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/router.py +3 -2
  9. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/server.py +2 -2
  10. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/client.py +49 -0
  11. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +7 -1
  12. ha_mcp_dev-8.4.3.dev2561/src/ha_mcp/_vendor/websockets/sync/client.py +1116 -0
  13. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/connection.py +11 -1
  14. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/router.py +3 -2
  15. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/server.py +5 -4
  16. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/client.py +33 -18
  17. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/connection.py +2 -1
  18. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/messages.py +5 -0
  19. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/typing.py +4 -2
  20. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/version.py +1 -1
  21. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  22. ha_mcp_dev-8.4.3.dev2557/src/ha_mcp/_vendor/websockets/sync/client.py +0 -644
  23. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/LICENSE +0 -0
  24. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/MANIFEST.in +0 -0
  25. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/README.md +0 -0
  26. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/setup.cfg +0 -0
  27. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/__init__.py +0 -0
  28. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/__main__.py +0 -0
  29. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_pypi_marker +0 -0
  30. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_rich_compat.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/__init__.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  33. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  60. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/_version.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/__init__.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/consent_form.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/oidc_compat.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/auth/provider.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/backup_manager.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/browser_landing.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/__init__.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/rest_client.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/supervisor_client.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/websocket_client.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/client/websocket_listener.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/config.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/errors.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/llm_exposure.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/log_filters.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/__init__.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/approval_queue.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/editing.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/evaluator.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/handlers.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/middleware.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/model.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/persistence.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/policy/value_sources.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/py.typed +0 -0
  104. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/read_only.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/redaction.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/renamed_tools.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  108. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  109. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  110. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  111. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  112. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  113. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  114. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  115. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  116. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  117. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  118. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  119. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  120. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  121. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  122. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  123. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  124. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  125. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  133. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  134. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  135. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  136. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  137. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  138. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  139. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  140. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  141. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  143. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  144. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  145. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  146. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  147. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  148. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/server.py +0 -0
  149. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/__init__.py +0 -0
  150. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  151. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  152. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  153. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_theme.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  163. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  164. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  165. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  166. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  167. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.css +0 -0
  178. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.html +0 -0
  179. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/settings_ui/settings.js +0 -0
  180. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/smoke_test.py +0 -0
  181. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  182. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/strict_bps.py +0 -0
  183. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/__init__.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/auto_backup.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/backup.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_result.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/blueprint_write.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/bulk_selector.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_api.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_config_entries.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_config_reads.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_devices.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_registries.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/device_control.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/hacs_registration.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/helpers.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_common.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/__init__.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/base.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/matter.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/thread.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/radio/zwave.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/reference_validator.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/registry.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_addons.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_areas.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_calendar.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_camera.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_categories.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_code.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_dev.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_energy.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_entities.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_groups.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_hacs.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_history.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_integrations.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_labels.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_logs.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_radio.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_registry.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_resources.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_search.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_service.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_services.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_system.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_themes.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_todo.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_traces.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_updates.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_utility.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/tools_zones.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/util_helpers.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/tools/validation_middleware.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/__init__.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/categorized_search.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/transport_security.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/update_check.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/__init__.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/config_hash.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/config_write_lock.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/data_paths.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/domain_handlers.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/entity_membership.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/operation_manager.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/python_sandbox.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/skill_loader.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/utils/usage_logger.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/__init__.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/enforcement.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/model.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/persistence.py +0 -0
  301. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp/visibility/resolver.py +0 -0
  302. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  303. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  304. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  305. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  306. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  307. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/tests/__init__.py +0 -0
  308. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/tests/test_constants.py +0 -0
  309. {ha_mcp_dev-8.4.3.dev2557 → ha_mcp_dev-8.4.3.dev2561}/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.4.3.dev2557
3
+ Version: 8.4.3.dev2561
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.4.3.dev2557"
7
+ version = "8.4.3.dev2561"
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
@@ -5,4 +5,4 @@
5
5
  # bump, including the source, license, and manifest in the same update.
6
6
  # tests/src/unit/test_vendored_websockets.py still rejects stale or altered trees.
7
7
  # For a manual pin change, run the same generator and commit its outputs.
8
- websockets==17.0.1
8
+ websockets==17.1
@@ -1,16 +1,16 @@
1
1
  3d6a0c050d8bec52fabad502e45fb25bd02bcadbd70dea34d447b6a0ff4e6da8 LICENSE
2
- c7a15094e48d9870f5ca9292be2dbcf02c1236041a596c7364ecd7fb952a5a5a VENDORED
2
+ e7a0229f98e8331a0e109d2e5a05d98fe445782329e54e418d0312589687c5af VENDORED
3
3
  ce6042263ec421ae99244403a787487739dfcc025403c756e35fa3ec49be4034 __init__.py
4
4
  c2ee4ddb093c9af060cafaf68219907f8a6b7b301ed3f8bea75db7555adec987 __main__.py
5
5
  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 asyncio/__init__.py
6
- a00be58048d15e2c6622bb6d6d0678020880f287ad03c123c6633fdfa6eaa151 asyncio/client.py
7
- 5772fe3eb5c6f2367fe88cad23ef5fb40f893a598a5e59c8f68092d605b1b083 asyncio/connection.py
6
+ 76cd6b1f39464325281925529b466d73640be5c2ce8942bdf79edb3b42baf8e6 asyncio/client.py
7
+ f2eb6ad56371fab33839a7ad2694e4b5610bea839bf92ae1f76e6d0a63f1e346 asyncio/connection.py
8
8
  bc13ddf7722e2f72c4d0e4b179a202223cefca886de7792687efd9868f9b1b35 asyncio/messages.py
9
- 8147589f675cfbe913fa434414e6bfab0a3f779bda5f7e16ca844db8f39256b5 asyncio/router.py
10
- e97a29f917bc4aa84ab01504b6ba5cf3d7ad16e42258f3f273d833ec072b866a asyncio/server.py
9
+ 2453543482e4001e4ff5fb7a3cba2035a66aea9f765b3d7dbc89717f1d434e58 asyncio/router.py
10
+ df846da778379c058b0da052731b9ba1f73390da0320c33330f03074b14ac6fc asyncio/server.py
11
11
  53f2709a7e7d65143a11e7293af322cd0086fd96c0be051fd6293b85a6510b77 auth.py
12
12
  7d87f462aad6231fe224303e45675cce1e6f8cef69e99c59be613beb56d4420d cli.py
13
- 0e9e23f3db8b9f35ec22d65ab03b3c855d38e587d1a57e9f60956e866b840c0d client.py
13
+ eaf4e66220a92297bc794adc98494e63ea0aae21fa394c72a7e846a535af3cc7 client.py
14
14
  38b88c56435ddb9ffceac07c43b0ab0b00685f2f6703438281d80b440f16511f connection.py
15
15
  5c64efbe015d6527af355fd3ebe2e8f83c66d951f125c80a9789750cd43a7d4f datastructures.py
16
16
  b69d3f132a907ddec260d3879b102278e1fc11df4f49016dd7c7be0ae45e4ce6 exceptions.py
@@ -28,7 +28,7 @@ e6826ead47333dd7578bc45d7b97c0da10f7578a67bfffd9eb8a514573fa1c1b legacy/client.
28
28
  6f4c0cc7cdd74c85d56683bad299770226ca1db4250dbeeb040ca114491a3029 legacy/framing.py
29
29
  d8dcebe40376c6f0c2e4474d3fe901de539cac069436562e8fffa1aff8efee93 legacy/handshake.py
30
30
  70e0909835a120a4269bc5161973d6ec20d9834df08e8802b1bd0b3fda1eb4d4 legacy/http.py
31
- d56508cc31c17b0f8d6757b086672dfd64f4c9c753c53e070dd83e226ef5cf86 legacy/protocol.py
31
+ dcc4e1d7ed24b564ad4425f4d252d5ebd80bcc5ffd8009fc60b144fdb664cd8c legacy/protocol.py
32
32
  8529389c54ec23778c45bbb925c2388177a2f546f0d3b452ad28ed2f878cda07 legacy/server.py
33
33
  dc7b8204c2d324cc69f491dde49301aad4c5f384ac636f62b871f4cb39ee0ff4 protocol.py
34
34
  a05adb118b5ab185aff960dc9e239b0fd9c1479439aa41e9c8254b9e0c7b58c4 proxy.py
@@ -36,20 +36,20 @@ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 py.typed
36
36
  ee41092f540414ef294c1f74c0fe1f51b9336060dc6e44daee34ef762499b509 server.py
37
37
  ac9ac33522fd872dc42587353c51e3631e2b75dd6f10b0ae6b40b074588737ff streams.py
38
38
  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 sync/__init__.py
39
- 8fd7efb0ec02cc98109da03239a558c3a893fc874f10cef42452e37aa5f3da3c sync/client.py
40
- c497896596676c82c952170d83f94158bdba226bfeb768ec9e73b9cbf79c1dfe sync/connection.py
39
+ 5b20fde3794aee3e0d40b23b3eaa3158411d77d98c2098e96b4344c71d3c3e3e sync/client.py
40
+ 019a800cd64e13779c4e2a93ed636ad67b146eea23683169ccd89c10df702054 sync/connection.py
41
41
  abc2b5bf176ba959356ef9f7cd6d49c74f5395a908592c9870e1c2eee7854269 sync/messages.py
42
- 06a29200a35962d45688ec6897da987b27e0c9746b30d27a16b4d364b35c5cc8 sync/router.py
43
- 7d565989a596f084a8a8570963964d6be301c6d2c26023f800b240b677201770 sync/server.py
42
+ c0e180bc66cac17caa98d1050425993f77da1efcbfd8c28deced977842fc9c62 sync/router.py
43
+ 5534fa4ec47e27e352596e657bc51531334d14dccfa7ac1b656b9541487e8d89 sync/server.py
44
44
  4ed5be9dc605bc99a2496da03bcea7804d8156c9e705d2fee07f3c91634361b8 sync/utils.py
45
45
  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 trio/__init__.py
46
- 570a49f5b6040883ccaecb17ece436aeb88d5630772e2b43a9748711f109c102 trio/client.py
47
- 95a970258845359a980cfedeebda28f4a5de6c536c6f233cc259a8aac31c7f4b trio/connection.py
48
- 8280dce6b7c8344c67bf27c44d66180d3dfeb6181125dec33ebe2e8f0243dcff trio/messages.py
46
+ 9b637921a141acf61c52da755423d4a3cb49d94162d9f4381bef793382423b15 trio/client.py
47
+ d571c39156caddefccf75a4e186798793d286b350ce4d8ea1cea30d0590dae06 trio/connection.py
48
+ 4a66c0d64fe58c41ae10764d2741cf0def3ea231ed313897191db41eb3c9b8a9 trio/messages.py
49
49
  a992fdfb8e268bd48e393194dc22c13ee68237369f406a99f9f265f61569bfeb trio/router.py
50
50
  8d1b6b7d97f7847a75690a3a7df34c37bb22696cef65586a0b58aad7f3e3d2c0 trio/server.py
51
51
  035d8d6143ce8d06a21aeb1a938de85b33c8702c618a429390024b5ed649bdc6 trio/utils.py
52
- ccbe0f8bfa501c919594be1c4f215abaac6030100523907a75fbcc567ed2158b typing.py
52
+ 72ef3d9ff5d05e7a3f83da8fa459a12db6f39c4f8c2956b3500a30b36bb926a5 typing.py
53
53
  d9f14cc3e01b289e47547342bb0d51c7532790290d591a688315a184cdf4114e uri.py
54
54
  59db6c876a908872eb5d40449e9dcb6ad30b253663076084adb78e16fadd5ef1 utils.py
55
- 4c93e014e70be31b07f08d8a890bb55778fc9121db39dfc458a3559e73aef121 version.py
55
+ fa82d6b7f153a88ea409283331194af48235ef365eece9cbc359d6d99bea5c4b version.py
@@ -1,2 +1,2 @@
1
- websockets==17.0.1
1
+ websockets==17.1
2
2
  Vendored by scripts/vendor_websockets.py — do not edit by hand.
@@ -11,10 +11,9 @@ from collections.abc import AsyncIterator, Generator, Sequence
11
11
  from types import TracebackType
12
12
  from typing import Any, Callable, Literal, cast
13
13
 
14
- from ..client import ClientProtocol, backoff
14
+ from ..client import ClientProtocol, backoff, process_exception
15
15
  from ..datastructures import Headers, HeadersLike
16
16
  from ..exceptions import (
17
- InvalidMessage,
18
17
  InvalidProxyMessage,
19
18
  InvalidProxyStatus,
20
19
  InvalidStatus,
@@ -28,7 +27,7 @@ from ..http11 import USER_AGENT, Response
28
27
  from ..protocol import CONNECTING, Event
29
28
  from ..proxy import Proxy, get_proxy, parse_proxy, prepare_connect_request
30
29
  from ..streams import StreamReader
31
- from ..typing import LoggerLike, Origin, Subprotocol
30
+ from ..typing import LoggerLike, Origin, PathLike, Subprotocol
32
31
  from ..uri import WebSocketURI, parse_uri
33
32
  from .connection import Connection
34
33
 
@@ -128,59 +127,14 @@ class ClientConnection(Connection):
128
127
  super().process_event(event)
129
128
 
130
129
 
131
- def process_exception(exc: Exception) -> Exception | None:
132
- """
133
- Determine whether a connection error is retryable or fatal.
134
-
135
- When reconnecting automatically with ``async for ... in connect(...)``, if a
136
- connection attempt fails, :func:`process_exception` is called to determine
137
- whether to retry connecting or to raise the exception.
138
-
139
- This function defines the default behavior, which is to retry on:
140
-
141
- * :exc:`EOFError`, :exc:`OSError`, :exc:`asyncio.TimeoutError`: network
142
- errors;
143
- * :exc:`~websockets.exceptions.InvalidStatus` when the status code is 500,
144
- 502, 503, or 504: server or proxy errors.
145
-
146
- All other exceptions are considered fatal.
147
-
148
- You can change this behavior with the ``process_exception`` argument of
149
- :func:`connect`.
150
-
151
- Return :obj:`None` if the exception is retryable i.e. when the error could
152
- be transient and trying to reconnect with the same parameters could succeed.
153
- The exception will be logged at the ``INFO`` level.
154
-
155
- Return an exception, either ``exc`` or a new exception, if the exception is
156
- fatal i.e. when trying to reconnect will most likely produce the same error.
157
- That exception will be raised, breaking out of the retry loop.
158
-
159
- """
160
- # This catches python-socks' ProxyConnectionError and ProxyTimeoutError.
161
- if isinstance(exc, (OSError, TimeoutError)):
162
- return None
163
- if isinstance(exc, InvalidMessage) and isinstance(exc.__cause__, EOFError):
164
- return None
165
- if isinstance(exc, InvalidStatus) and exc.response.status_code in [
166
- 500, # Internal Server Error
167
- 502, # Bad Gateway
168
- 503, # Service Unavailable
169
- 504, # Gateway Timeout
170
- ]:
171
- return None
172
- return exc
173
-
174
-
175
130
  # This is spelled in lower case because it's exposed as a callable in the API.
176
131
  class connect:
177
132
  """
178
133
  Connect to the WebSocket server at ``uri``.
179
134
 
180
- This coroutine returns a :class:`ClientConnection` instance, which you can
181
- use to send and receive messages.
182
-
183
- :func:`connect` may be used as an asynchronous context manager::
135
+ :func:`connect` should be treated as an asynchronous context manager
136
+ yielding a :class:`ClientConnection`, which can then receive and send
137
+ messages::
184
138
 
185
139
  from websockets.asyncio.client import connect
186
140
 
@@ -189,8 +143,8 @@ class connect:
189
143
 
190
144
  The connection is closed automatically when exiting the context.
191
145
 
192
- :func:`connect` can be used as an infinite asynchronous iterator to
193
- reconnect automatically on errors::
146
+ :func:`connect` can also be treated as an infinite asynchronous iterator
147
+ to reconnect automatically on errors::
194
148
 
195
149
  async for websocket in connect(...):
196
150
  try:
@@ -204,6 +158,13 @@ class connect:
204
158
 
205
159
  The connection is closed automatically after each iteration of the loop.
206
160
 
161
+ :func:`connect` can be awaited directly::
162
+
163
+ websocket = await connect(...)
164
+
165
+ In that case, you're responsible for closing the connection with
166
+ :meth:`ClientConnection.close` when no longer needed.
167
+
207
168
  Args:
208
169
  uri: URI of the WebSocket server.
209
170
  origin: Value of the ``Origin`` header, for servers that require it.
@@ -225,7 +186,8 @@ class connect:
225
186
  <../../topics/proxies>` for details.
226
187
  process_exception: When reconnecting automatically, tell whether an
227
188
  error is transient or fatal. The default behavior is defined by
228
- :func:`process_exception`. Refer to its documentation for details.
189
+ :func:`~websockets.client.process_exception`. Refer to its
190
+ documentation for details.
229
191
  open_timeout: Timeout for opening the connection in seconds.
230
192
  :obj:`None` disables the timeout.
231
193
  ping_interval: Interval between keepalive pings in seconds.
@@ -555,13 +517,7 @@ class connect:
555
517
 
556
518
  return new_uri
557
519
 
558
- # ... = await connect(...)
559
-
560
- def __await__(self) -> Generator[Any, None, ClientConnection]:
561
- # Create a suitable iterator by calling __await__ on a coroutine.
562
- return self.__await_impl__().__await__()
563
-
564
- async def __await_impl__(self) -> ClientConnection:
520
+ async def connect(self) -> ClientConnection:
565
521
  try:
566
522
  async with asyncio.timeout(self.open_timeout):
567
523
  for _ in range(MAX_REDIRECTS):
@@ -606,6 +562,12 @@ class connect:
606
562
  # Re-raise exception with an informative error message.
607
563
  raise TimeoutError("timed out during opening handshake") from exc
608
564
 
565
+ # ... = await connect(...)
566
+
567
+ def __await__(self) -> Generator[Any, None, ClientConnection]:
568
+ # Create a suitable iterator by calling __await__ on a coroutine.
569
+ return self.connect().__await__()
570
+
609
571
  # async with connect(...) as ...: ...
610
572
 
611
573
  async def __aenter__(self) -> ClientConnection:
@@ -668,7 +630,7 @@ class connect:
668
630
 
669
631
 
670
632
  def unix_connect(
671
- path: str | None = None,
633
+ path: PathLike | None = None,
672
634
  uri: str | None = None,
673
635
  **kwargs: Any,
674
636
  ) -> connect:
@@ -8,6 +8,7 @@ import random
8
8
  import struct
9
9
  import traceback
10
10
  import uuid
11
+ import weakref
11
12
  from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
12
13
  from types import TracebackType
13
14
  from typing import Any, Literal, Self, cast, overload
@@ -67,7 +68,7 @@ class Connection(asyncio.Protocol):
67
68
  # Inject reference to this instance in the protocol's logger.
68
69
  self.protocol.logger = logging.LoggerAdapter(
69
70
  self.protocol.logger,
70
- {"websocket": self},
71
+ {"websocket": weakref.proxy(self)},
71
72
  )
72
73
 
73
74
  # Copy attributes from the protocol for convenience.
@@ -1025,6 +1026,8 @@ class Connection(asyncio.Protocol):
1025
1026
 
1026
1027
  if self.keepalive_task is not None:
1027
1028
  self.keepalive_task.cancel()
1029
+ # Break reference cycle to allow immediate garbage collection.
1030
+ self.keepalive_task = None
1028
1031
 
1029
1032
  # If self.connection_lost_waiter isn't pending, that's a bug, because:
1030
1033
  # - it's set only here in connection_lost() which is called only once;
@@ -6,6 +6,7 @@ import urllib.parse
6
6
  from typing import Any, Awaitable, Callable, Literal
7
7
 
8
8
  from ..http11 import Request, Response
9
+ from ..typing import PathLike
9
10
  from .server import Server, ServerConnection, serve
10
11
 
11
12
 
@@ -30,7 +31,7 @@ except ImportError:
30
31
 
31
32
  def unix_route(
32
33
  url_map: Map,
33
- path: str | None = None,
34
+ path: PathLike | None = None,
34
35
  **kwargs: Any,
35
36
  ) -> Server:
36
37
  raise ImportError("unix_route() requires werkzeug")
@@ -155,7 +156,7 @@ else:
155
156
 
156
157
  def unix_route(
157
158
  url_map: Map,
158
- path: str | None = None,
159
+ path: PathLike | None = None,
159
160
  **kwargs: Any,
160
161
  ) -> Server:
161
162
  """
@@ -22,7 +22,7 @@ from ..headers import (
22
22
  from ..http11 import SERVER, Request, Response
23
23
  from ..protocol import CONNECTING, OPEN, Event
24
24
  from ..server import ServerProtocol
25
- from ..typing import LoggerLike, Origin, StatusLike, Subprotocol
25
+ from ..typing import LoggerLike, Origin, PathLike, StatusLike, Subprotocol
26
26
  from ..utils import get_socket_name
27
27
  from .connection import Connection, broadcast
28
28
 
@@ -769,7 +769,7 @@ def serve(
769
769
 
770
770
  def unix_serve(
771
771
  handler: Callable[[ServerConnection], Awaitable[None]],
772
- path: str | None = None,
772
+ path: PathLike | None = None,
773
773
  **kwargs: Any,
774
774
  ) -> Server:
775
775
  """
@@ -357,6 +357,55 @@ class ClientConnection(ClientProtocol):
357
357
  super().__init__(*args, **kwargs)
358
358
 
359
359
 
360
+ def process_exception(exc: Exception) -> Exception | None:
361
+ """
362
+ Determine whether a connection error is retryable or fatal.
363
+
364
+ When reconnecting automatically with ``async for ... in connect(...)``
365
+ (:mod:`asyncio`, :mod:`trio`) or ``for ... in reconnect(...)``
366
+ (:mod:`threading`), whenever a connection attempt fails,
367
+ :func:`process_exception` determines whether to retry connecting or to raise
368
+ the exception.
369
+
370
+ This function defines the default behavior, which is to retry on:
371
+
372
+ * :exc:`OSError` and :exc:`asyncio.TimeoutError`: network errors;
373
+ * :exc:`~websockets.exceptions.InvalidMessage` when it stems from an
374
+ :exc:`EOFError`: also network errors;
375
+ * :exc:`~websockets.exceptions.InvalidStatus` when the status code is 500,
376
+ 502, 503, or 504: server or proxy errors.
377
+
378
+ All other exceptions are considered fatal.
379
+
380
+ You can change this behavior with the ``process_exception`` argument of
381
+ :func:`~websockets.asyncio.client.connect` (:mod:`asyncio`),
382
+ :func:`~websockets.trio.client.connect` (:mod:`trio`), or
383
+ :func:`~websockets.sync.client.reconnect` (:mod:`threading`).
384
+
385
+ Return :obj:`None` if the exception is retryable i.e. when the error could
386
+ be transient and trying to reconnect with the same parameters could succeed.
387
+ The exception will be logged at the ``INFO`` level.
388
+
389
+ Return an exception, either ``exc`` or a new exception, if the exception is
390
+ fatal i.e. when trying to reconnect will most likely produce the same error.
391
+ That exception will be raised, breaking out of the retry loop.
392
+
393
+ """
394
+ # This catches python-socks' ProxyConnectionError and ProxyTimeoutError.
395
+ if isinstance(exc, (OSError, TimeoutError)):
396
+ return None
397
+ if isinstance(exc, InvalidMessage) and isinstance(exc.__cause__, EOFError):
398
+ return None
399
+ if isinstance(exc, InvalidStatus) and exc.response.status_code in [
400
+ 500, # Internal Server Error
401
+ 502, # Bad Gateway
402
+ 503, # Service Unavailable
403
+ 504, # Gateway Timeout
404
+ ]:
405
+ return None
406
+ return exc
407
+
408
+
360
409
  BACKOFF_INITIAL_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_INITIAL_DELAY", "5"))
361
410
  BACKOFF_MIN_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_MIN_DELAY", "3.1"))
362
411
  BACKOFF_MAX_DELAY = float(os.environ.get("WEBSOCKETS_BACKOFF_MAX_DELAY", "90.0"))
@@ -11,6 +11,7 @@ import time
11
11
  import traceback
12
12
  import uuid
13
13
  import warnings
14
+ import weakref
14
15
  from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
15
16
  from typing import Any, Callable, Deque, cast
16
17
 
@@ -205,7 +206,10 @@ class WebSocketCommonProtocol(asyncio.Protocol):
205
206
  # Logger or LoggerAdapter for this connection.
206
207
  if logger is None:
207
208
  logger = logging.getLogger("websockets.protocol")
208
- self.logger: LoggerLike = logging.LoggerAdapter(logger, {"websocket": self})
209
+ self.logger: LoggerLike = logging.LoggerAdapter(
210
+ logger,
211
+ {"websocket": weakref.proxy(self)},
212
+ )
209
213
  """Logger for this connection."""
210
214
 
211
215
  # Track if DEBUG is enabled. Shortcut logging calls if it isn't.
@@ -1278,6 +1282,8 @@ class WebSocketCommonProtocol(asyncio.Protocol):
1278
1282
  # Cancel the keepalive ping task.
1279
1283
  if hasattr(self, "keepalive_ping_task"):
1280
1284
  self.keepalive_ping_task.cancel()
1285
+ # Break reference cycle to allow immediate garbage collection.
1286
+ del self.keepalive_ping_task
1281
1287
 
1282
1288
  # A client should wait for a TCP close from the server.
1283
1289
  if self.is_client and hasattr(self, "transfer_data_task"):