prefect-client 3.8.1.dev5__tar.gz → 3.8.2__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 (451) hide show
  1. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/PKG-INFO +2 -2
  2. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/pyproject.toml +1 -1
  3. prefect_client-3.8.2/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/services.py +13 -2
  5. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/control_listener.py +4 -2
  6. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/websockets.py +9 -0
  7. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/core.py +8 -0
  8. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/client.py +2 -2
  9. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/objects.py +1 -1
  10. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_asyncio.py +26 -0
  11. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/services.py +84 -2
  12. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/context.py +19 -1
  13. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/runner.py +67 -7
  14. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/engine.py +6 -8
  15. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/clients.py +0 -1
  16. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/utilities.py +7 -3
  17. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flow_engine.py +16 -22
  18. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flows.py +2 -3
  19. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/futures.py +6 -0
  20. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/container_instance.py +1 -1
  21. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/AGENTS.md +2 -2
  22. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_control_channel.py +9 -8
  23. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_process_manager.py +33 -2
  24. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_engine.py +5 -0
  25. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_workspace_starter.py +3 -0
  26. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/storage.py +2 -2
  27. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/tasks.py +0 -8
  28. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/processutils/__init__.py +24 -3
  29. prefect_client-3.8.1.dev5/src/prefect/_build_info.py +0 -5
  30. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/.gitignore +0 -0
  31. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/LICENSE +0 -0
  32. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/README.md +0 -0
  33. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/hatch_build.py +0 -0
  34. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/.prefectignore +0 -0
  35. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/AGENTS.md +0 -0
  36. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/__init__.py +0 -0
  37. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/__main__.py +0 -0
  38. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/__init__.py +0 -0
  39. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/_launchers.py +0 -0
  40. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
  41. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/execute.py +0 -0
  42. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
  43. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/apply.py +0 -0
  44. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  45. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/manager.py +0 -0
  46. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/spec.py +0 -0
  47. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/__init__.py +0 -0
  48. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/client.py +0 -0
  49. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/objects.py +0 -0
  50. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_flow_run_suspension.py +0 -0
  51. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/__init__.py +0 -0
  52. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/_logging.py +0 -0
  53. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/__init__.py +0 -0
  54. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  55. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/client.py +0 -0
  56. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/device_id.py +0 -0
  57. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/emit.py +0 -0
  58. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/enabled.py +0 -0
  59. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/events.py +0 -0
  60. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/milestones.py +0 -0
  61. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/notice.py +0 -0
  62. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/service.py +0 -0
  63. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/ast_utils.py +0 -0
  64. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/buildx.py +0 -0
  65. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
  66. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  67. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/backports.py +0 -0
  68. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
  69. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  70. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  71. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/migration.py +0 -0
  72. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
  73. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
  74. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/api.py +0 -0
  75. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/calls.py +0 -0
  76. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  77. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  78. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
  79. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
  80. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/threads.py +0 -0
  81. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
  82. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/deprecated.py +0 -0
  83. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/engine.py +0 -0
  84. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/git.py +0 -0
  85. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  86. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/installation.py +0 -0
  87. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/integrations.py +0 -0
  88. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/launchers.py +0 -0
  89. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/lazy.py +0 -0
  90. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/metrics.py +0 -0
  91. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/observability.py +0 -0
  92. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/observers.py +0 -0
  93. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/__init__.py +0 -0
  94. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/apply.py +0 -0
  95. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/collections.py +0 -0
  96. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  97. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/manager.py +0 -0
  98. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/spec.py +0 -0
  99. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/startup.py +0 -0
  100. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
  101. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
  102. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  103. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  104. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  105. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pytz.py +0 -0
  106. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/result_records.py +0 -0
  107. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/retries.py +0 -0
  108. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schema.py +0 -0
  109. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/__init__.py +0 -0
  110. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/_registry.py +0 -0
  111. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/bases.py +0 -0
  112. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/fields.py +0 -0
  113. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/serializers.py +0 -0
  114. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/validators.py +0 -0
  115. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  116. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/states.py +0 -0
  117. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/testing.py +0 -0
  118. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/urls.py +0 -0
  119. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/uuid7.py +0 -0
  120. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/version_checking.py +0 -0
  121. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/versioning.py +0 -0
  122. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/waiters.py +0 -0
  123. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/__init__.py +0 -0
  124. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/fetcher.py +0 -0
  125. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/generator.py +0 -0
  126. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/models.py +0 -0
  127. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/naming.py +0 -0
  128. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/renderer.py +0 -0
  129. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/schema_converter.py +0 -0
  130. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/templates/__init__.py +0 -0
  131. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  132. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/types.py +0 -0
  133. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/unions.py +0 -0
  134. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
  135. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
  136. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/agent.py +0 -0
  137. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/analytics/__init__.py +0 -0
  138. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/artifacts.py +0 -0
  139. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/__init__.py +0 -0
  140. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/core.py +0 -0
  141. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/materialize.py +0 -0
  142. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/automations.py +0 -0
  143. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/AGENTS.md +0 -0
  144. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/__init__.py +0 -0
  145. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/abstract.py +0 -0
  146. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/fields.py +0 -0
  147. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/notifications.py +0 -0
  148. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/redis.py +0 -0
  149. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/system.py +0 -0
  150. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/webhook.py +0 -0
  151. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/__init__.py +0 -0
  152. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_file_collector.py +0 -0
  153. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_ignore_filter.py +0 -0
  154. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_path_resolver.py +0 -0
  155. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_zip_builder.py +0 -0
  156. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_zip_extractor.py +0 -0
  157. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/execute.py +0 -0
  158. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/cache_policies.py +0 -0
  159. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/AGENTS.md +0 -0
  160. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/__init__.py +0 -0
  161. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/attribution.py +0 -0
  162. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/base.py +0 -0
  163. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/cloud.py +0 -0
  164. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/collections.py +0 -0
  165. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/constants.py +0 -0
  166. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/__init__.py +0 -0
  167. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  168. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  169. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  170. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
  171. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  172. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  173. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  174. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  175. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  176. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  177. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  178. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  179. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  180. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  181. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  182. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/client.py +0 -0
  183. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  184. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  185. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  186. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
  187. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  188. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
  189. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  190. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
  191. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  192. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/base.py +0 -0
  193. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/routes.py +0 -0
  194. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/__init__.py +0 -0
  195. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/actions.py +0 -0
  196. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/events.py +0 -0
  197. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/filters.py +0 -0
  198. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/responses.py +0 -0
  199. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/schedules.py +0 -0
  200. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/sorting.py +0 -0
  201. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/worker_channel.py +0 -0
  202. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/subscriptions.py +0 -0
  203. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/types/__init__.py +0 -0
  204. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  205. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/utilities.py +0 -0
  206. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/AGENTS.md +0 -0
  207. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/__init__.py +0 -0
  208. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_events.py +0 -0
  209. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_leases.py +0 -0
  210. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_sync.py +0 -0
  211. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/asyncio.py +0 -0
  212. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/context.py +0 -0
  213. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/sync.py +0 -0
  214. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/__init__.py +0 -0
  215. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  216. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_events.py +0 -0
  217. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
  218. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/context.py +0 -0
  219. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/services.py +0 -0
  220. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/sync.py +0 -0
  221. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/AGENTS.md +0 -0
  222. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/__init__.py +0 -0
  223. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/base.py +0 -0
  224. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/deployments.py +0 -0
  225. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/flow_runs.py +0 -0
  226. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/schedules.py +0 -0
  227. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/__init__.py +0 -0
  228. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/core.py +0 -0
  229. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/pull.py +0 -0
  230. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/utility.py +0 -0
  231. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/__init__.py +0 -0
  232. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/_buildx.py +0 -0
  233. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/docker_image.py +0 -0
  234. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/AGENTS.md +0 -0
  235. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/__init__.py +0 -0
  236. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/actions.py +0 -0
  237. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/filters.py +0 -0
  238. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/related.py +0 -0
  239. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/__init__.py +0 -0
  240. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/automations.py +0 -0
  241. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  242. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/events.py +0 -0
  243. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/labelling.py +0 -0
  244. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/subscribers.py +0 -0
  245. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/worker.py +0 -0
  246. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/exceptions.py +0 -0
  247. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/filesystems.py +0 -0
  248. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flow_runs.py +0 -0
  249. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/__init__.py +0 -0
  250. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/base.py +0 -0
  251. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  252. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  253. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  254. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  255. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  256. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/__init__.py +0 -0
  257. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/actions.py +0 -0
  258. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/run_input.py +0 -0
  259. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/__init__.py +0 -0
  260. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/_filelock.py +0 -0
  261. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/filesystem.py +0 -0
  262. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/memory.py +0 -0
  263. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/protocol.py +0 -0
  264. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/AGENTS.md +0 -0
  265. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/__init__.py +0 -0
  266. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/clients.py +0 -0
  267. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/configuration.py +0 -0
  268. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/filters.py +0 -0
  269. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/formatters.py +0 -0
  270. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/handlers.py +0 -0
  271. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/highlighters.py +0 -0
  272. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/loggers.py +0 -0
  273. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/logging.yml +0 -0
  274. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/main.py +0 -0
  275. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/plugins.py +0 -0
  276. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/py.typed +0 -0
  277. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/results.py +0 -0
  278. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/__init__.py +0 -0
  279. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
  280. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_cancellation_manager.py +0 -0
  281. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_deployment_registry.py +0 -0
  282. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_event_emitter.py +0 -0
  283. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_flow_resolver.py +0 -0
  284. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_flow_run_executor.py +0 -0
  285. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_hook_runner.py +0 -0
  286. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_limit_manager.py +0 -0
  287. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  288. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_bundle.py +0 -0
  289. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_direct.py +0 -0
  290. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_state_proposer.py +0 -0
  291. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_workspace_resolver.py +0 -0
  292. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/runner.py +0 -0
  293. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/server.py +0 -0
  294. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/__init__.py +0 -0
  295. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/deployment.py +0 -0
  296. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/flow_run.py +0 -0
  297. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/task_run.py +0 -0
  298. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/schedules.py +0 -0
  299. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/serializers.py +0 -0
  300. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/__init__.py +0 -0
  301. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/_ui_static.py +0 -0
  302. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/admin.py +0 -0
  303. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/artifacts.py +0 -0
  304. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/automations.py +0 -0
  305. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/background_workers.py +0 -0
  306. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_capabilities.py +0 -0
  307. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_documents.py +0 -0
  308. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_schemas.py +0 -0
  309. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_types.py +0 -0
  310. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/clients.py +0 -0
  311. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/collections.py +0 -0
  312. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  313. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits.py +0 -0
  314. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  315. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/csrf_token.py +0 -0
  316. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/dependencies.py +0 -0
  317. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/deployments.py +0 -0
  318. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/events.py +0 -0
  319. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flow_run_states.py +0 -0
  320. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flow_runs.py +0 -0
  321. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flows.py +0 -0
  322. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/logs.py +0 -0
  323. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/middleware.py +0 -0
  324. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/root.py +0 -0
  325. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/run_history.py +0 -0
  326. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/saved_searches.py +0 -0
  327. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/server.py +0 -0
  328. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  329. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_run_states.py +0 -0
  330. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_runs.py +0 -0
  331. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_workers.py +0 -0
  332. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/templates.py +0 -0
  333. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/__init__.py +0 -0
  334. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
  335. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/flows.py +0 -0
  336. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/schemas.py +0 -0
  337. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/task_runs.py +0 -0
  338. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/validation.py +0 -0
  339. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/variables.py +0 -0
  340. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/work_queues.py +0 -0
  341. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/workers.py +0 -0
  342. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/AGENTS.md +0 -0
  343. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/__init__.py +0 -0
  344. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/_types.py +0 -0
  345. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/base.py +0 -0
  346. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/constants.py +0 -0
  347. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/context.py +0 -0
  348. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/legacy.py +0 -0
  349. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/__init__.py +0 -0
  350. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/_defaults.py +0 -0
  351. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/api.py +0 -0
  352. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/cli.py +0 -0
  353. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/client.py +0 -0
  354. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/cloud.py +0 -0
  355. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/deployments.py +0 -0
  356. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/events.py +0 -0
  357. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/experiments.py +0 -0
  358. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/flows.py +0 -0
  359. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/internal.py +0 -0
  360. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/logging.py +0 -0
  361. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/plugins.py +0 -0
  362. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/results.py +0 -0
  363. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/root.py +0 -0
  364. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/runner.py +0 -0
  365. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/__init__.py +0 -0
  366. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/api.py +0 -0
  367. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/concurrency.py +0 -0
  368. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/database.py +0 -0
  369. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/deployments.py +0 -0
  370. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/docket.py +0 -0
  371. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
  372. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/events.py +0 -0
  373. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  374. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/logs.py +0 -0
  375. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/root.py +0 -0
  376. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/services.py +0 -0
  377. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/tasks.py +0 -0
  378. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/ui.py +0 -0
  379. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
  380. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/tasks.py +0 -0
  381. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/telemetry.py +0 -0
  382. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/testing.py +0 -0
  383. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/worker.py +0 -0
  384. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/profiles.py +0 -0
  385. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/profiles.toml +0 -0
  386. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/sources.py +0 -0
  387. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/states.py +0 -0
  388. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_engine.py +0 -0
  389. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_runners.py +0 -0
  390. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_runs.py +0 -0
  391. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_worker.py +0 -0
  392. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/telemetry/__init__.py +0 -0
  393. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/telemetry/run_telemetry.py +0 -0
  394. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/transactions.py +0 -0
  395. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/__init__.py +0 -0
  396. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/_concurrency.py +0 -0
  397. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/_datetime.py +0 -0
  398. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/entrypoint.py +0 -0
  399. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/names.py +0 -0
  400. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/AGENTS.md +0 -0
  401. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/__init__.py +0 -0
  402. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/annotations.py +0 -0
  403. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  404. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  405. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
  406. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/callables/__init__.py +0 -0
  407. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/collections.py +0 -0
  408. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/compat.py +0 -0
  409. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/context.py +0 -0
  410. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/dispatch.py +0 -0
  411. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/dockerutils.py +0 -0
  412. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
  413. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/engine/__init__.py +0 -0
  414. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  415. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
  416. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/generics.py +0 -0
  417. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/hashing.py +0 -0
  418. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/importtools.py +0 -0
  419. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/math.py +0 -0
  420. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/names.py +0 -0
  421. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  422. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/pydantic.py +0 -0
  423. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/render_swagger.py +0 -0
  424. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  425. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  426. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  427. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
  428. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/services.py +0 -0
  429. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/slugify.py +0 -0
  430. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
  431. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/templating/__init__.py +0 -0
  432. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/text.py +0 -0
  433. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/timeout.py +0 -0
  434. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/urls.py +0 -0
  435. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/visualization.py +0 -0
  436. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/variables.py +0 -0
  437. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/AGENTS.md +0 -0
  438. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/__init__.py +0 -0
  439. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_cleanup.py +0 -0
  440. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
  441. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  442. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  443. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
  444. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  445. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  446. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/base.py +0 -0
  447. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/block.py +0 -0
  448. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/cloud.py +0 -0
  449. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/process.py +0 -0
  450. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/server.py +0 -0
  451. {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/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.8.1.dev5
3
+ Version: 3.8.2
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
@@ -22,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.14
22
22
  Classifier: Topic :: Software Development :: Libraries
23
23
  Requires-Python: <3.15,>=3.10
24
24
  Requires-Dist: amplitude-analytics<2.0.0,>=1.2.1
25
- Requires-Dist: anyio!=4.14.2,<5.0.0,>=4.4.0
25
+ Requires-Dist: anyio<5.0.0,>=4.4.0
26
26
  Requires-Dist: asgi-lifespan<3.0,>=1.0
27
27
  Requires-Dist: cachetools<8.0,>=5.3
28
28
  Requires-Dist: cloudpickle<4.0,>=2.0
@@ -26,7 +26,7 @@ classifiers = [
26
26
  dependencies = [
27
27
  # Client dependencies
28
28
  "amplitude-analytics>=1.2.1,<2.0.0",
29
- "anyio>=4.4.0,<5.0.0,!=4.14.2",
29
+ "anyio>=4.4.0,<5.0.0",
30
30
  "asgi-lifespan>=1.0,<3.0",
31
31
  "cachetools>=5.3,<8.0",
32
32
  "cloudpickle>=2.0,<4.0",
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.8.2"
3
+ __build_date__ = "2026-08-07 21:16:33.823431+00:00"
4
+ __git_commit__ = "b535a27ea1b567bd0363b94617fc2502a56d23c8"
5
+ __dirty__ = False
@@ -408,10 +408,21 @@ class FutureQueueService(
408
408
  # If the request to the increment endpoint fails in a non-standard
409
409
  # way, we need to set the future's result so it'll be re-raised in
410
410
  # the context of the caller.
411
- future.set_exception(exc)
411
+ if future.set_running_or_notify_cancel():
412
+ future.set_exception(exc)
412
413
  raise exc
413
414
  else:
414
- future.set_result(response)
415
+ # Transitioning the future to running before setting its result closes
416
+ # the window where the caller cancels it while `acquire` is in flight:
417
+ # after this point `cancel()` fails, and if the caller got there first
418
+ # the acquired resource is nobody's and must be discarded.
419
+ if future.set_running_or_notify_cancel():
420
+ future.set_result(response)
421
+ else:
422
+ await self._discard(response)
423
+
424
+ async def _discard(self, response: R) -> None:
425
+ """Dispose of a result whose caller is no longer waiting for it."""
415
426
 
416
427
  @abc.abstractmethod
417
428
  async def acquire(self, *args: Unpack[Ts]) -> R:
@@ -13,7 +13,7 @@ Protocol:
13
13
  one-shot env vars without connecting yet.
14
14
  3. The outermost `capture_sigterm()` calls `start()`, which connects back to
15
15
  the runner and spawns a daemon thread blocked on the socket.
16
- 4. The runner writes a single-byte intent (`b"c"` today).
16
+ 4. The runner writes a single-byte intent (`b"c"`, `b"r"` or `b"q"`).
17
17
  5. If Prefect still owns the live SIGTERM bridge, the child writes `b"a"`,
18
18
  commits the intent for engine dispatch, and on Windows triggers
19
19
  `_thread.interrupt_main(SIGTERM)`.
@@ -37,10 +37,12 @@ from typing import Literal
37
37
 
38
38
  from prefect.utilities.engine import commit_control_intent_and_ack
39
39
 
40
- Intent = Literal["cancel"]
40
+ Intent = Literal["cancel", "reschedule", "relinquish"]
41
41
 
42
42
  _INTENT_FOR_BYTE: dict[bytes, Intent] = {
43
43
  b"c": "cancel",
44
+ b"r": "reschedule",
45
+ b"q": "relinquish",
44
46
  }
45
47
 
46
48
  _intent: Intent | None = None
@@ -14,6 +14,8 @@ from urllib.parse import urlparse
14
14
  import certifi
15
15
  from websockets.asyncio.client import connect
16
16
 
17
+ import prefect
18
+ from prefect.client.constants import SERVER_API_VERSION
17
19
  from prefect.settings import get_current_settings
18
20
 
19
21
 
@@ -51,6 +53,13 @@ def websocket_connect(uri: str, **kwargs: Any) -> connect:
51
53
  if ssl_context:
52
54
  kwargs.setdefault("ssl", ssl_context)
53
55
 
56
+ # Identify ourselves to the server the same way the HTTP client does so that
57
+ # the client version can be parsed from the handshake
58
+ kwargs.setdefault(
59
+ "user_agent_header",
60
+ f"prefect/{prefect.__version__} (API {SERVER_API_VERSION})",
61
+ )
62
+
54
63
  # Add custom headers from settings
55
64
  custom_headers = get_current_settings().client.custom_headers
56
65
  if custom_headers:
@@ -424,6 +424,14 @@ class Block(BaseModel, ABC):
424
424
  def ser_model(
425
425
  self, handler: SerializerFunctionWrapHandler, info: SerializationInfo
426
426
  ) -> Any:
427
+ if info.context and info.context.get("serialize_blocks_as_references"):
428
+ if self._block_document_id is None:
429
+ raise BlockNotSavedError(
430
+ "Block must be saved with `.save()` before it can be used as a "
431
+ "deployment parameter."
432
+ )
433
+ return {"$ref": {"block_document_id": str(self._block_document_id)}}
434
+
427
435
  jsonable_self = handler(self)
428
436
  if (ctx := info.context) and ctx.get("include_secrets") is True:
429
437
  # Add serialization mode to context so handle_secret_render knows how to process nested models
@@ -48,7 +48,7 @@ class WorkPoolClient(BaseClient):
48
48
  Args:
49
49
  work_pool_name: The name of the work pool to heartbeat against.
50
50
  worker_name: The name of the worker sending the heartbeat.
51
- return_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `return_id` is `True`.
51
+ get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
52
52
  worker_metadata: Metadata about the worker to send to the server.
53
53
  """
54
54
  from uuid import UUID
@@ -376,7 +376,7 @@ class WorkPoolAsyncClient(BaseAsyncClient):
376
376
  Args:
377
377
  work_pool_name: The name of the work pool to heartbeat against.
378
378
  worker_name: The name of the worker sending the heartbeat.
379
- return_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `return_id` is `True`.
379
+ get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
380
380
  worker_metadata: Metadata about the worker to send to the server.
381
381
  """
382
382
  from uuid import UUID
@@ -1477,7 +1477,7 @@ class WorkQueueHealthPolicy(PrefectBaseModel):
1477
1477
  Given empirical information about the state of the work queue, evaluate its health status.
1478
1478
 
1479
1479
  Args:
1480
- late_runs: the count of late runs for the work queue.
1480
+ late_runs_count: the count of late runs for the work queue.
1481
1481
  last_polled: the last time the work queue was polled, if available.
1482
1482
 
1483
1483
  Returns:
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import concurrent.futures
4
5
  import logging
5
6
  from contextlib import asynccontextmanager
6
7
  from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional
@@ -150,6 +151,9 @@ async def aacquire_concurrency_slots_with_lease(
150
151
  )
151
152
  try:
152
153
  response = await asyncio.wrap_future(future)
154
+ except asyncio.CancelledError:
155
+ _release_lease_when_granted(service, future)
156
+ raise
153
157
  except TimeoutError as timeout:
154
158
  raise AcquireConcurrencySlotTimeoutError(
155
159
  f"Attempt to acquire concurrency slots timed out after {timeout_seconds} second(s)"
@@ -225,6 +229,28 @@ def _discard_cleanup_lease(lease_id: UUID) -> None:
225
229
  ctx.cleanup_lease_ids.remove(lease_id)
226
230
 
227
231
 
232
+ def _release_lease_when_granted(
233
+ service: ConcurrencySlotAcquisitionWithLeaseService,
234
+ future: "concurrent.futures.Future[httpx.Response]",
235
+ ) -> None:
236
+ """Release the lease for an acquisition whose caller has been cancelled.
237
+
238
+ The acquisition may still be granted after the caller is gone, and the lease
239
+ id never reaches the `ConcurrencyContext`, so the slots would stay occupied
240
+ until the lease expires. The cancelled caller cannot do the release itself, so
241
+ the service that acquired the slots is asked to release them.
242
+ """
243
+
244
+ def _release(completed: "concurrent.futures.Future[httpx.Response]") -> None:
245
+ if completed.cancelled() or completed.exception() is not None:
246
+ # Nothing was granted, so there is nothing to release.
247
+ return
248
+
249
+ service.release_orphaned_lease(completed.result())
250
+
251
+ future.add_done_callback(_release)
252
+
253
+
228
254
  def _response_to_minimal_concurrency_limit_response(
229
255
  response: httpx.Response,
230
256
  ) -> list[MinimalConcurrencyLimitResponse]:
@@ -1,10 +1,11 @@
1
1
  import asyncio
2
+ import concurrent.futures
2
3
  import json
3
4
  from collections.abc import AsyncGenerator
4
5
  from contextlib import asynccontextmanager
5
6
  from threading import Lock
6
7
  from typing import TYPE_CHECKING, Literal, Optional
7
- from uuid import uuid4
8
+ from uuid import UUID, uuid4
8
9
 
9
10
  import cachetools
10
11
  import httpx
@@ -104,12 +105,25 @@ class ConcurrencySlotAcquisitionWithLeaseService(
104
105
  super().__init__(concurrency_limit_names)
105
106
  self._client: PrefectClient
106
107
  self.concurrency_limit_names: list[str] = sorted(list(concurrency_limit_names))
108
+ self._pending_releases: set[concurrent.futures.Future[None]] = set()
107
109
 
108
110
  @asynccontextmanager
109
111
  async def _lifespan(self) -> AsyncGenerator[None, None]:
110
112
  async with get_client() as client:
111
113
  self._client = client
112
- yield
114
+ try:
115
+ yield
116
+ finally:
117
+ # The client closes when this exits, so releases scheduled by
118
+ # cancelled callers have to finish first or their slots leak.
119
+ if self._pending_releases:
120
+ await asyncio.gather(
121
+ *(
122
+ asyncio.wrap_future(release)
123
+ for release in tuple(self._pending_releases)
124
+ ),
125
+ return_exceptions=True,
126
+ )
113
127
 
114
128
  async def acquire(
115
129
  self,
@@ -185,6 +199,74 @@ class ConcurrencySlotAcquisitionWithLeaseService(
185
199
  if max_retries is not None:
186
200
  max_retries -= 1
187
201
 
202
+ async def _discard(self, response: httpx.Response) -> None:
203
+ """Release a lease granted to a caller that was cancelled while waiting.
204
+
205
+ Without this the slots stay occupied until the lease expires, because the
206
+ caller never learns the lease id and so cannot record it for cleanup.
207
+ """
208
+ lease_id = self._lease_id_from_response(response)
209
+ if lease_id is None:
210
+ return
211
+
212
+ try:
213
+ await self._client.release_concurrency_slots_with_lease(lease_id=lease_id)
214
+ except Exception:
215
+ logger.warning(
216
+ f"Failed to release concurrency lease {lease_id} for "
217
+ f"{self.concurrency_limit_names} after the acquiring caller was cancelled",
218
+ exc_info=True,
219
+ )
220
+
221
+ def release_orphaned_lease(
222
+ self, response: httpx.Response
223
+ ) -> "concurrent.futures.Future[None]":
224
+ """Release a lease that was delivered to a caller which is already gone.
225
+
226
+ The release is scheduled on the service's own loop so it reuses the client
227
+ that acquired the slots, keeping acquisition and cleanup on the same API, and
228
+ is tracked so that draining the service waits for it.
229
+ """
230
+ with self._lock:
231
+ loop = self._loop
232
+ if self._stopped or loop is None or loop.is_closed():
233
+ logger.warning(
234
+ f"Unable to release concurrency lease for {self.concurrency_limit_names} "
235
+ "after the acquiring caller was cancelled: the acquisition service is "
236
+ "no longer running. The slots remain occupied until the lease expires."
237
+ )
238
+ stopped: concurrent.futures.Future[None] = concurrent.futures.Future()
239
+ stopped.set_result(None)
240
+ return stopped
241
+
242
+ # Registering under the lock `_stop` uses keeps the service from
243
+ # finishing its lifespan, and closing its client, before this release.
244
+ release = asyncio.run_coroutine_threadsafe(self._discard(response), loop)
245
+ self._pending_releases.add(release)
246
+
247
+ release.add_done_callback(self._pending_releases.discard)
248
+ return release
249
+
250
+ def _lease_id_from_response(self, response: httpx.Response) -> Optional[UUID]:
251
+ """Read the lease id out of a successful acquisition response.
252
+
253
+ Returns `None` when no slots were acquired, and logs when the response is
254
+ malformed, since that leaves a possibly active lease we cannot release.
255
+ """
256
+ try:
257
+ data = response.json()
258
+ if not data.get("limits"):
259
+ return None
260
+ return UUID(data["lease_id"])
261
+ except Exception:
262
+ logger.warning(
263
+ f"Unable to read the lease id from the acquisition response for "
264
+ f"{self.concurrency_limit_names}; if a lease was granted its slots "
265
+ "remain occupied until it expires.",
266
+ exc_info=True,
267
+ )
268
+ return None
269
+
188
270
 
189
271
  def _should_use_cache(
190
272
  names: list[str], holder: Optional["ConcurrencyLeaseHolder"]
@@ -14,6 +14,7 @@ import warnings
14
14
  from collections.abc import AsyncGenerator, Generator, Mapping
15
15
  from contextlib import ExitStack, asynccontextmanager, contextmanager
16
16
  from contextvars import ContextVar, Token
17
+ from pathlib import Path
17
18
  from typing import (
18
19
  TYPE_CHECKING,
19
20
  Any,
@@ -46,11 +47,13 @@ from prefect.results import (
46
47
  )
47
48
  from prefect.settings import Profile, Settings
48
49
  from prefect.settings.legacy import (
50
+ Setting,
49
51
  _get_settings_fields, # type: ignore[reportPrivateUsage]
50
52
  )
51
53
  from prefect.states import State
52
54
  from prefect.task_runners import TaskRunner
53
55
  from prefect.types import DateTime
56
+ from prefect.utilities.collections import visit_collection
54
57
  from prefect.utilities.services import start_client_metrics_server
55
58
 
56
59
  T = TypeVar("T")
@@ -825,6 +828,21 @@ class SettingsContext(ContextModel):
825
828
  def __hash__(self: Self) -> int:
826
829
  return hash(self.settings)
827
830
 
831
+ def serialize(self, include_secrets: bool = True) -> dict[str, Any]:
832
+ """Serialize settings without platform-specific path objects."""
833
+ serialized = super().serialize(include_secrets=include_secrets)
834
+ return visit_collection(
835
+ serialized,
836
+ visit_fn=lambda value: (
837
+ value.name
838
+ if isinstance(value, Setting)
839
+ else str(value)
840
+ if isinstance(value, Path)
841
+ else value
842
+ ),
843
+ return_data=True,
844
+ )
845
+
828
846
  @classmethod
829
847
  def get(cls) -> Optional["SettingsContext"]:
830
848
  # Return the global context instead of `None` if no context exists
@@ -976,7 +994,7 @@ def use_profile(
976
994
 
977
995
  Args:
978
996
  profile: The name of the profile to load or an instance of a Profile.
979
- override_environment_variable: If set, variables in the profile will take
997
+ override_environment_variables: If set, variables in the profile will take
980
998
  precedence over current environment variables. By default, environment
981
999
  variables will override profile settings.
982
1000
  include_current_context: If set, the new settings will be constructed
@@ -53,6 +53,8 @@ from pydantic import (
53
53
  ConfigDict,
54
54
  Field,
55
55
  PrivateAttr,
56
+ TypeAdapter,
57
+ field_serializer,
56
58
  field_validator,
57
59
  model_validator,
58
60
  )
@@ -69,6 +71,7 @@ from prefect._internal.schemas.validators import (
69
71
  reconcile_schedules_runner,
70
72
  )
71
73
  from prefect._internal.versioning import VersionType, get_inferred_version_info
74
+ from prefect.blocks.core import Block, BlockNotSavedError
72
75
  from prefect.client.base import ServerType
73
76
  from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
74
77
  from prefect.client.schemas.actions import (
@@ -106,7 +109,12 @@ from prefect.types.entrypoint import EntrypointType
106
109
  from prefect.utilities.annotations import freeze
107
110
  from prefect.utilities.asyncutils import run_coro_as_sync
108
111
  from prefect.utilities.callables import ParameterSchema, parameter_schema
109
- from prefect.utilities.collections import get_from_dict, isiterable
112
+ from prefect.utilities.collections import (
113
+ StopVisiting,
114
+ get_from_dict,
115
+ isiterable,
116
+ visit_collection,
117
+ )
110
118
  from prefect.utilities.dockerutils import (
111
119
  parse_image_tag,
112
120
  )
@@ -117,6 +125,11 @@ if TYPE_CHECKING:
117
125
 
118
126
  __all__ = ["RunnerDeployment"]
119
127
 
128
+ _DEPLOYMENT_PARAMETER_SERIALIZER = TypeAdapter(
129
+ dict[str, Any],
130
+ config=ConfigDict(ser_json_timedelta="float"),
131
+ )
132
+
120
133
 
121
134
  def _extract_concurrency_options(
122
135
  concurrency_limit: Union[int, ConcurrencyLimitConfig, None],
@@ -296,6 +309,47 @@ class RunnerDeployment(BaseModel):
296
309
  def full_name(self) -> str:
297
310
  return f"{self.flow_name}/{self.name}"
298
311
 
312
+ @field_validator("parameters", "schedules", mode="before")
313
+ @classmethod
314
+ def validate_block_parameters(cls, value: Any) -> Any:
315
+ def ensure_block_is_saved(value: Any) -> Any:
316
+ if isinstance(value, Block):
317
+ if value._block_document_id is None:
318
+ raise BlockNotSavedError(
319
+ "Block must be saved with `.save()` before it can be used as a "
320
+ "deployment parameter."
321
+ )
322
+ raise StopVisiting()
323
+ return value
324
+
325
+ visit_collection(value, ensure_block_is_saved)
326
+ return value
327
+
328
+ @field_serializer("parameters", when_used="json")
329
+ def serialize_block_parameters(self, parameters: dict[str, Any]) -> dict[str, Any]:
330
+ return _DEPLOYMENT_PARAMETER_SERIALIZER.dump_python(
331
+ parameters,
332
+ mode="json",
333
+ context={"serialize_blocks_as_references": True},
334
+ )
335
+
336
+ def _schedules_with_serialized_block_parameters(
337
+ self,
338
+ ) -> Optional[List[Union[DeploymentScheduleCreate, DeploymentScheduleUpdate]]]:
339
+ if self.schedules is None:
340
+ return None
341
+
342
+ return [
343
+ schedule.model_copy(
344
+ update={
345
+ "parameters": self.serialize_block_parameters(schedule.parameters)
346
+ }
347
+ )
348
+ if schedule.parameters
349
+ else schedule
350
+ for schedule in self.schedules
351
+ ]
352
+
299
353
  def _get_deployment_version_info(
300
354
  self, version_type: Optional[VersionType] = None
301
355
  ) -> VersionInfo:
@@ -378,6 +432,9 @@ class RunnerDeployment(BaseModel):
378
432
  " with a work pool."
379
433
  )
380
434
 
435
+ parameters = self.model_dump(mode="json", include={"parameters"})["parameters"]
436
+ schedules = self._schedules_with_serialized_block_parameters()
437
+
381
438
  async with get_client() as client:
382
439
  flow_id = await client.create_flow_from_name(self.flow_name)
383
440
 
@@ -389,10 +446,10 @@ class RunnerDeployment(BaseModel):
389
446
  version=self.version,
390
447
  version_info=version_info,
391
448
  paused=self.paused,
392
- schedules=self.schedules,
449
+ schedules=schedules,
393
450
  concurrency_limit=self.concurrency_limit,
394
451
  concurrency_options=self.concurrency_options,
395
- parameters=self.parameters,
452
+ parameters=parameters,
396
453
  description=self.description,
397
454
  tags=self.tags,
398
455
  path=self._path,
@@ -481,6 +538,9 @@ class RunnerDeployment(BaseModel):
481
538
  " with a work pool."
482
539
  )
483
540
 
541
+ parameters = self.model_dump(mode="json", include={"parameters"})["parameters"]
542
+ schedules = self._schedules_with_serialized_block_parameters()
543
+
484
544
  with get_client(sync_client=True) as client:
485
545
  flow_id = client.create_flow_from_name(self.flow_name)
486
546
 
@@ -492,10 +552,10 @@ class RunnerDeployment(BaseModel):
492
552
  version=self.version,
493
553
  version_info=version_info,
494
554
  paused=self.paused,
495
- schedules=self.schedules,
555
+ schedules=schedules,
496
556
  concurrency_limit=self.concurrency_limit,
497
557
  concurrency_options=self.concurrency_options,
498
- parameters=self.parameters,
558
+ parameters=parameters,
499
559
  description=self.description,
500
560
  tags=self.tags,
501
561
  path=self._path,
@@ -579,7 +639,7 @@ class RunnerDeployment(BaseModel):
579
639
  if self.schedules:
580
640
  update_payload["schedules"] = [
581
641
  schedule.model_dump(mode="json", exclude_unset=True)
582
- for schedule in self.schedules
642
+ for schedule in self._schedules_with_serialized_block_parameters() or []
583
643
  ]
584
644
 
585
645
  await client.update_deployment(
@@ -631,7 +691,7 @@ class RunnerDeployment(BaseModel):
631
691
  if self.schedules:
632
692
  update_payload["schedules"] = [
633
693
  schedule.model_dump(mode="json", exclude_unset=True)
634
- for schedule in self.schedules
694
+ for schedule in self._schedules_with_serialized_block_parameters() or []
635
695
  ]
636
696
 
637
697
  client.update_deployment(
@@ -100,16 +100,14 @@ def handle_engine_signals(flow_run_id: UUID | None = None):
100
100
  engine_logger.info(msg)
101
101
  exit(0)
102
102
  except TerminationSignal:
103
- # A TerminationSignal can mean either:
104
- # - an expected runner-driven control action (today: cancel intent),
105
- # - or a raw external termination with no runner intent attached.
106
- #
107
- # Only the first case should translate to a clean process exit.
108
- if get_intent() == "cancel":
103
+ # An intent means the runner or the `prefect flow-run execute` supervisor
104
+ # drove this termination and owns the flow run's next state, so exit cleanly.
105
+ # A raw external termination has no intent and must keep propagating.
106
+ if get_intent() is not None:
109
107
  if flow_run_id:
110
- msg = f"Execution of flow run '{flow_run_id}' was cancelled."
108
+ msg = f"Execution of flow run '{flow_run_id}' was terminated."
111
109
  else:
112
- msg = "Execution was cancelled."
110
+ msg = "Execution was terminated."
113
111
  engine_logger.info(msg)
114
112
  clear_intent()
115
113
  exit(0)
@@ -718,7 +718,6 @@ class PrefectEventSubscriber:
718
718
  """
719
719
  Args:
720
720
  api_url: The base URL for a Prefect Cloud workspace
721
- api_key: The API of an actor with the manage_events scope
722
721
  reconnection_attempts: When the client is disconnected, how many times
723
722
  the client should attempt to reconnect
724
723
  reconnect_on_clean_close: Whether to reconnect when the server closes
@@ -49,9 +49,13 @@ def emit_event(
49
49
  payload: An open-ended set of data describing what happened.
50
50
  id: The sender-provided identifier for this event. Defaults to a random
51
51
  UUID.
52
- follows: The event that preceded this one. If the preceding event
53
- happened more than 5 minutes prior to this event the follows
54
- relationship will not be set.
52
+ follows: The event that preceded this one. Setting `follows`
53
+ establishes that this event is known to have occurred after the
54
+ given event, which the system can use to disambiguate the
55
+ ordering of the two events. Only the `id` and `occurred` of the
56
+ given event are used; it is not emitted again. If the preceding
57
+ event happened more than 5 minutes prior to this event the
58
+ follows relationship will not be set.
55
59
 
56
60
  Returns:
57
61
  The event that was emitted if worker is using a client that emit
@@ -195,26 +195,17 @@ def _termination_intent() -> Intent | None:
195
195
  for the outermost flow run as well as nested subflows running in the
196
196
  same process.
197
197
 
198
- Today the only non-None value returned is `"cancel"`. A follow-up PR
199
- will add `"suspend"` by extending
200
- `Intent` in `prefect._internal.control_listener`; the engine's
201
- `except TerminationSignal` dispatch below will gain a matching branch.
198
+ Adding an intent means extending `Intent` in
199
+ `prefect._internal.control_listener` and the `except TerminationSignal`
200
+ dispatch below with a matching branch.
202
201
  """
203
202
  return get_intent()
204
203
 
205
204
 
206
- def _should_bubble_raw_sigterm_for_reschedule() -> bool:
207
- """Return whether raw SIGTERM should bypass crash handling.
208
-
209
- `prefect flow-run execute` supports a reschedule mode where the parent
210
- process proposes `AwaitingRetry` and then sends a plain SIGTERM to the
211
- child. That path does not use the control channel, so the child must not
212
- reinterpret the resulting `TerminationSignal` as a crash.
213
- """
214
- return (
215
- os.environ.get("PREFECT_FLOW_RUN_EXECUTE_SIGTERM_BEHAVIOR", "").lower()
216
- == "reschedule"
217
- )
205
+ # Intents where the `prefect flow-run execute` supervisor owns the run's next state
206
+ # (`reschedule` proposes it; `relinquish` leaves it to retrying infrastructure), so
207
+ # the engine must exit without proposing one.
208
+ _SUPERVISOR_OWNED_INTENTS: frozenset[Intent] = frozenset({"reschedule", "relinquish"})
218
209
 
219
210
 
220
211
  def _is_async_runtime_cancellation(exc: BaseException) -> bool:
@@ -1198,10 +1189,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
1198
1189
  if intent == "cancel":
1199
1190
  self.handle_cancellation(exc)
1200
1191
  elif intent is None:
1201
- if _should_bubble_raw_sigterm_for_reschedule():
1202
- raise
1203
1192
  self.handle_crash(exc)
1204
- else:
1193
+ elif intent not in _SUPERVISOR_OWNED_INTENTS:
1205
1194
  # Defensive: an unknown intent means the control
1206
1195
  # listener was extended (e.g. "suspend" in a
1207
1196
  # follow-up PR) without extending this dispatch.
@@ -1896,10 +1885,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1896
1885
  if intent == "cancel":
1897
1886
  await self.handle_cancellation(exc)
1898
1887
  elif intent is None:
1899
- if _should_bubble_raw_sigterm_for_reschedule():
1900
- raise
1901
1888
  await self.handle_crash(exc)
1902
- else:
1889
+ elif intent not in _SUPERVISOR_OWNED_INTENTS:
1903
1890
  # Defensive: see sync engine's dispatch for why.
1904
1891
  self.logger.error(
1905
1892
  "Unhandled termination intent %r; treating as"
@@ -1936,6 +1923,13 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1936
1923
  exc_info=exc,
1937
1924
  )
1938
1925
  raise
1926
+ if (
1927
+ _is_async_runtime_cancellation(exc)
1928
+ and _termination_intent() in _SUPERVISOR_OWNED_INTENTS
1929
+ ):
1930
+ # A supervisor-driven SIGTERM can surface here as a cancellation
1931
+ # rather than a TerminationSignal.
1932
+ raise TerminationSignal(signal.SIGTERM) from exc
1939
1933
  # We don't want to crash a flow run if the user code finished executing
1940
1934
  if self.flow_run.state and not self.flow_run.state.is_final():
1941
1935
  # BaseExceptions are caught and handled as crashes