prefect-client 3.7.1.dev6__tar.gz → 3.7.1.dev8__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 (448) hide show
  1. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/PKG-INFO +1 -1
  2. prefect_client-3.7.1.dev8/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/AGENTS.md +2 -2
  4. prefect_client-3.7.1.dev8/src/prefect/concurrency/_leases.py +230 -0
  5. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/AGENTS.md +2 -0
  6. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/server.py +7 -1
  7. prefect_client-3.7.1.dev8/src/prefect/workers/_cleanup_handlers.py +142 -0
  8. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/__init__.py +2 -0
  9. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_protocol.py +24 -3
  10. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_state.py +34 -0
  11. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_sync.py +21 -3
  12. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/base.py +97 -80
  13. prefect_client-3.7.1.dev6/src/prefect/_build_info.py +0 -5
  14. prefect_client-3.7.1.dev6/src/prefect/concurrency/_leases.py +0 -190
  15. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/.gitignore +0 -0
  16. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/LICENSE +0 -0
  17. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/README.md +0 -0
  18. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/hatch_build.py +0 -0
  19. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/pyproject.toml +0 -0
  20. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/.prefectignore +0 -0
  21. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/AGENTS.md +0 -0
  22. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/__init__.py +0 -0
  23. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/__main__.py +0 -0
  24. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/__init__.py +0 -0
  25. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/_launchers.py +0 -0
  26. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/bundles/__init__.py +0 -0
  27. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/bundles/execute.py +0 -0
  28. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/__init__.py +0 -0
  29. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/apply.py +0 -0
  30. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  31. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/manager.py +0 -0
  32. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/spec.py +0 -0
  33. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/__init__.py +0 -0
  34. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/client.py +0 -0
  35. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/objects.py +0 -0
  36. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_flow_run_suspension.py +0 -0
  37. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/__init__.py +0 -0
  38. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/_logging.py +0 -0
  39. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/__init__.py +0 -0
  40. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  41. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/client.py +0 -0
  42. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/device_id.py +0 -0
  43. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/emit.py +0 -0
  44. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/enabled.py +0 -0
  45. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/events.py +0 -0
  46. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/milestones.py +0 -0
  47. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/notice.py +0 -0
  48. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/service.py +0 -0
  49. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/ast_utils.py +0 -0
  50. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/buildx.py +0 -0
  51. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/__init__.py +0 -0
  52. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  53. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/backports.py +0 -0
  54. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/blocks.py +0 -0
  55. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  56. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  57. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/migration.py +0 -0
  58. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/starlette.py +0 -0
  59. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/__init__.py +0 -0
  60. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/api.py +0 -0
  61. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/calls.py +0 -0
  62. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  63. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  64. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/inspection.py +0 -0
  65. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/primitives.py +0 -0
  66. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/services.py +0 -0
  67. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/threads.py +0 -0
  68. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/waiters.py +0 -0
  69. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/control_listener.py +0 -0
  70. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/deprecated.py +0 -0
  71. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/engine.py +0 -0
  72. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/git.py +0 -0
  73. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  74. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/installation.py +0 -0
  75. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/integrations.py +0 -0
  76. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/launchers.py +0 -0
  77. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/lazy.py +0 -0
  78. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/metrics.py +0 -0
  79. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/observability.py +0 -0
  80. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/observers.py +0 -0
  81. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/__init__.py +0 -0
  82. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/apply.py +0 -0
  83. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/collections.py +0 -0
  84. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  85. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/manager.py +0 -0
  86. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/spec.py +0 -0
  87. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/startup.py +0 -0
  88. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/__init__.py +0 -0
  89. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/schemas.py +0 -0
  90. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  91. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  92. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  93. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pytz.py +0 -0
  94. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/result_records.py +0 -0
  95. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/retries.py +0 -0
  96. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schema.py +0 -0
  97. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/__init__.py +0 -0
  98. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/bases.py +0 -0
  99. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/fields.py +0 -0
  100. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/serializers.py +0 -0
  101. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/validators.py +0 -0
  102. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  103. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/states.py +0 -0
  104. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/testing.py +0 -0
  105. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/urls.py +0 -0
  106. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/uuid7.py +0 -0
  107. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/version_checking.py +0 -0
  108. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/versioning.py +0 -0
  109. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/waiters.py +0 -0
  110. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/websockets.py +0 -0
  111. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/__init__.py +0 -0
  112. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/fetcher.py +0 -0
  113. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/generator.py +0 -0
  114. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/models.py +0 -0
  115. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/naming.py +0 -0
  116. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/renderer.py +0 -0
  117. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/schema_converter.py +0 -0
  118. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/templates/__init__.py +0 -0
  119. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  120. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/types.py +0 -0
  121. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/unions.py +0 -0
  122. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_vendor/croniter/__init__.py +0 -0
  123. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_vendor/croniter/croniter.py +0 -0
  124. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/agent.py +0 -0
  125. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/analytics/__init__.py +0 -0
  126. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/artifacts.py +0 -0
  127. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/__init__.py +0 -0
  128. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/core.py +0 -0
  129. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/materialize.py +0 -0
  130. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/automations.py +0 -0
  131. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/AGENTS.md +0 -0
  132. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/__init__.py +0 -0
  133. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/abstract.py +0 -0
  134. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/core.py +0 -0
  135. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/fields.py +0 -0
  136. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/notifications.py +0 -0
  137. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/redis.py +0 -0
  138. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/system.py +0 -0
  139. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/webhook.py +0 -0
  140. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/__init__.py +0 -0
  141. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_file_collector.py +0 -0
  142. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_ignore_filter.py +0 -0
  143. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_path_resolver.py +0 -0
  144. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_zip_builder.py +0 -0
  145. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_zip_extractor.py +0 -0
  146. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/execute.py +0 -0
  147. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/cache_policies.py +0 -0
  148. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/AGENTS.md +0 -0
  149. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/__init__.py +0 -0
  150. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/attribution.py +0 -0
  151. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/base.py +0 -0
  152. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/cloud.py +0 -0
  153. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/collections.py +0 -0
  154. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/constants.py +0 -0
  155. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/__init__.py +0 -0
  156. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  157. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  158. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  159. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_automations/client.py +0 -0
  160. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  161. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  162. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  163. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  164. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  165. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  166. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  167. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  168. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  169. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  170. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  171. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_events/client.py +0 -0
  172. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  173. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  174. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  175. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flows/client.py +0 -0
  176. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  177. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_logs/client.py +0 -0
  178. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  179. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_variables/client.py +0 -0
  180. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  181. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  182. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/base.py +0 -0
  183. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/routes.py +0 -0
  184. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/__init__.py +0 -0
  185. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/actions.py +0 -0
  186. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/events.py +0 -0
  187. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/filters.py +0 -0
  188. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/objects.py +0 -0
  189. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/responses.py +0 -0
  190. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/schedules.py +0 -0
  191. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/sorting.py +0 -0
  192. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/worker_channel.py +0 -0
  193. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/subscriptions.py +0 -0
  194. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/types/__init__.py +0 -0
  195. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  196. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/utilities.py +0 -0
  197. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/__init__.py +0 -0
  198. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_asyncio.py +0 -0
  199. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_events.py +0 -0
  200. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_sync.py +0 -0
  201. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/asyncio.py +0 -0
  202. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/context.py +0 -0
  203. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/services.py +0 -0
  204. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/sync.py +0 -0
  205. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/__init__.py +0 -0
  206. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  207. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/_events.py +0 -0
  208. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/asyncio.py +0 -0
  209. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/context.py +0 -0
  210. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/services.py +0 -0
  211. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/sync.py +0 -0
  212. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/context.py +0 -0
  213. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/AGENTS.md +0 -0
  214. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/__init__.py +0 -0
  215. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/base.py +0 -0
  216. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/deployments.py +0 -0
  217. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/flow_runs.py +0 -0
  218. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/runner.py +0 -0
  219. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/schedules.py +0 -0
  220. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/__init__.py +0 -0
  221. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/core.py +0 -0
  222. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/pull.py +0 -0
  223. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/utility.py +0 -0
  224. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/__init__.py +0 -0
  225. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/_buildx.py +0 -0
  226. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/docker_image.py +0 -0
  227. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/engine.py +0 -0
  228. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/__init__.py +0 -0
  229. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/actions.py +0 -0
  230. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/clients.py +0 -0
  231. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/filters.py +0 -0
  232. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/related.py +0 -0
  233. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/__init__.py +0 -0
  234. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/automations.py +0 -0
  235. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  236. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/events.py +0 -0
  237. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/labelling.py +0 -0
  238. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/subscribers.py +0 -0
  239. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/utilities.py +0 -0
  240. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/worker.py +0 -0
  241. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/exceptions.py +0 -0
  242. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/filesystems.py +0 -0
  243. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flow_engine.py +0 -0
  244. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flow_runs.py +0 -0
  245. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flows.py +0 -0
  246. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/futures.py +0 -0
  247. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/__init__.py +0 -0
  248. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/base.py +0 -0
  249. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  250. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  251. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  252. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  253. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  254. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  255. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/__init__.py +0 -0
  256. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/actions.py +0 -0
  257. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/run_input.py +0 -0
  258. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/__init__.py +0 -0
  259. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/_filelock.py +0 -0
  260. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/filesystem.py +0 -0
  261. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/memory.py +0 -0
  262. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/protocol.py +0 -0
  263. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/AGENTS.md +0 -0
  264. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/__init__.py +0 -0
  265. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/clients.py +0 -0
  266. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/configuration.py +0 -0
  267. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/filters.py +0 -0
  268. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/formatters.py +0 -0
  269. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/handlers.py +0 -0
  270. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/highlighters.py +0 -0
  271. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/loggers.py +0 -0
  272. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/logging.yml +0 -0
  273. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/main.py +0 -0
  274. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/plugins.py +0 -0
  275. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/py.typed +0 -0
  276. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/results.py +0 -0
  277. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/AGENTS.md +0 -0
  278. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/__init__.py +0 -0
  279. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_cancel_finalizer.py +0 -0
  280. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_cancellation_manager.py +0 -0
  281. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_control_channel.py +0 -0
  282. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_deployment_registry.py +0 -0
  283. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_event_emitter.py +0 -0
  284. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_flow_resolver.py +0 -0
  285. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_flow_run_executor.py +0 -0
  286. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_hook_runner.py +0 -0
  287. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_limit_manager.py +0 -0
  288. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_process_manager.py +0 -0
  289. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  290. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_bundle.py +0 -0
  291. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_direct.py +0 -0
  292. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_engine.py +0 -0
  293. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_state_proposer.py +0 -0
  294. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_workspace_resolver.py +0 -0
  295. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_workspace_starter.py +0 -0
  296. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/runner.py +0 -0
  297. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/server.py +0 -0
  298. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/storage.py +0 -0
  299. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/__init__.py +0 -0
  300. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/deployment.py +0 -0
  301. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/flow_run.py +0 -0
  302. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/task_run.py +0 -0
  303. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/schedules.py +0 -0
  304. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/serializers.py +0 -0
  305. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/__init__.py +0 -0
  306. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/admin.py +0 -0
  307. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/artifacts.py +0 -0
  308. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/automations.py +0 -0
  309. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/background_workers.py +0 -0
  310. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_capabilities.py +0 -0
  311. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_documents.py +0 -0
  312. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_schemas.py +0 -0
  313. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_types.py +0 -0
  314. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/clients.py +0 -0
  315. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/collections.py +0 -0
  316. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  317. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/concurrency_limits.py +0 -0
  318. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  319. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/csrf_token.py +0 -0
  320. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/dependencies.py +0 -0
  321. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/deployments.py +0 -0
  322. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/events.py +0 -0
  323. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flow_run_states.py +0 -0
  324. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flow_runs.py +0 -0
  325. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flows.py +0 -0
  326. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/logs.py +0 -0
  327. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/middleware.py +0 -0
  328. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/root.py +0 -0
  329. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/run_history.py +0 -0
  330. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/saved_searches.py +0 -0
  331. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  332. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_run_states.py +0 -0
  333. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_runs.py +0 -0
  334. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_workers.py +0 -0
  335. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/templates.py +0 -0
  336. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/__init__.py +0 -0
  337. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/flow_runs.py +0 -0
  338. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/flows.py +0 -0
  339. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/schemas.py +0 -0
  340. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/task_runs.py +0 -0
  341. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/validation.py +0 -0
  342. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/variables.py +0 -0
  343. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/work_queues.py +0 -0
  344. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/workers.py +0 -0
  345. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/AGENTS.md +0 -0
  346. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/__init__.py +0 -0
  347. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/base.py +0 -0
  348. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/constants.py +0 -0
  349. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/context.py +0 -0
  350. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/legacy.py +0 -0
  351. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/__init__.py +0 -0
  352. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/_defaults.py +0 -0
  353. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/api.py +0 -0
  354. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/cli.py +0 -0
  355. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/client.py +0 -0
  356. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/cloud.py +0 -0
  357. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/deployments.py +0 -0
  358. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/events.py +0 -0
  359. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/experiments.py +0 -0
  360. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/flows.py +0 -0
  361. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/internal.py +0 -0
  362. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/logging.py +0 -0
  363. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/plugins.py +0 -0
  364. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/results.py +0 -0
  365. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/root.py +0 -0
  366. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/runner.py +0 -0
  367. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/__init__.py +0 -0
  368. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/api.py +0 -0
  369. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/concurrency.py +0 -0
  370. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/database.py +0 -0
  371. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/deployments.py +0 -0
  372. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/docket.py +0 -0
  373. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/ephemeral.py +0 -0
  374. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/events.py +0 -0
  375. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  376. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/logs.py +0 -0
  377. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/root.py +0 -0
  378. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/services.py +0 -0
  379. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/tasks.py +0 -0
  380. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/ui.py +0 -0
  381. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/tasks.py +0 -0
  382. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/telemetry.py +0 -0
  383. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/testing.py +0 -0
  384. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/worker.py +0 -0
  385. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/profiles.py +0 -0
  386. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/profiles.toml +0 -0
  387. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/sources.py +0 -0
  388. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/states.py +0 -0
  389. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_engine.py +0 -0
  390. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_runners.py +0 -0
  391. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_runs.py +0 -0
  392. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_worker.py +0 -0
  393. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/tasks.py +0 -0
  394. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/telemetry/__init__.py +0 -0
  395. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/telemetry/run_telemetry.py +0 -0
  396. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/transactions.py +0 -0
  397. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/__init__.py +0 -0
  398. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/_concurrency.py +0 -0
  399. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/_datetime.py +0 -0
  400. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/entrypoint.py +0 -0
  401. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/names.py +0 -0
  402. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/AGENTS.md +0 -0
  403. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/__init__.py +0 -0
  404. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/annotations.py +0 -0
  405. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  406. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  407. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/callables/AGENTS.md +0 -0
  408. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/callables/__init__.py +0 -0
  409. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/collections.py +0 -0
  410. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/compat.py +0 -0
  411. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/context.py +0 -0
  412. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/dispatch.py +0 -0
  413. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/dockerutils.py +0 -0
  414. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/engine/AGENTS.md +0 -0
  415. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/engine/__init__.py +0 -0
  416. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  417. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/filesystem/__init__.py +0 -0
  418. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/generics.py +0 -0
  419. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/hashing.py +0 -0
  420. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/importtools.py +0 -0
  421. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/math.py +0 -0
  422. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/names.py +0 -0
  423. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  424. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/processutils/__init__.py +0 -0
  425. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/pydantic.py +0 -0
  426. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/render_swagger.py +0 -0
  427. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  428. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  429. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  430. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/validation.py +0 -0
  431. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/services.py +0 -0
  432. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/slugify.py +0 -0
  433. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/templating/AGENTS.md +0 -0
  434. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/templating/__init__.py +0 -0
  435. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/text.py +0 -0
  436. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/timeout.py +0 -0
  437. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/urls.py +0 -0
  438. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/visualization.py +0 -0
  439. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/variables.py +0 -0
  440. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/AGENTS.md +0 -0
  441. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/__init__.py +0 -0
  442. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_cleanup.py +0 -0
  443. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  444. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/block.py +0 -0
  445. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/cloud.py +0 -0
  446. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/process.py +0 -0
  447. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/server.py +0 -0
  448. {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/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.1.dev6
3
+ Version: 3.7.1.dev8
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
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.7.1.dev8"
3
+ __build_date__ = "2026-05-14 09:02:56.534802+00:00"
4
+ __git_commit__ = "7057b0df499b140407d3abf264538c21444724ce"
5
+ __dirty__ = False
@@ -18,7 +18,7 @@ Does NOT define concurrency limits (server-side in `server/`). Does NOT handle t
18
18
 
19
19
  **`raise_on_lease_renewal_failure` (public parameter):** Controls lease renewal failure behavior independently from `strict`. When `None` (default), falls back to the value of `strict` for backward compatibility. Set to `False` to let long-running tasks continue even if a transient renewal error occurs; set to `True` to terminate immediately on renewal failure regardless of `strict`. This means `strict=True, raise_on_lease_renewal_failure=False` gives strict slot acquisition but non-fatal renewal failures, and vice versa.
20
20
 
21
- **Lease renewal:** `_leases.py` runs a background loop that renews immediately on entry, then sleeps for 75% of `lease_duration` between renewals. Each renewal call uses `@retry_async_fn(max_attempts=3)` for transient failures. If all 3 attempts fail, the background task raises and a done-callback either cancels execution or logs a warning, depending on `raise_on_lease_renewal_failure`.
21
+ **Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`.
22
22
 
23
23
  **Sync/async lockstep invariant:** `asyncio.py`/`sync.py` and `_asyncio.py`/`_sync.py` are parallel implementations. Any behavior change to one must be mirrored in the other.
24
24
 
@@ -39,6 +39,6 @@ Layered — public → internal → services, with leases and events as cross-cu
39
39
  ## Pitfalls
40
40
 
41
41
  - **Service singleton is keyed on `frozenset(names)`.** Passing the same names in different order reuses the same singleton; passing a strict subset creates a different singleton. Each unique name-set gets its own queue.
42
- - **Lease renewal runs on the global event loop** (sync path). If the global loop is blocked or torn down, renewal silently fails you'll see the renewal failure callback fire after `max_attempts` retries are exhausted.
42
+ - **Lease renewal runs on a daemon thread.** The thread copies the caller's context variables for settings and logging context, then uses the standard `get_client(sync_client=True)` path instead of lease-specific async-client cloning. Sync callers join the thread briefly on exit; async callers only signal the thread to stop so the event loop is not blocked.
43
43
  - **Cancellation during acquire or release** — if a `CancelledError` is raised either during slot acquisition or during `release_concurrency_slots_with_lease` in the `finally` block, the lease ID is appended to `ConcurrencyContext.cleanup_lease_ids`. `ConcurrencyContext.__exit__` releases them via a sync client. If `ConcurrencyContext` is not active, those leases are abandoned until server-side expiry.
44
44
  - **`v1/` subdirectory** contains the legacy slot API (no lease model). New code should use the top-level `concurrency()` / `rate_limit()` APIs.
@@ -0,0 +1,230 @@
1
+ import contextvars
2
+ import threading
3
+ from contextlib import asynccontextmanager, contextmanager
4
+ from typing import TYPE_CHECKING, AsyncGenerator, Generator
5
+ from uuid import UUID
6
+
7
+ from prefect._internal.concurrency.cancellation import (
8
+ AsyncCancelScope,
9
+ WatcherThreadCancelScope,
10
+ )
11
+ from prefect._internal.retries import exponential_backoff_with_jitter
12
+ from prefect.client.orchestration import get_client
13
+ from prefect.logging.loggers import get_logger, get_run_logger
14
+
15
+ if TYPE_CHECKING:
16
+ from prefect.client.orchestration import SyncPrefectClient
17
+
18
+ _RENEWAL_FRACTION = 0.75
19
+ _RENEWAL_MAX_ATTEMPTS = 3
20
+ _RENEWAL_RETRY_BASE_DELAY = 1
21
+ _RENEWAL_RETRY_MAX_DELAY = 10
22
+
23
+
24
+ def _renew_concurrency_lease_with_retries(
25
+ client: "SyncPrefectClient",
26
+ lease_id: UUID,
27
+ lease_duration: float,
28
+ stop_event: threading.Event,
29
+ ) -> bool:
30
+ """
31
+ Renew a concurrency lease, retrying transient failures.
32
+
33
+ Returns `False` when shutdown is requested during retry backoff.
34
+ """
35
+ logger = get_logger("concurrency")
36
+
37
+ for attempt in range(_RENEWAL_MAX_ATTEMPTS):
38
+ try:
39
+ client.renew_concurrency_lease(
40
+ lease_id=lease_id, lease_duration=lease_duration
41
+ )
42
+ return True
43
+ except Exception as exc:
44
+ if attempt == _RENEWAL_MAX_ATTEMPTS - 1:
45
+ logger.exception(
46
+ "Function 'concurrency lease renewal' failed after %s attempts",
47
+ _RENEWAL_MAX_ATTEMPTS,
48
+ )
49
+ raise
50
+
51
+ delay = exponential_backoff_with_jitter(
52
+ attempt,
53
+ _RENEWAL_RETRY_BASE_DELAY,
54
+ _RENEWAL_RETRY_MAX_DELAY,
55
+ )
56
+ logger.warning(
57
+ "Attempt %s of function 'concurrency lease renewal' failed with "
58
+ "%s: %s. Retrying in %.2f seconds...",
59
+ attempt + 1,
60
+ type(exc).__name__,
61
+ exc,
62
+ delay,
63
+ )
64
+ if stop_event.wait(delay):
65
+ return False
66
+
67
+ return False
68
+
69
+
70
+ def _lease_renewal_loop(
71
+ lease_id: UUID,
72
+ lease_duration: float,
73
+ stop_event: threading.Event,
74
+ ) -> None:
75
+ """
76
+ Maintain a concurrency lease until stopped.
77
+
78
+ Args:
79
+ lease_id: The ID of the lease to maintain.
80
+ lease_duration: The duration of the lease in seconds.
81
+ stop_event: Event set by the owning context manager on exit.
82
+ """
83
+ with get_client(sync_client=True) as client:
84
+ while not stop_event.is_set():
85
+ renewed = _renew_concurrency_lease_with_retries(
86
+ client, lease_id, lease_duration, stop_event
87
+ )
88
+ if not renewed:
89
+ return
90
+ stop_event.wait(lease_duration * _RENEWAL_FRACTION)
91
+
92
+
93
+ def _handle_lease_renewal_failure(
94
+ exc: BaseException,
95
+ lease_id: UUID,
96
+ raise_on_lease_renewal_failure: bool,
97
+ suppress_warnings: bool,
98
+ cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
99
+ ) -> None:
100
+ try:
101
+ # Use a run logger if available
102
+ logger = get_run_logger()
103
+ except Exception:
104
+ logger = get_logger("concurrency")
105
+
106
+ if raise_on_lease_renewal_failure:
107
+ logger.error(
108
+ "Concurrency lease renewal failed - slots are no longer reserved. "
109
+ "Terminating execution to prevent over-allocation. "
110
+ "Lease ID: %s, exception: %s",
111
+ lease_id,
112
+ exc,
113
+ exc_info=(type(exc), exc, exc.__traceback__),
114
+ )
115
+ cancel_scope.cancel()
116
+ elif suppress_warnings:
117
+ logger.debug(
118
+ "Concurrency lease renewal failed - slots are no longer reserved. "
119
+ "Execution will continue, but concurrency limits may be exceeded. "
120
+ "Lease ID: %s, exception: %s",
121
+ lease_id,
122
+ exc,
123
+ exc_info=(type(exc), exc, exc.__traceback__),
124
+ )
125
+ else:
126
+ logger.warning(
127
+ "Concurrency lease renewal failed - slots are no longer reserved. "
128
+ "Execution will continue, but concurrency limits may be exceeded. "
129
+ "Lease ID: %s, exception: %s",
130
+ lease_id,
131
+ exc,
132
+ exc_info=(type(exc), exc, exc.__traceback__),
133
+ )
134
+
135
+
136
+ def _start_lease_renewal_thread(
137
+ lease_id: UUID,
138
+ lease_duration: float,
139
+ raise_on_lease_renewal_failure: bool,
140
+ suppress_warnings: bool,
141
+ cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
142
+ ) -> tuple[threading.Event, threading.Thread]:
143
+ stop_event = threading.Event()
144
+ renewal_ctx = contextvars.copy_context()
145
+
146
+ def renewal_loop() -> None:
147
+ try:
148
+ renewal_ctx.run(_lease_renewal_loop, lease_id, lease_duration, stop_event)
149
+ except Exception as exc:
150
+ if not stop_event.is_set():
151
+ _handle_lease_renewal_failure(
152
+ exc,
153
+ lease_id,
154
+ raise_on_lease_renewal_failure,
155
+ suppress_warnings,
156
+ cancel_scope,
157
+ )
158
+
159
+ thread = threading.Thread(
160
+ target=renewal_loop,
161
+ daemon=True,
162
+ name=f"concurrency-lease-renewal-{lease_id}",
163
+ )
164
+ thread.start()
165
+ return stop_event, thread
166
+
167
+
168
+ @contextmanager
169
+ def maintain_concurrency_lease(
170
+ lease_id: UUID,
171
+ lease_duration: float,
172
+ raise_on_lease_renewal_failure: bool = False,
173
+ suppress_warnings: bool = False,
174
+ ) -> Generator[None, None, None]:
175
+ """
176
+ Maintain a concurrency lease for the given lease ID.
177
+
178
+ Args:
179
+ lease_id: The ID of the lease to maintain.
180
+ lease_duration: The duration of the lease in seconds.
181
+ raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
182
+ """
183
+ with WatcherThreadCancelScope() as cancel_scope:
184
+ stop_event: threading.Event | None = None
185
+ thread: threading.Thread | None = None
186
+ try:
187
+ stop_event, thread = _start_lease_renewal_thread(
188
+ lease_id,
189
+ lease_duration,
190
+ raise_on_lease_renewal_failure,
191
+ suppress_warnings,
192
+ cancel_scope,
193
+ )
194
+ yield
195
+ finally:
196
+ if stop_event is not None:
197
+ stop_event.set()
198
+ if thread is not None:
199
+ thread.join(timeout=2)
200
+
201
+
202
+ @asynccontextmanager
203
+ async def amaintain_concurrency_lease(
204
+ lease_id: UUID,
205
+ lease_duration: float,
206
+ raise_on_lease_renewal_failure: bool = False,
207
+ suppress_warnings: bool = False,
208
+ ) -> AsyncGenerator[None, None]:
209
+ """
210
+ Maintain a concurrency lease for the given lease ID.
211
+
212
+ Args:
213
+ lease_id: The ID of the lease to maintain.
214
+ lease_duration: The duration of the lease in seconds.
215
+ raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
216
+ """
217
+ with AsyncCancelScope() as cancel_scope:
218
+ stop_event: threading.Event | None = None
219
+ try:
220
+ stop_event, _ = _start_lease_renewal_thread(
221
+ lease_id,
222
+ lease_duration,
223
+ raise_on_lease_renewal_failure,
224
+ suppress_warnings,
225
+ cancel_scope,
226
+ )
227
+ yield
228
+ finally:
229
+ if stop_event is not None:
230
+ stop_event.set()
@@ -7,6 +7,8 @@ Client-side event system for emitting, subscribing to, and defining automations
7
7
  - **Both client and server define their own event schemas.** The client-side schemas live in `schemas/` here; the server has its own parallel definitions in `server/events/schemas/`. They are structurally similar but independently maintained — the server does not import schemas from this module.
8
8
  - Events follow the CloudEvents-inspired schema: `Event` with `Resource` and `RelatedResource`.
9
9
  - Automations combine triggers (event, metric, compound, sequence) with actions.
10
+ - **Metric triggers are Cloud-only.** OSS's `ServerTriggerTypes` excludes `MetricTrigger`, so `POST /automations` returns 422. For "alert if a flow takes too long" on OSS, use a proactive `EventTrigger` (`after={prefect.flow-run.Running}`, terminal states in `expect`, SLO in `within`).
11
+ - **Event name prefixes differ by backend.** OSS emits `prefect.*`; Cloud emits `prefect-cloud.*` for automation/action lifecycle events (e.g., `prefect-cloud.automation.triggered`). Cross-backend tooling that filters events must match both.
10
12
  - `DeploymentTriggerTypes` are the subset of triggers usable in `prefect.yaml` deployment definitions.
11
13
 
12
14
  ## clients.py — Checkpointing Invariant
@@ -257,7 +257,13 @@ def _build_ui_path(base_url: str, relative_path: str) -> str:
257
257
  return normalized_relative_path
258
258
 
259
259
  if normalized_relative_path == "/":
260
- return normalized_base_url
260
+ # Preserve the trailing slash so the redirect target falls inside
261
+ # the bundle's mount. Starlette's `Mount` only routes requests
262
+ # whose path starts with `{mount}/`; a bare `{mount}` falls through
263
+ # to whatever else matches, which in practice is the V1 SPA mount
264
+ # at "/" — that returns V1's index.html under the `/v2` URL and
265
+ # the V1 router can't resolve the route.
266
+ return f"{normalized_base_url}/"
261
267
 
262
268
  return f"{normalized_base_url}{normalized_relative_path}"
263
269
 
@@ -0,0 +1,142 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ from functools import lru_cache
5
+ from typing import TYPE_CHECKING, Any
6
+ from uuid import UUID
7
+
8
+ from prefect.client.schemas.worker_channel import (
9
+ CANCELLING_TIMEOUT_TEARDOWN,
10
+ CancellingTimeoutCleanupMessagePayload,
11
+ CleanupMessagePayload,
12
+ )
13
+ from prefect.exceptions import (
14
+ InfrastructureNotAvailable,
15
+ InfrastructureNotFound,
16
+ ObjectNotFound,
17
+ )
18
+ from prefect.workers._cleanup import (
19
+ CleanupExecutionResult,
20
+ WorkerCleanupHandlerRegistry,
21
+ )
22
+
23
+ if TYPE_CHECKING:
24
+ from prefect.client.schemas.objects import FlowRun
25
+ from prefect.workers.base import BaseWorker
26
+
27
+
28
+ class CancellingTimeoutTeardownHandler:
29
+ """Idempotent infrastructure teardown for `cancelling_timeout_teardown.v1`.
30
+
31
+ The cleanup message is enqueued after the server has already committed
32
+ the CANCELLING-timeout state outcome. Boundary contract:
33
+
34
+ - Does not propose or force flow-run state transitions.
35
+ - Does not require the flow run to currently be in `CANCELLING` and
36
+ does not skip teardown when the flow run has a `start_time`.
37
+ - Treats `InfrastructureNotFound` and an absent infrastructure handle
38
+ (when no actionable handle can be determined) as idempotent success.
39
+ - Maps `InfrastructureNotAvailable`, `NotImplementedError`, and missing
40
+ configuration context to stable release reasons rather than generic
41
+ errors so the executor can release with intent.
42
+ - Uses the cleanup payload's stable target identifiers; current worker
43
+ configuration is consulted only for provider access, not as proof of
44
+ submission-time configuration.
45
+ """
46
+
47
+ cleanup_kind = CANCELLING_TIMEOUT_TEARDOWN
48
+
49
+ def __init__(
50
+ self,
51
+ worker: "BaseWorker[Any, Any, Any]",
52
+ *,
53
+ grace_seconds: int = 30,
54
+ ) -> None:
55
+ self._worker = worker
56
+ self._grace_seconds = grace_seconds
57
+
58
+ async def cleanup(
59
+ self, message: CleanupMessagePayload
60
+ ) -> CleanupExecutionResult | None:
61
+ if not isinstance(message, CancellingTimeoutCleanupMessagePayload):
62
+ return CleanupExecutionResult.release("unexpected_payload_kind")
63
+
64
+ flow_run_id = getattr(message.target, "flow_run_id", None)
65
+ if flow_run_id is None:
66
+ return CleanupExecutionResult.release("invalid_payload")
67
+
68
+ flow_run = await self._read_flow_run(flow_run_id)
69
+ if flow_run is None:
70
+ return CleanupExecutionResult.success()
71
+
72
+ infrastructure_pid = message.target.infrastructure_pid
73
+ if not infrastructure_pid:
74
+ stored_pid = getattr(flow_run, "infrastructure_pid", None)
75
+ if not stored_pid:
76
+ return CleanupExecutionResult.success()
77
+ return CleanupExecutionResult.release("missing_infrastructure_handle")
78
+
79
+ # Freeze the worker's work-pool view so a mid-flight snapshot apply
80
+ # cannot retemplate the configuration we're handing to kill_infrastructure.
81
+ work_pool = copy.deepcopy(self._worker.work_pool)
82
+ try:
83
+ configuration = await self._worker.job_configuration.resolve_for_flow_run(
84
+ flow_run,
85
+ client=self._worker.client,
86
+ work_pool=work_pool,
87
+ worker_name=self._worker.name,
88
+ worker_id=self._worker.backend_id,
89
+ )
90
+ except ObjectNotFound:
91
+ return CleanupExecutionResult.release("configuration_context_unavailable")
92
+
93
+ try:
94
+ await self._worker.kill_infrastructure(
95
+ infrastructure_pid=infrastructure_pid,
96
+ configuration=configuration,
97
+ grace_seconds=self._grace_seconds,
98
+ )
99
+ except InfrastructureNotFound:
100
+ return CleanupExecutionResult.success()
101
+ except NotImplementedError:
102
+ return CleanupExecutionResult.release("unsupported_worker_type")
103
+ except InfrastructureNotAvailable:
104
+ return CleanupExecutionResult.release("infrastructure_not_available")
105
+
106
+ return CleanupExecutionResult.success()
107
+
108
+ async def _read_flow_run(self, flow_run_id: UUID) -> "FlowRun | None":
109
+ try:
110
+ return await self._worker.client.read_flow_run(flow_run_id)
111
+ except ObjectNotFound:
112
+ return None
113
+
114
+
115
+ @lru_cache(maxsize=None)
116
+ def _class_implements_kill_infrastructure(cls: type) -> bool:
117
+ return sum("kill_infrastructure" in vars(c) for c in cls.__mro__) > 1
118
+
119
+
120
+ def build_cleanup_handler_registry(
121
+ worker: "BaseWorker[Any, Any, Any]",
122
+ ) -> "WorkerCleanupHandlerRegistry":
123
+ """Build the cleanup handler registry for a worker.
124
+
125
+ Class-level `cleanup_handlers` for a given cleanup kind take precedence
126
+ over the per-instance default registered here.
127
+ """
128
+ registry = WorkerCleanupHandlerRegistry(worker.__class__.cleanup_handlers)
129
+
130
+ if (
131
+ _class_implements_kill_infrastructure(type(worker))
132
+ and registry.get(CANCELLING_TIMEOUT_TEARDOWN) is None
133
+ ):
134
+ registry.register(CancellingTimeoutTeardownHandler(worker))
135
+
136
+ return registry
137
+
138
+
139
+ __all__ = [
140
+ "CancellingTimeoutTeardownHandler",
141
+ "build_cleanup_handler_registry",
142
+ ]
@@ -9,6 +9,7 @@ from prefect.workers._worker_channel._state import (
9
9
  WorkerChannelState,
10
10
  WorkerChannelStatus,
11
11
  WorkerChannelTerminalError,
12
+ WorkPoolSnapshotState,
12
13
  )
13
14
  from prefect.workers._worker_channel._sync import WorkPoolWorkerChannel
14
15
 
@@ -21,5 +22,6 @@ __all__ = [
21
22
  "WorkerChannelState",
22
23
  "WorkerChannelStatus",
23
24
  "WorkerChannelTerminalError",
25
+ "WorkPoolSnapshotState",
24
26
  "WorkPoolWorkerChannel",
25
27
  ]
@@ -27,6 +27,7 @@ from prefect.client.schemas.worker_channel import (
27
27
  WorkerHelloFrame,
28
28
  WorkerReadyFrame,
29
29
  WorkPoolSnapshotFrame,
30
+ WorkPoolSnapshotPayload,
30
31
  validate_worker_channel_frame,
31
32
  )
32
33
  from prefect.settings import get_current_settings
@@ -38,6 +39,7 @@ from prefect.workers._worker_channel._state import (
38
39
  WorkerChannelRetryableError,
39
40
  WorkerChannelSession,
40
41
  WorkerChannelTerminalError,
42
+ WorkPoolSnapshotState,
41
43
  )
42
44
 
43
45
 
@@ -77,6 +79,7 @@ class WorkerChannelProtocolHandler:
77
79
  self._current_session = CurrentWorkerChannelSession()
78
80
  self._worker_id: UUID | None = None
79
81
  self._worker_metadata_sent = False
82
+ self._work_pool_snapshots = WorkPoolSnapshotState()
80
83
 
81
84
  @property
82
85
  def worker_id(self) -> UUID | None:
@@ -86,6 +89,10 @@ class WorkerChannelProtocolHandler:
86
89
  def worker_metadata_sent(self) -> bool:
87
90
  return self._worker_metadata_sent
88
91
 
92
+ @property
93
+ def work_pool_snapshots_available(self) -> bool:
94
+ return self._work_pool_snapshots.snapshots_available
95
+
89
96
  async def handshake(
90
97
  self, websocket: websockets.asyncio.client.ClientConnection
91
98
  ) -> WorkerReadyFrame:
@@ -175,12 +182,26 @@ class WorkerChannelProtocolHandler:
175
182
  )
176
183
 
177
184
  def _handle_ready(self, ready: WorkerReadyFrame) -> None:
178
- self.handle_work_pool_snapshot(ready.payload.initial_snapshot.work_pool)
185
+ self.reset_work_pool_snapshot_sequence()
186
+ self.handle_work_pool_snapshot(ready.payload.initial_snapshot)
179
187
  worker_id = ready.payload.worker_id
180
188
  if worker_id is not None:
181
189
  self.record_worker_id(worker_id)
182
190
 
183
- def handle_work_pool_snapshot(self, work_pool: WorkPool) -> None:
191
+ def reset_work_pool_snapshot_sequence(self) -> None:
192
+ self._work_pool_snapshots.reset_connection_sequence()
193
+
194
+ def handle_work_pool_snapshot(self, snapshot: WorkPoolSnapshotPayload) -> bool:
195
+ work_pool = self._work_pool_snapshots.apply_snapshot(snapshot)
196
+ if work_pool is None:
197
+ return False
198
+
199
+ if self._on_work_pool_snapshot is not None:
200
+ self._on_work_pool_snapshot(work_pool)
201
+ return True
202
+
203
+ def record_rest_work_pool_snapshot(self, work_pool: WorkPool) -> None:
204
+ work_pool = self._work_pool_snapshots.replace_from_rest(work_pool)
184
205
  if self._on_work_pool_snapshot is not None:
185
206
  self._on_work_pool_snapshot(work_pool)
186
207
 
@@ -299,7 +320,7 @@ class WorkerChannelProtocolHandler:
299
320
  ) from exc
300
321
 
301
322
  if isinstance(frame, WorkPoolSnapshotFrame):
302
- self.handle_work_pool_snapshot(frame.payload.work_pool)
323
+ self.handle_work_pool_snapshot(frame.payload)
303
324
  continue
304
325
 
305
326
  if isinstance(frame, CleanupMessageFrame):
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import copy
4
5
  from dataclasses import dataclass
5
6
  from enum import Enum
6
7
  from typing import Protocol
@@ -10,10 +11,12 @@ import websockets.asyncio.client
10
11
  import websockets.exceptions
11
12
 
12
13
  from prefect.client.orchestration import PrefectClient
14
+ from prefect.client.schemas.objects import WorkPool
13
15
  from prefect.client.schemas.worker_channel import (
14
16
  WorkerChannelCapability,
15
17
  WorkerChannelFrame,
16
18
  WorkerReadyFrame,
19
+ WorkPoolSnapshotPayload,
17
20
  )
18
21
 
19
22
 
@@ -77,6 +80,34 @@ class WorkerChannelState:
77
80
  WorkerChannelFallbackState = WorkerChannelState
78
81
 
79
82
 
83
+ @dataclass
84
+ class WorkPoolSnapshotState:
85
+ work_pool: WorkPool | None = None
86
+ last_applied_sequence: int | None = None
87
+
88
+ @property
89
+ def snapshots_available(self) -> bool:
90
+ return self.last_applied_sequence is not None
91
+
92
+ def reset_connection_sequence(self) -> None:
93
+ self.last_applied_sequence = None
94
+
95
+ def apply_snapshot(self, snapshot: WorkPoolSnapshotPayload) -> WorkPool | None:
96
+ if (
97
+ self.last_applied_sequence is not None
98
+ and snapshot.snapshot_sequence <= self.last_applied_sequence
99
+ ):
100
+ return None
101
+
102
+ self.last_applied_sequence = snapshot.snapshot_sequence
103
+ self.work_pool = copy.deepcopy(snapshot.work_pool)
104
+ return self.work_pool
105
+
106
+ def replace_from_rest(self, work_pool: WorkPool) -> WorkPool:
107
+ self.work_pool = copy.deepcopy(work_pool)
108
+ return self.work_pool
109
+
110
+
80
111
  @dataclass
81
112
  class WorkerChannelSession:
82
113
  """One successfully negotiated worker-channel WebSocket session."""
@@ -146,6 +177,9 @@ class WorkerChannel(Protocol):
146
177
  @property
147
178
  def rest_fallback_enabled(self) -> bool: ...
148
179
 
180
+ @property
181
+ def snapshots_available(self) -> bool: ...
182
+
149
183
  def set_client(self, client: PrefectClient) -> None: ...
150
184
 
151
185
  async def sync(self, task_group: anyio.abc.TaskGroup | None) -> None: ...
@@ -112,6 +112,10 @@ class WorkPoolWorkerChannel:
112
112
  def rest_fallback_enabled(self) -> bool:
113
113
  return self.state.rest_fallback_enabled
114
114
 
115
+ @property
116
+ def snapshots_available(self) -> bool:
117
+ return self._protocol.work_pool_snapshots_available
118
+
115
119
  @property
116
120
  def worker_id(self) -> UUID | None:
117
121
  return self._protocol.worker_id
@@ -128,7 +132,7 @@ class WorkPoolWorkerChannel:
128
132
  self._run_scope.cancel()
129
133
 
130
134
  async def sync(self, task_group: anyio.abc.TaskGroup | None) -> None:
131
- if self.state.healthy:
135
+ if self.state.healthy and self.snapshots_available:
132
136
  return
133
137
 
134
138
  if task_group is not None:
@@ -138,7 +142,7 @@ class WorkPoolWorkerChannel:
138
142
  if self.url is None:
139
143
  self.state.mark_terminal("endpoint_unavailable")
140
144
 
141
- if channel_started:
145
+ if channel_started and self.snapshots_available:
142
146
  return
143
147
 
144
148
  await self._sync_rest_work_pool()
@@ -317,13 +321,27 @@ class WorkPoolWorkerChannel:
317
321
  )
318
322
  return
319
323
 
324
+ if self.state.healthy and self.snapshots_available:
325
+ self._logger.debug(
326
+ "Skipping REST work pool sync because the worker channel applied a "
327
+ "snapshot while REST sync was in flight."
328
+ )
329
+ return
330
+
320
331
  if not work_pool.base_job_template:
321
332
  await self._set_work_pool_template(
322
333
  work_pool, self.default_base_job_template
323
334
  )
324
335
  work_pool.base_job_template = self.default_base_job_template
325
336
 
326
- self._protocol.handle_work_pool_snapshot(work_pool)
337
+ if self.state.healthy and self.snapshots_available:
338
+ self._logger.debug(
339
+ "Skipping REST work pool snapshot because the worker channel applied "
340
+ "a snapshot while REST sync was in flight."
341
+ )
342
+ return
343
+
344
+ self._protocol.record_rest_work_pool_snapshot(work_pool)
327
345
 
328
346
  async def _set_work_pool_template(
329
347
  self, work_pool: WorkPool, job_template: dict[str, Any]