prefect-client 3.8.1.dev4__tar.gz → 3.8.2.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/PKG-INFO +2 -2
  2. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/pyproject.toml +1 -1
  3. prefect_client-3.8.2.dev1/src/prefect/_build_info.py +5 -0
  4. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/control_listener.py +4 -2
  5. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/observers.py +188 -27
  6. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/core.py +8 -0
  7. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +56 -0
  8. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/filters.py +26 -20
  9. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/AGENTS.md +1 -1
  10. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/runner.py +67 -7
  11. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/engine.py +6 -8
  12. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flow_engine.py +16 -22
  13. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/AGENTS.md +2 -2
  14. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_control_channel.py +9 -8
  15. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_process_manager.py +33 -2
  16. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_engine.py +5 -0
  17. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_workspace_starter.py +3 -0
  18. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/processutils/__init__.py +24 -3
  19. prefect_client-3.8.1.dev4/src/prefect/_build_info.py +0 -5
  20. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/.gitignore +0 -0
  21. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/LICENSE +0 -0
  22. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/README.md +0 -0
  23. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/hatch_build.py +0 -0
  24. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/.prefectignore +0 -0
  25. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/AGENTS.md +0 -0
  26. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/__init__.py +0 -0
  27. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/__main__.py +0 -0
  28. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/__init__.py +0 -0
  29. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/_launchers.py +0 -0
  30. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
  31. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
  32. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
  33. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
  34. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  35. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
  36. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
  37. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
  38. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/client.py +0 -0
  39. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
  40. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_flow_run_suspension.py +0 -0
  41. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/__init__.py +0 -0
  42. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/_logging.py +0 -0
  43. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
  44. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  45. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/client.py +0 -0
  46. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
  47. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
  48. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
  49. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/events.py +0 -0
  50. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
  51. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
  52. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/analytics/service.py +0 -0
  53. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/ast_utils.py +0 -0
  54. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/buildx.py +0 -0
  55. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
  56. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  57. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
  58. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
  59. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  60. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  61. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
  62. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
  63. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
  64. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
  65. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
  66. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  67. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  68. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
  69. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
  70. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
  71. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
  72. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
  73. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/deprecated.py +0 -0
  74. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/engine.py +0 -0
  75. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/git.py +0 -0
  76. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  77. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/installation.py +0 -0
  78. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/integrations.py +0 -0
  79. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/launchers.py +0 -0
  80. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/lazy.py +0 -0
  81. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/metrics.py +0 -0
  82. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/observability.py +0 -0
  83. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/__init__.py +0 -0
  84. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/apply.py +0 -0
  85. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/collections.py +0 -0
  86. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  87. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/manager.py +0 -0
  88. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/spec.py +0 -0
  89. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/plugins/startup.py +0 -0
  90. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
  91. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
  92. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  93. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  94. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  95. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/pytz.py +0 -0
  96. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/result_records.py +0 -0
  97. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/retries.py +0 -0
  98. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schema.py +0 -0
  99. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
  100. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/_registry.py +0 -0
  101. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
  102. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
  103. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
  104. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
  105. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  106. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/states.py +0 -0
  107. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/testing.py +0 -0
  108. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/urls.py +0 -0
  109. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/uuid7.py +0 -0
  110. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/version_checking.py +0 -0
  111. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/versioning.py +0 -0
  112. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/waiters.py +0 -0
  113. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_internal/websockets.py +0 -0
  114. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/__init__.py +0 -0
  115. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/fetcher.py +0 -0
  116. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/generator.py +0 -0
  117. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/models.py +0 -0
  118. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/naming.py +0 -0
  119. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/renderer.py +0 -0
  120. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
  121. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
  122. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  123. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/types.py +0 -0
  124. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_sdk/unions.py +0 -0
  125. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
  126. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
  127. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/agent.py +0 -0
  128. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/analytics/__init__.py +0 -0
  129. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/artifacts.py +0 -0
  130. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/__init__.py +0 -0
  131. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/core.py +0 -0
  132. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/assets/materialize.py +0 -0
  133. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/automations.py +0 -0
  134. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/AGENTS.md +0 -0
  135. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/__init__.py +0 -0
  136. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/abstract.py +0 -0
  137. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/fields.py +0 -0
  138. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/notifications.py +0 -0
  139. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/redis.py +0 -0
  140. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/system.py +0 -0
  141. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/blocks/webhook.py +0 -0
  142. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/__init__.py +0 -0
  143. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_file_collector.py +0 -0
  144. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_ignore_filter.py +0 -0
  145. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_path_resolver.py +0 -0
  146. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_zip_builder.py +0 -0
  147. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/_zip_extractor.py +0 -0
  148. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/bundles/execute.py +0 -0
  149. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/cache_policies.py +0 -0
  150. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/AGENTS.md +0 -0
  151. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/__init__.py +0 -0
  152. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/attribution.py +0 -0
  153. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/base.py +0 -0
  154. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/cloud.py +0 -0
  155. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/collections.py +0 -0
  156. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/constants.py +0 -0
  157. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
  158. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  159. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  160. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  161. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
  162. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  163. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  164. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  165. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  166. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  167. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  168. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  169. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  170. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  171. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  172. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  173. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
  174. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  175. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  176. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
  177. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  178. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
  179. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  180. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
  181. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  182. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  183. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/base.py +0 -0
  184. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/orchestration/routes.py +0 -0
  185. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/__init__.py +0 -0
  186. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/actions.py +0 -0
  187. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/events.py +0 -0
  188. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/objects.py +0 -0
  189. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/responses.py +0 -0
  190. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/schedules.py +0 -0
  191. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/sorting.py +0 -0
  192. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/schemas/worker_channel.py +0 -0
  193. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/subscriptions.py +0 -0
  194. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/types/__init__.py +0 -0
  195. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  196. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/client/utilities.py +0 -0
  197. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/__init__.py +0 -0
  198. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
  199. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_events.py +0 -0
  200. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_leases.py +0 -0
  201. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/_sync.py +0 -0
  202. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/asyncio.py +0 -0
  203. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/context.py +0 -0
  204. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/services.py +0 -0
  205. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/sync.py +0 -0
  206. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
  207. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  208. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
  209. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
  210. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/context.py +0 -0
  211. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/services.py +0 -0
  212. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
  213. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/context.py +0 -0
  214. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/AGENTS.md +0 -0
  215. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/__init__.py +0 -0
  216. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/base.py +0 -0
  217. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/deployments.py +0 -0
  218. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/flow_runs.py +0 -0
  219. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/schedules.py +0 -0
  220. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
  221. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/core.py +0 -0
  222. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/pull.py +0 -0
  223. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/deployments/steps/utility.py +0 -0
  224. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/__init__.py +0 -0
  225. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/_buildx.py +0 -0
  226. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/docker/docker_image.py +0 -0
  227. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/AGENTS.md +0 -0
  228. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/__init__.py +0 -0
  229. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/actions.py +0 -0
  230. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/clients.py +0 -0
  231. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/filters.py +0 -0
  232. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/related.py +0 -0
  233. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/__init__.py +0 -0
  234. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/automations.py +0 -0
  235. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  236. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/events.py +0 -0
  237. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/schemas/labelling.py +0 -0
  238. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/subscribers.py +0 -0
  239. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/utilities.py +0 -0
  240. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/events/worker.py +0 -0
  241. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/exceptions.py +0 -0
  242. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/filesystems.py +0 -0
  243. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flow_runs.py +0 -0
  244. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/flows.py +0 -0
  245. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/futures.py +0 -0
  246. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/__init__.py +0 -0
  247. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/base.py +0 -0
  248. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  249. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  250. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  251. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  252. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  253. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  254. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/__init__.py +0 -0
  255. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/actions.py +0 -0
  256. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/input/run_input.py +0 -0
  257. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/__init__.py +0 -0
  258. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/_filelock.py +0 -0
  259. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/filesystem.py +0 -0
  260. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/memory.py +0 -0
  261. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/locking/protocol.py +0 -0
  262. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/AGENTS.md +0 -0
  263. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/__init__.py +0 -0
  264. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/clients.py +0 -0
  265. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/configuration.py +0 -0
  266. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/filters.py +0 -0
  267. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/formatters.py +0 -0
  268. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/handlers.py +0 -0
  269. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/highlighters.py +0 -0
  270. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/loggers.py +0 -0
  271. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/logging/logging.yml +0 -0
  272. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/main.py +0 -0
  273. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/plugins.py +0 -0
  274. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/py.typed +0 -0
  275. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/results.py +0 -0
  276. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/__init__.py +0 -0
  277. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_cancel_finalizer.py +0 -0
  278. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
  279. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
  280. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_event_emitter.py +0 -0
  281. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
  282. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
  283. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_hook_runner.py +0 -0
  284. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_limit_manager.py +0 -0
  285. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  286. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
  287. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_starter_direct.py +0 -0
  288. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_state_proposer.py +0 -0
  289. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/_workspace_resolver.py +0 -0
  290. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/runner.py +0 -0
  291. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/server.py +0 -0
  292. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runner/storage.py +0 -0
  293. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/__init__.py +0 -0
  294. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/deployment.py +0 -0
  295. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/flow_run.py +0 -0
  296. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/runtime/task_run.py +0 -0
  297. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/schedules.py +0 -0
  298. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/serializers.py +0 -0
  299. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/__init__.py +0 -0
  300. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/_ui_static.py +0 -0
  301. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/admin.py +0 -0
  302. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/artifacts.py +0 -0
  303. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/automations.py +0 -0
  304. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/background_workers.py +0 -0
  305. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
  306. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_documents.py +0 -0
  307. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_schemas.py +0 -0
  308. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/block_types.py +0 -0
  309. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/clients.py +0 -0
  310. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/collections.py +0 -0
  311. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  312. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
  313. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  314. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/csrf_token.py +0 -0
  315. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/dependencies.py +0 -0
  316. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/deployments.py +0 -0
  317. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/events.py +0 -0
  318. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
  319. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flow_runs.py +0 -0
  320. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/flows.py +0 -0
  321. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/logs.py +0 -0
  322. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/middleware.py +0 -0
  323. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/root.py +0 -0
  324. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/run_history.py +0 -0
  325. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/saved_searches.py +0 -0
  326. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/server.py +0 -0
  327. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  328. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_run_states.py +0 -0
  329. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_runs.py +0 -0
  330. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/task_workers.py +0 -0
  331. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/templates.py +0 -0
  332. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
  333. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
  334. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/flows.py +0 -0
  335. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
  336. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
  337. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/validation.py +0 -0
  338. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/variables.py +0 -0
  339. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/work_queues.py +0 -0
  340. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/server/api/workers.py +0 -0
  341. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/AGENTS.md +0 -0
  342. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/__init__.py +0 -0
  343. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/_types.py +0 -0
  344. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/base.py +0 -0
  345. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/constants.py +0 -0
  346. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/context.py +0 -0
  347. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/legacy.py +0 -0
  348. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/__init__.py +0 -0
  349. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/_defaults.py +0 -0
  350. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/api.py +0 -0
  351. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/cli.py +0 -0
  352. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/client.py +0 -0
  353. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/cloud.py +0 -0
  354. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/deployments.py +0 -0
  355. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/events.py +0 -0
  356. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/experiments.py +0 -0
  357. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/flows.py +0 -0
  358. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/internal.py +0 -0
  359. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/logging.py +0 -0
  360. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/plugins.py +0 -0
  361. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/results.py +0 -0
  362. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/root.py +0 -0
  363. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/runner.py +0 -0
  364. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
  365. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/api.py +0 -0
  366. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
  367. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/database.py +0 -0
  368. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
  369. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/docket.py +0 -0
  370. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
  371. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/events.py +0 -0
  372. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  373. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/logs.py +0 -0
  374. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/root.py +0 -0
  375. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/services.py +0 -0
  376. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
  377. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/ui.py +0 -0
  378. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/server/worker_channel.py +0 -0
  379. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/tasks.py +0 -0
  380. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/telemetry.py +0 -0
  381. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/testing.py +0 -0
  382. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/models/worker.py +0 -0
  383. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/profiles.py +0 -0
  384. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/profiles.toml +0 -0
  385. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/settings/sources.py +0 -0
  386. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/states.py +0 -0
  387. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_engine.py +0 -0
  388. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_runners.py +0 -0
  389. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_runs.py +0 -0
  390. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/task_worker.py +0 -0
  391. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/tasks.py +0 -0
  392. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/telemetry/__init__.py +0 -0
  393. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
  394. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/transactions.py +0 -0
  395. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/__init__.py +0 -0
  396. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/_concurrency.py +0 -0
  397. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/_datetime.py +0 -0
  398. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/entrypoint.py +0 -0
  399. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/types/names.py +0 -0
  400. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/AGENTS.md +0 -0
  401. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/__init__.py +0 -0
  402. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/annotations.py +0 -0
  403. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  404. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  405. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/callables/AGENTS.md +0 -0
  406. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/callables/__init__.py +0 -0
  407. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/collections.py +0 -0
  408. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/compat.py +0 -0
  409. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/context.py +0 -0
  410. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/dispatch.py +0 -0
  411. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/dockerutils.py +0 -0
  412. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/engine/AGENTS.md +0 -0
  413. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/engine/__init__.py +0 -0
  414. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  415. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/filesystem/__init__.py +0 -0
  416. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/generics.py +0 -0
  417. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/hashing.py +0 -0
  418. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/importtools.py +0 -0
  419. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/math.py +0 -0
  420. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/names.py +0 -0
  421. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  422. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/pydantic.py +0 -0
  423. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/render_swagger.py +0 -0
  424. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  425. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  426. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  427. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
  428. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/services.py +0 -0
  429. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/slugify.py +0 -0
  430. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/templating/AGENTS.md +0 -0
  431. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/templating/__init__.py +0 -0
  432. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/text.py +0 -0
  433. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/timeout.py +0 -0
  434. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/urls.py +0 -0
  435. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/utilities/visualization.py +0 -0
  436. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/variables.py +0 -0
  437. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/AGENTS.md +0 -0
  438. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/__init__.py +0 -0
  439. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_cleanup.py +0 -0
  440. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_cleanup_handlers.py +0 -0
  441. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  442. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  443. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_state.py +0 -0
  444. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  445. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  446. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/base.py +0 -0
  447. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/block.py +0 -0
  448. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/cloud.py +0 -0
  449. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/process.py +0 -0
  450. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/server.py +0 -0
  451. {prefect_client-3.8.1.dev4 → prefect_client-3.8.2.dev1}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.8.1.dev4
3
+ Version: 3.8.2.dev1
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -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.dev1"
3
+ __build_date__ = "2026-08-01 08:50:43.060957+00:00"
4
+ __git_commit__ = "ef4286181588e579f72854d9344f4a2f6d66a090"
5
+ __dirty__ = False
@@ -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()
@@ -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
@@ -2,10 +2,10 @@
2
2
  Schemas that define Prefect REST API filtering operations.
3
3
  """
4
4
 
5
- from typing import List, Optional
5
+ from typing import ClassVar, List, Optional
6
6
  from uuid import UUID
7
7
 
8
- from pydantic import Field
8
+ from pydantic import ConfigDict, Field
9
9
 
10
10
  from prefect._internal.schemas.bases import PrefectBaseModel
11
11
  from prefect.client.schemas.objects import StateType
@@ -20,6 +20,12 @@ class Operator(AutoEnum):
20
20
  or_ = AutoEnum.auto()
21
21
 
22
22
 
23
+ class _FlowRunFilterBaseModel(PrefectBaseModel):
24
+ """Base model for flow run filters that rejects unknown fields."""
25
+
26
+ model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
27
+
28
+
23
29
  class OperatorMixin:
24
30
  """Base model for Prefect filters that combines criteria with a user-provided operator"""
25
31
 
@@ -87,7 +93,7 @@ class FlowFilter(PrefectBaseModel, OperatorMixin):
87
93
  )
88
94
 
89
95
 
90
- class FlowRunFilterId(PrefectBaseModel):
96
+ class FlowRunFilterId(_FlowRunFilterBaseModel):
91
97
  """Filter by FlowRun.id."""
92
98
 
93
99
  any_: Optional[List[UUID]] = Field(
@@ -98,7 +104,7 @@ class FlowRunFilterId(PrefectBaseModel):
98
104
  )
99
105
 
100
106
 
101
- class FlowRunFilterName(PrefectBaseModel):
107
+ class FlowRunFilterName(_FlowRunFilterBaseModel):
102
108
  """Filter by `FlowRun.name`."""
103
109
 
104
110
  any_: Optional[List[str]] = Field(
@@ -118,7 +124,7 @@ class FlowRunFilterName(PrefectBaseModel):
118
124
  )
119
125
 
120
126
 
121
- class FlowRunFilterTags(PrefectBaseModel, OperatorMixin):
127
+ class FlowRunFilterTags(_FlowRunFilterBaseModel, OperatorMixin):
122
128
  """Filter by `FlowRun.tags`."""
123
129
 
124
130
  all_: Optional[List[str]] = Field(
@@ -139,7 +145,7 @@ class FlowRunFilterTags(PrefectBaseModel, OperatorMixin):
139
145
  )
140
146
 
141
147
 
142
- class FlowRunFilterDeploymentId(PrefectBaseModel, OperatorMixin):
148
+ class FlowRunFilterDeploymentId(_FlowRunFilterBaseModel, OperatorMixin):
143
149
  """Filter by `FlowRun.deployment_id`."""
144
150
 
145
151
  any_: Optional[List[UUID]] = Field(
@@ -151,7 +157,7 @@ class FlowRunFilterDeploymentId(PrefectBaseModel, OperatorMixin):
151
157
  )
152
158
 
153
159
 
154
- class FlowRunFilterWorkQueueName(PrefectBaseModel, OperatorMixin):
160
+ class FlowRunFilterWorkQueueName(_FlowRunFilterBaseModel, OperatorMixin):
155
161
  """Filter by `FlowRun.work_queue_name`."""
156
162
 
157
163
  any_: Optional[List[str]] = Field(
@@ -165,7 +171,7 @@ class FlowRunFilterWorkQueueName(PrefectBaseModel, OperatorMixin):
165
171
  )
166
172
 
167
173
 
168
- class FlowRunFilterStateType(PrefectBaseModel):
174
+ class FlowRunFilterStateType(_FlowRunFilterBaseModel):
169
175
  """Filter by `FlowRun.state_type`."""
170
176
 
171
177
  any_: Optional[List[StateType]] = Field(
@@ -176,7 +182,7 @@ class FlowRunFilterStateType(PrefectBaseModel):
176
182
  )
177
183
 
178
184
 
179
- class FlowRunFilterStateName(PrefectBaseModel):
185
+ class FlowRunFilterStateName(_FlowRunFilterBaseModel):
180
186
  any_: Optional[List[str]] = Field(
181
187
  default=None, description="A list of flow run state names to include"
182
188
  )
@@ -185,7 +191,7 @@ class FlowRunFilterStateName(PrefectBaseModel):
185
191
  )
186
192
 
187
193
 
188
- class FlowRunFilterState(PrefectBaseModel, OperatorMixin):
194
+ class FlowRunFilterState(_FlowRunFilterBaseModel, OperatorMixin):
189
195
  type: Optional[FlowRunFilterStateType] = Field(
190
196
  default=None, description="Filter criteria for `FlowRun` state type"
191
197
  )
@@ -194,7 +200,7 @@ class FlowRunFilterState(PrefectBaseModel, OperatorMixin):
194
200
  )
195
201
 
196
202
 
197
- class FlowRunFilterFlowVersion(PrefectBaseModel):
203
+ class FlowRunFilterFlowVersion(_FlowRunFilterBaseModel):
198
204
  """Filter by `FlowRun.flow_version`."""
199
205
 
200
206
  any_: Optional[List[str]] = Field(
@@ -202,7 +208,7 @@ class FlowRunFilterFlowVersion(PrefectBaseModel):
202
208
  )
203
209
 
204
210
 
205
- class FlowRunFilterStartTime(PrefectBaseModel):
211
+ class FlowRunFilterStartTime(_FlowRunFilterBaseModel):
206
212
  """Filter by `FlowRun.start_time`."""
207
213
 
208
214
  before_: Optional[DateTime] = Field(
@@ -218,7 +224,7 @@ class FlowRunFilterStartTime(PrefectBaseModel):
218
224
  )
219
225
 
220
226
 
221
- class FlowRunFilterEndTime(PrefectBaseModel):
227
+ class FlowRunFilterEndTime(_FlowRunFilterBaseModel):
222
228
  """Filter by `FlowRun.end_time`."""
223
229
 
224
230
  before_: Optional[DateTime] = Field(
@@ -234,7 +240,7 @@ class FlowRunFilterEndTime(PrefectBaseModel):
234
240
  )
235
241
 
236
242
 
237
- class FlowRunFilterExpectedStartTime(PrefectBaseModel):
243
+ class FlowRunFilterExpectedStartTime(_FlowRunFilterBaseModel):
238
244
  """Filter by `FlowRun.expected_start_time`."""
239
245
 
240
246
  before_: Optional[DateTime] = Field(
@@ -247,7 +253,7 @@ class FlowRunFilterExpectedStartTime(PrefectBaseModel):
247
253
  )
248
254
 
249
255
 
250
- class FlowRunFilterNextScheduledStartTime(PrefectBaseModel):
256
+ class FlowRunFilterNextScheduledStartTime(_FlowRunFilterBaseModel):
251
257
  """Filter by `FlowRun.next_scheduled_start_time`."""
252
258
 
253
259
  before_: Optional[DateTime] = Field(
@@ -266,7 +272,7 @@ class FlowRunFilterNextScheduledStartTime(PrefectBaseModel):
266
272
  )
267
273
 
268
274
 
269
- class FlowRunFilterParentFlowRunId(PrefectBaseModel, OperatorMixin):
275
+ class FlowRunFilterParentFlowRunId(_FlowRunFilterBaseModel, OperatorMixin):
270
276
  """Filter for subflows of the given flow runs"""
271
277
 
272
278
  any_: Optional[List[UUID]] = Field(
@@ -274,7 +280,7 @@ class FlowRunFilterParentFlowRunId(PrefectBaseModel, OperatorMixin):
274
280
  )
275
281
 
276
282
 
277
- class FlowRunFilterParentTaskRunId(PrefectBaseModel, OperatorMixin):
283
+ class FlowRunFilterParentTaskRunId(_FlowRunFilterBaseModel, OperatorMixin):
278
284
  """Filter by `FlowRun.parent_task_run_id`."""
279
285
 
280
286
  any_: Optional[List[UUID]] = Field(
@@ -286,7 +292,7 @@ class FlowRunFilterParentTaskRunId(PrefectBaseModel, OperatorMixin):
286
292
  )
287
293
 
288
294
 
289
- class FlowRunFilterIdempotencyKey(PrefectBaseModel):
295
+ class FlowRunFilterIdempotencyKey(_FlowRunFilterBaseModel):
290
296
  """Filter by FlowRun.idempotency_key."""
291
297
 
292
298
  any_: Optional[List[str]] = Field(
@@ -297,7 +303,7 @@ class FlowRunFilterIdempotencyKey(PrefectBaseModel):
297
303
  )
298
304
 
299
305
 
300
- class FlowRunFilterCreatedBy(PrefectBaseModel, OperatorMixin):
306
+ class FlowRunFilterCreatedBy(_FlowRunFilterBaseModel, OperatorMixin):
301
307
  """Filter by `FlowRun.created_by`."""
302
308
 
303
309
  id_: Optional[List[UUID]] = Field(
@@ -318,7 +324,7 @@ class FlowRunFilterCreatedBy(PrefectBaseModel, OperatorMixin):
318
324
  )
319
325
 
320
326
 
321
- class FlowRunFilter(PrefectBaseModel, OperatorMixin):
327
+ class FlowRunFilter(_FlowRunFilterBaseModel, OperatorMixin):
322
328
  """Filter flow runs. Only flow runs matching all criteria will be returned"""
323
329
 
324
330
  id: Optional[FlowRunFilterId] = Field(
@@ -40,5 +40,5 @@ Layered — public → internal → services, with leases and events as cross-cu
40
40
 
41
41
  - **Service singleton is keyed on `frozenset(names)`.** Passing the same names in different order reuses the same singleton; passing a strict subset creates a different singleton. Each unique name-set gets its own queue.
42
42
  - **Lease renewal runs on a daemon thread.** The thread copies the caller's context variables for settings and logging context, then uses the standard `get_client(sync_client=True)` path instead of lease-specific async-client cloning. Sync callers join the thread briefly on exit; async callers only signal the thread to stop so the event loop is not blocked.
43
- - **Cancellation during acquire or release** if a `CancelledError` is raised either during slot acquisition or during `release_concurrency_slots_with_lease` in the `finally` block, the lease ID is appended to `ConcurrencyContext.cleanup_lease_ids`. `ConcurrencyContext.__exit__` releases them via a sync client. If `ConcurrencyContext` is not active, those leases are abandoned until server-side expiry.
43
+ - **Cleanup leases are recorded at acquisition, not reactively on cancellation.** `ConcurrencyContext.cleanup_lease_ids` gets the lease ID the moment a lease is granted, and it's discarded again after a successful release. This closes a race where cancellation fires the instant the lease is granted — before the release call is even reached — which would otherwise leak the slot. `ConcurrencyContext.__exit__` releases any leases still in the list via a sync client; if `ConcurrencyContext` is not active, those leases are abandoned until server-side expiry.
44
44
  - **`v1/` subdirectory** contains the legacy slot API (no lease model). New code should use the top-level `concurrency()` / `rate_limit()` APIs.