prefect-client 3.7.9.dev7__tar.gz → 3.8.1.dev1__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 (453) hide show
  1. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/PKG-INFO +1 -1
  2. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/AGENTS.md +1 -0
  3. prefect_client-3.8.1.dev1/src/prefect/_build_info.py +5 -0
  4. prefect_client-3.8.1.dev1/src/prefect/concurrency/context.py +53 -0
  5. prefect_client-3.8.1.dev1/src/prefect/concurrency/v1/context.py +56 -0
  6. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/clients.py +54 -11
  7. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/subscribers.py +46 -22
  8. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/exceptions.py +4 -0
  9. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/futures.py +11 -1
  10. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/clients.py +39 -12
  11. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/_types.py +1 -0
  12. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/database.py +6 -0
  13. prefect_client-3.7.9.dev7/src/prefect/_build_info.py +0 -5
  14. prefect_client-3.7.9.dev7/src/prefect/concurrency/context.py +0 -25
  15. prefect_client-3.7.9.dev7/src/prefect/concurrency/v1/context.py +0 -29
  16. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/.gitignore +0 -0
  17. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/LICENSE +0 -0
  18. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/README.md +0 -0
  19. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/hatch_build.py +0 -0
  20. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/pyproject.toml +0 -0
  21. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/.prefectignore +0 -0
  22. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/__init__.py +0 -0
  23. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/__main__.py +0 -0
  24. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/__init__.py +0 -0
  25. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/_launchers.py +0 -0
  26. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
  27. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
  28. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
  29. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
  30. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  31. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
  32. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
  33. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
  34. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/client.py +0 -0
  35. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
  36. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_flow_run_suspension.py +0 -0
  37. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/__init__.py +0 -0
  38. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/_logging.py +0 -0
  39. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
  40. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  41. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/client.py +0 -0
  42. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
  43. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
  44. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
  45. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/events.py +0 -0
  46. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
  47. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
  48. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/service.py +0 -0
  49. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/ast_utils.py +0 -0
  50. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/buildx.py +0 -0
  51. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
  52. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  53. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
  54. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
  55. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  56. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  57. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
  58. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
  59. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
  60. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
  61. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
  62. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  63. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  64. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
  65. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
  66. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
  67. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
  68. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
  69. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/control_listener.py +0 -0
  70. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/deprecated.py +0 -0
  71. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/engine.py +0 -0
  72. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/git.py +0 -0
  73. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  74. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/installation.py +0 -0
  75. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/integrations.py +0 -0
  76. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/launchers.py +0 -0
  77. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/lazy.py +0 -0
  78. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/metrics.py +0 -0
  79. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/observability.py +0 -0
  80. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/observers.py +0 -0
  81. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/__init__.py +0 -0
  82. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/apply.py +0 -0
  83. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/collections.py +0 -0
  84. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  85. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/manager.py +0 -0
  86. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/spec.py +0 -0
  87. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/startup.py +0 -0
  88. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
  89. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
  90. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  91. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  92. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  93. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pytz.py +0 -0
  94. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/result_records.py +0 -0
  95. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/retries.py +0 -0
  96. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schema.py +0 -0
  97. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
  98. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/_registry.py +0 -0
  99. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
  100. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
  101. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
  102. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
  103. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  104. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/states.py +0 -0
  105. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/testing.py +0 -0
  106. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/urls.py +0 -0
  107. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/uuid7.py +0 -0
  108. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/version_checking.py +0 -0
  109. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/versioning.py +0 -0
  110. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/waiters.py +0 -0
  111. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/websockets.py +0 -0
  112. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/__init__.py +0 -0
  113. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/fetcher.py +0 -0
  114. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/generator.py +0 -0
  115. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/models.py +0 -0
  116. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/naming.py +0 -0
  117. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/renderer.py +0 -0
  118. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
  119. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
  120. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  121. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/types.py +0 -0
  122. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/unions.py +0 -0
  123. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
  124. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
  125. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/agent.py +0 -0
  126. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/analytics/__init__.py +0 -0
  127. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/artifacts.py +0 -0
  128. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/__init__.py +0 -0
  129. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/core.py +0 -0
  130. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/materialize.py +0 -0
  131. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/automations.py +0 -0
  132. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/AGENTS.md +0 -0
  133. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/__init__.py +0 -0
  134. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/abstract.py +0 -0
  135. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/core.py +0 -0
  136. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/fields.py +0 -0
  137. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/notifications.py +0 -0
  138. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/redis.py +0 -0
  139. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/system.py +0 -0
  140. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/webhook.py +0 -0
  141. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/__init__.py +0 -0
  142. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_file_collector.py +0 -0
  143. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_ignore_filter.py +0 -0
  144. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_path_resolver.py +0 -0
  145. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_zip_builder.py +0 -0
  146. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_zip_extractor.py +0 -0
  147. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/execute.py +0 -0
  148. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/cache_policies.py +0 -0
  149. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/AGENTS.md +0 -0
  150. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/__init__.py +0 -0
  151. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/attribution.py +0 -0
  152. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/base.py +0 -0
  153. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/cloud.py +0 -0
  154. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/collections.py +0 -0
  155. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/constants.py +0 -0
  156. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
  157. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  158. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  159. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  160. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
  161. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  162. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  163. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  164. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  165. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  166. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  167. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  168. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  169. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  170. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  171. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  172. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
  173. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  174. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  175. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  176. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
  177. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  178. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
  179. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  180. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
  181. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  182. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  183. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/base.py +0 -0
  184. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/routes.py +0 -0
  185. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/__init__.py +0 -0
  186. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/actions.py +0 -0
  187. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/events.py +0 -0
  188. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/filters.py +0 -0
  189. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/objects.py +0 -0
  190. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/responses.py +0 -0
  191. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/schedules.py +0 -0
  192. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/sorting.py +0 -0
  193. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/worker_channel.py +0 -0
  194. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/subscriptions.py +0 -0
  195. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/types/__init__.py +0 -0
  196. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  197. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/utilities.py +0 -0
  198. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/AGENTS.md +0 -0
  199. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/__init__.py +0 -0
  200. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
  201. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_events.py +0 -0
  202. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_leases.py +0 -0
  203. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_sync.py +0 -0
  204. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/asyncio.py +0 -0
  205. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/services.py +0 -0
  206. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/sync.py +0 -0
  207. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
  208. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  209. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
  210. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
  211. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/services.py +0 -0
  212. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
  213. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/context.py +0 -0
  214. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/AGENTS.md +0 -0
  215. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/__init__.py +0 -0
  216. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/base.py +0 -0
  217. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/deployments.py +0 -0
  218. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/flow_runs.py +0 -0
  219. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/runner.py +0 -0
  220. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/schedules.py +0 -0
  221. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
  222. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/core.py +0 -0
  223. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/pull.py +0 -0
  224. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/utility.py +0 -0
  225. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/__init__.py +0 -0
  226. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/_buildx.py +0 -0
  227. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/docker_image.py +0 -0
  228. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/engine.py +0 -0
  229. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/AGENTS.md +0 -0
  230. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/__init__.py +0 -0
  231. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/actions.py +0 -0
  232. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/filters.py +0 -0
  233. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/related.py +0 -0
  234. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/__init__.py +0 -0
  235. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/automations.py +0 -0
  236. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  237. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/events.py +0 -0
  238. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/labelling.py +0 -0
  239. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/utilities.py +0 -0
  240. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/worker.py +0 -0
  241. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/filesystems.py +0 -0
  242. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flow_engine.py +0 -0
  243. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flow_runs.py +0 -0
  244. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flows.py +0 -0
  245. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/__init__.py +0 -0
  246. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/base.py +0 -0
  247. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  248. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  249. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  250. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  251. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  252. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  253. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/__init__.py +0 -0
  254. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/actions.py +0 -0
  255. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/run_input.py +0 -0
  256. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/__init__.py +0 -0
  257. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/_filelock.py +0 -0
  258. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/filesystem.py +0 -0
  259. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/memory.py +0 -0
  260. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/protocol.py +0 -0
  261. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/AGENTS.md +0 -0
  262. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/__init__.py +0 -0
  263. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/configuration.py +0 -0
  264. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/filters.py +0 -0
  265. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/formatters.py +0 -0
  266. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/handlers.py +0 -0
  267. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/highlighters.py +0 -0
  268. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/loggers.py +0 -0
  269. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/logging.yml +0 -0
  270. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/main.py +0 -0
  271. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/plugins.py +0 -0
  272. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/py.typed +0 -0
  273. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/results.py +0 -0
  274. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/AGENTS.md +0 -0
  275. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/__init__.py +0 -0
  276. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_cancel_finalizer.py +0 -0
  277. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
  278. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_control_channel.py +0 -0
  279. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
  280. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_event_emitter.py +0 -0
  281. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
  282. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
  283. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_hook_runner.py +0 -0
  284. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_limit_manager.py +0 -0
  285. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_process_manager.py +0 -0
  286. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  287. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
  288. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_direct.py +0 -0
  289. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_engine.py +0 -0
  290. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_state_proposer.py +0 -0
  291. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_workspace_resolver.py +0 -0
  292. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_workspace_starter.py +0 -0
  293. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/runner.py +0 -0
  294. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/server.py +0 -0
  295. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/storage.py +0 -0
  296. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/__init__.py +0 -0
  297. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/deployment.py +0 -0
  298. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/flow_run.py +0 -0
  299. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/task_run.py +0 -0
  300. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/schedules.py +0 -0
  301. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/serializers.py +0 -0
  302. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/__init__.py +0 -0
  303. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/_ui_static.py +0 -0
  304. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/admin.py +0 -0
  305. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/artifacts.py +0 -0
  306. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/automations.py +0 -0
  307. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/background_workers.py +0 -0
  308. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
  309. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_documents.py +0 -0
  310. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_schemas.py +0 -0
  311. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_types.py +0 -0
  312. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/clients.py +0 -0
  313. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/collections.py +0 -0
  314. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  315. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
  316. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  317. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/csrf_token.py +0 -0
  318. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/dependencies.py +0 -0
  319. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/deployments.py +0 -0
  320. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/events.py +0 -0
  321. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
  322. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flow_runs.py +0 -0
  323. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flows.py +0 -0
  324. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/logs.py +0 -0
  325. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/middleware.py +0 -0
  326. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/root.py +0 -0
  327. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/run_history.py +0 -0
  328. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/saved_searches.py +0 -0
  329. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/server.py +0 -0
  330. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  331. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_run_states.py +0 -0
  332. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_runs.py +0 -0
  333. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_workers.py +0 -0
  334. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/templates.py +0 -0
  335. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
  336. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
  337. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/flows.py +0 -0
  338. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
  339. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
  340. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/validation.py +0 -0
  341. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/variables.py +0 -0
  342. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/work_queues.py +0 -0
  343. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/workers.py +0 -0
  344. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/AGENTS.md +0 -0
  345. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/__init__.py +0 -0
  346. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/base.py +0 -0
  347. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/constants.py +0 -0
  348. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/context.py +0 -0
  349. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/legacy.py +0 -0
  350. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/__init__.py +0 -0
  351. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/_defaults.py +0 -0
  352. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/api.py +0 -0
  353. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/cli.py +0 -0
  354. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/client.py +0 -0
  355. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/cloud.py +0 -0
  356. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/deployments.py +0 -0
  357. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/events.py +0 -0
  358. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/experiments.py +0 -0
  359. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/flows.py +0 -0
  360. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/internal.py +0 -0
  361. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/logging.py +0 -0
  362. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/plugins.py +0 -0
  363. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/results.py +0 -0
  364. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/root.py +0 -0
  365. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/runner.py +0 -0
  366. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
  367. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/api.py +0 -0
  368. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
  369. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
  370. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/docket.py +0 -0
  371. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
  372. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/events.py +0 -0
  373. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  374. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/logs.py +0 -0
  375. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/root.py +0 -0
  376. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/services.py +0 -0
  377. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
  378. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/ui.py +0 -0
  379. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/worker_channel.py +0 -0
  380. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/tasks.py +0 -0
  381. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/telemetry.py +0 -0
  382. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/testing.py +0 -0
  383. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/worker.py +0 -0
  384. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/profiles.py +0 -0
  385. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/profiles.toml +0 -0
  386. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/sources.py +0 -0
  387. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/states.py +0 -0
  388. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_engine.py +0 -0
  389. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_runners.py +0 -0
  390. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_runs.py +0 -0
  391. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_worker.py +0 -0
  392. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/tasks.py +0 -0
  393. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/telemetry/__init__.py +0 -0
  394. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
  395. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/transactions.py +0 -0
  396. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/__init__.py +0 -0
  397. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/_concurrency.py +0 -0
  398. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/_datetime.py +0 -0
  399. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/entrypoint.py +0 -0
  400. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/names.py +0 -0
  401. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/AGENTS.md +0 -0
  402. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/__init__.py +0 -0
  403. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/annotations.py +0 -0
  404. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  405. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  406. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/callables/AGENTS.md +0 -0
  407. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/callables/__init__.py +0 -0
  408. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/collections.py +0 -0
  409. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/compat.py +0 -0
  410. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/context.py +0 -0
  411. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/dispatch.py +0 -0
  412. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/dockerutils.py +0 -0
  413. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/engine/AGENTS.md +0 -0
  414. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/engine/__init__.py +0 -0
  415. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  416. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/filesystem/__init__.py +0 -0
  417. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/generics.py +0 -0
  418. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/hashing.py +0 -0
  419. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/importtools.py +0 -0
  420. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/math.py +0 -0
  421. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/names.py +0 -0
  422. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  423. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/processutils/__init__.py +0 -0
  424. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/pydantic.py +0 -0
  425. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/render_swagger.py +0 -0
  426. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  427. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  428. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  429. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
  430. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/services.py +0 -0
  431. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/slugify.py +0 -0
  432. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/templating/AGENTS.md +0 -0
  433. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/templating/__init__.py +0 -0
  434. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/text.py +0 -0
  435. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/timeout.py +0 -0
  436. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/urls.py +0 -0
  437. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/visualization.py +0 -0
  438. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/variables.py +0 -0
  439. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/AGENTS.md +0 -0
  440. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/__init__.py +0 -0
  441. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_cleanup.py +0 -0
  442. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_cleanup_handlers.py +0 -0
  443. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  444. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  445. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_state.py +0 -0
  446. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  447. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  448. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/base.py +0 -0
  449. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/block.py +0 -0
  450. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/cloud.py +0 -0
  451. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/process.py +0 -0
  452. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/server.py +0 -0
  453. {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.7.9.dev7
3
+ Version: 3.8.1.dev1
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -23,6 +23,7 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
23
23
  - **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
24
24
  - **Set run metadata before state transitions.** Any run attribute that event subscribers observe at the moment of a state transition (e.g., custom `flow_run_name`) must be persisted to the server *before* `set_state()` is called for that transition. Metadata set after the call appears stale to subscribers of that state event.
25
25
  - **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
26
+ - **Event and log WebSocket subscribers are parallel implementations.** `events/clients.py::PrefectEventSubscriber` and `logging/clients.py::PrefectLogsSubscriber` duplicate the same reconnect/backoff/dedup logic, including the `reconnect_on_clean_close` option (used by `events/subscribers.py::FlowRunSubscriber` so a clean disconnect doesn't hide a terminal event). Mirror any reconnection-behavior change across both.
26
27
  - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
27
28
  - **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
28
29
  - **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.8.1.dev1"
3
+ __build_date__ = "2026-07-25 08:45:04.608753+00:00"
4
+ __git_commit__ = "d2d873b2e1d8747a23e1719882da81d65f2400bb"
5
+ __dirty__ = False
@@ -0,0 +1,53 @@
1
+ import logging
2
+ from contextvars import ContextVar
3
+ from typing import Any, ClassVar
4
+ from uuid import UUID
5
+
6
+ from typing_extensions import Self
7
+
8
+ from prefect.client.orchestration import get_client
9
+ from prefect.context import ContextModel, Field
10
+ from prefect.logging.loggers import get_logger, get_run_logger
11
+
12
+
13
+ def _cleanup_logger() -> "logging.Logger | logging.LoggerAdapter[logging.Logger]":
14
+ try:
15
+ # Use a run logger if available so failures reach the run logs
16
+ return get_run_logger()
17
+ except Exception:
18
+ return get_logger("concurrency")
19
+
20
+
21
+ class ConcurrencyContext(ContextModel):
22
+ __var__: ClassVar[ContextVar[Self]] = ContextVar("concurrency")
23
+
24
+ # Track the leases that have been acquired but were not able to be released
25
+ # due to cancellation or some other error. These leases are revoked when
26
+ # the context manager exits.
27
+ cleanup_lease_ids: list[UUID] = Field(default_factory=lambda: [])
28
+
29
+ def __exit__(self, *exc_info: Any) -> None:
30
+ # Releasing these leases is best-effort: a failure for one lease must not
31
+ # strand the others or skip the context teardown below.
32
+ if self.cleanup_lease_ids:
33
+ logger = _cleanup_logger()
34
+ try:
35
+ with get_client(sync_client=True) as client:
36
+ for lease_id in self.cleanup_lease_ids:
37
+ try:
38
+ client.release_concurrency_slots_with_lease(
39
+ lease_id=lease_id
40
+ )
41
+ except Exception:
42
+ logger.warning(
43
+ "Failed to release concurrency lease %s during cleanup",
44
+ lease_id,
45
+ exc_info=True,
46
+ )
47
+ except Exception:
48
+ logger.warning(
49
+ "Failed to release concurrency leases during cleanup",
50
+ exc_info=True,
51
+ )
52
+
53
+ return super().__exit__(*exc_info)
@@ -0,0 +1,56 @@
1
+ import logging
2
+ from contextvars import ContextVar
3
+ from typing import Any, ClassVar
4
+ from uuid import UUID
5
+
6
+ from typing_extensions import Self
7
+
8
+ from prefect.client.orchestration import get_client
9
+ from prefect.context import ContextModel, Field
10
+ from prefect.logging.loggers import get_logger, get_run_logger
11
+
12
+
13
+ def _cleanup_logger() -> "logging.Logger | logging.LoggerAdapter[logging.Logger]":
14
+ try:
15
+ # Use a run logger if available so failures reach the run logs
16
+ return get_run_logger()
17
+ except Exception:
18
+ return get_logger("concurrency")
19
+
20
+
21
+ class ConcurrencyContext(ContextModel):
22
+ __var__: ClassVar[ContextVar[Self]] = ContextVar("concurrency_v1")
23
+
24
+ # Track the limits that have been acquired but were not able to be released
25
+ # due to cancellation or some other error. These limits are released when
26
+ # the context manager exits.
27
+ cleanup_slots: list[tuple[list[str], float, UUID]] = Field(default_factory=list)
28
+
29
+ def __exit__(self, *exc_info: Any) -> None:
30
+ # Releasing these slots is best-effort: a failure for one entry must not
31
+ # strand the others or skip the context teardown below.
32
+ if self.cleanup_slots:
33
+ logger = _cleanup_logger()
34
+ try:
35
+ with get_client(sync_client=True) as client:
36
+ for names, occupancy_seconds, task_run_id in self.cleanup_slots:
37
+ try:
38
+ client.decrement_v1_concurrency_slots(
39
+ names=names,
40
+ occupancy_seconds=occupancy_seconds,
41
+ task_run_id=task_run_id,
42
+ )
43
+ except Exception:
44
+ logger.warning(
45
+ "Failed to release concurrency slots %s for task run %s during cleanup",
46
+ names,
47
+ task_run_id,
48
+ exc_info=True,
49
+ )
50
+ except Exception:
51
+ logger.warning(
52
+ "Failed to release concurrency slots during cleanup",
53
+ exc_info=True,
54
+ )
55
+
56
+ return super().__exit__(*exc_info)
@@ -136,16 +136,21 @@ def get_events_client(
136
136
  def get_events_subscriber(
137
137
  filter: Optional["EventFilter"] = None,
138
138
  reconnection_attempts: int = 10,
139
+ reconnect_on_clean_close: bool = False,
139
140
  ) -> "PrefectEventSubscriber":
140
141
  api_url = PREFECT_API_URL.value()
141
142
 
142
143
  if isinstance(api_url, str) and api_url.startswith(PREFECT_CLOUD_API_URL.value()):
143
144
  return PrefectCloudEventSubscriber(
144
- filter=filter, reconnection_attempts=reconnection_attempts
145
+ filter=filter,
146
+ reconnection_attempts=reconnection_attempts,
147
+ reconnect_on_clean_close=reconnect_on_clean_close,
145
148
  )
146
149
  elif api_url:
147
150
  return PrefectEventSubscriber(
148
- filter=filter, reconnection_attempts=reconnection_attempts
151
+ filter=filter,
152
+ reconnection_attempts=reconnection_attempts,
153
+ reconnect_on_clean_close=reconnect_on_clean_close,
149
154
  )
150
155
  elif PREFECT_SERVER_ALLOW_EPHEMERAL_MODE:
151
156
  from prefect.server.api.server import SubprocessASGIServer
@@ -156,6 +161,7 @@ def get_events_subscriber(
156
161
  api_url=server.api_url,
157
162
  filter=filter,
158
163
  reconnection_attempts=reconnection_attempts,
164
+ reconnect_on_clean_close=reconnect_on_clean_close,
159
165
  )
160
166
  else:
161
167
  raise ValueError(
@@ -677,6 +683,10 @@ class PrefectEventSubscriber:
677
683
  """
678
684
  Subscribes to a Prefect event stream, yielding events as they occur.
679
685
 
686
+ Abnormal disconnects are retried. Clean disconnects end iteration unless
687
+ `reconnect_on_clean_close` is enabled. Event backfill and ID-based
688
+ deduplication cover the reconnect window.
689
+
680
690
  Example:
681
691
 
682
692
  from prefect.events.clients import PrefectEventSubscriber
@@ -693,6 +703,7 @@ class PrefectEventSubscriber:
693
703
  _websocket: Optional[ClientConnection]
694
704
  _filter: "EventFilter"
695
705
  _seen_events: MutableMapping[UUID, bool]
706
+ _backfill_since: Optional[prefect.types._datetime.DateTime]
696
707
 
697
708
  _api_key: Optional[str]
698
709
  _auth_token: Optional[str]
@@ -702,6 +713,7 @@ class PrefectEventSubscriber:
702
713
  api_url: Optional[str] = None,
703
714
  filter: Optional["EventFilter"] = None,
704
715
  reconnection_attempts: int = 10,
716
+ reconnect_on_clean_close: bool = False,
705
717
  ):
706
718
  """
707
719
  Args:
@@ -709,6 +721,8 @@ class PrefectEventSubscriber:
709
721
  api_key: The API of an actor with the manage_events scope
710
722
  reconnection_attempts: When the client is disconnected, how many times
711
723
  the client should attempt to reconnect
724
+ reconnect_on_clean_close: Whether to reconnect when the server closes
725
+ the connection normally instead of ending iteration
712
726
  """
713
727
  self._api_key = None
714
728
  auth_string = get_current_settings().api.auth_string
@@ -725,6 +739,7 @@ class PrefectEventSubscriber:
725
739
 
726
740
  self._filter = filter or EventFilter() # type: ignore[call-arg]
727
741
  self._seen_events = TTLCache(maxsize=SEEN_EVENTS_SIZE, ttl=SEEN_EVENTS_TTL)
742
+ self._backfill_since = None
728
743
 
729
744
  socket_url = events_out_socket_from_api_url(api_url)
730
745
 
@@ -736,6 +751,7 @@ class PrefectEventSubscriber:
736
751
  )
737
752
  self._websocket = None
738
753
  self._reconnection_attempts = reconnection_attempts
754
+ self._reconnect_on_clean_close = reconnect_on_clean_close
739
755
  if self._reconnection_attempts < 0:
740
756
  raise ValueError("reconnection_attempts must be a non-negative integer")
741
757
 
@@ -808,9 +824,13 @@ class PrefectEventSubscriber:
808
824
 
809
825
  from prefect.events.filters import EventOccurredFilter
810
826
 
827
+ current_time = prefect.types._datetime.now("UTC")
828
+ if self._backfill_since is None:
829
+ self._backfill_since = current_time - timedelta(minutes=1)
830
+
811
831
  self._filter.occurred = EventOccurredFilter(
812
- since=prefect.types._datetime.now("UTC") - timedelta(minutes=1),
813
- until=prefect.types._datetime.now("UTC") + timedelta(days=365),
832
+ since=self._backfill_since,
833
+ until=current_time + timedelta(days=365),
814
834
  )
815
835
 
816
836
  logger.debug(" filtering events since %s...", self._filter.occurred.since)
@@ -841,6 +861,7 @@ class PrefectEventSubscriber:
841
861
  async def __anext__(self) -> Event:
842
862
  assert self._reconnection_attempts >= 0
843
863
  consecutive_failures = 0
864
+ consecutive_clean_closes = 0
844
865
  while consecutive_failures <= self._reconnection_attempts:
845
866
  try:
846
867
  # If we're here and the websocket is None, then we've had a failure in a
@@ -865,25 +886,39 @@ class PrefectEventSubscriber:
865
886
  if event.id in self._seen_events:
866
887
  continue
867
888
  self._seen_events[event.id] = True
889
+ replay_since = event.occurred - timedelta(minutes=1)
890
+ if (
891
+ self._backfill_since is None
892
+ or replay_since > self._backfill_since
893
+ ):
894
+ self._backfill_since = replay_since
868
895
 
869
896
  try:
870
897
  return event
871
898
  finally:
872
899
  EVENTS_OBSERVED.labels(self.client_name).inc()
873
- except ConnectionClosedOK:
874
- logger.debug('Connection closed with "OK" status')
875
- raise StopAsyncIteration
876
- except RETRYABLE_EXCEPTIONS:
900
+ except RETRYABLE_EXCEPTIONS as exc:
901
+ if isinstance(exc, ConnectionClosedOK):
902
+ if not self._reconnect_on_clean_close:
903
+ logger.debug('Connection closed with "OK" status')
904
+ raise StopAsyncIteration
905
+ consecutive_clean_closes += 1
906
+
877
907
  consecutive_failures += 1
908
+ attempts = (
909
+ consecutive_clean_closes
910
+ if isinstance(exc, ConnectionClosedOK)
911
+ else consecutive_failures
912
+ )
878
913
  logger.debug(
879
914
  "Retryable error with %s/%s attempts",
880
- consecutive_failures,
915
+ attempts,
881
916
  self._reconnection_attempts,
882
917
  )
883
- if consecutive_failures > self._reconnection_attempts:
918
+ if attempts > self._reconnection_attempts:
884
919
  raise
885
920
 
886
- if consecutive_failures > 2:
921
+ if attempts > 2:
887
922
  # let the first two attempts happen quickly in case this is just
888
923
  # a standard load balancer timeout, but after that, just take a
889
924
  # beat to let things come back around.
@@ -898,6 +933,7 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
898
933
  api_key: Optional[str] = None,
899
934
  filter: Optional["EventFilter"] = None,
900
935
  reconnection_attempts: int = 10,
936
+ reconnect_on_clean_close: bool = False,
901
937
  ):
902
938
  """
903
939
  Args:
@@ -905,6 +941,8 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
905
941
  api_key: The API of an actor with the manage_events scope
906
942
  reconnection_attempts: When the client is disconnected, how many times
907
943
  the client should attempt to reconnect
944
+ reconnect_on_clean_close: Whether to reconnect when the server closes
945
+ the connection normally instead of ending iteration
908
946
  """
909
947
  api_url, api_key = _get_api_url_and_key(api_url, api_key)
910
948
 
@@ -912,6 +950,7 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
912
950
  api_url=api_url,
913
951
  filter=filter,
914
952
  reconnection_attempts=reconnection_attempts,
953
+ reconnect_on_clean_close=reconnect_on_clean_close,
915
954
  )
916
955
 
917
956
  self._api_key = api_key
@@ -924,6 +963,7 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
924
963
  api_key: Optional[str] = None,
925
964
  filter: Optional["EventFilter"] = None,
926
965
  reconnection_attempts: int = 10,
966
+ reconnect_on_clean_close: bool = False,
927
967
  ):
928
968
  """
929
969
  Args:
@@ -931,6 +971,8 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
931
971
  api_key: The API of an actor with the manage_events scope
932
972
  reconnection_attempts: When the client is disconnected, how many times
933
973
  the client should attempt to reconnect
974
+ reconnect_on_clean_close: Whether to reconnect when the server closes
975
+ the connection normally instead of ending iteration
934
976
  """
935
977
  api_url, api_key = _get_api_url_and_key(api_url, api_key)
936
978
 
@@ -940,6 +982,7 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
940
982
  api_url=account_api_url,
941
983
  filter=filter,
942
984
  reconnection_attempts=reconnection_attempts,
985
+ reconnect_on_clean_close=reconnect_on_clean_close,
943
986
  )
944
987
 
945
988
  self._api_key = api_key
@@ -33,6 +33,9 @@ class FlowRunSubscriber:
33
33
  is received, the event subscription stops but log subscription continues for a
34
34
  configurable timeout to catch any straggler logs.
35
35
 
36
+ The underlying event and log subscribers own reconnection behavior. If either
37
+ exhausts its retries or fails for another reason, that error is propagated.
38
+
36
39
  Example:
37
40
  ```python
38
41
  from prefect.events.subscribers import FlowRunSubscriber
@@ -47,7 +50,7 @@ class FlowRunSubscriber:
47
50
  """
48
51
 
49
52
  _flow_run_id: UUID
50
- _queue: asyncio.Queue[Union[Log, Event, None]]
53
+ _queue: asyncio.Queue[Union[Log, Event, Exception, None]]
51
54
  _tasks: list[asyncio.Task[None]]
52
55
  _flow_completed: bool
53
56
  _straggler_timeout: int
@@ -91,10 +94,14 @@ class FlowRunSubscriber:
91
94
  async def __aenter__(self) -> Self:
92
95
  """Enter the async context manager"""
93
96
  self._logs_subscriber = get_logs_subscriber(
94
- filter=self._log_filter, reconnection_attempts=self._reconnection_attempts
97
+ filter=self._log_filter,
98
+ reconnection_attempts=self._reconnection_attempts,
99
+ reconnect_on_clean_close=True,
95
100
  )
96
101
  self._events_subscriber = get_events_subscriber(
97
- filter=self._event_filter, reconnection_attempts=self._reconnection_attempts
102
+ filter=self._event_filter,
103
+ reconnection_attempts=self._reconnection_attempts,
104
+ reconnect_on_clean_close=True,
98
105
  )
99
106
 
100
107
  await self._logs_subscriber.__aenter__()
@@ -122,6 +129,22 @@ class FlowRunSubscriber:
122
129
  await self._logs_subscriber.__aexit__(exc_type, exc_val, exc_tb)
123
130
  await self._events_subscriber.__aexit__(exc_type, exc_val, exc_tb)
124
131
 
132
+ def _is_terminal_event(self, event: Event) -> bool:
133
+ """Whether an event marks the flow run reaching a terminal state"""
134
+ if event.resource.id != f"prefect.flow-run.{self._flow_run_id}":
135
+ return False
136
+
137
+ state_type_str = event.resource.get("prefect.state-type")
138
+ if not state_type_str and "validated_state" in event.payload:
139
+ state_type_str = event.payload["validated_state"].get("type")
140
+ if not state_type_str:
141
+ return False
142
+
143
+ try:
144
+ return StateType(state_type_str) in TERMINAL_STATES
145
+ except ValueError:
146
+ return False
147
+
125
148
  def __aiter__(self) -> Self:
126
149
  """Return self as an async iterator"""
127
150
  return self
@@ -142,6 +165,8 @@ class FlowRunSubscriber:
142
165
  if item is None:
143
166
  self._sentinels_received += 1
144
167
  continue
168
+ if isinstance(item, Exception):
169
+ raise item
145
170
 
146
171
  return item
147
172
 
@@ -154,8 +179,13 @@ class FlowRunSubscriber:
154
179
  await self._queue.put(log)
155
180
  except asyncio.CancelledError:
156
181
  pass
157
- except Exception:
158
- pass
182
+ except Exception as exc:
183
+ await self._queue.put(exc)
184
+ else:
185
+ if not self._flow_completed:
186
+ await self._queue.put(
187
+ ConnectionError("Flow run logs stream closed unexpectedly")
188
+ )
159
189
  finally:
160
190
  await self._queue.put(None)
161
191
 
@@ -164,23 +194,17 @@ class FlowRunSubscriber:
164
194
  try:
165
195
  async for event in self._events_subscriber:
166
196
  await self._queue.put(event)
167
-
168
- # Check if this is a terminal state event for our flow run
169
- if event.resource.id == f"prefect.flow-run.{self._flow_run_id}":
170
- # Get state type from event resource or payload
171
- state_type_str = event.resource.get("prefect.state-type")
172
- if not state_type_str and "validated_state" in event.payload:
173
- state_type_str = event.payload["validated_state"].get("type")
174
-
175
- if state_type_str:
176
- try:
177
- state_type = StateType(state_type_str)
178
- if state_type in TERMINAL_STATES:
179
- self._flow_completed = True
180
- break
181
- except ValueError:
182
- pass
183
- except Exception:
197
+ if self._is_terminal_event(event):
198
+ self._flow_completed = True
199
+ break
200
+ except asyncio.CancelledError:
184
201
  pass
202
+ except Exception as exc:
203
+ await self._queue.put(exc)
204
+ else:
205
+ if not self._flow_completed:
206
+ await self._queue.put(
207
+ ConnectionError("Flow run events stream closed unexpectedly")
208
+ )
185
209
  finally:
186
210
  await self._queue.put(None)
@@ -425,6 +425,10 @@ class FlowRunWaitTimeout(PrefectException):
425
425
  """Raised when a flow run takes longer than a given timeout"""
426
426
 
427
427
 
428
+ class FlowRunWatchError(PrefectException):
429
+ """Raised when watching a flow run stops before it reaches a terminal state"""
430
+
431
+
428
432
  class PrefectImportError(ImportError):
429
433
  """
430
434
  An error raised when a Prefect object cannot be imported due to a move or removal.
@@ -610,6 +610,7 @@ def as_completed(
610
610
  unique_futures: set[PrefectFuture[R]] = set(futures)
611
611
  total_futures = len(unique_futures)
612
612
  pending = unique_futures
613
+ deadline: float | None = None
613
614
  try:
614
615
  with timeout_context(timeout):
615
616
  done = {f for f in unique_futures if f._final_state} # type: ignore[privateUsage]
@@ -628,8 +629,17 @@ def as_completed(
628
629
  for future in pending:
629
630
  _register_prefect_done_callback(future, add_to_done)
630
631
 
632
+ deadline = time.monotonic() + timeout if timeout is not None else None
633
+
631
634
  while pending:
632
- finished_event.wait()
635
+ if timeout is None:
636
+ finished_event.wait()
637
+ else:
638
+ assert deadline is not None
639
+ remaining = deadline - time.monotonic()
640
+ if not finished_event.wait(timeout=max(remaining, 0.0)):
641
+ raise TimeoutError
642
+
633
643
  with finished_lock:
634
644
  done = finished_futures
635
645
  finished_futures = []
@@ -47,6 +47,13 @@ if TYPE_CHECKING:
47
47
 
48
48
  logger: "logging.Logger" = get_logger(__name__)
49
49
 
50
+ # Exceptions that indicate transient network issues and should trigger retries.
51
+ _RETRYABLE_EXCEPTIONS: Tuple[Type[Exception], ...] = (
52
+ ConnectionClosed,
53
+ TimeoutError,
54
+ OSError,
55
+ )
56
+
50
57
  LOGS_OBSERVED = Counter(
51
58
  "prefect_logs_observed",
52
59
  "The number of logs observed by Prefect log subscribers",
@@ -90,6 +97,7 @@ def _get_api_url_and_key(
90
97
  def get_logs_subscriber(
91
98
  filter: Optional["LogFilter"] = None,
92
99
  reconnection_attempts: int = 10,
100
+ reconnect_on_clean_close: bool = False,
93
101
  ) -> "PrefectLogsSubscriber":
94
102
  """
95
103
  Get a logs subscriber based on the current Prefect configuration.
@@ -101,13 +109,16 @@ def get_logs_subscriber(
101
109
 
102
110
  if isinstance(api_url, str) and api_url.startswith(PREFECT_CLOUD_API_URL.value()):
103
111
  return PrefectCloudLogsSubscriber(
104
- filter=filter, reconnection_attempts=reconnection_attempts
112
+ filter=filter,
113
+ reconnection_attempts=reconnection_attempts,
114
+ reconnect_on_clean_close=reconnect_on_clean_close,
105
115
  )
106
116
  elif api_url:
107
117
  return PrefectLogsSubscriber(
108
118
  api_url=api_url,
109
119
  filter=filter,
110
120
  reconnection_attempts=reconnection_attempts,
121
+ reconnect_on_clean_close=reconnect_on_clean_close,
111
122
  )
112
123
  elif PREFECT_SERVER_ALLOW_EPHEMERAL_MODE:
113
124
  from prefect.server.api.server import SubprocessASGIServer
@@ -118,6 +129,7 @@ def get_logs_subscriber(
118
129
  api_url=server.api_url,
119
130
  filter=filter,
120
131
  reconnection_attempts=reconnection_attempts,
132
+ reconnect_on_clean_close=reconnect_on_clean_close,
121
133
  )
122
134
  else:
123
135
  raise ValueError(
@@ -129,6 +141,10 @@ class PrefectLogsSubscriber:
129
141
  """
130
142
  Subscribes to a Prefect logs stream, yielding logs as they occur.
131
143
 
144
+ Abnormal disconnects are retried. Clean disconnects end iteration unless
145
+ `reconnect_on_clean_close` is enabled. The logs stream is live-only, so logs
146
+ emitted while disconnected may be omitted.
147
+
132
148
  Example:
133
149
 
134
150
  from prefect.logging.clients import PrefectLogsSubscriber
@@ -155,6 +171,7 @@ class PrefectLogsSubscriber:
155
171
  api_url: Optional[str] = None,
156
172
  filter: Optional["LogFilter"] = None,
157
173
  reconnection_attempts: int = 10,
174
+ reconnect_on_clean_close: bool = False,
158
175
  ):
159
176
  """
160
177
  Args:
@@ -162,6 +179,8 @@ class PrefectLogsSubscriber:
162
179
  filter: Log filter to apply
163
180
  reconnection_attempts: When the client is disconnected, how many times
164
181
  the client should attempt to reconnect
182
+ reconnect_on_clean_close: Whether to reconnect when the server closes
183
+ the connection normally instead of ending iteration
165
184
  """
166
185
  self._api_key = None
167
186
  self._auth_token = PREFECT_API_AUTH_STRING.value()
@@ -189,6 +208,7 @@ class PrefectLogsSubscriber:
189
208
  self._connect = websocket_connect(socket_url, **connect_kwargs)
190
209
  self._websocket = None
191
210
  self._reconnection_attempts = reconnection_attempts
211
+ self._reconnect_on_clean_close = reconnect_on_clean_close
192
212
  if self._reconnection_attempts < 0:
193
213
  raise ValueError("reconnection_attempts must be a non-negative integer")
194
214
 
@@ -272,14 +292,15 @@ class PrefectLogsSubscriber:
272
292
 
273
293
  async def __anext__(self) -> Log:
274
294
  assert self._reconnection_attempts >= 0
275
- for i in range(self._reconnection_attempts + 1): # pragma: no branch
295
+ attempts = 0
296
+ while attempts <= self._reconnection_attempts:
276
297
  try:
277
298
  # If we're here and the websocket is None, then we've had a failure in a
278
299
  # previous reconnection attempt.
279
300
  #
280
301
  # Otherwise, after the first time through this loop, we're recovering
281
302
  # from a ConnectionClosed, so reconnect now.
282
- if not self._websocket or i > 0:
303
+ if not self._websocket or attempts > 0:
283
304
  try:
284
305
  await self._reconnect()
285
306
  finally:
@@ -301,20 +322,22 @@ class PrefectLogsSubscriber:
301
322
  finally:
302
323
  LOGS_OBSERVED.labels(self.client_name).inc()
303
324
 
304
- except ConnectionClosedOK:
305
- logger.debug('Connection closed with "OK" status')
306
- raise StopAsyncIteration
307
- except ConnectionClosed:
325
+ except _RETRYABLE_EXCEPTIONS as exc:
326
+ if isinstance(exc, ConnectionClosedOK):
327
+ if not self._reconnect_on_clean_close:
328
+ logger.debug('Connection closed with "OK" status')
329
+ raise StopAsyncIteration
330
+
331
+ attempts += 1
308
332
  logger.debug(
309
- "Connection closed with %s/%s attempts",
310
- i + 1,
333
+ "Retryable error with %s/%s attempts",
334
+ attempts,
311
335
  self._reconnection_attempts,
312
336
  )
313
- if i == self._reconnection_attempts:
314
- # this was our final chance, raise the most recent error
337
+ if attempts > self._reconnection_attempts:
315
338
  raise
316
339
 
317
- if i > 2:
340
+ if attempts > 2:
318
341
  # let the first two attempts happen quickly in case this is just
319
342
  # a standard load balancer timeout, but after that, just take a
320
343
  # beat to let things come back around.
@@ -331,6 +354,7 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
331
354
  api_key: Optional[str] = None,
332
355
  filter: Optional["LogFilter"] = None,
333
356
  reconnection_attempts: int = 10,
357
+ reconnect_on_clean_close: bool = False,
334
358
  ):
335
359
  """
336
360
  Args:
@@ -339,6 +363,8 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
339
363
  filter: Log filter to apply
340
364
  reconnection_attempts: When the client is disconnected, how many times
341
365
  the client should attempt to reconnect
366
+ reconnect_on_clean_close: Whether to reconnect when the server closes
367
+ the connection normally instead of ending iteration
342
368
  """
343
369
  api_url, api_key = _get_api_url_and_key(api_url, api_key)
344
370
 
@@ -346,6 +372,7 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
346
372
  api_url=api_url,
347
373
  filter=filter,
348
374
  reconnection_attempts=reconnection_attempts,
375
+ reconnect_on_clean_close=reconnect_on_clean_close,
349
376
  )
350
377
 
351
378
  self._api_key = api_key
@@ -90,6 +90,7 @@ SettingAccessor: TypeAlias = Literal[
90
90
  "server.database.echo",
91
91
  "server.database.host",
92
92
  "server.database.migrate_on_start",
93
+ "server.database.migration_timeout",
93
94
  "server.database.name",
94
95
  "server.database.password",
95
96
  "server.database.port",
@@ -280,6 +280,12 @@ class ServerDatabaseSettings(PrefectBaseSettings):
280
280
  ),
281
281
  )
282
282
 
283
+ migration_timeout: Optional[float] = Field(
284
+ default=None,
285
+ gt=0,
286
+ description="A statement timeout, in seconds, applied to database migrations. Schema changes such as concurrent index builds on large tables can take much longer than an ordinary API query, so migrations are not bound by `server.database.timeout`. Defaults to `None` (no timeout); set a positive value to bound migration statement duration.",
287
+ )
288
+
283
289
  # handle deprecated fields
284
290
 
285
291
  def __getattribute__(self, name: str) -> Any: