prefect-client 3.7.1.dev7__tar.gz → 3.7.1.dev9__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.dev7 → prefect_client-3.7.1.dev9}/PKG-INFO +1 -1
  2. prefect_client-3.7.1.dev9/src/prefect/_build_info.py +5 -0
  3. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/AGENTS.md +2 -2
  4. prefect_client-3.7.1.dev9/src/prefect/concurrency/_leases.py +230 -0
  5. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/AGENTS.md +2 -0
  6. prefect_client-3.7.1.dev9/src/prefect/workers/_cleanup_handlers.py +142 -0
  7. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/base.py +83 -72
  8. prefect_client-3.7.1.dev7/src/prefect/_build_info.py +0 -5
  9. prefect_client-3.7.1.dev7/src/prefect/concurrency/_leases.py +0 -190
  10. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/.gitignore +0 -0
  11. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/LICENSE +0 -0
  12. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/README.md +0 -0
  13. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/hatch_build.py +0 -0
  14. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/pyproject.toml +0 -0
  15. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/.prefectignore +0 -0
  16. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/AGENTS.md +0 -0
  17. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/__init__.py +0 -0
  18. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/__main__.py +0 -0
  19. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/__init__.py +0 -0
  20. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/_launchers.py +0 -0
  21. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/bundles/__init__.py +0 -0
  22. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/bundles/execute.py +0 -0
  23. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/__init__.py +0 -0
  24. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/apply.py +0 -0
  25. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  26. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/manager.py +0 -0
  27. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/spec.py +0 -0
  28. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/__init__.py +0 -0
  29. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/client.py +0 -0
  30. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/objects.py +0 -0
  31. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_flow_run_suspension.py +0 -0
  32. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/__init__.py +0 -0
  33. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/_logging.py +0 -0
  34. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/__init__.py +0 -0
  35. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  36. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/client.py +0 -0
  37. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/device_id.py +0 -0
  38. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/emit.py +0 -0
  39. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/enabled.py +0 -0
  40. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/events.py +0 -0
  41. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/milestones.py +0 -0
  42. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/notice.py +0 -0
  43. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/service.py +0 -0
  44. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/ast_utils.py +0 -0
  45. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/buildx.py +0 -0
  46. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/__init__.py +0 -0
  47. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  48. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/backports.py +0 -0
  49. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/blocks.py +0 -0
  50. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  51. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  52. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/migration.py +0 -0
  53. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/starlette.py +0 -0
  54. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/__init__.py +0 -0
  55. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/api.py +0 -0
  56. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/calls.py +0 -0
  57. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  58. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  59. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/inspection.py +0 -0
  60. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/primitives.py +0 -0
  61. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/services.py +0 -0
  62. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/threads.py +0 -0
  63. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/waiters.py +0 -0
  64. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/control_listener.py +0 -0
  65. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/deprecated.py +0 -0
  66. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/engine.py +0 -0
  67. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/git.py +0 -0
  68. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  69. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/installation.py +0 -0
  70. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/integrations.py +0 -0
  71. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/launchers.py +0 -0
  72. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/lazy.py +0 -0
  73. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/metrics.py +0 -0
  74. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/observability.py +0 -0
  75. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/observers.py +0 -0
  76. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/__init__.py +0 -0
  77. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/apply.py +0 -0
  78. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/collections.py +0 -0
  79. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  80. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/manager.py +0 -0
  81. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/spec.py +0 -0
  82. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/startup.py +0 -0
  83. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/__init__.py +0 -0
  84. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/schemas.py +0 -0
  85. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  86. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  87. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  88. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pytz.py +0 -0
  89. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/result_records.py +0 -0
  90. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/retries.py +0 -0
  91. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schema.py +0 -0
  92. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/__init__.py +0 -0
  93. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/bases.py +0 -0
  94. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/fields.py +0 -0
  95. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/serializers.py +0 -0
  96. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/validators.py +0 -0
  97. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  98. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/states.py +0 -0
  99. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/testing.py +0 -0
  100. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/urls.py +0 -0
  101. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/uuid7.py +0 -0
  102. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/version_checking.py +0 -0
  103. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/versioning.py +0 -0
  104. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/waiters.py +0 -0
  105. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/websockets.py +0 -0
  106. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/__init__.py +0 -0
  107. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/fetcher.py +0 -0
  108. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/generator.py +0 -0
  109. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/models.py +0 -0
  110. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/naming.py +0 -0
  111. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/renderer.py +0 -0
  112. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/schema_converter.py +0 -0
  113. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/templates/__init__.py +0 -0
  114. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  115. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/types.py +0 -0
  116. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/unions.py +0 -0
  117. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_vendor/croniter/__init__.py +0 -0
  118. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_vendor/croniter/croniter.py +0 -0
  119. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/agent.py +0 -0
  120. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/analytics/__init__.py +0 -0
  121. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/artifacts.py +0 -0
  122. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/__init__.py +0 -0
  123. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/core.py +0 -0
  124. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/materialize.py +0 -0
  125. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/automations.py +0 -0
  126. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/AGENTS.md +0 -0
  127. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/__init__.py +0 -0
  128. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/abstract.py +0 -0
  129. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/core.py +0 -0
  130. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/fields.py +0 -0
  131. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/notifications.py +0 -0
  132. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/redis.py +0 -0
  133. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/system.py +0 -0
  134. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/webhook.py +0 -0
  135. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/__init__.py +0 -0
  136. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_file_collector.py +0 -0
  137. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_ignore_filter.py +0 -0
  138. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_path_resolver.py +0 -0
  139. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_zip_builder.py +0 -0
  140. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_zip_extractor.py +0 -0
  141. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/execute.py +0 -0
  142. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/cache_policies.py +0 -0
  143. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/AGENTS.md +0 -0
  144. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/__init__.py +0 -0
  145. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/attribution.py +0 -0
  146. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/base.py +0 -0
  147. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/cloud.py +0 -0
  148. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/collections.py +0 -0
  149. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/constants.py +0 -0
  150. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/__init__.py +0 -0
  151. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  152. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  153. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  154. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_automations/client.py +0 -0
  155. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  156. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  157. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  158. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  159. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  160. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  161. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  162. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  163. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  164. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  165. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  166. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_events/client.py +0 -0
  167. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  168. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  169. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  170. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flows/client.py +0 -0
  171. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  172. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_logs/client.py +0 -0
  173. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  174. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_variables/client.py +0 -0
  175. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  176. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  177. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/base.py +0 -0
  178. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/routes.py +0 -0
  179. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/__init__.py +0 -0
  180. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/actions.py +0 -0
  181. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/events.py +0 -0
  182. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/filters.py +0 -0
  183. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/objects.py +0 -0
  184. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/responses.py +0 -0
  185. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/schedules.py +0 -0
  186. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/sorting.py +0 -0
  187. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/worker_channel.py +0 -0
  188. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/subscriptions.py +0 -0
  189. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/types/__init__.py +0 -0
  190. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  191. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/utilities.py +0 -0
  192. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/__init__.py +0 -0
  193. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_asyncio.py +0 -0
  194. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_events.py +0 -0
  195. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_sync.py +0 -0
  196. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/asyncio.py +0 -0
  197. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/context.py +0 -0
  198. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/services.py +0 -0
  199. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/sync.py +0 -0
  200. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/__init__.py +0 -0
  201. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  202. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/_events.py +0 -0
  203. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/asyncio.py +0 -0
  204. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/context.py +0 -0
  205. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/services.py +0 -0
  206. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/sync.py +0 -0
  207. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/context.py +0 -0
  208. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/AGENTS.md +0 -0
  209. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/__init__.py +0 -0
  210. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/base.py +0 -0
  211. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/deployments.py +0 -0
  212. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/flow_runs.py +0 -0
  213. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/runner.py +0 -0
  214. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/schedules.py +0 -0
  215. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/__init__.py +0 -0
  216. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/core.py +0 -0
  217. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/pull.py +0 -0
  218. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/utility.py +0 -0
  219. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/__init__.py +0 -0
  220. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/_buildx.py +0 -0
  221. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/docker_image.py +0 -0
  222. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/engine.py +0 -0
  223. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/__init__.py +0 -0
  224. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/actions.py +0 -0
  225. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/clients.py +0 -0
  226. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/filters.py +0 -0
  227. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/related.py +0 -0
  228. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/__init__.py +0 -0
  229. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/automations.py +0 -0
  230. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  231. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/events.py +0 -0
  232. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/labelling.py +0 -0
  233. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/subscribers.py +0 -0
  234. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/utilities.py +0 -0
  235. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/worker.py +0 -0
  236. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/exceptions.py +0 -0
  237. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/filesystems.py +0 -0
  238. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flow_engine.py +0 -0
  239. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flow_runs.py +0 -0
  240. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flows.py +0 -0
  241. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/futures.py +0 -0
  242. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/__init__.py +0 -0
  243. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/base.py +0 -0
  244. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  245. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  246. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  247. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  248. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  249. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  250. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/__init__.py +0 -0
  251. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/actions.py +0 -0
  252. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/run_input.py +0 -0
  253. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/__init__.py +0 -0
  254. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/_filelock.py +0 -0
  255. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/filesystem.py +0 -0
  256. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/memory.py +0 -0
  257. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/protocol.py +0 -0
  258. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/AGENTS.md +0 -0
  259. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/__init__.py +0 -0
  260. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/clients.py +0 -0
  261. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/configuration.py +0 -0
  262. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/filters.py +0 -0
  263. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/formatters.py +0 -0
  264. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/handlers.py +0 -0
  265. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/highlighters.py +0 -0
  266. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/loggers.py +0 -0
  267. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/logging.yml +0 -0
  268. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/main.py +0 -0
  269. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/plugins.py +0 -0
  270. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/py.typed +0 -0
  271. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/results.py +0 -0
  272. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/AGENTS.md +0 -0
  273. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/__init__.py +0 -0
  274. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_cancel_finalizer.py +0 -0
  275. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_cancellation_manager.py +0 -0
  276. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_control_channel.py +0 -0
  277. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_deployment_registry.py +0 -0
  278. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_event_emitter.py +0 -0
  279. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_flow_resolver.py +0 -0
  280. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_flow_run_executor.py +0 -0
  281. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_hook_runner.py +0 -0
  282. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_limit_manager.py +0 -0
  283. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_process_manager.py +0 -0
  284. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  285. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_bundle.py +0 -0
  286. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_direct.py +0 -0
  287. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_engine.py +0 -0
  288. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_state_proposer.py +0 -0
  289. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_workspace_resolver.py +0 -0
  290. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_workspace_starter.py +0 -0
  291. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/runner.py +0 -0
  292. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/server.py +0 -0
  293. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/storage.py +0 -0
  294. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/__init__.py +0 -0
  295. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/deployment.py +0 -0
  296. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/flow_run.py +0 -0
  297. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/task_run.py +0 -0
  298. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/schedules.py +0 -0
  299. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/serializers.py +0 -0
  300. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/__init__.py +0 -0
  301. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/admin.py +0 -0
  302. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/artifacts.py +0 -0
  303. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/automations.py +0 -0
  304. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/background_workers.py +0 -0
  305. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_capabilities.py +0 -0
  306. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_documents.py +0 -0
  307. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_schemas.py +0 -0
  308. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_types.py +0 -0
  309. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/clients.py +0 -0
  310. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/collections.py +0 -0
  311. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  312. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/concurrency_limits.py +0 -0
  313. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  314. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/csrf_token.py +0 -0
  315. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/dependencies.py +0 -0
  316. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/deployments.py +0 -0
  317. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/events.py +0 -0
  318. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flow_run_states.py +0 -0
  319. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flow_runs.py +0 -0
  320. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flows.py +0 -0
  321. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/logs.py +0 -0
  322. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/middleware.py +0 -0
  323. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/root.py +0 -0
  324. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/run_history.py +0 -0
  325. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/saved_searches.py +0 -0
  326. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/server.py +0 -0
  327. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  328. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_run_states.py +0 -0
  329. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_runs.py +0 -0
  330. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_workers.py +0 -0
  331. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/templates.py +0 -0
  332. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/__init__.py +0 -0
  333. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/flow_runs.py +0 -0
  334. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/flows.py +0 -0
  335. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/schemas.py +0 -0
  336. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/task_runs.py +0 -0
  337. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/validation.py +0 -0
  338. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/variables.py +0 -0
  339. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/work_queues.py +0 -0
  340. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/workers.py +0 -0
  341. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/AGENTS.md +0 -0
  342. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/__init__.py +0 -0
  343. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/base.py +0 -0
  344. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/constants.py +0 -0
  345. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/context.py +0 -0
  346. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/legacy.py +0 -0
  347. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/__init__.py +0 -0
  348. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/_defaults.py +0 -0
  349. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/api.py +0 -0
  350. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/cli.py +0 -0
  351. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/client.py +0 -0
  352. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/cloud.py +0 -0
  353. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/deployments.py +0 -0
  354. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/events.py +0 -0
  355. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/experiments.py +0 -0
  356. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/flows.py +0 -0
  357. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/internal.py +0 -0
  358. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/logging.py +0 -0
  359. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/plugins.py +0 -0
  360. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/results.py +0 -0
  361. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/root.py +0 -0
  362. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/runner.py +0 -0
  363. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/__init__.py +0 -0
  364. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/api.py +0 -0
  365. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/concurrency.py +0 -0
  366. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/database.py +0 -0
  367. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/deployments.py +0 -0
  368. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/docket.py +0 -0
  369. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/ephemeral.py +0 -0
  370. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/events.py +0 -0
  371. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  372. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/logs.py +0 -0
  373. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/root.py +0 -0
  374. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/services.py +0 -0
  375. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/tasks.py +0 -0
  376. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/ui.py +0 -0
  377. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/tasks.py +0 -0
  378. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/telemetry.py +0 -0
  379. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/testing.py +0 -0
  380. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/worker.py +0 -0
  381. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/profiles.py +0 -0
  382. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/profiles.toml +0 -0
  383. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/sources.py +0 -0
  384. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/states.py +0 -0
  385. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_engine.py +0 -0
  386. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_runners.py +0 -0
  387. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_runs.py +0 -0
  388. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_worker.py +0 -0
  389. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/tasks.py +0 -0
  390. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/telemetry/__init__.py +0 -0
  391. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/telemetry/run_telemetry.py +0 -0
  392. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/transactions.py +0 -0
  393. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/__init__.py +0 -0
  394. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/_concurrency.py +0 -0
  395. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/_datetime.py +0 -0
  396. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/entrypoint.py +0 -0
  397. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/names.py +0 -0
  398. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/AGENTS.md +0 -0
  399. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/__init__.py +0 -0
  400. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/annotations.py +0 -0
  401. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  402. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  403. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/callables/AGENTS.md +0 -0
  404. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/callables/__init__.py +0 -0
  405. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/collections.py +0 -0
  406. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/compat.py +0 -0
  407. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/context.py +0 -0
  408. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/dispatch.py +0 -0
  409. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/dockerutils.py +0 -0
  410. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/engine/AGENTS.md +0 -0
  411. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/engine/__init__.py +0 -0
  412. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  413. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/filesystem/__init__.py +0 -0
  414. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/generics.py +0 -0
  415. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/hashing.py +0 -0
  416. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/importtools.py +0 -0
  417. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/math.py +0 -0
  418. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/names.py +0 -0
  419. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  420. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/processutils/__init__.py +0 -0
  421. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/pydantic.py +0 -0
  422. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/render_swagger.py +0 -0
  423. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  424. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  425. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  426. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/validation.py +0 -0
  427. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/services.py +0 -0
  428. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/slugify.py +0 -0
  429. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/templating/AGENTS.md +0 -0
  430. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/templating/__init__.py +0 -0
  431. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/text.py +0 -0
  432. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/timeout.py +0 -0
  433. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/urls.py +0 -0
  434. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/visualization.py +0 -0
  435. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/variables.py +0 -0
  436. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/AGENTS.md +0 -0
  437. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/__init__.py +0 -0
  438. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_cleanup.py +0 -0
  439. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  440. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  441. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_state.py +0 -0
  442. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  443. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  444. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/block.py +0 -0
  445. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/cloud.py +0 -0
  446. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/process.py +0 -0
  447. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/server.py +0 -0
  448. {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/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.dev7
3
+ Version: 3.7.1.dev9
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.dev9"
3
+ __build_date__ = "2026-05-15 09:11:51.705996+00:00"
4
+ __git_commit__ = "7b3d832873540f6c92ce44e75089070d46502dbb"
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
@@ -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
+ ]
@@ -17,7 +17,6 @@ from typing import (
17
17
  Callable,
18
18
  ClassVar,
19
19
  Generic,
20
- Iterable,
21
20
  Optional,
22
21
  Type,
23
22
  )
@@ -109,6 +108,7 @@ from prefect.workers._cleanup import (
109
108
  WorkerCleanupHandler,
110
109
  WorkerCleanupHandlerRegistry,
111
110
  )
111
+ from prefect.workers._cleanup_handlers import build_cleanup_handler_registry
112
112
  from prefect.workers._worker_channel import WorkerChannel, WorkPoolWorkerChannel
113
113
 
114
114
  if TYPE_CHECKING:
@@ -251,6 +251,65 @@ class BaseJobConfiguration(BaseModel):
251
251
  )
252
252
  return cls(**populated_configuration)
253
253
 
254
+ @classmethod
255
+ async def resolve_for_flow_run(
256
+ cls,
257
+ flow_run: "FlowRun",
258
+ *,
259
+ client: PrefectClient,
260
+ work_pool: WorkPool,
261
+ worker_name: str,
262
+ worker_id: UUID | None = None,
263
+ deployment: "DeploymentResponse | None" = None,
264
+ ) -> Self:
265
+ """Build a fully-prepared job configuration for an existing flow run.
266
+
267
+ Reads the flow run's deployment (when present) and flow, merges
268
+ deployment- and flow-run-level job variables over the work pool's
269
+ base template, instantiates the configuration, and stamps
270
+ attribution metadata via `prepare_for_flow_run`.
271
+ """
272
+ if not deployment and flow_run.deployment_id:
273
+ deployment = await client.read_deployment(flow_run.deployment_id)
274
+
275
+ flow = await client.read_flow(flow_run.flow_id)
276
+
277
+ deployment_vars = getattr(deployment, "job_variables", {}) or {}
278
+ flow_run_vars = flow_run.job_variables or {}
279
+ job_variables = {**deployment_vars}
280
+
281
+ # merge environment variables carefully, otherwise full override
282
+ if isinstance(job_variables.get("env"), dict):
283
+ job_variables["env"].update(flow_run_vars.pop("env", {}))
284
+ job_variables.update(flow_run_vars)
285
+
286
+ configuration = await cls.from_template_and_values(
287
+ base_job_template=work_pool.base_job_template,
288
+ values=job_variables,
289
+ client=client,
290
+ )
291
+ try:
292
+ configuration.prepare_for_flow_run(
293
+ flow_run=flow_run,
294
+ deployment=deployment,
295
+ flow=flow,
296
+ work_pool=work_pool,
297
+ worker_name=worker_name,
298
+ worker_id=worker_id,
299
+ )
300
+ except TypeError:
301
+ warnings.warn(
302
+ "This worker is missing the `work_pool`, `worker_name`, or `worker_id` arguments "
303
+ "in its JobConfiguration.prepare_for_flow_run method. Please update "
304
+ "the worker's JobConfiguration class to accept these arguments to "
305
+ "avoid this warning.",
306
+ category=PrefectDeprecationWarning,
307
+ )
308
+ configuration.prepare_for_flow_run(
309
+ flow_run=flow_run, deployment=deployment, flow=flow
310
+ )
311
+ return configuration
312
+
254
313
  @classmethod
255
314
  def json_template(cls) -> dict[str, Any]:
256
315
  """Returns a dict with job configuration as keys and the corresponding templates as values
@@ -567,8 +626,6 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
567
626
  heartbeat_interval_seconds: int | None = None,
568
627
  *,
569
628
  base_job_template: dict[str, Any] | None = None,
570
- _cleanup_handlers: Iterable[WorkerCleanupHandler] | None = None,
571
- _max_cleanup_concurrency: int | None = None,
572
629
  ):
573
630
  """
574
631
  Base class for all Prefect workers.
@@ -607,14 +664,7 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
607
664
  self._base_job_template = base_job_template
608
665
  self._work_pool_name = work_pool_name
609
666
  self._work_queues: set[str] = set(work_queues) if work_queues else set()
610
- self._cleanup_handler_registry = WorkerCleanupHandlerRegistry(
611
- _cleanup_handlers
612
- if _cleanup_handlers is not None
613
- else self.__class__.cleanup_handlers
614
- )
615
- if _max_cleanup_concurrency is not None and _max_cleanup_concurrency < 0:
616
- raise ValueError("Cleanup concurrency cannot be negative")
617
- self._max_cleanup_concurrency_override = _max_cleanup_concurrency
667
+ self._cleanup_handler_registry = build_cleanup_handler_registry(self)
618
668
 
619
669
  self._prefetch_seconds: float = (
620
670
  prefetch_seconds or PREFECT_WORKER_PREFETCH_SECONDS.value()
@@ -687,15 +737,8 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
687
737
  def max_cleanup_concurrency(self) -> int:
688
738
  if not self._cleanup_handler_registry:
689
739
  return 0
690
-
691
- concurrency = (
692
- self._max_cleanup_concurrency_override
693
- if self._max_cleanup_concurrency_override is not None
694
- else self.__class__.cleanup_max_concurrency
695
- )
696
- if concurrency is None:
697
- return 1
698
- return concurrency
740
+ concurrency = self.__class__.cleanup_max_concurrency
741
+ return 1 if concurrency is None else concurrency
699
742
 
700
743
  def _cleanup_delivery_available(self) -> bool:
701
744
  return bool(self._cleanup_handler_registry) and self.max_cleanup_concurrency > 0
@@ -1514,7 +1557,16 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
1514
1557
  run_logger = self.get_flow_run_logger(flow_run)
1515
1558
 
1516
1559
  try:
1517
- configuration = await self._get_configuration(flow_run)
1560
+ # Freeze a local copy of the work pool so a mid-flight snapshot
1561
+ # apply cannot retemplate the configuration we're building.
1562
+ work_pool = copy.deepcopy(self.work_pool)
1563
+ configuration = await self.job_configuration.resolve_for_flow_run(
1564
+ flow_run,
1565
+ client=self.client,
1566
+ work_pool=work_pool,
1567
+ worker_name=self.name,
1568
+ worker_id=self.backend_id,
1569
+ )
1518
1570
  submitted_event = self._emit_flow_run_submitted_event(configuration)
1519
1571
  await self._give_worker_labels_to_flow_run(flow_run.id)
1520
1572
 
@@ -1611,55 +1663,6 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
1611
1663
  },
1612
1664
  }
1613
1665
 
1614
- async def _get_configuration(
1615
- self,
1616
- flow_run: "FlowRun",
1617
- deployment: Optional["DeploymentResponse"] = None,
1618
- ) -> C:
1619
- work_pool = copy.deepcopy(self.work_pool)
1620
-
1621
- if not deployment and flow_run.deployment_id:
1622
- deployment = await self.client.read_deployment(flow_run.deployment_id)
1623
-
1624
- flow = await self.client.read_flow(flow_run.flow_id)
1625
-
1626
- deployment_vars = getattr(deployment, "job_variables", {}) or {}
1627
- flow_run_vars = flow_run.job_variables or {}
1628
- job_variables = {**deployment_vars}
1629
-
1630
- # merge environment variables carefully, otherwise full override
1631
- if isinstance(job_variables.get("env"), dict):
1632
- job_variables["env"].update(flow_run_vars.pop("env", {}))
1633
- job_variables.update(flow_run_vars)
1634
-
1635
- configuration = await self.job_configuration.from_template_and_values(
1636
- base_job_template=work_pool.base_job_template,
1637
- values=job_variables,
1638
- client=self.client,
1639
- )
1640
- try:
1641
- configuration.prepare_for_flow_run(
1642
- flow_run=flow_run,
1643
- deployment=deployment,
1644
- flow=flow,
1645
- work_pool=work_pool,
1646
- worker_name=self.name,
1647
- worker_id=self.backend_id,
1648
- )
1649
- except TypeError:
1650
- warnings.warn(
1651
- "This worker is missing the `work_pool`, `worker_name`, or `worker_id` arguments "
1652
- "in its JobConfiguration.prepare_for_flow_run method. Please update "
1653
- "the worker's JobConfiguration class to accept these arguments to "
1654
- "avoid this warning.",
1655
- category=PrefectDeprecationWarning,
1656
- )
1657
- # Handle older subclasses that don't accept work_pool, worker_name, and worker_id
1658
- configuration.prepare_for_flow_run(
1659
- flow_run=flow_run, deployment=deployment, flow=flow
1660
- )
1661
- return configuration
1662
-
1663
1666
  async def _propose_pending_state(self, flow_run: "FlowRun") -> bool:
1664
1667
  run_logger = self.get_flow_run_logger(flow_run)
1665
1668
  state = flow_run.state
@@ -1804,9 +1807,17 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
1804
1807
  )
1805
1808
  return
1806
1809
 
1807
- # Get configuration and kill infrastructure
1810
+ # Get configuration and kill infrastructure. Freeze a local work
1811
+ # pool copy so a mid-flight snapshot cannot retemplate the build.
1808
1812
  try:
1809
- configuration = await self._get_configuration(flow_run)
1813
+ work_pool = copy.deepcopy(self.work_pool)
1814
+ configuration = await self.job_configuration.resolve_for_flow_run(
1815
+ flow_run,
1816
+ client=self.client,
1817
+ work_pool=work_pool,
1818
+ worker_name=self.name,
1819
+ worker_id=self.backend_id,
1820
+ )
1810
1821
  except ObjectNotFound:
1811
1822
  run_logger.warning(
1812
1823
  "Cannot kill infrastructure: deployment not found. "
@@ -1,5 +0,0 @@
1
- # Generated by versioningit
2
- __version__ = "3.7.1.dev7"
3
- __build_date__ = "2026-05-13 09:09:16.813044+00:00"
4
- __git_commit__ = "35c7f1ed90b2a8605bc9f39b83d917ed2b862e08"
5
- __dirty__ = False