prefect-client 3.8.1.dev4__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.dev4 → prefect_client-3.8.2}/PKG-INFO +2 -2
  2. {prefect_client-3.8.1.dev4 → 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.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/services.py +13 -2
  5. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/control_listener.py +4 -2
  6. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/observers.py +188 -27
  7. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/websockets.py +9 -0
  8. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/core.py +8 -0
  9. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/client.py +56 -0
  10. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/client.py +2 -2
  11. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/filters.py +26 -20
  12. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/objects.py +1 -1
  13. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/AGENTS.md +1 -1
  14. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_asyncio.py +26 -0
  15. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/services.py +84 -2
  16. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/context.py +19 -1
  17. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/runner.py +67 -7
  18. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/engine.py +6 -8
  19. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/clients.py +0 -1
  20. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/utilities.py +7 -3
  21. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flow_engine.py +16 -22
  22. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flows.py +2 -3
  23. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/futures.py +6 -0
  24. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/container_instance.py +1 -1
  25. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/AGENTS.md +2 -2
  26. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_control_channel.py +9 -8
  27. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_process_manager.py +33 -2
  28. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_engine.py +5 -0
  29. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_workspace_starter.py +3 -0
  30. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/storage.py +2 -2
  31. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/tasks.py +0 -8
  32. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/processutils/__init__.py +24 -3
  33. prefect_client-3.8.1.dev4/src/prefect/_build_info.py +0 -5
  34. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/.gitignore +0 -0
  35. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/LICENSE +0 -0
  36. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/README.md +0 -0
  37. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/hatch_build.py +0 -0
  38. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/.prefectignore +0 -0
  39. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/AGENTS.md +0 -0
  40. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/__init__.py +0 -0
  41. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/__main__.py +0 -0
  42. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/__init__.py +0 -0
  43. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/_launchers.py +0 -0
  44. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
  45. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/execute.py +0 -0
  46. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
  47. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/apply.py +0 -0
  48. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  49. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/manager.py +0 -0
  50. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/spec.py +0 -0
  51. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/__init__.py +0 -0
  52. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/client.py +0 -0
  53. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/objects.py +0 -0
  54. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_flow_run_suspension.py +0 -0
  55. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/__init__.py +0 -0
  56. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/_logging.py +0 -0
  57. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/__init__.py +0 -0
  58. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  59. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/client.py +0 -0
  60. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/device_id.py +0 -0
  61. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/emit.py +0 -0
  62. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/enabled.py +0 -0
  63. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/events.py +0 -0
  64. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/milestones.py +0 -0
  65. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/notice.py +0 -0
  66. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/service.py +0 -0
  67. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/ast_utils.py +0 -0
  68. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/buildx.py +0 -0
  69. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
  70. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  71. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/backports.py +0 -0
  72. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
  73. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  74. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  75. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/migration.py +0 -0
  76. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
  77. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
  78. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/api.py +0 -0
  79. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/calls.py +0 -0
  80. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  81. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  82. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
  83. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
  84. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/threads.py +0 -0
  85. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
  86. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/deprecated.py +0 -0
  87. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/engine.py +0 -0
  88. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/git.py +0 -0
  89. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  90. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/installation.py +0 -0
  91. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/integrations.py +0 -0
  92. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/launchers.py +0 -0
  93. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/lazy.py +0 -0
  94. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/metrics.py +0 -0
  95. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/observability.py +0 -0
  96. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/__init__.py +0 -0
  97. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/apply.py +0 -0
  98. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/collections.py +0 -0
  99. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  100. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/manager.py +0 -0
  101. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/spec.py +0 -0
  102. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/startup.py +0 -0
  103. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
  104. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
  105. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  106. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  107. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  108. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pytz.py +0 -0
  109. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/result_records.py +0 -0
  110. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/retries.py +0 -0
  111. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schema.py +0 -0
  112. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/__init__.py +0 -0
  113. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/_registry.py +0 -0
  114. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/bases.py +0 -0
  115. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/fields.py +0 -0
  116. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/serializers.py +0 -0
  117. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/validators.py +0 -0
  118. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  119. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/states.py +0 -0
  120. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/testing.py +0 -0
  121. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/urls.py +0 -0
  122. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/uuid7.py +0 -0
  123. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/version_checking.py +0 -0
  124. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/versioning.py +0 -0
  125. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/waiters.py +0 -0
  126. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/__init__.py +0 -0
  127. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/fetcher.py +0 -0
  128. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/generator.py +0 -0
  129. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/models.py +0 -0
  130. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/naming.py +0 -0
  131. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/renderer.py +0 -0
  132. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/schema_converter.py +0 -0
  133. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/templates/__init__.py +0 -0
  134. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  135. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/types.py +0 -0
  136. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/unions.py +0 -0
  137. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
  138. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
  139. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/agent.py +0 -0
  140. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/analytics/__init__.py +0 -0
  141. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/artifacts.py +0 -0
  142. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/__init__.py +0 -0
  143. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/core.py +0 -0
  144. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/materialize.py +0 -0
  145. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/automations.py +0 -0
  146. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/AGENTS.md +0 -0
  147. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/__init__.py +0 -0
  148. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/abstract.py +0 -0
  149. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/fields.py +0 -0
  150. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/notifications.py +0 -0
  151. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/redis.py +0 -0
  152. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/system.py +0 -0
  153. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/webhook.py +0 -0
  154. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/__init__.py +0 -0
  155. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_file_collector.py +0 -0
  156. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_ignore_filter.py +0 -0
  157. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_path_resolver.py +0 -0
  158. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_zip_builder.py +0 -0
  159. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_zip_extractor.py +0 -0
  160. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/execute.py +0 -0
  161. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/cache_policies.py +0 -0
  162. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/AGENTS.md +0 -0
  163. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/__init__.py +0 -0
  164. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/attribution.py +0 -0
  165. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/base.py +0 -0
  166. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/cloud.py +0 -0
  167. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/collections.py +0 -0
  168. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/constants.py +0 -0
  169. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/__init__.py +0 -0
  170. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  171. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  172. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  173. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
  174. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  175. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  176. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  177. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  178. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  179. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  180. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  181. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  182. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  183. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  184. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  185. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/client.py +0 -0
  186. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  187. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  188. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
  189. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  190. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
  191. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  192. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
  193. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  194. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/base.py +0 -0
  195. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/routes.py +0 -0
  196. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/__init__.py +0 -0
  197. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/actions.py +0 -0
  198. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/events.py +0 -0
  199. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/responses.py +0 -0
  200. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/schedules.py +0 -0
  201. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/sorting.py +0 -0
  202. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/worker_channel.py +0 -0
  203. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/subscriptions.py +0 -0
  204. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/types/__init__.py +0 -0
  205. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  206. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/utilities.py +0 -0
  207. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/__init__.py +0 -0
  208. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_events.py +0 -0
  209. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_leases.py +0 -0
  210. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_sync.py +0 -0
  211. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/asyncio.py +0 -0
  212. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/context.py +0 -0
  213. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/sync.py +0 -0
  214. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/__init__.py +0 -0
  215. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  216. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_events.py +0 -0
  217. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
  218. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/context.py +0 -0
  219. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/services.py +0 -0
  220. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/sync.py +0 -0
  221. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/AGENTS.md +0 -0
  222. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/__init__.py +0 -0
  223. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/base.py +0 -0
  224. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/deployments.py +0 -0
  225. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/flow_runs.py +0 -0
  226. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/schedules.py +0 -0
  227. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/__init__.py +0 -0
  228. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/core.py +0 -0
  229. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/pull.py +0 -0
  230. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/utility.py +0 -0
  231. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/__init__.py +0 -0
  232. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/_buildx.py +0 -0
  233. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/docker_image.py +0 -0
  234. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/AGENTS.md +0 -0
  235. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/__init__.py +0 -0
  236. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/actions.py +0 -0
  237. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/filters.py +0 -0
  238. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/related.py +0 -0
  239. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/__init__.py +0 -0
  240. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/automations.py +0 -0
  241. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  242. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/events.py +0 -0
  243. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/labelling.py +0 -0
  244. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/subscribers.py +0 -0
  245. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/worker.py +0 -0
  246. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/exceptions.py +0 -0
  247. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/filesystems.py +0 -0
  248. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flow_runs.py +0 -0
  249. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/__init__.py +0 -0
  250. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/base.py +0 -0
  251. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  252. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  253. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  254. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  255. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  256. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/__init__.py +0 -0
  257. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/actions.py +0 -0
  258. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/run_input.py +0 -0
  259. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/__init__.py +0 -0
  260. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/_filelock.py +0 -0
  261. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/filesystem.py +0 -0
  262. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/memory.py +0 -0
  263. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/protocol.py +0 -0
  264. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/AGENTS.md +0 -0
  265. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/__init__.py +0 -0
  266. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/clients.py +0 -0
  267. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/configuration.py +0 -0
  268. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/filters.py +0 -0
  269. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/formatters.py +0 -0
  270. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/handlers.py +0 -0
  271. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/highlighters.py +0 -0
  272. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/loggers.py +0 -0
  273. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/logging.yml +0 -0
  274. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/main.py +0 -0
  275. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/plugins.py +0 -0
  276. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/py.typed +0 -0
  277. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/results.py +0 -0
  278. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/__init__.py +0 -0
  279. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
  280. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_cancellation_manager.py +0 -0
  281. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_deployment_registry.py +0 -0
  282. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_event_emitter.py +0 -0
  283. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_flow_resolver.py +0 -0
  284. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_flow_run_executor.py +0 -0
  285. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_hook_runner.py +0 -0
  286. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_limit_manager.py +0 -0
  287. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  288. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_bundle.py +0 -0
  289. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_direct.py +0 -0
  290. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_state_proposer.py +0 -0
  291. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_workspace_resolver.py +0 -0
  292. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/runner.py +0 -0
  293. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/server.py +0 -0
  294. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/__init__.py +0 -0
  295. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/deployment.py +0 -0
  296. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/flow_run.py +0 -0
  297. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/task_run.py +0 -0
  298. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/schedules.py +0 -0
  299. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/serializers.py +0 -0
  300. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/__init__.py +0 -0
  301. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/_ui_static.py +0 -0
  302. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/admin.py +0 -0
  303. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/artifacts.py +0 -0
  304. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/automations.py +0 -0
  305. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/background_workers.py +0 -0
  306. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_capabilities.py +0 -0
  307. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_documents.py +0 -0
  308. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_schemas.py +0 -0
  309. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_types.py +0 -0
  310. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/clients.py +0 -0
  311. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/collections.py +0 -0
  312. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  313. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits.py +0 -0
  314. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  315. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/csrf_token.py +0 -0
  316. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/dependencies.py +0 -0
  317. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/deployments.py +0 -0
  318. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/events.py +0 -0
  319. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flow_run_states.py +0 -0
  320. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flow_runs.py +0 -0
  321. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flows.py +0 -0
  322. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/logs.py +0 -0
  323. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/middleware.py +0 -0
  324. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/root.py +0 -0
  325. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/run_history.py +0 -0
  326. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/saved_searches.py +0 -0
  327. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/server.py +0 -0
  328. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  329. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_run_states.py +0 -0
  330. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_runs.py +0 -0
  331. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_workers.py +0 -0
  332. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/templates.py +0 -0
  333. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/__init__.py +0 -0
  334. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
  335. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/flows.py +0 -0
  336. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/schemas.py +0 -0
  337. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/task_runs.py +0 -0
  338. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/validation.py +0 -0
  339. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/variables.py +0 -0
  340. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/work_queues.py +0 -0
  341. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/workers.py +0 -0
  342. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/AGENTS.md +0 -0
  343. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/__init__.py +0 -0
  344. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/_types.py +0 -0
  345. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/base.py +0 -0
  346. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/constants.py +0 -0
  347. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/context.py +0 -0
  348. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/legacy.py +0 -0
  349. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/__init__.py +0 -0
  350. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/_defaults.py +0 -0
  351. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/api.py +0 -0
  352. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/cli.py +0 -0
  353. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/client.py +0 -0
  354. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/cloud.py +0 -0
  355. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/deployments.py +0 -0
  356. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/events.py +0 -0
  357. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/experiments.py +0 -0
  358. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/flows.py +0 -0
  359. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/internal.py +0 -0
  360. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/logging.py +0 -0
  361. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/plugins.py +0 -0
  362. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/results.py +0 -0
  363. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/root.py +0 -0
  364. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/runner.py +0 -0
  365. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/__init__.py +0 -0
  366. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/api.py +0 -0
  367. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/concurrency.py +0 -0
  368. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/database.py +0 -0
  369. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/deployments.py +0 -0
  370. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/docket.py +0 -0
  371. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
  372. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/events.py +0 -0
  373. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  374. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/logs.py +0 -0
  375. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/root.py +0 -0
  376. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/services.py +0 -0
  377. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/tasks.py +0 -0
  378. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/ui.py +0 -0
  379. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
  380. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/tasks.py +0 -0
  381. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/telemetry.py +0 -0
  382. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/testing.py +0 -0
  383. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/worker.py +0 -0
  384. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/profiles.py +0 -0
  385. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/profiles.toml +0 -0
  386. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/sources.py +0 -0
  387. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/states.py +0 -0
  388. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_engine.py +0 -0
  389. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_runners.py +0 -0
  390. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_runs.py +0 -0
  391. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_worker.py +0 -0
  392. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/telemetry/__init__.py +0 -0
  393. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/telemetry/run_telemetry.py +0 -0
  394. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/transactions.py +0 -0
  395. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/__init__.py +0 -0
  396. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/_concurrency.py +0 -0
  397. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/_datetime.py +0 -0
  398. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/entrypoint.py +0 -0
  399. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/names.py +0 -0
  400. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/AGENTS.md +0 -0
  401. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/__init__.py +0 -0
  402. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/annotations.py +0 -0
  403. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  404. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  405. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
  406. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/callables/__init__.py +0 -0
  407. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/collections.py +0 -0
  408. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/compat.py +0 -0
  409. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/context.py +0 -0
  410. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/dispatch.py +0 -0
  411. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/dockerutils.py +0 -0
  412. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
  413. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/engine/__init__.py +0 -0
  414. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  415. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
  416. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/generics.py +0 -0
  417. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/hashing.py +0 -0
  418. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/importtools.py +0 -0
  419. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/math.py +0 -0
  420. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/names.py +0 -0
  421. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  422. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/pydantic.py +0 -0
  423. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/render_swagger.py +0 -0
  424. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  425. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  426. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  427. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
  428. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/services.py +0 -0
  429. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/slugify.py +0 -0
  430. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
  431. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/templating/__init__.py +0 -0
  432. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/text.py +0 -0
  433. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/timeout.py +0 -0
  434. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/urls.py +0 -0
  435. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/visualization.py +0 -0
  436. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/variables.py +0 -0
  437. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/AGENTS.md +0 -0
  438. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/__init__.py +0 -0
  439. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_cleanup.py +0 -0
  440. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
  441. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  442. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  443. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
  444. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  445. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  446. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/base.py +0 -0
  447. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/block.py +0 -0
  448. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/cloud.py +0 -0
  449. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/process.py +0 -0
  450. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/server.py +0 -0
  451. {prefect_client-3.8.1.dev4 → 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.dev4
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
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import logging
5
+ import time
4
6
  import uuid
5
7
  from contextlib import AsyncExitStack
8
+ from datetime import datetime
6
9
  from typing import Any, Protocol
7
10
 
8
11
  from prefect._flow_run_suspension import is_suspended_flow_run_state
@@ -17,9 +20,16 @@ from prefect.client.schemas.filters import (
17
20
  from prefect.client.schemas.objects import State, StateType
18
21
  from prefect.events.clients import PrefectEventSubscriber, get_events_subscriber
19
22
  from prefect.events.filters import EventFilter, EventNameFilter
23
+ from prefect.exceptions import ObjectNotFound
20
24
  from prefect.logging.loggers import get_logger
21
25
  from prefect.utilities.services import critical_service_loop
22
26
 
27
+ # How long to wait before warning that a suspension state is still unavailable,
28
+ # how often to look initially, and the retry cap after the warning.
29
+ SUSPENSION_CONFIRMATION_WARNING_AFTER = 30.0
30
+ SUSPENSION_CONFIRMATION_INTERVAL = 0.5
31
+ SUSPENSION_CONFIRMATION_MAX_INTERVAL = 10.0
32
+
23
33
 
24
34
  class OnCancellingCallback(Protocol):
25
35
  def __call__(self, flow_run_id: uuid.UUID) -> None: ...
@@ -33,6 +43,133 @@ class OnFailureCallback(Protocol):
33
43
  def __call__(self, flow_run_ids: set[uuid.UUID]) -> None: ...
34
44
 
35
45
 
46
+ class _SuspensionWatch:
47
+ """Reconcile suspension events with durable states for one flow run."""
48
+
49
+ def __init__(
50
+ self,
51
+ flow_run_id: uuid.UUID,
52
+ client: PrefectClient,
53
+ on_suspended: OnSuspendedCallback,
54
+ logger: logging.Logger,
55
+ ) -> None:
56
+ self.flow_run_id = flow_run_id
57
+ self.is_suspended = False
58
+ self._client = client
59
+ self._on_suspended = on_suspended
60
+ self._logger = logger
61
+ self._initialized = asyncio.Event()
62
+ self._replay_checkpoint: datetime | None = None
63
+ self._confirmation_tasks: dict[uuid.UUID, asyncio.Task[None]] = {}
64
+ self._closed = False
65
+
66
+ def initialize(self, state: State | None) -> None:
67
+ """Set the initial server checkpoint and release waiting events."""
68
+ if not self._initialized.is_set():
69
+ self._replay_checkpoint = state.timestamp if state is not None else None
70
+ self._initialized.set()
71
+ self.notify_if_suspended(state)
72
+
73
+ def notify_if_suspended(self, state: State | None) -> None:
74
+ if (
75
+ not self.is_suspended
76
+ and state is not None
77
+ and is_suspended_flow_run_state(state)
78
+ ):
79
+ self.is_suspended = True
80
+ self._on_suspended(self.flow_run_id, state)
81
+
82
+ def observe(self, state_id: uuid.UUID, occurred: datetime) -> None:
83
+ """Confirm a new suspension event without blocking event consumption."""
84
+ if self._closed or self.is_suspended:
85
+ return
86
+ if state_id in self._confirmation_tasks:
87
+ return
88
+
89
+ task = asyncio.create_task(self._confirm(state_id, occurred))
90
+ self._confirmation_tasks[state_id] = task
91
+ task.add_done_callback(
92
+ lambda completed, state_id=state_id: self._confirmation_done(
93
+ state_id, completed
94
+ )
95
+ )
96
+
97
+ async def _confirm(self, state_id: uuid.UUID, occurred: datetime) -> None:
98
+ await self._initialized.wait()
99
+ if self._closed or self.is_suspended:
100
+ return
101
+ if self._replay_checkpoint is not None and occurred <= self._replay_checkpoint:
102
+ self._logger.debug(
103
+ "Ignoring replayed suspension event for flow run %s that occurred"
104
+ " at or before the initial server state.",
105
+ self.flow_run_id,
106
+ )
107
+ return
108
+
109
+ warning_deadline = time.monotonic() + SUSPENSION_CONFIRMATION_WARNING_AFTER
110
+ retry_interval = SUSPENSION_CONFIRMATION_INTERVAL
111
+ warned = False
112
+ last_error: Exception | None = None
113
+
114
+ while not self._closed and not self.is_suspended:
115
+ try:
116
+ state = await self._client.read_flow_run_state(state_id)
117
+ except ObjectNotFound:
118
+ pass
119
+ except Exception as exc:
120
+ last_error = exc
121
+ else:
122
+ if state.state_details.flow_run_id not in (None, self.flow_run_id):
123
+ self._logger.warning(
124
+ "Suspension event for flow run %s referred to state %s owned"
125
+ " by flow run %s.",
126
+ self.flow_run_id,
127
+ state_id,
128
+ state.state_details.flow_run_id,
129
+ )
130
+ return
131
+ self.notify_if_suspended(state)
132
+ return
133
+
134
+ if not warned and time.monotonic() >= warning_deadline:
135
+ self._logger.warning(
136
+ "Received a suspension event for flow run %s, but state %s has"
137
+ " not become readable within %s seconds; continuing to retry.",
138
+ self.flow_run_id,
139
+ state_id,
140
+ SUSPENSION_CONFIRMATION_WARNING_AFTER,
141
+ exc_info=last_error,
142
+ )
143
+ warned = True
144
+
145
+ await asyncio.sleep(retry_interval)
146
+ if warned:
147
+ retry_interval = min(
148
+ max(retry_interval * 2, SUSPENSION_CONFIRMATION_INTERVAL),
149
+ SUSPENSION_CONFIRMATION_MAX_INTERVAL,
150
+ )
151
+
152
+ def _confirmation_done(self, state_id: uuid.UUID, task: asyncio.Task[None]) -> None:
153
+ self._confirmation_tasks.pop(state_id, None)
154
+ if task.cancelled():
155
+ return
156
+ if error := task.exception():
157
+ self._logger.error(
158
+ "Suspension confirmation failed for flow run %s and state %s.",
159
+ self.flow_run_id,
160
+ state_id,
161
+ exc_info=error,
162
+ )
163
+
164
+ def cancel(self) -> tuple[asyncio.Task[None], ...]:
165
+ self._closed = True
166
+ tasks = tuple(self._confirmation_tasks.values())
167
+ self._confirmation_tasks.clear()
168
+ for task in tasks:
169
+ task.cancel()
170
+ return tasks
171
+
172
+
36
173
  class FlowRunCancellingObserver:
37
174
  def __init__(
38
175
  self,
@@ -283,35 +420,59 @@ class FlowRunSuspendingObserver:
283
420
  self._event_filter = EventFilter(
284
421
  event=EventNameFilter(name=["prefect.flow-run.Suspended"])
285
422
  )
286
- self._in_flight_flow_run_ids: set[uuid.UUID] = set()
287
423
  self._events_subscriber: PrefectEventSubscriber | None
288
424
  self._exit_stack = AsyncExitStack()
289
425
  self._consumer_task: asyncio.Task[None] | None = None
290
426
  self._polling_task: asyncio.Task[None] | None = None
291
427
  self._is_shutting_down = False
292
428
  self._client: PrefectClient | None = None
293
- self._suspended_flow_run_ids: set[uuid.UUID] = set()
429
+ self._watches: dict[uuid.UUID, _SuspensionWatch] = {}
430
+
431
+ @property
432
+ def _in_flight_flow_run_ids(self) -> set[uuid.UUID]:
433
+ return set(self._watches)
294
434
 
295
435
  def add_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
436
+ if self._client is None:
437
+ raise RuntimeError(
438
+ "Client not initialized. Please use `async with` to initialize the observer."
439
+ )
296
440
  self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
297
- self._in_flight_flow_run_ids.add(flow_run_id)
441
+ if flow_run_id not in self._watches:
442
+ watch = self._watches[flow_run_id] = self._create_watch(flow_run_id)
443
+ watch.initialize(None)
444
+
445
+ def _create_watch(self, flow_run_id: uuid.UUID) -> _SuspensionWatch:
446
+ if self._client is None:
447
+ raise RuntimeError(
448
+ "Client not initialized. Please use `async with` to initialize the observer."
449
+ )
450
+ return _SuspensionWatch(
451
+ flow_run_id=flow_run_id,
452
+ client=self._client,
453
+ on_suspended=self.on_suspended,
454
+ logger=self.logger,
455
+ )
298
456
 
299
457
  def remove_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
300
458
  self.logger.debug("Removing in-flight flow run ID: %s", flow_run_id)
301
- self._in_flight_flow_run_ids.discard(flow_run_id)
302
- self._suspended_flow_run_ids.discard(flow_run_id)
459
+ if watch := self._watches.pop(flow_run_id, None):
460
+ watch.cancel()
303
461
 
304
462
  async def watch_flow_run_id(self, flow_run_id: uuid.UUID) -> None:
305
- self.add_in_flight_flow_run_id(flow_run_id)
306
463
  if self._client is None:
307
464
  raise RuntimeError(
308
465
  "Client not initialized. Please use `async with` to initialize the observer."
309
466
  )
467
+ self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
468
+ if flow_run_id not in self._watches:
469
+ self._watches[flow_run_id] = self._create_watch(flow_run_id)
310
470
  retry_interval = max(min(self.polling_interval, 1.0), 0.01)
311
471
  attempts = 0
312
472
 
313
473
  while not self._is_shutting_down:
314
- if flow_run_id in self._suspended_flow_run_ids:
474
+ watch = self._watches.get(flow_run_id)
475
+ if watch is None or watch.is_suspended:
315
476
  return
316
477
 
317
478
  try:
@@ -328,26 +489,14 @@ class FlowRunSuspendingObserver:
328
489
  await asyncio.sleep(retry_interval)
329
490
  continue
330
491
 
331
- self._notify_if_suspended_state(flow_run_id, flow_run.state)
492
+ watch.initialize(flow_run.state)
332
493
  return
333
494
 
334
495
  def _notify_if_suspended_state(
335
496
  self, flow_run_id: uuid.UUID, state: State | None
336
497
  ) -> None:
337
- if state is not None and is_suspended_flow_run_state(state):
338
- self._suspended_flow_run_ids.add(flow_run_id)
339
- self.on_suspended(flow_run_id, state)
340
-
341
- async def _notify_if_suspended(self, flow_run_id: uuid.UUID) -> None:
342
- if self._client is None:
343
- raise RuntimeError(
344
- "Client not initialized. Please use `async with` to initialize the observer."
345
- )
346
- if flow_run_id in self._suspended_flow_run_ids:
347
- return
348
-
349
- flow_run = await self._client.read_flow_run(flow_run_id)
350
- self._notify_if_suspended_state(flow_run_id, flow_run.state)
498
+ if watch := self._watches.get(flow_run_id):
499
+ watch.notify_if_suspended(state)
351
500
 
352
501
  async def _consume_events(self):
353
502
  if self._events_subscriber is None:
@@ -361,9 +510,14 @@ class FlowRunSuspendingObserver:
361
510
  "prefect.flow-run.", ""
362
511
  )
363
512
  )
364
- if flow_run_id not in self._in_flight_flow_run_ids:
513
+ watch = self._watches.get(flow_run_id)
514
+ if watch is None:
365
515
  continue
366
- await self._notify_if_suspended(flow_run_id)
516
+
517
+ # State change events carry the ID of the state they report, so the
518
+ # event identifies the exact transition to confirm. Confirmation is
519
+ # done in a separate task to keep consuming events while we wait.
520
+ watch.observe(event.id, event.occurred)
367
521
  except ValueError:
368
522
  self.logger.warning(
369
523
  "Received event with invalid flow run ID: %s",
@@ -412,7 +566,11 @@ class FlowRunSuspendingObserver:
412
566
  "Client not initialized. Please use `async with` to initialize the observer."
413
567
  )
414
568
 
415
- flow_run_ids = self._in_flight_flow_run_ids - self._suspended_flow_run_ids
569
+ flow_run_ids = {
570
+ flow_run_id
571
+ for flow_run_id, watch in self._watches.items()
572
+ if not watch.is_suspended
573
+ }
416
574
  if not flow_run_ids:
417
575
  return
418
576
 
@@ -434,8 +592,7 @@ class FlowRunSuspendingObserver:
434
592
 
435
593
  for flow_run in suspended_flow_runs:
436
594
  if flow_run.state:
437
- self._suspended_flow_run_ids.add(flow_run.id)
438
- self.on_suspended(flow_run.id, flow_run.state)
595
+ self._notify_if_suspended_state(flow_run.id, flow_run.state)
439
596
 
440
597
  async def __aenter__(self):
441
598
  try:
@@ -470,6 +627,10 @@ class FlowRunSuspendingObserver:
470
627
  async def __aexit__(self, *exc_info: Any):
471
628
  self.logger.debug("Shutting down FlowRunSuspendingObserver")
472
629
  self._is_shutting_down = True
630
+ tasks = [task for watch in self._watches.values() for task in watch.cancel()]
631
+ self._watches.clear()
632
+ if tasks:
633
+ await asyncio.gather(*tasks, return_exceptions=True)
473
634
  await self._exit_stack.__aexit__(*exc_info)
474
635
  if self._consumer_task is not None:
475
636
  self._consumer_task.cancel()
@@ -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
@@ -416,6 +416,34 @@ class FlowRunClient(BaseClient):
416
416
  )
417
417
  return result
418
418
 
419
+ def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
420
+ """
421
+ Read a flow run state by ID.
422
+
423
+ Args:
424
+ flow_run_state_id: The flow run state ID.
425
+
426
+ Returns:
427
+ A State model representation of the flow run state.
428
+
429
+ Raises:
430
+ ObjectNotFound: If the flow run state does not exist.
431
+ """
432
+ try:
433
+ response = self.request(
434
+ "GET",
435
+ "/flow_run_states/{id}",
436
+ path_params={"id": flow_run_state_id},
437
+ )
438
+ except httpx.HTTPStatusError as exc:
439
+ if exc.response.status_code == 404:
440
+ raise ObjectNotFound(http_exc=exc) from exc
441
+ raise
442
+
443
+ from prefect.states import State
444
+
445
+ return State.model_validate(response.json())
446
+
419
447
  def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
420
448
  """
421
449
  Query for the states of a flow run
@@ -916,6 +944,34 @@ class FlowRunAsyncClient(BaseAsyncClient):
916
944
  )
917
945
  return result
918
946
 
947
+ async def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
948
+ """
949
+ Read a flow run state by ID.
950
+
951
+ Args:
952
+ flow_run_state_id: The flow run state ID.
953
+
954
+ Returns:
955
+ A State model representation of the flow run state.
956
+
957
+ Raises:
958
+ ObjectNotFound: If the flow run state does not exist.
959
+ """
960
+ try:
961
+ response = await self.request(
962
+ "GET",
963
+ "/flow_run_states/{id}",
964
+ path_params={"id": flow_run_state_id},
965
+ )
966
+ except httpx.HTTPStatusError as exc:
967
+ if exc.response.status_code == 404:
968
+ raise ObjectNotFound(http_exc=exc) from exc
969
+ raise
970
+
971
+ from prefect.states import State
972
+
973
+ return State.model_validate(response.json())
974
+
919
975
  async def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
920
976
  """
921
977
  Query for the states of a flow run
@@ -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